美文网首页
Servlet笔记

Servlet笔记

作者: XAbo | 来源:发表于2020-10-28 17:47 被阅读0次

Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类。

一、Servlet基础:
1.1 Servlet处理流程。
1.部署Web应用服务,Tomcat作为Servlet容器,利用Tomcat启动应用程序,会创建并初始化Servlet;
2.通过浏览器访问Web应用服务器,利用Http通讯协议传递数据;
3.当访问到达时,Servlet容器创建HttpServletRequest和HttpServletResponse对象,并且将请求数据放入HttpServletRequest中,同时请求信息通常是可以在一个共享容器(ServletContext)内存储和取出;
4.Servlet容器根据传递的url通过匹配web.xml中配置的Servlet路径,找到对应的Servlet,传递请求和响应对象;

<servlet>
        <servlet-name>Init</servlet-name>
        <servlet-class>org.xl.servlet.InitServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>

5.Servlet中根据请求方式调用doGet或doPost方法,处理请求数据,将响应数据放入HttpServletResponse,返回给Servlet容器;
6.Servlet容器解析响应数据,根据HTTP通讯协议,返回给浏览器,浏览器解析并展示数据。

1.2 Servlet继承关系

public abstract class HttpServlet extends GenericServlet {
    private static final String METHOD_DELETE = "DELETE";
    private static final String METHOD_HEAD = "HEAD";
    private static final String METHOD_GET = "GET";
    private static final String METHOD_OPTIONS = "OPTIONS";
    private static final String METHOD_POST = "POST";
    private static final String METHOD_PUT = "PUT";
    private static final String METHOD_TRACE = "TRACE";
    private static final String HEADER_IFMODSINCE = "If-Modified-Since";
    private static final String HEADER_LASTMOD = "Last-Modified";
    private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
    private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");
    public HttpServlet() {}
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
    protected long getLastModified(HttpServletRequest req) {}
    protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
    private Method[] getAllDeclaredMethods(Class<? extends HttpServlet> c) {}
    protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
    protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
    private void maybeSetLastModified(HttpServletResponse resp, long lastModified) {}
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {}
}
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
    private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");
    private transient ServletConfig config;
    public GenericServlet() {}
    public void destroy() {}
    public String getInitParameter(String name) {}
    public Enumeration<String> getInitParameterNames() {}
    public ServletConfig getServletConfig() {}
    public ServletContext getServletContext() {}
    public String getServletInfo() {}
    public void init(ServletConfig config) throws ServletException {}
    public void init() throws ServletException {} //让子类复写用
    public void log(String msg) {}
    public void log(String message, Throwable t) {}
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    public String getServletName() {}
}
public interface ServletConfig {
    String getServletName();
    ServletContext getServletContext();
    String getInitParameter(String var1);
    Enumeration<String> getInitParameterNames();
}
public interface Servlet {
    void init(ServletConfig var1) throws ServletException;
    ServletConfig getServletConfig();
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    String getServletInfo();
    void destroy();
}

二、Servlet生命周期:

public class InitServlet extends HttpServlet{
    //初始化servlet,调用init方法,只调用一次.
    @Override
    public void init() throws ServletException {
        System.out.println("初始化时调用");
    }
    //每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。
    //service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        System.out.println("开启服务时调用");
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }
    //方法只会被调用一次,在 Servlet 生命周期结束时被调用。
    //destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
    //在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。
    @Override
    public void destroy() {
        System.out.println("销毁时调用");
    }
}

2.1 init初始化操作
实例1: 读取web.xml的配置信息。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
   <!-- 声明初始化参数,这里初始化对应的xml文件(全局) -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:/config/spring/applicationContext.xml,classpath*:/config/spring/applicationContext-repository.xml
        </param-value>
    </context-param>
    <servlet>
        <servlet-name>initServlet</servlet-name>
        <servlet-class>com.examples.servlet.InitServlet</servlet-class>
   <!-- 对initServlet进行初始化参数(局部) -->
        <init-param>
            <param-name>initParam1</param-name>
            <param-value>initServlet的初始参数:1</param-value>
        </init-param>
        <init-param>
            <param-name>initParam2</param-name>
            <param-value>initServlet的初始参数:2</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>initServlet</servlet-name>
        <url-pattern>/ServletInit</url-pattern>
    </servlet-mapping>
</web-app>

InitServlet.java

public class InitServlet extends HttpServlet {

    public void init() throws ServletException {

        String servletName=getServletConfig().getServletName();
        System.out.println("ABO:---->servletName:【"+servletName+"】");

        String contextParam =getServletConfig().getServletContext().getInitParameter("contextConfigLocation");
        System.out.println("ABO:---->contextParam:【"+contextParam+"】");

        Enumeration <String > enums=getServletConfig().getInitParameterNames();
        while(enums.hasMoreElements()){
            String param=enums.nextElement();
            String paramValue=getInitParameter(param);
            System.out.println("ABO:---->ParameterValues:【"+paramValue +"】");
        }

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
     
}

控制台输出

ABO:---->servletName:【initServlet】
ABO:---->contextParam:【classpath*:/config/spring/applicationContext.xml,classpath*:/config/spring/applicationContext-repository.xml】
ABO:---->ParameterValues:【initServlet的初始参数:2】
ABO:---->ParameterValues:【initServlet的初始参数:1】

2.2. Servlet接收和响应浏览器请求
Servlet使用HttpServletRequest和HttpServletResponse处理浏览器请求以及对浏览器进行响应。
其中重定向和转发的区别:

  • 重定向会改变地址栏的内容,转发不会。
  • 重定向是两次请求的过程,而转发只有一次。重定向是由浏览器完成的,转发是服务器内部完成的转发由于是一次过程,所以request和response能在Servlet和jsp中共享,可以在里面添加Attribute,而重定向是两次过程,两次之间的request和response是独立的。
  • 转发和重定向代码中的path路径的写法也不一样,转发中的/代表服务器的web站点目录,重定向/代表webapps这个目录。

HttpServletRequest API

Cookie[] getCookies():返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。
Enumeration getAttributeNames():返回一个枚举,包含提供给该请求可用的属性名称。
Enumeration getHeaderNames():返回一个枚举,包含在该请求中包含的所有的头名。
Enumeration getParameterNames():返回一个String对象的枚举,包含在该请求中包含的参数的名称。
HttpSession getSession():返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。
HttpSession getSession(boolean create):返回与该请求关联的当前 HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。
Locale getLocale():基于 Accept-Language 头,返回客户端接受内容的首选的区域设置。
Object getAttribute(String name):以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。
ServletInputStream getInputStream():使用 ServletInputStream,以二进制数据形式检索请求的主体。
String getAuthType():返回用于保护 Servlet 的身份验证方案的名称,例如,"BASIC" 或 "SSL",如果JSP没有受到保护则返回 null。
String getCharacterEncoding():返回请求主体中使用的字符编码的名称。
String getContentType():返回请求主体的 MIME 类型,如果不知道类型则返回 null。
String getContextPath():返回指示请求上下文的请求 URI 部分。
String getHeader(String name):以字符串形式返回指定的请求头的值。
String getMethod():返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。
String getParameter(String name):以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。
String getPathInfo():当请求发出时,返回与客户端发送的 URL 相关的任何额外的路径信息。
String getProtocol():返回请求协议的名称和版本。
String getQueryString():返回包含在路径后的请求 URL 中的查询字符串。
String getRemoteAddr():返回发送请求的客户端的互联网协议(IP)地址。
String getRemoteHost():返回发送请求的客户端的完全限定名称。
String getRemoteUser():如果用户已通过身份验证,则返回发出请求的登录用户,或者如果用户未通过身份验证,则返回 null。
String getRequestURI():从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。
String getRequestedSessionId():返回由客户端指定的 session 会话 ID。
String getServletPath():返回调用 JSP 的请求的 URL 的一部分。
String[] getParameterValues(String name):返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null。
boolean isSecure():返回一个布尔值,指示请求是否使用安全通道,如 HTTPS。
int getContentLength():以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。
int getIntHeader(String name):返回指定的请求头的值为一个 int 值。
int getServerPort():返回接收到这个请求的端口号。
int getParameterMap():将参数封装成 Map 类型。

HttpServletResponse API

String encodeRedirectURL(String url):为 sendRedirect 方法中使用的指定的 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
String encodeURL(String url):对包含 session 会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
boolean containsHeader(String name):返回一个布尔值,指示是否已经设置已命名的响应报头。
boolean isCommitted():返回一个布尔值,指示响应是否已经提交。
void addCookie(Cookie cookie):把指定的 cookie 添加到响应。
void addDateHeader(String name, long date):添加一个带有给定的名称和日期值的响应报头。
void addHeader(String name, String value):添加一个带有给定的名称和值的响应报头。
void addIntHeader(String name, int value):添加一个带有给定的名称和整数值的响应报头。
void flushBuffer():强制任何在缓冲区中的内容被写入到客户端。
void reset():清除缓冲区中存在的任何数据,包括状态码和头。
void resetBuffer():清除响应中基础缓冲区的内容,不清除状态码和头。
void sendError(int sc):使用指定的状态码发送错误响应到客户端,并清除缓冲区。
void sendError(int sc, String msg):使用指定的状态发送错误响应到客户端。
void sendRedirect(String location):使用指定的重定向位置 URL 发送临时重定向响应到客户端。
void setBufferSize(int size):为响应主体设置首选的缓冲区大小。
void setCharacterEncoding(String charset):设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
void setContentLength(int len):设置在 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTP Content-Length 头。
void setContentType(String type):如果响应还未被提交,设置被发送到客户端的响应的内容类型。
void setDateHeader(String name, long date):设置一个带有给定的名称和日期值的响应报头。
void setHeader(String name, String value):设置一个带有给定的名称和值的响应报头。
void setIntHeader(String name, int value):设置一个带有给定的名称和整数值的响应报头。
void setLocale(Locale loc):如果响应还未被提交,设置响应的区域。
void setStatus(int sc):为该响应设置状态码。

浏览器会话对象:Session 、Cookie
Session API

public Object getAttribute(String name):该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
public Enumeration getAttributeNames():该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
public long getCreationTime():该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
public String getId():该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
public long getLastAccessedTime():该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
public int getMaxInactiveInterval():该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
public void invalidate():该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
public boolean isNew():如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
public void removeAttribute(String name):该方法将从该 session 会话移除指定名称的对象。
public void setAttribute(String name, Object value) :该方法使用指定的名称绑定一个对象到该 session 会话。
public void setMaxInactiveInterval(int interval):该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。

Cookie API

public void setDomain(String pattern):该方法设置 cookie 适用的域,例如 runoob.com。
public String getDomain():该方法获取 cookie 适用的域,例如 runoob.com。
public void setMaxAge(int expiry):该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
public int getMaxAge():该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
public String getName():该方法返回 cookie 的名称。名称在创建后不能改变。
public void setValue(String newValue):该方法设置与 cookie 关联的值。
public String getValue():该方法获取与 cookie 关联的值。
public void setPath(String uri):该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
public String getPath():该方法获取 cookie 适用的路径。
public void setSecure(boolean flag):该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
public void setComment(String purpose):设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
public String getComment():获取 cookie 的注释,如果 cookie 没有注释则返回 null。

示例:

package com.examples.servlet;
import com.examples.pojo.User;
import org.junit.Test;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;

public class InitServlet extends HttpServlet {

    public void init() throws ServletException {}

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //请求解码  响应设置编码
        req.setCharacterEncoding("UTF-8");
       
       // 获取字节输出流  处理响应乱码
       //OutputStream os = response.getOutputStream();
       //os.write("哈罗我的".getBytes("UTF-8"));

       // 获取字符输出流  处理响应乱码
       //PrintWriter out = resp.getWriter();
       //resp.setContentType("text/html;charset=UTF-8");

       //下面两个等同于resp.setContentType("text/html;charset=UTF-8");
       // 设置response缓冲区的编码
       //resp.setCharacterEncoding("UTF-8");
       // 设置浏览器打开文件所采用的编码
       //resp.setHeader("Content-Type", "text/html;charset=UTF-8");
   
        //0- 使用PrintWriter对象相应浏览器请求
        PrintWriter out = resp.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>InitServlet</title>");
        out.println("</head>");
        out.println("<body>");
        //1- 接收HttpServletRequest相关内容
        User user=new User();
        user.setUserName((String) req.getParameter("userName"));
        user.setPassword((String) req.getParameter("password"));
        out.println(user.getUserName()+"||"+user.getPassword());
        out.println("<br/>");
        //2- 接收cookies
        Cookie[] cookies = req.getCookies();
        for (int i = 0; i <cookies.length ; i++) {
             Cookie cookie=cookies[i];
             if (cookie.getName().equals("cookie")){
                out.println("Cookie:"+URLDecoder.decode(cookie.getValue(),"UTF-8"));
                out.println("<br/>");
             }
        }
        // 3- 接收Session
       HttpSession session=req.getSession();
       if(session.getAttribute("mySession")!=null){
            out.println(URLDecoder.decode((String) session.getAttribute("mySession"),"UTF-8"));
            out.println("<br/>");
        }
        //设置Cookie
        Cookie cookie=new Cookie("cookie", URLEncoder.encode("小饼干","UTF-8"));
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
        //设置Session
        session.setAttribute("mySession","我的名字:XSession");
        if (session.isNew()){
             out.write("注销后的Session,ID:"+session.getId());
             out.println("<br/>");
        }else {
             out.write("服务器初始Session,ID:"+session.getId());
             out.println("<br/>");
         }
        //注销cookie和session
        if("clear".equals(user.getPassword())){
             cookie.setMaxAge(0);
             session.invalidate();
        }
        out.println("</body>");
        out.println("</html>");
       }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
    }
 }

2.3 Servlet过滤器
Servlet 过滤器是可用于 Servlet 编程的 Java 类,过滤器是以一种组件的形式绑定到WEB应用程序当中的,与其他的WEB应用程序组件不同的是,过滤器是采用了“链”的方式进行处理的。可以实现以下目的:

  • 在客户端的请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应。
    CharEncodeFilter.java
package com.examples.filter;
import javax.servlet.*;
import java.io.IOException;

public class CharEncodeFilter implements Filter {
    private FilterConfig config = null; 
    public void init(FilterConfig arg0) throws ServletException {
        this.config = arg0;
        System.out.println("MyCharsetFilter初始化...");
    }
    public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain chain) throws IOException, ServletException{
        // 强制类型转换
        HttpServletRequest request = (HttpServletRequest) arg0;
        HttpServletResponse response = (HttpServletResponse) arg1;
        // 获取web.xm设置的编码集,设置到Request、Response中
        request.setCharacterEncoding(config.getInitParameter("charset"));
        response.setContentType(config.getInitParameter("contentType"));
        response.setCharacterEncoding(config.getInitParameter("charset"));
        // 将请求转发到目的地
        chain.doFilter(request, response);
    }
    public void destroy(){
        System.out.println("MyCharsetFilter准备销毁...");
    } 
    }

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
    <!-- 声明初始化参数,这里初始化对应的xml文件 -->
     <filter>
      <filter-name>filter</filter-name>
      <filter-class>com.examples.filter.CharEncodeFilter</filter-class>
      <init-param>
          <param-name>charset</param-name>
          <param-value>UTF-8</param-value>
      </init-param>
      <init-param>
          <param-name>contentType</param-name>
          <param-value>text/html;charset=UTF-8</param-value>
      </init-param>
      <filter-mapping>
          <filter-name>charEncodeFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
    <servlet>
        <servlet-name>initServlet</servlet-name>
        <servlet-class>com.examples.servlet.InitServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>initServlet</servlet-name>
        <url-pattern>/ServletInit</url-pattern>
    </servlet-mapping>
</web-app>

2.4 Servlet监听器
2.4.1 对Servlet上下文监听
可以监听ServletContext对象的创建和删除以及属性的添加、删除和修改等操作,该监听器需要用到如下两个接口类:
(1)ServletContextAttributeListener:监听对ServletContext属性的操作,比如增加、删除、修改。
(2)ServletContextListener:监听对ServletContext对象的创建和删除。

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServletContext implements   ServletContextListener,ServletContextAttributeListener{
   //上下文属性:添加、删除、修改监听
   //1.上下文属性添加监听
 public void attributeAdded(ServletContextAttributeEvent scae) {
         print("增加ServletContext对象的一个属性:"+scae.getName()+","+scae.getValue());
 }
    //2.上下文属性删除监听
 public void attributeRemoved(ServletContextAttributeEvent scae) {
         print("删除ServletContext对象的一个属性:"+scae.getName()+","+scae.getValue());
 }
    //3.上下文属性修改监听
 public void attributeReplaced(ServletContextAttributeEvent scae) {
         print("修改ServletContext对象的一个属性:"+scae.getName()+","+scae.getValue());
 }
   //上下文对象:创建、销毁监听
 //1.上下文对象创建监听
  public void contextInitialized(ServletContextEvent sce) {
         print("ServletContext初始化......"); }
 //2.上下文对象销毁监听
 public void contextDestroyed(ServletContextEvent sce) {
         print("ServletContext销毁......"); }
 @SuppressWarnings("deprecation")
 private void print(String message){
  //调用该方法在txt文件中打印出message字符串信息
  PrintWriter out = null;
  try {
        out = new PrintWriter(new FileOutputStream("F:context_result.txt",true));
        out.println(new java.util.Date().toLocaleString()+"contextListener:"+message);
        out.close();
  } catch (FileNotFoundException e) {
        e.printStackTrace();) }
}
}

2.4.2 对HTTP会话进行监听
可以监听http会话活动情况和http会话中的属性设置情况,也可以监听http会话的active和passivate情况等,该监听器需要用到如下多个接口类:
(1)HttpSessionListener:监听httpSession的操作。
(2)HttpSessionActivationListener:用于监听http会话的active和passivate情况。
(3)HttpSessionAttributeListener:监听HttpSession中的属性操作 。

import java.io.FileNotFoundException
import java.io.FileOutputStream;
import java.io.PrintWriter; 
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionListener implements HttpSessionActivationListener,HttpSessionAttributeListener,
HttpSessionListener,ServletContextListener{
       ServletContext context;
       int users;
   //session属性监听
   //1.监听属性添加
 public void attributeAdded(HttpSessionBindingEvent arg0) {
        print("attributeAdded('"+arg0.getSession().getId()+"','"+arg0.getName()+"','"+arg0.getValue()+"')");
 }
     //2.监听属性删除
 public void attributeRemoved(HttpSessionBindingEvent arg0) {
        print("attributeRemoved('"+arg0.getSession().getId()+"','"+arg0.getName()+"','"+arg0.getValue()+"')");
 }
     //3.监听属性替换
 public void attributeReplaced(HttpSessionBindingEvent arg0) {
        print("attributeReplaced('"+arg0.getSession().getId()+"','"+arg0.getName()+"','"+arg0.getValue()+"')");
 }
   //session会话创建监听
   //1.监听会话创建
 public void sessionCreated(HttpSessionEvent arg0) {
       users++;
       print("sessionCreated('"+arg0.getSession().getId()+"'),目前拥有"+users+"个用户");
       context.setAttribute("users",new Integer(users));
 }
     //2.监听会话释放
 public void sessionDestroyed(HttpSessionEvent arg0) {
       users--;
       print("sessionDestroyed('"+arg0.getSession().getId()+"'),目前拥有"+users+"个用户");
       context.setAttribute("users",new Integer(users));
 }
 public void contextInitialized(ServletContextEvent arg0) {
       this.context = arg0.getServletContext();
       this.print("ServletContext的初始化.....");
 } 
 public void contextDestroyed(ServletContextEvent arg0) {
       this.context = null;
       print("ServletContext的释放");
 }
   //session活动监听
   //1.监听会话的active情况
 public void sessionDidActivate(HttpSessionEvent arg0) {
       print("sessionDidActivate("+arg0.getSession().getId()+")");
 }
     //2.监听会话的passivate情况
 public void sessionWillPassivate(HttpSessionEvent arg0) {
       print("sessionWillPassivate("+arg0.getSession().getId()+")");
 }
 @SuppressWarnings("deprecation")
 private void print(String message){
  //调用该方法在txt文件中打印出message字符串信息
  PrintWriter out = null;
  try {
          out = new PrintWriter(new FileOutputStream("F:session_result.txt",true));
          out.println(new java.util.Date().toLocaleString()+"contextListener:"+message);
          out.close();
  } catch (FileNotFoundException e) {
          e.printStackTrace();
  }
 } 
}

2.4.3 对客户端请求进行监听
对客户端的请求进行监听是在Servlet2.4规范中新添加的一项新技术,使用的接口如下:
(1)ServletRequestListener接口类
(2)ServletRequestAttributeListener接口类

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class RequestListener implements ServletRequestListener,ServletRequestAttributeListener{

  //监听请求的初始化与否
  //1.对实现客户端请求进行监听
 public void requestInitialized(ServletRequestEvent arg0) {
          print("request的初始化");          
          print(arg0.getServletRequest().getRemoteAddr()+";"+arg0.getServletRequest().getRemoteHost()+","+arg0.getServletRequest().getRemotePort());
 }
    //2.对销毁客户端请求进行监听
 public void requestDestroyed(ServletRequestEvent arg0) {
          print("request的销毁");
 }
  //监听请求属性
  //1.对属性的添加进行监听
 public void attributeAdded(ServletRequestAttributeEvent arg0) {
          print("attributeAdded('"+arg0.getName()+"','"+arg0.getValue()+"')");
 }
    //2.对属性的删除进行监听
 public void attributeRemoved(ServletRequestAttributeEvent arg0) {
          print("attributeRemoved('"+arg0.getName()+"','"+arg0.getValue()+"')"); 
 }
    //3.对属性的更新进行监听
 public void attributeReplaced(ServletRequestAttributeEvent arg0) {
          print("attributeReplaced('"+arg0.getName()+"','"+arg0.getValue()+"')");
 }
 @SuppressWarnings("deprecation")
 private void print(String message){
  //调用该方法在txt文件中打印出message字符串信息
  PrintWriter out = null;
  try {
            out = new PrintWriter(new FileOutputStream("F: equest_result.txt",true));
            out.println(new java.util.Date().toLocaleString()+"RequestListener:"+message);
            out.close();
  } catch (FileNotFoundException e) {
            e.printStackTrace();
  }
 }
}

相关文章

  • <JavaWeb>Servlet技术简介

    笔记总结自网易云课堂Servlet系列课程 什么是Servlet Servlet == Server + Appl...

  • Head First Servlet & JSP读书笔记

    Head First Servlet & JSP读书笔记 本书内容:Servlet和JSP Servlet和JSP...

  • Tomcat Servlet 工作原理

    简单叙述Tomcat Servlet工作原理,做一下笔记。 Servlet Servlet有很多种实现,例如:Je...

  • servlet学习笔记

    title: servlet学习笔记date: 2019-11-07 21:01:05tags: servlet学...

  • Servlet学习笔记,编写第一个servlet

    Servlet学习笔记,编写第一个servlet 用到的软件/工具:JDK1.6以上、maven 3.1.0、to...

  • Servlet笔记

    Servlet: 配置:两种方式 -> web.xml或Annotation1)在web.xml中配置:配置Ser...

  • servlet笔记

    一、ServerLet是什么?什么是CGI程序? 答:ServerLet是运用在web服务器或运用服务器上的程序作...

  • servlet 笔记

    servlet servlet 声明周期 Servlet 的线程安全 Servlet 获取配置信息 Servlet...

  • Servlet笔记

    JavaWeb应用的概念 在Sun的Java Servlet规范中,对Java Web应用作了这样定义:“Java...

  • Servlet笔记

    Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java...

网友评论

      本文标题:Servlet笔记

      本文链接:https://www.haomeiwen.com/subject/wyhupktx.html