2 request请求转发
1.1.1 POST请求方式乱码处理
乱码产生的原因:
网络之间传输数据,统一传输编码为UTF-8
我们编写的源码编码为UTF-8,为了保证不乱码,服务器的解析编码必须是UTF-8
也就是我们常说的三码和一,文件编码,传输码,解析码都为UTF-8
但,tomcat的默认解析编码为ISO-8859-1,所以只要写中文一定乱码
解决方案:
方式1:先解码,后重新编码
//对获取到的内容先解码,然后重新编码
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
方式2:设置请求的解析编码为UTF-8(一定在数据接收之前)
//在接收数据之前设置解析码为UTF-8
request.setCharacterEncoding("UTF-8");
1.1.2 GET请求方式乱码处理
l GET请求只有一种解决方案,即先解码,后重新编码
l 使用username.getBytes("ISO-8859-1");方式把乱码内容还原成解析前的字节
l 使用new String(value,"UTF-8");对内容重新编码,使得乱码问题得以解决
2 request请求转发
2.1 request作为 域对象 使用
转发(forward)
可以理解为就是内容性跳转,地址栏不会发生改变,不可以跳转到外部资源,只能转到站内资源。
获得请求转发器
RequestDispatcher getRequestDispatcher(String path)
通过转发器对象转发
forward(ServletRequest request, ServletResponse response)
总结:浏览器客户端总向服务器发起了一次请求,但是服务器内部悄悄的做了资源替换,最终呈现的内容其实不是用户直接请求的那个内容
优点:1,资源在服务器内部做了替换,效率非常高
2,有效的保护真正资源地址
2.2 request作为 域对象 使用
【用来暂时存放数据,用法相当于一个map】
//给request对象中加入一个值,两个参数分别表示参数的名称key以及参数的值value
request.setAttribute("url", "www.baidu.cn");
//根据参数的名称获取参数的值value,参数名为对应存储的参数名称key
String url = (String) request.getAttribute("url");
System.out.println("url:"+url);
//移除存储的数据信息,通过key移除value
request.removeAttribute("url");
3 response响应对象
3.1 介绍
response对象是专门用来给客户端响应数据的!
HTTP协议规定,响应的数据由3个部分组成:
1. 响应行 协议和版本 状态码 状态描述
2. 响应头 给浏览器的额外信息
3. 响应体 也就是响应的内容
【浏览器根据不同的状态码,会给出不同的处理方式。】
3.2 请求重定向
重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置。
可以理解为就是完全性跳转,地址栏会发生改变,可以跳转到外部资源,其实就是浏览器重新发起了一次请求。
设置响应状态码为302,告诉浏览器所请求的资源已转移至新的url
同时设置响应头location,告诉浏览器资源被转移到了哪个位置,浏览器会重新请求新的地址。
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//告诉浏览器,你请求的资源转移了
response.setStatus(302);
//告诉浏览器转移的地址
response.setHeader("location", "http://www.baidu.cn");
}
请求重定向的简单写法:
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//请求重定向的另一种写法,更常用
response.sendRedirect("http://www.baidu.cn");
}
注:
2XX:请求OK
3XX:重定向信息
4XX:找不到或者不可用
5XX:请求到了目标资源,但是服务器内部有错,不能正常响应
4 ServletContext
4.1 ServletContext对象介绍
如图ServletContext代表整个web应用,所有的servlet共享同一个ServletContext
我们又把ServletContext称为Servlet的资源管理器。
功能有
1, 获取全局初始化参数
2, 作为域对象使用,ServletContext对象是整个WEB应用的域对象
3, 获取资源在应用中的绝对路径
4.2 ServletContext域对象
由于ServletContext对象是WEB应用的域对象,能够被所有的Servlet所共享,所以能够实现数据的共享。
ServletContextText.java部分代码
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取context对象
ServletContext servletContext = request.getServletContext();
//向context对象中加入值
servletContext.setAttribute("address", "上海市浦东新区");
//从context对象中获取值
String address = (String) servletContext.getAttribute("address");
System.out.println("address:"+address);
}
ServletContextTest01.java部分代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletContext对象
ServletContext servletContext = request.getServletContext();
//从context对象中获取值
String address = (String) servletContext.getAttribute("address");
System.out.println("address:"+address);
}
ServletContext的生命周期,web项目发布运行后,它就存在了,服务器关闭时销毁
1, 获取全局配置参数
2, 作为域对象使用
3, 由于所有的servlet共享了同一个ServletContext所以只要服务器没有重启,在任何一个ServletContext中存入了值,在其他的servlet中都可以取得到
5 重点总解
5.1 Servlet的执行流程
Servlet的执行流程【重要:要能明白一个请求从发出到,到达servlet并执行其内部方法的全过程】
项目发布后的内容:
1, 项目的根目录
2, 项目根目录中没有,就要去找WEB-INF/web.xml文件
5.2 使用request获取请求的数据
request获得请求行信息和ip地址
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取请求方式
String method = request.getMethod();
//获取URI,请求资源标识符
String uri = request.getRequestURI();
//获取URL,请求资源定位符
String url = request.getRequestURL().toString();
//获取请求协议
String protocol = request.getProtocol();
//获取客户端ip}
request获取头信息
public class Header extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取所有的请求头信息,返回一个枚举集合
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String string = (String) headerNames.nextElement();
System.out.println(string);
}
//根据具体的请求头名称获取对应的值
//获取浏览器的版本信息
String agent = request.getHeader("user-agent");
System.out.println("agent:"+agent);
}
}
5.3 使用response返回响应得数据
响应体:给浏览器发送的网页内容
在response对象中,有2个对象可以完成内容的响应:
OutputStream: 字节流
Writer: 字符流
这两种都可以完成网页内容的响应,OutputStream主要用于后期资源的下载,而响应网页内容一般使用Writer来完成
PrintWriter writer = response.getWriter();
writer.write("你好");
writer.println(",李四");
write方法和println方法的区别是,参数的类型不同,print方法可以接收任意类型的参数,然后最终调用write方法响应字符内容,当print方法中给一个对象的时候,会自动调用对象的toString方法
字节流和字符流不能同时使用,否则会报异常!
5.4 转发和重定向的区别
转发的速度快;重定向速度慢
转发的是同一次请求;重定向是两次不同请求
转发不会执行转发后的代码;重定向会执行重定向之后的代码
转发地址栏没有变化;重定向地址栏有变化
转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
5.5 GET,POST中文编码处理(URLEncode,URLDecode)
l GET请求只有一种解决方案,即先解码,后重新编码
l 使用username.getBytes("ISO-8859-1");方式把乱码内容还原成解析前的字节
l 使用new String(value,"UTF-8");对内容重新编码,使得乱码问题得以解决
1.6 Request和ServletContext作用域区别
servletContext 它代表了servlet环境的上下文,相当于一个全局变量,即只要某个web应用在启动中,这个对象就一直都有效的存在,所以它的范围是最大的,存储的数据可以被所有用户使用,只要服务器不关闭,数据就会一直都存在
Request 保存的键值仅在下一个request对象中可以得到。