做海报有什么好的网站推荐,做网站大,北京博洛尼装饰公司,自建网站的劣势没有servlet能单独存在。在当前的现代Web应用中#xff0c;许多组件都是在一起协作共同完成一个目标。怎么让这些组件共享信息#xff1f;如何隐藏信息#xff1f;怎样让信息做到线程安全#xff1f;
1 属性和监听者
1.1 初始化
容器初始化一个servlet时#xff0c;会为… 没有servlet能单独存在。在当前的现代Web应用中许多组件都是在一起协作共同完成一个目标。怎么让这些组件共享信息如何隐藏信息怎样让信息做到线程安全
1 属性和监听者
1.1 初始化
容器初始化一个servlet时会为这个servlet建一个唯一的ServletConfig。容器从web.xml 配置文件中“读出”servlet初始化参数并把这些参数交给ServletConfig。然后把ServletConfig传递给servlet的init()方法。
一旦参数置于ServletConfig中就不会再读了除非重写部署了servlet。
1.1.1 上下文初始化参数
上下文初始化参数与servlet初始化参数很类似只不过上下文参数对整个Web应用可用而不只针对一个servlet。
public class InitServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletConfig servletConfig getServletConfig();String servletName servletConfig.getInitParameter(servletName);ServletContext servletContext getServletContext();String contextName servletContext.getInitParameter(contextName);resp.setCharacterEncoding(gbk);PrintWriter writer resp.getWriter();writer.println(servlet初始化参数: servletName);writer.println(上下文初始化参数: contextName);writer.close();}
}
web-app xmlnshttp://java.sun.com/xml/ns/j2eexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsdversion2.4servletservlet-nameinitServlet/servlet-nameservlet-classservlet.InitServlet/servlet-classinit-paramparam-nameservletName/param-nameparam-valueinitServlet/param-value/init-param/servletcontext-paramparam-namecontextName/param-nameparam-valueday01/param-value/context-paramservlet-mappingservlet-nameinitServlet/servlet-nameurl-pattern/init/url-pattern/servlet-mapping/web-app
web.xml
1.2 监听者 接口 使用场景 ServletContextAttributeListener 监听Web应用上下文中是否增加、删除或替换了一个属性。 HttpSessionListener 监听会话的创建。 ServletRequestListener 用户请求监听。 ServletRequestAttributeListener 监听请求增加、删除或替换属性。 HttpSessionBindingListener 属性类对象在绑定到一个会话或从会话删除时触发给属性类对象。 HttpSessionAttributeListener 监听会话增加、删除或替换属性。 ServletContextListener 监听Web应用上下文创建或销毁。 HttpSessionActivationListener 监听会话迁移到另一个JVM。
表 servlet常见的8种监听者
public class MyAtt implements HttpSessionBindingListener {Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println(myAtt 添加到: event.getSession());}Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println(myAtt 移除);}
}public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {Overridepublic void attributeAdded(HttpSessionBindingEvent event) {System.out.println(添加session属性 event.getName() ,其值为: event.getValue());}Overridepublic void attributeRemoved(HttpSessionBindingEvent event) {System.out.println(删除session属性 event.getName() ,其值为: event.getValue());}Overridepublic void attributeReplaced(HttpSessionBindingEvent event) {System.out.println(替换属性 event.getName() ,其值为: event.getValue());}}public class MyHttpSessionListener implements HttpSessionListener {Overridepublic void sessionCreated(HttpSessionEvent event) {System.out.println(有个会话被创建了: event.getSession());}Overridepublic void sessionDestroyed(HttpSessionEvent event) {System.out.println(有个会话被销毁了: event.getSession());}
}public class MyServletContextAttributeListener implements ServletContextAttributeListener {Overridepublic void attributeAdded(ServletContextAttributeEvent event) {System.out.println(添加上下文属性 event.getName() ,其值为: event.getValue());}Overridepublic void attributeRemoved(ServletContextAttributeEvent event) {System.out.println(删除上下文属性 event.getName() ,其值为: event.getValue());}Overridepublic void attributeReplaced(ServletContextAttributeEvent event) {System.out.println(替换上下文属性 event.getName() ,其值为: event.getValue());}
}public class MyServletContextListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent event) {System.out.println(上下文创建 event.getServletContext());}Overridepublic void contextDestroyed(ServletContextEvent event) {System.out.println(上下文销毁: event.getServletContext());}}public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {Overridepublic void attributeAdded(ServletRequestAttributeEvent event) {System.out.println(添加请求属性 event.getName() ,其值为: event.getValue());}Overridepublic void attributeRemoved(ServletRequestAttributeEvent event) {System.out.println(删除请求属性 event.getName() ,其值为: event.getValue());}Overridepublic void attributeReplaced(ServletRequestAttributeEvent event) {System.out.println(替换请求属性 event.getName() ,其值为: event.getValue());}
}public class MyServletRequestListener implements ServletRequestListener {Overridepublic void requestDestroyed(ServletRequestEvent event) {System.out.println(请求被销毁: event.getServletRequest());}Overridepublic void requestInitialized(ServletRequestEvent event) {System.out.println(请求初始化: event.getServletRequest());}
}
监听者
public class ListenerServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setAttribute(reqAtt,hello req);req.getSession().setAttribute(sessionAtt, hello session);req.getSession().setAttribute(binding,new MyAtt());getServletContext().setAttribute(contextAtt, hello context);}
} web-app xmlnshttp://java.sun.com/xml/ns/j2eexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsdversion2.4servletservlet-namelistenerServlet/servlet-nameservlet-classservlet.ListenerServlet/servlet-class/servletservlet-mappingservlet-namelistenerServlet/servlet-nameurl-pattern/listener/url-pattern/servlet-mappinglistenerlistener-classlistener.MyHttpSessionAttributeListener/listener-class/listenerlistenerlistener-classlistener.MyHttpSessionListener/listener-class/listenerlistenerlistener-classlistener.MyServletContextAttributeListener/listener-class/listenerlistenerlistener-classlistener.MyServletContextListener/listener-class/listenerlistenerlistener-classlistener.MyServletRequestAttributeListener/listener-class/listenerlistenerlistener-classlistener.MyServletRequestListener/listener-class/listener/web-app
web.xml
2 会话管理
Web服务器没有短期记忆。
HttpSession对象可以保存跨同一个客户多个请求的会话状态即与一个特定客户的整个会话期间HttpSession会持久存储。对于会话期间客户做的所有请求都可以用HttpSession存取。
2.1 容器几乎做cookie的所有工作
除了必须告诉容器创建或使用一个会话其他工作比如生成会话ID、创建新的cookie对象、把会话ID放到cookie中、把cookie设置为响应的一部分以及从请求中的cookie得到会话ID将这个会话ID与一个现有会话匹配等工作都是由容器完成。
HttpSession session request.getSession(); // 在响应中发送一个会话cookie
执行完上面后容器会负责余下的事情你什么也不用做。
HttpSession session request.getSession(); // 从请求得到会话id。
执行完上面后容器会负责余下的事情找到与该ID匹配的会话没有则创建一个新会话。
图 执行request.getSession()后的响应与请求
当cookie被禁时URL重写是一条后路:如果客户端不接受cookie可以把URL重写作为一条后路。当然在实际开发中这种方法很少使用。
2.2 删除会话
删除会话有两种方式(不包括结束应用)
1设置超时时间setMaxInactiveInterval() 指定对于这个会话客户请求的最大间隔时间秒。
也可以在web.xml中配置单位是分钟
session-config session-timeout15session-timeout
/session-config
2结束会话invalidate()
2.3 会话迁移
在部署分布式Web应用时容器可能会负载均衡取得客户的请求把请求发送到多个JVM上。例如每次客户请求时有可能到达同一个servlet到不同实例。
只有HttpSession对象及其属性会从一个VM移到另一个VM。
每个VM中有一个ServletContext,每个VM上的每个servlet有一个ServletConfig。但是对于每个Web应用的一个给定会话ID只有一个HttpSession对象而无论应用分布在多少个VM上。