1. 编码设置
- get请求
- tomcat8之前:需要使用代码进行转换
String fname = request.getParameter("fname"); //1.将字符串打散成字节数组 byte[] bytes = fname.getBytes("ISO-8859-1"); //2.将字节数组按照设定的编码重新组装成字符串 fname = new String(bytes,"UTF-8");
- tomcat8之后:不需要设置编码
- post请求
在获取请求参数之前设置编码request.setCharacterEncoding("UTF-8");
2. Servlet类继承关系
javax.servlet.Servlet接口 → javax.servlet.GenericServlet抽象类 → javax.servlet.http.HttpServlet抽象子类
3. Servlet常用接口
Servlet主要可以override重写三个方法,这三个方法也对应着Servlet的生命周期:实例化(调用构造方法)、初始化(调用init())、然后服务(调用service())、当容器销毁的时候调用destroy()
- 初始化:
void init(config)
- 服务:
void service(request,response)
在javax.servlet.GenericServlet中仍是抽象方法,在javax.servlet.http.HttpServlet中实现,完成对于方法是什么的判断并执行
javax.servlet.http.HttpServlet中的service源码如下:
重写doPost或者doGet方法(如果没有重写就会执行javax.servlet.http.HttpServlet中的doPost或者doGet报405错误)String method = req.getMethod(); 获取请求的方式(get/post) if (method.equals("GET")) { this.doGet(req,resp); } else if (method.equals("HEAD")) { this.doHead(req, resp); } else if (method.equals("POST")) { this.doPost(req, resp); } else if (method.equals("PUT")) { }
注意:service方法与doPost/doGet的关系为:先执行service,由其中的@Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
String method = req.getMethod();
来判断具体执行什么方法 - 销毁:
void destory()
4. Servlet的特点
- 由于Servlet的实例只创造一个(在第一次发出请求的时候)即单例,因此Servlet是线程不安全的。Servlet最好不要定义成员变量
- 在web.xml中通过
<load-on-startup>
来设置servlet启动的先后顺序,数字越小,启动越靠前,最小值0
5. Http协议
-
HTTP 是无状态的,服务器无法判断两次请求是同一个客户端发过来的,还是不同的客户端发过来的,可以通过会话跟踪技术来解决无状态的问题。会话跟踪技术:sessionID
常用的API有:
request.getSession() //获取当前的会话,没有则创建一个新的会话 request.getSession(true) //效果和不带参数相同 request.getSession(false) //获取当前会话,没有则返回null,不会创建新的 session.getId() //获取sessionID session.isNew() //判断当前session是否是新的 session.getMaxInactiveInterval() //session的非激活间隔时长,默认1800秒 session.setMaxInactiveInterval() session.invalidate() //强制性让会话立即失效 //session保存作用域 //session保存作用域是和具体的某一个session对应的 //常用的API: void session.setAttribute(k,v) Object session.getAttribute(k) void removeAttribute(k)
-
Http包含两个部分:请求和响应
- 请求:
- 请求行: 1. 请求的方式 ; 2.请求的URL ; 3.请求的协议(一般都是HTTP1.1)
- 请求消息头:浏览器型号、版本、能接收的内容的类型、发的内容的类型、内容的长度等
- 请求体,三种情况:
get方式,没有请求体,但是有一个queryString
post方式,有请求体,form data
json格式,有请求体,request payload
- 响应:
- 响应行:1.协议 2.响应状态码(200) 3.响应状态(ok)
- 响应头:服务器的信息;服务器发送给浏览器的信息(内容的媒体类型、编码、内容长度等)
- 响应体:响应的实际内容(比如请求add.html页面时,响应的内容就是<form…)
- 请求:
6. 服务器内部转发以及客户端重定向
-
服务器内部转发 :
request.getRequestDispatcher("...").forward(request,response);
- 一次请求响应的过程,对于客户端而言,内部经过了多少次转发,客户端是不知道的
- 地址栏没有变化
-
客户端重定向:
response.sendRedirect("....");
- 两次请求响应的过程。客户端知道请求URL有变化
- 地址栏有变化