【1】Servlet3.0前
① Servlet实例
实例代码如下,通常继承HttpServlet
public class HelloWorld extends HttpServlet { private String message; public void init() throws ServletException { // 执行必需的初始化 message = "Hello World"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html"); // 实际的逻辑是在这里 PrintWriter out = response.getWriter(); out.println("<h1>" + message + "</h1>"); } public void destroy() { // 什么也不做 } }
web.xml配置如下:
<web-app> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> </web-app>
② Filter实例
实例类如下,通常继承Filter
public class UserFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // 过滤请求 System.out.println("UserFilter...doFilter..."); //放行 arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
web.xml配置如下:
<filter> <filter-name>FilterTest</filter-name> <filter-class>com.web.UserFilter</filter-class> </filter> <!--映射过滤器--> <filter-mapping> <filter-name>FilterTest</filter-name> <!--“/*”表示拦截所有的请求 --> <url-pattern>/*</url-pattern> </filter-mapping>
③ Listener
按监听的对象划分,可以分为
- ServletContext对象监听器
- HttpSession对象监听器
- ServletRequest对象监听器
按监听的事件划分
- 对象自身的创建和销毁的监听器
- 对象中属性的创建和消除的监听器
- session中的某个对象的状态变化的监听器
对应类如下:
javax.servlet.ServletContextListener javax.servlet.ServletContextAttributeListener javax.servlet.ServletRequestListener javax.servlet.ServletRequestAttributeListener javax.servlet.http.HttpSessionListener javax.servlet.http.HttpSessionAttributeListener
实例代码如下:
public class UserListener implements ServletContextListener { //监听ServletContext销毁 @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("UserListener...contextDestroyed..."); } //监听ServletContext启动初始化 @Override public void contextInitialized(ServletContextEvent arg0) { ServletContext servletContext = arg0.getServletContext(); System.out.println("UserListener...contextInitialized..."); } }
web.xml配置如下:
<listener> <listener-class>com.web.UserListener</listener-class> </listener>
【2】Servlet3.0新特性
Servlet3.0提供了注解支持,可以不用使用web.xml配置。
① @WebServlet
其参数如下:
注解实例如下:
@WebServlet(name="helloServlet",urlPatterns={"/hello"}, initParams={@WebInitParam(name="age",value="11")})
实例类如下:
@WebServlet(name="helloServlet",urlPatterns={"/hello"},initParams={@WebInitParam(name="age",value="11")}) public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String age = getServletConfig().getInitParameter("age"); System.out.println("age-->"+age); System.out.println(Thread.currentThread()+" start..."); try { sayHello(); } catch (Exception e) { e.printStackTrace(); } resp.getWriter().write("hello..."); System.out.println(Thread.currentThread()+" end..."); } public void sayHello() throws Exception{ System.out.println(Thread.currentThread()+" processing..."); // Thread.sleep(3000); } }
测试结果如下:
age-->11 Thread[http-apr-8080-exec-12,5,main] start... Thread[http-apr-8080-exec-12,5,main] processing... Thread[http-apr-8080-exec-12,5,main] end...
② @WebFilter
其参数如下:
实例类如下:
@WebFilter(urlPatterns={"/*"}) public class UserFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // 过滤请求 System.out.println("UserFilter...doFilter..."); //放行 arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
测试结果如下:
注意哦,这里先执行了过滤器,后执行了servlet。那如果是多个过滤器且chain.doFilter(request,response);
前后都有数据呢?以FirstFilter和SecondFilter为例,次序如下:
logger.info("FirstFilter......begin"); firstFilterChain.doFilter(request, response); logger.info("SecondFilter......begin"); secondFilterchain.doFilter(request,response); logger.info("SecondFilter......end"); logger.info("FirstFilter......end");
③ @WebListener
其注解源码如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebListener { /** * @return description of the listener, if present */ String value() default ""; }
实例代码如下:
@WebListener public class UserListener implements ServletContextListener { //监听ServletContext销毁 @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("UserListener...contextDestroyed..."); } //监听ServletContext启动初始化 @Override public void contextInitialized(ServletContextEvent arg0) { ServletContext servletContext = arg0.getServletContext(); System.out.println("UserListener...contextInitialized..."); } }
测试结果如下: