- 过滤器
Dynamic web module version 2.5 项目的版本为2.5
Step1: 编写 java 类实现 Filter 接口,并实现其 doFilter 方法。
public class Filter01 implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("filter01销毁了,难受啊?!马飞?");
}
@Override
public void doFilter(ServletRequest request1, ServletResponse response2, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
//chain.doFilter方法之前处理的是请求的数据
System.out.println("Filter01 filter....");
//放行资源
chain.doFilter(request1,response2);
//chain.doFilter方法之后处理的是响应的数据
System.out.println("Filter01 end....");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("filter01出生了");
}
}
Step2: 在 web.xml 文件中对编写的 filter 类进行注册,并设置它所能拦截 的资源
<filter>
<filter-name>Filter02</filter-name>
<filter-class>包名.类名</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter02</filter-name>
<url-pattern>/*</url-pattern> //拦截所有(/*)
</filter-mapping>
Dynamic web module version 3.0 项目版本为3.0及以上
@WebFilter("/*") //不需要配置web.xml,这里直接设置拦截所有
public class filter01 implements Filter {
public filter01() {
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
- 监听器
Dynamic web module version 2.5 项目的版本为2.5
Step1:创建一个监听器,需要实现某种接口,根据需求选取 HttpSessionListener
public class Listener01 implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session create....");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session destroy...");
}
}
Step2:在 web.xml 中配置该监听器
<listener>
<listener-class>com.shsxt.listener.Listener01</listener-class>
</listener>
在线统计人数案例
监听器代码
public class OnlineListener implements HttpSessionListener {
// 默认在线人数
private Integer onlineNumber = 0;
public OnlineListener() {
}
/**
* session被创建
*/
public void sessionCreated(HttpSessionEvent se) {
// 人数+1
onlineNumber++;
// 设置到域对象中
se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
}
public void sessionDestroyed(HttpSessionEvent se) {
// 人数-1
onlineNumber--;
// 设置到域对象
se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
}
}
Servlet代码
public class OnlineServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request1, HttpServletResponse response2)
throws ServletException, IOException {
// 设置响应类型及编码格式
response2.setContentType("text/html;charset=UTF-8");
// 获取在线人数的数量
// 得到appliction对象,并获取存到application域对象的值
Integer onlineNumber = (Integer) request1.getSession().getServletContext().getAttribute("onlineNumber");
// 得到字符输出流
PrintWriter out = response2.getWriter();
// 得到当前访问
String ip = request1.getRemoteAddr();
System.out.println("当前ip:" + ip);
out.write("<h2>在线人数统计</h2><h3>当前人数为:"+ onlineNumber+"</h3><h3>当前IP:"+ip+"</h3><h4><a href='layout'>退出</a></h4>" );
}
}
web.xml配置
<listener>
<listener-class>xyz.xkun.listener.OnlineListener</listener-class>
</listener>
<servlet>
<servlet-name>OnlineServlet</servlet-name>
<servlet-class>xyz.xkun.servlet.OnlineServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OnlineServlet</servlet-name>
<url-pattern>/o1</url-pattern>
</servlet-mapping>
Dynamic web module version 3.0 项目的版本为3.0及以上
监听事件不需要配置web.xml
@WebListener
public class listener01 implements HttpSessionListener {
public listener01() {
// TODO Auto-generated constructor stub
}
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
}
}
- Servlet3.0 注解
@WebServlet
开发 servlet 项目,使用@WebServlet 将一个继承于 javax.servlet.http.HttpServlet 的类定义为 Servlet 组件。在 Servlet3.0 中 , 可以 使用@WebServlet 注解将一个继承于 javax.servlet.http.HttpServlet 的类标注为可 以处理用户请求的 Servlet。
// @WebServlet("/Servlet01")
// @WebServlet(name="Servlet01",value="/s01")
// @WebServlet(name="Servlet01",value= {"/s01","/s001"})
// @WebServlet(urlPatterns="/s0001")
// @WebServlet(urlPatterns = { "/s0001", "/s00001" })
@WebFilter
@WebFilter 用来配置过滤器
@WebFilter("/cccc")
public class filter01 implements Filter {
}
@WebListener
特定监听器接口的类定义 为监听器。
@WebListener //在此加入集合,按照需求选择比如 1)ServletContext, 2)HttpSession, 3)ServletRequest
public class listener01 implements HttpSessionListener {
}
@MultipartConfig
使用注解@MultipartConfig 将一个 Servlet 标识为支持文件上传。 Servlet3.0 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传 的文件进行操作。
文件上传案例
servlet代码
@MultipartConfig //必须设置
@WebServlet("/upload") //路径
public class UploadServet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request1, HttpServletResponse response2)
throws ServletException, IOException {
// TODO Auto-generated method stub
// 如果是普通的表单项,就是通过获取参数的方式
request1.setCharacterEncoding("UTF-8");
String uname = request1.getParameter("uname");
System.out.println(uname);
// Servlet3.0将multipart/form-data的post的请求封装成Part
// request.getPart("myfile");myfile代表的就是前台表单中的文件域,name的属性值
Part part = request1.getPart("myfile");
// 得到上传的文件名
String fileName = part.getSubmittedFileName();
// 上传文件到指定目录
part.write(request1.getServletContext().getRealPath("/") + fileName);
System.out.println(request1.getServletContext().getRealPath("/"));
}
}
html代码
<body>
<form action="upload" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="uname" />
文件名:<input type="file" name="myfile" />
<button>上传</button>
</form>
</body>