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文件中配置Filter1,请求重定向:客户端行为,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>