JavaWeb学习-02(response和request)
一、request对象
1.HttpServletRequest是ServletRequest的子接口
request对象用于接收客户端传递过来的请求内容,通过该对象的各种方法来获取请求中的内容,以便于后台根据请求的内容进行处理。
2.request对象的常用方法
①:获取请求的完整路径,从http到?之前的数据
String url=request.getRequestURL()+"";//该方法返回的不是字符串,所以需要转为字符串。
②:获取请求的部分路径,从站点名到?之前
String uri=request.getRequestURI();
③: 获取请求时的参数字符串,从?之后的内容
String qurString=request.getQueryString();
④:获取指定名称的参数值
String userName=request.getParameter(“userName”);
⑤:获取协议版本
String version=request.getProtocol();
⑥: 获取请求的方法
String method=request.getMethod();
⑦:获取传递过来的有多个值的参数的值,以数组的形势获取
String[] likes=request.getParameterValues(“like”);
3.request乱码问题
原因:在浏览器中默认使用的编码格式是ISO-8859-1,该编码是支持中文的,所以对传递中文会乱码。
1. Tomcat8.0及以上 :
GET请求:GET请求不会乱码
POST请求 : 会乱码
2.Tomcat7.0及以下
GET请求: 会乱码
POST请求 : 会乱码
3.post请求乱码解决:
在获取信息之前设置request的编码格式:request.setCharacterEnconding(“UTF-8”);注:只能用于POST请求
4.所有请求乱码都能解决:
获取传过来的字节序列,再将其转换为UTF-8的编码格式;(只允许在7.0及以下,否则在8.0不会乱码,都乱码了),此方 法针对于任何请求有乱码的
解决:String s=new(request.getParameter(“name”).getBytes(“ISO-8859-1”),“UTF-8”));
4.request的转发跳转
服务器在接受到了客户端的请求之后,根据传递过来的请求可以进行跳转。可以跳转到指定的JSP、HTML或者Java类。
1.request转发跳转的特点
①.是服务器端的行为
②.浏览器中的地址栏不会发生变化
③.使用的都是一个请求
④.数据共享,在进行转发跳转的时候使用的是同一个request请求的数据
//请求转发跳转到另外一个实现了HttpServlet的类,getRequestDispatcher()中传递的是跳转的地址,forward()是将请求的数据转发过去
request.getRequestDispatcher("/ser01").forward(request, response);
//请求跳转到其他的html或者JSP页面
request.getRequestDispatcher("/NewFile.html").forward(request, response);
注意:转发跳转只能使用一个,不能同时使用
5.request域对象
在服务器获取了客户端发送过来的请求数据之后,我们还可以在request的域对象中添加数据。作用范围只在一次请求中有效,但是可以多次请求转发。
//1.设置域对象中的内容
request.setAttribute(String name,Object value);//类似于键值对,其中值的类型为对象,即可以传整数、字符串、集合等等
//2.获取域对象中的内容
requset.getAttribute(String name);//注意当获取的时候要注意接收时候的数据类型,可能会需要进行类型转换
//3.删除对象中的内容
requset.removeAttribuet(String name)
二、response对象
1.response对象
每次发送请求都会有一个response 和request的对象传递过来,通过response对象向浏览器传递数据。
1.获取的方法:注:两种方法只能使用一种,不能同时使用
getWriter()获取字符流的输出对象,只能输出字符串
getOutputStream()获取字节流的输出对象,能输出所有的数据类型
//获取字符流
PrintWriter writer=response.getWriter();
writer.write("你好");
//获取字节流
ServletOutputStream outStream=response.getOutputStream();
outStream.write("你好!!".getBytes());//传递的参数要是字符串的字节码
2.乱码问题
①:字符流getWriter():必定会产生乱码,在客户端中的IOS-8858-1不支持中文编码
解决:统一客户端和服务器端的编码格式
//服务器:
response.setCharacterEncoding("UTF-8")
//客户端:
response.setHeader("content-type","UTF-8");
//或者两者同时设置
response.setContentType("charset=UTF-8");
②:字节流getOutputStream():输出的是字节,但是由于来服务器和客户端的编码不同,导致乱码
//解决:同时设置服务器和客户端的编码:
response.setContentType("charset=UTF-8");
2.重定向
重定向是一种服务端指导,客户端的行为。在服务器端接受到第一次请求之后,进行重定向,会传递给客户端一个新的地址,进行跳转,会发送第二次请求。
//重定向
response.sendRedirect(url);
3.重定向与转发跳转的区别
①:重定向的地址栏会发生变化,转发跳转不会。
②:重定向会发送两次请求,转发跳转只会发送一次
③:重定向的request数据不可共享(因为发送了两次请求),转发跳转的request数据是可共享的
④:重定向是客户端行为,而转发跳转是服务器行为
⑤:重定向访问的地址可以是任何地址(可进行跨域),而转发跳转的地址只能是当前站点下的资源(不能进行跨域)