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 方式:
request.setCharacterEncoding("UTF-8");
2、get 方式
2-1、tomcat8以后不需要设置
2-2、tomcat8之前,将字符串打散成字节数组,再按照需要的编码重新组成字符串
String fname = request.getParameter("fname");
byte[] bytes = fname.getBytes("ISO-8859-1");
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) 服务器内部转发:
客户端无感知
req.getRequestDispatcher("...").forward(req, resp);
保存作用域
- page 页面级别,现在几乎不用
- request 一次请求
- 重定向不会携带前一次请求的数据
- 内部转发会携带前一次的请求数据 ```java String requestAttrName = “helloRequestAttr”; String requestAttrValue = “helloRequestAttr-VALUE”;
request.setAttribute(requestAttrName, requestAttrValue);
// thymeleaf表达式
request field value
- session 一次会话
```java
// ①通过request对象获取session对象
HttpSession session = request.getSession();
// ②存入数据
session.setAttribute("helloSessionAttr", "helloSessionAttr-VALUE");
// thymeleaf表达式
<p th:text="${session.helloSessionAttr}">这里显示会话域数据</p>
- application 应用 ```java // ①通过调用父类的方法获取ServletContext对象 ServletContext servletContext = getServletContext();
// ②存入数据 servletContext.setAttribute(“helloAppAttr”, “helloAppAttr-VALUE”);
// thymeleaf表达式
这里显示应用域数据
```