servlet生命周期/客户端跳转VS服务器端跳转/过滤器/监听器
- Servlet 生命周期:Servlet 加载--->实例化(调构造器)--->服务--->销毁。(tomcat启动时加载,第一次访问时实例化(和初始化init)并做服务,后面再访问就不再实例化,只做相应的doget/dopost服务,长时间不访问就会销毁。)
- init():在Servlet的生命周期中,仅执行一次init()方法。
- service():它是Servlet的核心,负责响应客户的请求。
- destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。
客户端跳转/重定向 (不能带request的值, session,application可以传值。) 定义:浏览器发送请求并收到响应后再次向一个新地址发送请求。特点: 改变url, 发送2次请求,request不共享数据。
服务器调转/转发 (3个作用域都可用) 定义: 服务器收到请求后再内部转发给其他组件处理,然后把结果返回。 特点: 不改变url, 发送1次请求,request共享数据。

@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("requestKey", "request值"); HttpSession session=request.getSession(); // 获取session session.setAttribute("sessionKey", "session值"); ServletContext application=this.getServletContext(); // 获取application application.setAttribute("applicationKey", "application值"); response.sendRedirect("target.jsp"); // 客户端跳转/重定向 } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("requestKey", "request值"); HttpSession session=request.getSession(); // 获取session session.setAttribute("sessionKey", "session值"); ServletContext application=this.getServletContext(); // 获取application application.setAttribute("applicationKey", "application值"); RequestDispatcher rd=request.getRequestDispatcher("target.jsp"); rd.forward(request, response); // 服务器调转/转发 } ---------------------------target.jsp------------------------------------- <body> <h1>目标地址</h1> request值:<%=request.getAttribute("requestKey") %><br/> session值:<%=session.getAttribute("sessionKey") %><br/> application值:<%=application.getAttribute("applicationKey") %><br/> </body>
Servlet过滤器
下面的是过滤用户请求,对于没有登录的的请求过滤掉,跳转到登录页面

public class LoginFilter implements Filter{ public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)servletRequest; HttpSession session=request.getSession(); Object o=session.getAttribute("currentUser"); String path=request.getServletPath(); if(o==null&&path.indexOf("login")<0){ request.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse); }else{ filterChain.doFilter(servletRequest, servletResponse); } } public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } } ---------------------------web.xml------------------------------ <filter> <filter-name>loginFilter</filter-name> <filter-class>com.java1234.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Servlet监听器
监听 web 事件;如 application,session,request
例子是session事件的监听,可在session添加、删除时触发事件

public class SessionAttributeListener implements HttpSessionAttributeListener{ public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) { // TODO Auto-generated method stub System.out.println("添加的属性名:"+httpSessionBindingEvent.getName()+",属性值:"+httpSessionBindingEvent.getValue()); } public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) { // TODO Auto-generated method stub System.out.println("删除的属性名:"+httpSessionBindingEvent.getName()+",属性值:"+httpSessionBindingEvent.getValue()); } public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) { // TODO Auto-generated method stub } } -------------------web.xml----------------------------------------- <listener> <listener-class> com.java1234.listener.SessionAttributeListener </listener-class> </listener> </web-app>