Servlet流程

1、用户请求,action = add
2、在项目中的 web.xml 文件的 servlet-mapping 中匹配 url-pattern,找到对应的 servlet-name
3、再从 servlet 中根据 servlet-name 找到对应的 servlet-class
4、根据发送的是 get 或 post 请求,执行相应的 Servlet 中 doGet 或者 doPost 方法

Servlet处理参数中文乱码

1、post 方式:

  1. request.setCharacterEncoding("UTF-8");

2、get 方式
2-1、tomcat8以后不需要设置
2-2、tomcat8之前,将字符串打散成字节数组,再按照需要的编码重新组成字符串

  1. String fname = request.getParameter("fname");
  2. byte[] bytes = fname.getBytes("ISO-8859-1");
  3. fname = new String(bytes, "UTF-8");

Servlet 继承关系

javax.servlet.Servlet 接口
— void init(config) 初始化方法
— void service(request, response) 服务方法
— void destroy() 销毁方法
javax.servlet.GenericServlet 抽象类
— void service(request, response) 抽象方法
javax.servlet.http.HttpServlet 抽象子类
— void service(request, response) 具体实现,做具体的 doGet doPost 分发等等

Servlet生命周期

1、init 初始化:第一次请求实例化, 初始化 servlet
或者在 load-on-startup 启动,数字越小,启动越靠前,最小值0
2、service:第二次请求开始都是服务,不再进行实例化
3、destroy:容器关闭,servlet实例销毁

Servlet 在容器中是单例,线程不安全的

服务器内部转发以及重定向

1) 服务器内部转发:
客户端无感知

  1. req.getRequestDispatcher("...").forward(req, resp);


2)客户端重定向:
客户端地址链接变化

保存作用域

  • page 页面级别,现在几乎不用
  • request 一次请求
    • 重定向不会携带前一次请求的数据
    • 内部转发会携带前一次的请求数据 ```java String requestAttrName = “helloRequestAttr”; String requestAttrValue = “helloRequestAttr-VALUE”;

request.setAttribute(requestAttrName, requestAttrValue);

// thymeleaf表达式

request field value

  1. - session 一次会话
  2. ```java
  3. // ①通过request对象获取session对象
  4. HttpSession session = request.getSession();
  5. // ②存入数据
  6. session.setAttribute("helloSessionAttr", "helloSessionAttr-VALUE");
  7. // thymeleaf表达式
  8. <p th:text="${session.helloSessionAttr}">这里显示会话域数据</p>
  • application 应用 ```java // ①通过调用父类的方法获取ServletContext对象 ServletContext servletContext = getServletContext();

// ②存入数据 servletContext.setAttribute(“helloAppAttr”, “helloAppAttr-VALUE”);

// thymeleaf表达式

这里显示应用域数据

```