Servlet的生命周期
Servlet的生命周期体现在以下几个方法:
l 构造器:第一次请求servlet的时候执行,证明第一次请求servlet的时候,servlet对象被创建,在整个生命周期中只执行一次,用于创建servlet对象;
l Init: 第一次请求servlet的时候执行,用于初始化servlet,在整个生命周期中只执行一次;
l Service:每次请求servlet都会执行,用户获取客户端请求,执行多次;
l Destroy:关闭服务器的时候执行,只执行一次,用于销毁servlet;
ServletConfig和ServletContext接口
ServletConfig:
代表servlet的配置,存在于servlet中的init方法中
1.可以获取注册时servlet的名称
2.可以获取初始化参数
3.还可以获取servletContext对象
ServletContext:
意思为servlet上下文,代表当前的web应用
1.可以获取当前web应用的初始化参数
2.获取项目中资源的真实路径
转发和重定向
l 转发:客户端向目标资源发送请求的时候,目标资源又把请求交个另一个资源进行处理的过程;如果另一个资源是图片或者是html直接给浏览器响应当前文件
l 转发流程图:
l 重定向流程图:
l 转发和重定向的区别:
-
转发往服务器发送一次请求;重定向往服务器发送两次请求
-
转发地址栏不发生变化;重定向地址栏发生变化
-
转发在服务器内部完成,浏览器感知不到;重定向是给浏览器发送302状态码,告诉浏览器访问新的的值
-
转发可以访问WEB-INF下的资源;重定向不能访问WEB-INF下的资源
请求响应乱码问题
l 编码:把字符转为二进制的过程称为编码
l 解码:把二进制转换为字符称为解码
l 乱码:当编码和解码格式不一致的时候就会出现乱码
编码格式需和解码格式保持一致
请求中含有中文:请求是由客户端发送给服务器
由浏览器编码:
浏览的编码格式使用由.html中meta中的charset属性值来指定,通常指定为utf-8
由服务解码:服务默认的解码格式为iso-8859-1(具体情况见下)
问题的解决
Post请求:
post请求中含有中文的话,由服务器解码, 解码是在servlet中进行的 ,servlet的默认解码格式为iso-8859-1,那么需要设置servlet的解码格式为utf-8,对请求体中的内容进行解码,即通过:request.setCharacterEncoding(“utf-8”); 注意:要设置在request.getParameter之前;
Get请求:
get请求的请求信息存储在地址栏,由tomcat服务器优先获取,所以被tomcat优先解码**,tomcat7默认解码格式为iso8859-1, tomcat8默认解码格式为utf-8,那么需要设置tomcat7的解码格式为utf-8,即在tomcat7的server.xml文件中加入URIEncoding=“utf-8”,解决乱码问题;
响应中含有中文:
响应是由服务器发送给客户端
由服务器编码:默认编码格式iso-8859-1
由客户端解码:默认解码格式为GBK
问题的解决:
告诉浏览器使用utf-8对响应体中的内容进行解码,并且响应体也会使用该字符集编码
response.setContentType(“text/html;charset=utf-8”);
web应用中的路径问题
“/”代表绝对路径
在浏览器中“/”绝对路径代表:http://localhost:8080/
哪些地址由浏览器解析:a标签,script标签中的src;link标签中的href、重定向中的地址都是由浏览器解析
在服务器中“/”绝对路径代表:http://localhost:8080/项目名称/
哪些地址由服务器解析:转发中的地址,web.xml中utl-pattern中的地址,getServletContext().getRealPath("")