servlet是运行在Web服务器中的小型Java程序,通常通过HTTP接受和响应来自客户端的请求。
servlet 通常运行在多线程服务器上,因此应该意识到 servlet 必须处理并发请求并小心地同步对共享资源的访问。共享资源包括内存数据(比如实例或类变量)和外部对象(比如文件、数据库连接和网络连接)。
Servlet相关接口、类
Servlet工作流程
Servlet生命周期
Web服务器接收到HTTP请求后将请求委托给Servlet容器,然后
- 加载Servlet类 ,当Servlet容器接收到servlet的第一个请求时,类加载器将加载servlet类
- 创建Servlet实例 ,加载后会创建一个servlet实例
- 调用init() ,只初始化一次servlet,生命周期开始
- 调用service()
- 调用destory() ,将servlet从容器中移除
Servlet容器处理请求
- 将请求与web.xml文件中的servlet进行映射
- 为请求创建请求和响应对象
- 调用线程上的service方法
- 公共service方法内部调用受保护的service方法
- 受保护的service方法根据请求的类型调用doGet方法
- doGet方法生成响应,并将其传递给客户端
- 发送响应后,Web容器将删除请求和响应对象。线程包含在线程池中或删除取决于服务器实现。
war文件
web.xml
欢迎文件优先级:指定文件->index.html->
加载优先级:context-param -> listener -> filter -> servlet ,同类型按mapping顺序进行调用。
加载过程如下:
- 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取和两个结点。
- 紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
- 容器将转换为键值对,并交给servletContext。
- 容器创建中的类实例,创建监听器。
元素详解:
向ServletContext提供键值对(上下文信息),getServletContext().getInitParameter(“context/param”)可得到。
监听客户端请求、服务端操作,可自动激发一些操作。常用监听接口、类有。
将一个名字与一个实现javaxs.servlet.Filter接口的类相关联。
是的子元素,代表servlet。
是的子元素,表示servlet的名称。
是的子元素,表示servlet的类。
是的子元素。它用于映射servlet。
是的子元素。客户端使用此模式来调用servlet。
1可传递正值负值,servlet将在项目部署或服务器启动时加载。
其他元素
其他
Listener
Servlet协作
RequestDispatcher接口接收来自客户端的请求并将它们发送到服务器上的任何资源(比如 servlet、HTML 文件或 JSP 文件)的对象。
获取RequestDispatcher对象:调用ServletRequest接口的getRequestDispatcher()方法返回RequestDispatcher的对象,它充当位于给定路径上的资源的包装器。可以使用 RequestDispatcher 对象将请求转发到资源,或者在响应中包含资源。
使用:
1)forward(请求转发,由第二个资源给客户端响应)
2)include(在调用资源的响应中包含另一个资源的响应内容)
Servlet重定向
HttpServletResponse接口的sendRedirect()方法可以用于将响应重定向到另一个资源,资源可能是servlet,jsp或html文件。与forward()不同的是方法在客户端工作。response.sendRedirect("http://www.yiibai.com");
属性配置
ServletConfig 从web.xml文件获取配置信息传递给servlet,提供了初始化参数
获取:调用Servlet接口的getServletConfig()
<servlet>
......
<init-param>
<param-name>parameter_name</param-name>
<param-value>parameter_value</param-value>
</init-param>
ServletContext配置信息
ServletContext对象由Web容器在部署一个项目时创建一个ServletContext对象,可用于从web.xml文件获取配置信息。
如果有信息要共享给多个servlet使用,最好在web.xml文件中使用元素提供它。
ServletContext的优点如果有任何信息要共享给所有的servlet使用,并且要让它容易维护,最好的办法就是在web.xml文件中提供这些信息,所以如果信息要更改直接在web.xml中修改,而不需要修改servlet代码。
ServletContext接口的使用
- ServletContext对象提供容器和servlet之间的接口。
- 使用ServletContext对象在web.xml文件获取配置信息。
- ServletContext对象可用于设置,获取或删除web.xml文件中属性。
- ServletContext对象可用于提供应用程序间通信。
获取对象:
- 通过ServletConfig接口的getServletContext()方法返回ServletContext对象
- 通过GenericServlet类的getServletContext()方法返回ServletContext对象
<web-app>
......
<context-param>
<param-name>parameter_name</param-name>
<param-value>parameter_value</param-value>
</context-param>
......
属性设置
Servlet中有以下4种属性方法,它们具体如下:
public void setAttribute(String name,Object object)
在应用程序范围内设置给定的对象。
public Object getAttribute(String name)
返回指定名称的属性。
public Enumeration getInitParameterNames()
返回上下文的初始化参数的名称,转为String对象的枚举。
public void removeAttribute(String name)
从servlet上下文中删除具有给定名称的属性。
过滤器
过滤器在web.xml中被定义,在预加载或后加载时被调用对web资源进行拦截从而实现转换、日志记录、压缩、加解密、输入验证等过滤任务。
Filter开发
- 编写java类实现Filter接口,并实现其doFilter方法。
- 在 web.xml 文件中使用和元素对编写的filter类进行注册,并设置它所能拦截的资源。
过滤器API
Filter接口提供了生命周期方法(init、doFilter、destory)。
FilterChain接口负责调用链中下一个过滤器或资源(doFilter)。
FilterConfig对象由Web容器创建,可用于获取web.xml文件中的配置信息(init、getInitParameter、getInitParameterNames、getServletContext)。
过滤器配置
用于为过滤器指定一个名字,该元素的内容不能为空。
元素用于指定过滤器的完整的限定类名。
元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
指定过滤器所拦截的Servlet名称。
会话跟踪
HTTP协议是无状态的,需要一种方式来维护用户状态,即会话跟踪。
常用技术:Cookies 隐藏表格域 网址重写 HttpSession
Cookies
Cookie是由Server产生在客户端维护用于唯一地标识客户端的一段信息,具有名称,单个值和一些属性如注释路径域限定符版本号等。
类型
- 非持久性cookie,适用于单个对话,关闭浏览器即删除
- 持久性Cookie,适用于多个对话,在用户注销时才被删除
javax.servlet.http.Cookie提供了Cookie功能,有以下方法
构造:
- Cookie()
- Cookie(String name,String value) 构造具有指定名称和值的cookie
常用方法:setMaxAge() getValue() getName() setName() setValue()
使用
- servlet 通过使用 HttpServletResponse#addCookie 方法将 cookie 发送到浏览器,该方法将字段添加到 HTTP 响应头,以便一次一个地将 cookie 发送到浏览器。
- 浏览器通过向 HTTP 请求头添加字段将 cookie 返回给 servlet。可使用 HttpServletRequest#getCookies 方法从请求中获取 cookie
隐藏表格字段
在隐藏表单字段的情况下,一般使用隐藏(不可见)文本字段来维护用户的状态。在服务器维护,每个页面需要额外提交表单字段。
URL重写
在URL重写中,我们将令牌或标识符附加到下一个Servlet或下一个资源的URL。
当用户单击超链接时,参数名称/值对将被传递到服务器。 从Servlet中可以使用getParameter()方法获取指定参数的值。
在链接上工作,只限于文本,不需要额外提交表单。
HttpSession
HttpSession对象在容器中为每个用户创建会话ID。容器使用此标识来识别特定的用户。
HttpSession的一个对象可用于执行两个任务:
- 绑定对象
- 查看和操作有关会话的信息,如会话标识符,创建时间和上次访问时间。
HttpServletRequest接口提供了两种获取HttpSession对象的方法:
- public HttpSession getSession():返回与此请求相关联的当前会话,或者如果请求没有会话,则创建一个会话。
- public HttpSession getSession(boolean create):返回与此请求相关联的当前HttpSession,如果没有当前会话,并且create的值为true,则返回一个新会话。
HttpSession接口的常用方法
- public String getId() :返回一个包含唯一标识符值的字符串。
- public long getCreationTime() :返回创建此会话的时间,GMT毫秒。
- public long getLastAccessedTime() : 返回客户端发送与此会话相关联的请求的最后一次,GMT。
- public void invalidate() : 使此会话无效,然后取消绑定绑定到该对象的任何对象。
- public void setAttribute(String name, Object value):使用指定名称将对象绑定到此会话
- public Object getAttribute(String name):返回与此会话中的指定名称绑定在一起的对象
事件和监听器
更改对象的状态称为事件。事件发生时可以执行一些操作:计数总数和当前登录的用户数,在部署项目时创建数据库的表,创建数据库连接对象等。
事件类
- ServletRequestEvent
- ServletContextEvent
- ServletRequestAttributeEvent
- ServletContextAttributeEvent
- HttpSessionEvent
- HttpSessionBindingEvent
事件接口
- ServletRequestListener
- ServletRequestAttributeListener
- ServletContextListener
- ServletContextAttributeListener
- HttpSessionListener
- HttpSessionAttributeListener
- HttpSessionBindingListener
- HttpSessionActivationListener
servlet初始化时ServletConfig作为配置对象由容器提供给servlet,ServletContext对象包含在ServletConfig对象中实现servlet与容器的通信,容器在ServletContext对象之后创建ServletContextEvent的对象用于通知有关 Web 应用程序的 servlet 上下文更改的信息。
ServletContextEvent和ServletContextListener
Web应用部署时会通知ServletContextEvent事件,如果在部署时创建数据库连接、创建项目所有表需要给ServletContextListener接口提供方法实现。
- 事件构造方法:ServletContextEvent(ServletContext e)
- 事件中返回更改的ServletContext实例:public ServletContext getServletContext()
- 实现的接口方法应用部署时被调用:public void contextInitialized(ServletContextEvent e)
- 实现的接口方法取消部署时被调用: public void contextDestroyed(ServletContextEvent e)
HttpServletEvent和HttpSessionListener
HttpServletEvent是表示Web程序内会话更改的类,相应的监听器接口是HttpServletListener。可以在这个事件上计数统计当前登录的用户,记录登录时间,注销时间等用户详细信息。
HttpServletEvent给出了以下方法: - public HttpSessionEvent(HttpSession source):构造来自给定源的会话事件。
- public HttpSession getSession():返回更改的会话。
HttpSessionListener接口中声明了两种需给出实现的方法: - public void sessionCreated(HttpSessionEvent e):在创建会话对象时被调用。
- public void sessionDestroyed(ServletContextEvent e):当会话无效时被调用。