Serviet

xiaoxiao2021-02-28  115

seriet基本:

servlet步骤: 过滤器

1.创建一个类  extends  javax.servlet.http.HttpServlet 2.重写三个方法:

init; doFilter; destroy;

3.给Serviet配置一个URL地址,供浏览器访问Servlet用

filter的步骤: 1.创建一个类; 2.自动生产三个方法: init; doFilter; destroy; 3.在WebRoot/WEB-INF/web.xml文件中配置Filter

1,请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保持,地址栏的URL地址会改变。

2,请求转发:服务器行为,request.getRequsetDispatcher().forward(requset,response);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。(服务器内部转发,所有客户端看不到地址栏的改变)

监听Servlet容器事件:

有时候,知道应用服务器容器(the application server container)里某些事件发生的时间是很有用的。这个概念适用于很多情况,但它通常用在开启应用时初始化应用或者关闭应用时清理应用。可以在应用里 注册一个监听器(listener)来显示应用什么时候开启或者关闭。因此,通过监听这些事件,Servlet可以在一些事件发生时执行相应的动作。

为了创建一个基于容器事件执行动作的监听器,你必须创建一个实现 ServletContextListener 接口的类。这个类必须实现的方法有 contextInitialized() 和 contextDestroyed()。这两个方法都需要 ServletContextEvent 作为参数,并且在每次初始化或者关闭Servlet容器时都会被自动调用。

为了在容器注册监听器,你可以使用下面其中一个方法:

1) 利用 @WebListener 注解。 2) 在web.xml应用部署文件里注册监听器。 3) 使用 ServletContext 里定义的 addListener() 方法

服务端service @Override public void testException() throws MyException{     throw new MyException("this is my exception"); } 在WetRoot目录下添加jsp文件:login.jsp <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <javaee:handler-chains      xmlns:javaee="http://java.sun.com/xml/ns/javaee"      xmlns:xsd="http://www.w3.org/2001/XMLSchema">   <javaee:handler-chain>     <javaee:handler>       <javaee:handler-class>com.ws03.MySoapHandler</javaee:handler-class>     </javaee:handler> <!--还可以加入其它的handler  <javaee:handler>       <javaee:handler-class>com.ws03.MySoapHandler</javaee:handler-class>     </javaee:handler> -->   </javaee:handler-chain> </javaee:handler-chains> 过滤器: package com.ws03; import java.io.IOException; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; public class MySoapHandler implements SOAPHandler<SOAPMessageContext> {     @Override     public boolean handleFault(SOAPMessageContext context) {         System.out.println("run handleFault method!");         return false;     }     /**      * 先判断是否是发出去的消息,然后再在soapheader中添加消息userpassword      */     @Override     public boolean handleMessage(SOAPMessageContext context) {         System.out.println("run handleMessage method!");         Boolean out = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);         if(out){             SOAPMessage message = context.getMessage();             try {                 SOAPEnvelope senv = message.getSOAPPart().getEnvelope();                 SOAPHeader header = senv.getHeader();                 if(header==null){                     header = senv.addHeader();                 }                 QName qname = new QName("http://ws01.com/", "userpassword","lic");                 header.addChildElement(qname).setValue("123456");                 message.writeTo(System.out);                 System.out.println();             } catch (SOAPException e) {                 e.printStackTrace();             } catch (IOException e) {                 e.printStackTrace();             }         }         //返回true表示继续执行之后的业务代码,否则停止运行业务代码         return true;     }         @Override     public void close(MessageContext context) {         System.out.println("run close method!");     }     @Override     public Set<QName> getHeaders() {         return null;     } }

使用wsimport命令或者myeclipse生成客户端代码:

修改生成的IServiceImpService.java文件,在类定义上加上下面注解:

@HandlerChain(file="wed.xml");

测试类:

@Test public void test01(){     IServiceImpService service = new IServiceImpService();     IService iService = service.getIServiceImpPort();     try {         iService.testException();     } catch (MyException_Exception e) {         e.printStackTrace();     } }

编写服务端handler的java文件,并配置。

ServiceSoapHandler.java:

package com.ws01; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import org.w3c.dom.Node; public class ServiceSoapHandler implements SOAPHandler<SOAPMessageContext> {     /**      * 如果客户端的saopheader为空或者密码不能123456则直接停止运行业务代码      */     @Override     public boolean handleMessage(SOAPMessageContext context) {         Boolean out = (Boolean)context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY);         if(!out){             SOAPMessage message = context.getMessage();             try {                 SOAPHeader header = message.getSOAPPart().getEnvelope().getHeader();                 if(header != null){                     Node node = header.getElementsByTagName("lic:userpassword").item(0);                     String password = node.getTextContent();                     System.out.println("client send password:"+password);                     if(!"123456".equals(password)) return false;                 }else{                     return false;                 }             } catch (SOAPException e) {                 e.printStackTrace();             }                     }         return true;     }         @Override     public Set<QName> getHeaders() {         // TODO Auto-generated method stub         return null;     }     @Override     public void close(MessageContext context) {         // TODO Auto-generated method stub             }     @Override     public boolean handleFault(SOAPMessageContext context) {         // TODO Auto-generated method stub         return false;     } } IServiceImp.java: package com.ws01; import javax.jws.HandlerChain; import javax.jws.WebService; @WebService(endpointInterface="com.ws01.IService") @HandlerChain(file="service-handler-chain.xml") public class IServiceImp implements IService {     @Override     public void testException() throws MyException {         throw new MyException("test exception");         //throw new RuntimeException("service runtime Exception");     } } wed.xml: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <javaee:handler-chains      xmlns:javaee="http://java.sun.com/xml/ns/javaee"      xmlns:xsd="http://www.w3.org/2001/XMLSchema">   <javaee:handler-chain>     <javaee:handler>       <javaee:handler-class>com.ws01.ServiceSoapHandler</javaee:handler-class>     </javaee:handler>   </javaee:handler-chain> </javaee:handler-chains>

转载请注明原文地址: https://www.6miu.com/read-20888.html

最新回复(0)