话说:
不知道有读者看我的博客后,发觉这个人好傻,早都有新东西了,还在写一些陈芝麻烂稻谷的功能,是的。因为这是我的博客,主要还是给自己作思维梳理和回味人生用的。如果一不小心帮助到了你,那就更好了。
前面我们依次用上古的方式写了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>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
变化的部分就在类上方的@这里
@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还有很多其他新特性,读者如果感兴趣,我们一同去探索吧!午安!