Java Servlet
前置
Servlet继承HttpServlet类,重写相应请求方法的do类
public class MyServlet extends HttpServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response){
//.....
}
}
//获取字段内容
Object value = request.getParameter(key);
请求的中文乱码问题
//get方式目前不需要设置编码(基于tomcat8)
//如果是get请求发送的中文数据,转码稍微有点麻烦(tomcat8之前)
String fname = request.getParameter("fname");
//1.将字符串打散成字节数组
byte[] bytes = fname.getBytes("ISO-8859-1");
//2.将字节数组按照设定的编码重新组装成字符串
fname = new String(bytes,"UTF-8");
//post方式下,设置编码,防止中文乱码
//需要注意的是,设置编码这一句代码必须在所有的获取参数动作之前
request.setCharacterEncoding("UTF-8");
Servlet的继承关系 - 重点查看的是服务方法(service())
继承关系
- javax.servlet.Servlet - 接口
- javax.servlet.GenericServlet - 抽象类
- javax.servlet.http.HttpServlet - 抽象子类
- javax.servlet.GenericServlet - 抽象类
相关方法
- javax.servlet.Servlet接口:
- void init(config) - 初始化方法
- void service(request,response) - 服务方法
- void destory() - 销毁方法
- javax.servlet.GenericServlet抽象类:
- void service(request,response) - 仍然是抽象的
- String method = req.getMethod(); 获取请求的方式
- 各种if判断,根据请求方式不同,决定去调用不同的do方法
- 在HttpServlet这个抽象类中,do方法都差不多
- void service(request,response) - 仍然是抽象的
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")) {
}
//*********************************************
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
小结
- 继承关系: HttpServlet -> GenericServlet -> Servlet
- Servlet中的核心方法: init() , service() , destroy()
- 服务方法: 当有请求过来时,service方法会自动响应(其实是tomcat容器调用的),在HttpServlet中我们会去分析请求的方式:到底是get、post、head还是delete等等;然后再决定调用的是哪个do开头的方法,那么在HttpServlet中这些do方法默认都是405的实现风格-要我们子类去实现对应的方法,否则默认会报405错误
- 因此,我们在新建Servlet时,我们才会去考虑请求方法,从而决定重写哪个do方法
Servlet的生命周期
-
生命周期:从出生到死亡的过程就是生命周期。对应Servlet中的三个方法:init(),service(),destroy()
-
默认情况下:
第一次接收请求时,这个Servlet会进行实例化(调用构造方法)、初始化(调用init())、然后服务(调用service());从第二次请求开始,每一次都是服务去服务;当容器关闭时,其中的所有的servlet实例会被销毁,调用销毁方法
- 通过案例我们发现:
- Servlet实例tomcat只会创建一个,所有的请求都是这个实例去响应
- 默认情况下,第一次请求时,tomcat才会去实例化,初始化,然后再服务.好处是提高系统的启动速度 。 缺点是第一次请求时,耗时较长。
- Servlet的初始化时机
- 默认是第一次接收请求时,实例化,初始化
- 我们可以通过
来设置servlet启动的先后顺序,数字越小,启动越靠前,最小值0
- Servlet在容器中是:单例的、线程不安全的
- 尽量的不要在servlet中定义成员变量。如果不得不定义成员变量,那么
- 不要去修改成员变量的值
- 不要去根据成员变量的值做一些逻辑判断
- 尽量的不要在servlet中定义成员变量。如果不得不定义成员变量,那么