Serviet

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

     xmlns:javaee="http://java.sun.com/xml/ns/javaee"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   
      com.ws03.MySoapHandler
   


 


过滤器:
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 {
    @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 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 {
    /**
     * 如果客户端的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 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:

     xmlns:javaee="http://java.sun.com/xml/ns/javaee"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   
      com.ws01.ServiceSoapHandler
   

 



你可能感兴趣的:(server过滤器)