1.servlet3.0概述
Servlet3.0是Java EE6规范的一部分,Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,简化开发流程。具体的介绍看官方文档,这里主要记录一下我的学习测试使用过程。
2.创建动态web工程
注意:Servlet3.0是tomcat7.0版本及以后的版本的支持的,在创建的时候记得选择版本,还有servlet的版本。我的如下图所示。创建完成之后是没有web.xml文件的。我们使用servlet3.0开发就是不需要web.xml,当然你要结合使用也可以。
3.创建web3大组件
3.1Servlet
以前我们编写自己的servlet需要继承HttpServlet然后在xml中进行这样的配置
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>cn.hzu.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
现在只要加个@WebServlet注解就好了,xml里面的参数写在注解里面。具体看下面例子。
package cn.hzu.servlet;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = "/hello",
initParams = {
@WebInitParam(name="username",value="zhangsan") ,
@WebInitParam(name="pwd",value="123456")
}
)
public class HelloServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
try {
resp.getWriter().write("hello...");
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
}
3.2Listener
以前我们编写自己的Listener需要继承实现监听的接口(以ServletContextListener为例),然后在web.xml进行这样的配置
<!-- 监听器开始 -->
<listener>
<listener-class>cn.hzu.listener.UserListener</listener-class>
</listener>
<!-- 监听器结束 -->
现在只需要加一个@WebListener注解就可以了。
package cn.hzu.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* 监听项目的启动和停止
*
*
*/
@WebListener
public class UserListener implements ServletContextListener {
//监听ServletContext销毁
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("userListener...contextDestroyed...");
}
//监听ServletContext启动初始化
@Override
public void contextInitialized(ServletContextEvent arg0) {
//从ServletContextEvent中获取ServletContext对象
ServletContext servletContext = arg0.getServletContext();
System.out.println("UserListener...contextInitialized...");
}
}
3.3Filter
以前编写自己的Filter需要实现Filter接口并在web.xml中这样配置
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>cn.hzu.filter.UserFilter</filter-class>
<init-param>
<param-name>xxx</param-name>
<param-value>aaa</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodeingFilter</filter-name>
<url-pattern->/
* </url-pattern>
</filter-mapping>
现在只需要加一个@WebFilter注解就可以了
package cn.hzu.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
@WebFilter
public class UserFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("过滤器放行....................");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化..................");
}
}
4.启动项目测试
运行项目可以发现监听器监听器器作用了,同时过滤器也进行了初始化工作
请求servet可以发现可以正常请求
关闭项目项目时,监听器也触发了,注意这里要正常关闭才能触发,直接点stop是不行的,这里我就不演示了,前面起作用了就证明使用注解就可以的了。
总结:在没有web.xml的情况下,或者不想在web.xml中进行繁杂的配置就可以使用@WebFilter,@WebListener,@WebServlet这三个注解。如果需要带参数那就结合@WebInitParam注解使用。
抛出问题:我们可以发现使用注解只能配置自己的编写的过滤器,监听器和servlet,但是对于第三方的组件呢,没有了web.xml,我们怎么配置?总不能跑到人家类上去贴个注解吧。这里就需要使用servlet3.0的 Sharedlibraries(共享库) / runtimes pluggability(运行时插件能力)的知识了。下一篇继续测试。