Servlet
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
init: 第一次请求Servlet时,Servlet容器就会调用这个方法,在后续的请求中,将不会再调用该方法。init收到一个ServletConfig的变量,一般配合getServletConfig。把变量用成员变量保存,让servlet其他方法可以使用。
service: 每次请求servlet时,Servlet容器都会调用这个方法。必须在这里编写要Servlet完成的相应代码。第一次请求Servlet时,Servlet容器会调用init方法和service方法。对于后续请求,则只调用service方法
destory: 要销毁Servlet时,Servlet容器就会调用这个方法。它通常发生在卸载应用程序,或者关闭Servlet容器的时候。一般来说,用来资源清理
getServletInfo: 该方法返回Servlet的描述,没多大用处
getServlet: 和init方法配合,init把ServletConfig赋值给变量。getServlet赋值调用该变量获取值。
如何注册Serlvet?
第一种方式(注解)
@WebServlet(name = "MyServlet", urlPatterns = "/my")
public class MyServlet implements Servlet {
}
第二种方式(配置)
当然SimpleServlet也要继承Servlet或则子类(如HttpServlet,GenericServlet),通常开发(这个通常可能已经不用了)都是选择继承HttpServlet,重写需要的处理的请求。不要重写HttpServlet全部方法。同样也可以看到,一个Servlet可以匹配多个请求链接
public class SimpleServlet extends HttpServlet {
}
ServletRequest & HttpServletRequest
ServletRequest 封装了客户端发送过来的request请求,如果是基于Http发送的请求就可以通过HttpServletRequest request = ==(HttpServletRequest) servletRequest;==来处理。详细的API请查看文档。
ServletResponse & HttpServletResponse
ServletResponse 封装了服务器响应的response请求。也可以通过如上进行转换,然后处理基于Http响应
大致处理过程
HttpSession
HTTP协议是无状态协议,看过《初恋50次》没有各位。就跟里面的女主角一样。当然比她还快一些。她是一天。HTTP协议是每次。那怎么办呢,要想办法让Http协议知道点什么,除了我们日常开发传递查询用的参数,上传表格这些数据外。HTTP还需要每次都要认证您这个人。为此提供了Session,Cookie。在此我就不详细讲解他们作用。只讲HttpSession对象一些执行过程
第一个带参数调用,getSession(false)方法返回当前HttpSession,如果没有就返回null。getSession(true)如果没有,就创建一个返回
HttpSession中的值保存在内存当中。其值不返回给客户端,而是创建一个HttpSession唯一标识,作为一个token返回给游览器,一般是作为名称JSESSIONID的cookie。当第一次发送请求的时候,游览器Cookie当中没有JESSIONID,Servlet自动通过Response返回给游览器,游览器自己保存在Cookie当中,这个操作用于用户,乃至开发者都是透明的。如下有一个神奇过程。
当你开启多个游览器的时候他的SessionID还是一样的,只有你把全部游览器关闭了,重新发送请求SessionID才发生变化。不妨你们自己尝试一下。
监听器(Listener)
顾名思义,监听器就是用来监听某些特定操作发生。javaweb当中有ServletContext监听器,Session监听器,ServletRequest监听器。通过名字可以知道他们分别是对于什么的监听。在此我只讲解大概经常会用到的ServletRequest监听器。其他大同小异
ServletRequestListener
监听器第一种注册方式(注解)
@WebListener
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
//销毁(或从返回池子中)ServletRequest时会调用
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
//创建(或从池子中取出)ServletRequest时会调用
}
}
看到这里你们大概知道能处理什么了吧,能拿到上下文,或者拿到请求本身。做一下预处理,用监听器来实现完全没有问题。
监听器第二种注册方式(配置)
SerlvetRequestAttributeListener
这就不用说了吧,看方法名字都知道何时处理这个监听器,用途是什么,姑且发挥各自想象力了。
过滤器(Filter)
过滤器(Filter)是指拦截请求,并对传给被请求资源的ServletRequest或ServletResponse进行处理的一个对象。过滤器可以用于登录、加密和解密、会话检查,图片转换等等。可以配置一个或多个拦截器
第一种注册方式(注解)
@WebFilter(value = "/*",filterName = "Filter") //拦截路径
public class MyFilter2 implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
第二种注册方式(配置)
猜猜拦截器的执行顺序
通过配置的方式,我们知道它是按照书写排列的拦截。
那么通过注解配置的执行顺序又是什么呢?猜一下下面的执行结果?
Filter1 Filter2Extend3 Filter3 Filter4 Filter4Extend1 Filter5
继承是没有办法打乱拦截循序,顺序还是按照排列顺序来执行。
FilterChain
FilterChain对象只有一个方法就是doFilter。doFilter作用就是放行。给下一个拦截器,如果没有就,整一个拦截链就完成。回到Serlver管理,让他匹配到Servlet对象。如果拦截不通过可以通过throw 抛出异常。打断执行的执行。