【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...");
}
}
测试结果如下: