Servlet生命周期
- 生命周期
<load-on-startup>0</load-on-startup>
当属性值为正整数范围内,Servlet会按照值的大小来启动
值越小的启动越早
当被访问时构造并初始化,先执行带参的init再执行不带参的
最后在服务器关闭的销毁
Servlet在接收请求和输出时乱码
- request乱码时
请求为post时,在程序的第一行加入
请求为get时,无法通过request本身解决
需要重新编码
request.setCharsetEncoding("utf-8");
new String(name.getBytes("iso-8859-1"),"utf-8")
- response乱码时
//在页面加入
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
//在程序中加入
response.setCharacterEncoding("UTF-8");
response.setHeader("content-type","text/html;charset=UTF-8");
response.setContentType("text/html;charset=utf-8");
Servlet的属性
ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
ServletContext:对任何servlet,任何人在任何时间都有效
<init-param>
<param-name>charset</param-name>
<param-value>GB2312</param-value>
</init-param>
当init-param单独配置在servlet标签中则是ServletConfig的值,并且只有对应的Servlet才能拿到
而配置在web-app中则是ServletContext的值,任何时刻都能获取到
Servlet的转发和重定向
- 转发forword
假设浏览器访问servlet1,而servlet1想让servlet2为客户端服务。此时servlet1调用forward()方法,将请求转发给servlet2。但是调用forward()方法,对于浏览器来说是透明的,浏览器并不知道为其服务的Servlet已经换成Servlet2,它只知道发出了一个请求,获得了一个响应。浏览器URL的地址栏不变。
request.getRequestDispatcher("目标servlet").forword(req,res);
- 重定向sendRedirect
假设浏览器访问servlet1,而servlet1想让servlet2为客户端服务。此时servlet1调用sendRedirect()方法,将客户端的请求重新定向到Servlet2。接着浏览器访问servlet2,servlet2对客户端请求作出反应。浏览器URL的地址栏改变。
response.sendRedirect("目标网页");
- 二者的区别
sendRedirect()可以发到任意主机,forward不行
forward是同一个请求,request延续
forward浏览器地址栏不发生改变
Servlet中的资源路径
getRealPath获取的是项目根路径
项目部署在哪里路径就在哪里
getClass().getResource获取的是类路径