JavaWeb-Servlet3.0新特性-注解

来源:互联网 发布:dw软件怎么下载 编辑:程序博客网 时间:2024/06/16 20:51

话说:

不知道有读者看我的博客后,发觉这个人好傻,早都有新东西了,还在写一些陈芝麻烂稻谷的功能,是的。因为这是我的博客,主要还是给自己作思维梳理和回味人生用的。如果一不小心帮助到了你,那就更好了。

前面我们依次用上古的方式写了Servlet、Filter、Listener,主要是因为一些类和接口使用的Servlet的版本都是Servlet2.3或者2.几的。我们使用它们,都是在web.xml里面配啊配。

这里写图片描述

这里用Servlet3.0的新特性@——注解的方式来简化一下。
目录


案例一:Servlet注解配置
案例二:Filter注解配置
案例三:Listener注解配置


笔者的测试环境是这样的:
IntelliJ IDEA 开发版本
Tomcat 7.0.5
导入:javax.servlet-api-3.1.0.jar包(Maven仓库)
是在上一个工程JavaWeb_Servlet基础上做的测试。

这里写图片描述

案例一:Servlet注解配置

之前是这样配置的:

 <servlet>        <servlet-name>news</servlet-name>        <servlet-class>com.hmc.jdbc.news.servlet.NewsServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>news</servlet-name>        <url-pattern>/news.do</url-pattern>    </servlet-mapping>

注解配置是这样的:

package com.hmc.jdbc.news.servlet;import com.hmc.jdbc.news.dao.BaseDao;import com.hmc.jdbc.news.dao.NewsDao;import com.hmc.jdbc.news.model.News;import com.hmc.jdbc.news.util.StringConvertUtil;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.List;/** * User:Meice * 2017/10/5 */@WebServlet(urlPatterns = "/news.do")public class NewsServlet extends BaseServlet {    NewsDao nd = new NewsDao();    BaseDao bd = new BaseDao();        //查(R)        // 未避免代码混乱,把显示新闻列表封装成方法;这里采用最高级的显示新闻方法listShow3()        private  void list (HttpServletRequest req, HttpServletResponse resp){            String sql = "select * from t_news";             List<Object> list =bd.listShow3(sql,News.class,null);            //3 存储到req中            req.setAttribute("list", list);            try {                req.getRequestDispatcher("newsShow.jsp").forward(req, resp);            } catch (ServletException e) {            } catch (IOException e) {            }        }}

变化的部分就在类上方的@这里

@WebServlet(urlPatterns = "/news.do")

可以展开想象的翅膀,之前我们一开始针对CURD,每个功能都写了一个Servlet,配置后的场面是这样的:

<!--news Add Servlet--> <servlet>     <servlet-name>newsAdd</servlet-name>     <servlet-class>com.hmc.jdbc.news.servlet.NewsAddServlet</servlet-class> </servlet> <servlet-mapping>     <servlet-name>newsAdd</servlet-name>     <url-pattern>/newsAdd.do</url-pattern> </servlet-mapping> <!--news Show Servlet--> <servlet>     <servlet-name>newsShow</servlet-name>     <servlet-class>com.hmc.jdbc.news.servlet.NewsShowServlet</servlet-class> </servlet> <servlet-mapping>     <servlet-name>newsShow</servlet-name>     <url-pattern>/newsShow.do</url-pattern> </servlet-mapping> <!-- news Update Servlet--> <servlet>     <servlet-name>newsUpdate</servlet-name>     <servlet-class>com.hmc.jdbc.news.servlet.NewsUpdateServlet</servlet-class> </servlet> <servlet-mapping>     <servlet-name>newsUpdate</servlet-name>     <url-pattern>/newsUpdate.do</url-pattern> </servlet-mapping> <!--news Update Do Servlet--> <servlet>     <servlet-name>newsUpdateDo</servlet-name>     <servlet-class>com.hmc.jdbc.news.servlet.NewsUpdateDoServlet</servlet-class> </servlet> <servlet-mapping>     <servlet-name>newsUpdateDo</servlet-name>     <url-pattern>/newsUpdateDo.do</url-pattern> </servlet-mapping> <!--news Del Servlet--> <servlet>     <servlet-name>newsDel</servlet-name>     <servlet-class>com.hmc.jdbc.news.servlet.NewsDelServlet</servlet-class> </servlet> <servlet-mapping>     <servlet-name>newsDel</servlet-name>     <url-pattern>/newsDel.do</url-pattern> </servlet-mapping>

配置得好辛苦啊!可是,如果不回味这样一个过程,就无法体会到多个Servlet整合为一个Servlet的妙处,也无法更加深刻的体会到注解的妙处!
注解,大大简化配置。
我们看看前辈7年前发表的文章,里面有详细讲解,仅供参考。
https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/

案例二:Filter注解配置

回顾我们前面那篇关于Filter的博客,其中有个案例是关于字符编码初始化过滤的。之前我们写好Filter之后,在web.xml里面是这么配置的。

<filter>    <filter-name>encoding</filter-name>    <filter-class>com.hmc.jdbc.news.filter.EncodingFilter</filter-class>    <init-param>        <param-name>encoding</param-name>        <param-value>utf-8</param-value>    </init-param></filter><filter-mapping>    <filter-name>encoding</filter-name>    <url-pattern>/*</url-pattern></filter-mapping>

现在,我们用注解是这么配置的:web.xml里面通通不用配置啦!

package com.hmc.jdbc.news.filter;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.annotation.WebInitParam;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * User:Meice * 2017/10/8 */@WebFilter(urlPatterns = "/*",        initParams = {       @WebInitParam(name = "encoding",value = ""),                @WebInitParam(name = "encoding2",value ="gbc" ),})public class EncodingFilter implements Filter {    String encoding = null;    @Override    public void init(FilterConfig config) throws ServletException {        System.out.println("过滤器初始化啦......");        System.out.println("初始化参数值: "+config.getInitParameter("encoding"));            //对初始化做个设置        encoding =  config.getInitParameter("encoding");         if(encoding == null || "".equals(encoding)){             encoding="UTF-8";         }        System.out.println("初始化参数值: "+encoding);    }    @Override    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {        //向下转型一下,因为用这个响应和请求熟悉,而且可以用到session         HttpServletRequest request =(HttpServletRequest) req;        HttpServletResponse response =(HttpServletResponse)resp;        //我们设置初始化值的目的是什么?就是为了在初始化的时候就设置好值,而不用人为设置        request.setCharacterEncoding(encoding);        response.setCharacterEncoding(encoding);          System.out.println("过滤请求.....");            chain.doFilter(request,response);            System.out.println("过滤响应.....");    }    @Override    public void destroy() {        System.out.println("过滤器销毁....");    }}

这里变化点也在类的头部:

@WebFilter(urlPatterns = "/*",        initParams = {       @WebInitParam(name = "encoding",value = ""),                @WebInitParam(name = "encoding2",value ="gbc" ),})

以上需要注意的是,初始化参数的配置方式以及多个初始化参数的配置。这个的返回类型是WebInitPararm[]数组,可以配置多个,结尾用逗号隔开。

案例三:Listener注解配置
同样,前面那篇JavaWeb_Filter博客里面的案例——HttpSessionListener,我们在web.xml中是这么配置的。

<listener>    <listener-class>com.hmc.jdbc.news.listener.TestHttpSessionListener</listener-class></listener>

用注解配置是这样的:

package com.hmc.jdbc.news.listener;import javax.servlet.annotation.WebListener;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;/** * User:Meice * 2017/10/8 */@WebListener()public class TestHttpSessionListener implements HttpSessionListener {    @Override    public void sessionCreated(HttpSessionEvent e) {        HttpSession session = e.getSession();        System.out.println("会话创建了....."+"sessionID为: "+session.getId());        //注意,这里测试可以,实际运行的时候,一旦销毁,页面就不显示啦!刚创建,又销毁;刚创建,又销毁...销毁销毁无穷期也...        //session.invalidate();        //还有一种方式就是设置session-timeout    }    @Override    public void sessionDestroyed(HttpSessionEvent e) {        //促使会话失效;在这里设置没用滴      //  e.getSession().invalidate();        System.out.println("会话销毁了....");    }}

变化点依旧在那里:

@WebListener()

因为监听器只需要指定类就可以了,所以@起来很简单。

当然,Servlet还有很多其他新特性,读者如果感兴趣,我们一同去探索吧!午安!