JavaWeb-Servlet3.0新特性-注解

话说:

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

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

JavaWeb-Servlet3.0新特性-注解_第1张图片

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


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


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

JavaWeb-Servlet3.0新特性-注解_第2张图片

案例一:Servlet注解配置

之前是这样配置的:

 <servlet>
        <servlet-name>newsservlet-name>
        <servlet-class>com.hmc.jdbc.news.servlet.NewsServletservlet-class>
    servlet>

    <servlet-mapping>
        <servlet-name>newsservlet-name>
        <url-pattern>/news.dourl-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 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,配置后的场面是这样的:



 <servlet>
     <servlet-name>newsAddservlet-name>
     <servlet-class>com.hmc.jdbc.news.servlet.NewsAddServletservlet-class>
 servlet>

 <servlet-mapping>
     <servlet-name>newsAddservlet-name>
     <url-pattern>/newsAdd.dourl-pattern>
 servlet-mapping>


 

 <servlet>
     <servlet-name>newsShowservlet-name>
     <servlet-class>com.hmc.jdbc.news.servlet.NewsShowServletservlet-class>
 servlet>

 <servlet-mapping>
     <servlet-name>newsShowservlet-name>
     <url-pattern>/newsShow.dourl-pattern>
 servlet-mapping>

 
 <servlet>
     <servlet-name>newsUpdateservlet-name>
     <servlet-class>com.hmc.jdbc.news.servlet.NewsUpdateServletservlet-class>
 servlet>

 <servlet-mapping>
     <servlet-name>newsUpdateservlet-name>
     <url-pattern>/newsUpdate.dourl-pattern>
 servlet-mapping>

 
 <servlet>
     <servlet-name>newsUpdateDoservlet-name>
     <servlet-class>com.hmc.jdbc.news.servlet.NewsUpdateDoServletservlet-class>
 servlet>
 <servlet-mapping>
     <servlet-name>newsUpdateDoservlet-name>
     <url-pattern>/newsUpdateDo.dourl-pattern>
 servlet-mapping>

 
 <servlet>
     <servlet-name>newsDelservlet-name>
     <servlet-class>com.hmc.jdbc.news.servlet.NewsDelServletservlet-class>
 servlet>

 <servlet-mapping>
     <servlet-name>newsDelservlet-name>
     <url-pattern>/newsDel.dourl-pattern>
 servlet-mapping>

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

案例二:Filter注解配置

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

<filter>
    <filter-name>encodingfilter-name>
    <filter-class>com.hmc.jdbc.news.filter.EncodingFilterfilter-class>

    <init-param>
        <param-name>encodingparam-name>
        <param-value>utf-8param-value>
    init-param>

filter>

<filter-mapping>
    <filter-name>encodingfilter-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中是这么配置的。


    com.hmc.jdbc.news.listener.TestHttpSessionListener

用注解配置是这样的:

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还有很多其他新特性,读者如果感兴趣,我们一同去探索吧!午安!

你可能感兴趣的:(Java)