话说:
不知道有读者看我的博客后,发觉这个人好傻,早都有新东西了,还在写一些陈芝麻烂稻谷的功能,是的。因为这是我的博客,主要还是给自己作思维梳理和回味人生用的。如果一不小心帮助到了你,那就更好了。
前面我们依次用上古的方式写了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还有很多其他新特性,读者如果感兴趣,我们一同去探索吧!午安!
Servlet3.0注解配置
本文介绍如何利用Servlet3.0的新特性——注解,简化Servlet、Filter和Listener的配置过程。通过示例展示了注解配置的具体实现方法。
1232

被折叠的 条评论
为什么被折叠?



