请求和响应详解

1.请求和相应的概述:
请求:在浏览器地址栏输入地址,点击回车请求服务器,这个过程就是一个请求过程。
响应:服务器根据浏览器发送的请求,返回数据到浏览器在网页上进行显示,这个过程就称之为响应。

2.HttpServletResponse相应对象:
HttpServletResponse是一个接口,他的父接口是ServletResponse,在开发中通常使用HttpServletResponse。

响应信息分为三部分:响应行、响应头、响应正文(响应体)

1.1 设置状态码:
1.发送状态码的相关方法:setStatus(int sc):参数就是状态码。

2.setStatus(int sc,String sm):第一个参数表示状态码,第二个参数就状态码的描述。

3.常见状态码:200响应成功 302重定向 404请求资源找不到 500服务器代码出异常。

错误信息方法:
1.sendError(int sc):参数状态码。

2.sendError(int sc,String sm):第一个参数表示状态码,第二个参数就状态码的描述。

3.sendError与setStatus的区别:
sendError(int sc):使用指定的状态码并清空缓冲,发送一个错误响应至客户端。如果响应已经被提交,这个方法会抛出IllegalStateException。使用这个方法后,响应则应该被认为已被提交,且不应该再被进行写操作了。

sendError(int sc, String msg):使用指定的状态码发送一个错误响应至客户端。服务器默认会创建一个HTML格式的服务错误页面作为响应结果,其中包含参数msg指定的文本信息,这个HTML页面的内容类型为“text/html”,保留cookies和其他未修改的响应头信息。如果一个对应于传入的错误码的错误页面已经在web.xml中声明,那么这个声明的错误页面将会优先于建议的msg参数服务于客户端。(ps:相比较上面的方法,我更倾向于前者。使用上面的方法,可以通过定制不同状态的响应结果显示于客户端,我们应该不想让客户端看到服务器创建出的简单粗暴的页面吧?)

setStatus(int sc):设置响应的状态码。这个方法被用于当响应结果正常时(例如,状态码为SC_OK或SC_MOVED_TEMPORARTLY)设置响应状态码。如果发生错误,而且来访者希望调用在web应用中定义的错误页面作为显示,那么应该使用sendError方法代替之。使用setStatus方法之后,容器会清空缓冲并设置Location响应头,保留cookies和其他响应头信息。

从直译的结果不难发现哈,sendError适用于报错且存在对应的报错页面配置作为输出显示的情况,而setStatus适用于正常响应的情况,仅仅可以改变响应状态码而已。

错误信息方法3转载自:https://my.oschina.net/angerbaby/blog/468687

1.2 发送响应头相关的方法:
响应消息头的数据形式:
key-value的形式,有的是一个key,一个value,有的是一个key多个value。

1.设置响应消息头:

1.一个Key,一个value
setHeader(String key,String value)
比如:setHeader(“aa”, “AA”)结果就是,aa这个头对应的值就是BB

2.一个key ,多个value
addHeader(String key,String value)
比如:addHeader(“aa”,”AA”);
addHeader(“aa”,”BB”);
最终的结果:aa这个响应头对应的值是AA BB

2.设置相应数据的长度:
setContentlength(int src)方法

3.设置处理乱码的方法:
1.setCharacterEncoding(String a);参数就是一个码表格式,比如“UTF-8”。

2.setContentType(String a);参数代表响应数据的类型和码表格式,比如“text/html;charset=utf-8”。

1.3发送响应消息体相关的方法:
第一个方法:getOutputStream,通过response向浏览器返回图片、视频等二进制数据的文件。当然也可以向浏览器返回文本数据。
第二个方法:getWriter(),通过response向浏览器返回文本数据,不能向浏览器返回图片、视频等二进制文件。

1.4解决中文乱码问题:

第一种方式:
设置HttpServletResponse使用utf-8编码
Response.setCharacterEncoding(“utf-8”);
通知浏览器使用utf-8编码
Respons.setHeader(“Content-Type”,”text/html;charset=utf-8”);

第二种方式:
包含第一种方式的两个功能
Response.setContentType(“text/html;charset=utf-8”);

结论:在处理字符流和字节流输出中文乱码时,都采用Response.setContentType(“text/html;charset=utf-8”);

注意:常见的编码格式:
GBK GB180830 GB2312都是支持中文的编码格式,当然支持其他一些字符。
UTF-8:万能码表格式,支持所有的字符。
ISO-8859-1:不支持中文。

1.5实现网页的定时跳转并刷新
定时跳转:从一个注册页面跳转到登入界面,输入之前注册的用户名和密码。
代码如下:
定时跳转,需要用到Refresh响应头
response.setHeader(“Refresh”,”5,URL=/chapter04/login.html”);

定时刷新:在当前页面的地址不发生变化,但是当前页面自己定时刷新,页面数据会发生变化。
代码如下:response.setHeader(“Refresh”,”5”);
response.getWriter().print(new Date());

1.6实现重定向:
实现重定向相关的方法:

第一种方式:302和location配合使用,实现重定向。 Response.setStatus(302);
Response.setHeader(“location”,/chapter04/login.html);

第二种方式: Response.sendRedirect(“/chapter04/login.html”);

请求和响应详解_第1张图片

重定向通过登入案例来完成:
需求分析:在登入页面输入用户名和密码,在loginServlet里面,判断用户名和密码是否正确。如果错误,会重定向到登入页面,如果正确,跳转到欢迎页面。

获取登入页面提交的用户名和密码:request.getParameter()方法。

重定向的特点:
1.浏览器地址栏发生变化
2.发送了两次请求,都是由浏览器发送的请求。
重定向的路径:由于是浏览器发送得到请求,所以路径不许要带项目名称,比如:/chapter04/login.html

1.7请求和相应:
HttpServletRequest请求对象

HttpServletRequest它是一个接口,他的父接口ServletRequest,在开发中,常用的是带协议的请求对象。

请求消息:请求行、请求头、请求参数。

1.获取请求行消息的相关方法: 常用的请求行方法:
1.获取请求提交的方式:getMthod();
2.获取请求的协议:getProtocol();
3.获取项目名称:getContextPath();
4.获取servlet路径:getServletPath();
5.获取请求路径:getRequestURI(),getRequestURL()

request.getRequestURI() 返回值类似:/xuejava/requestdemo.jsp
request.getRequestURL()返回值类似:http://localhost:8080/xuejava/requestdemo.jsp   

2.获取请求消息头相关的方法
1.根据消息头,获取值:String value = getHeader(消息头的名称);

2.获取所有的消息头:Enumeration er = request.getHeaderNames();

3.Enumeration er = request.getHeaderNames();//获取所有的消息头

 While(er.hasMoreElements()){//遍历
String name = er.nextElement();//获取消息头
String value = request.getHeader(name);//获取消息头对应的值
}

4.根据Referer请求消息头,做一个防盗链的案例
难点:怎么判断这个发起的下载请求是从别的网站上发起的。

解决方法:根据Rederer请求头对应的值,是否包含了服务器的名称
如果包含,就说明是从本网站下载的,否则就不是。

5.获取请求参数相关的方法

1.根据name属性值,获取用户输入的值:String value = getParameter(name属性对应的值);
2.根据name属性值,获取用户选择的值:String value = getParameterValue(name属性对应的值);
3.没有参数:获取所有值:Map map = getParameterMap();

6.解决请求参数相关的方法
中文乱码处理分两种情况:
第一种情况:处理get方式提交的中文乱码
使用的String的构造方法解决的中文乱码:new String(字节数组,编码格式);
代码:String newvalue = new String(value.getBytes(“ISO8859-1”),”utf-8”);
请求和响应详解_第2张图片

第二种情况:处理post请求的中文乱码问题
Post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认编码格式是ISO8859-1,不支持中文。
代码:request.setCharacterEncoding(“utf-8”);
请求和响应详解_第3张图片

7.通过Request对象传递数据

什么是域对象:在一定的范围内,可以存值和取值。

request域对象:在一次请求中,可以存值和取值。

1.存值:setAttribute(String key,Object obj);
2.取值:Object obj = getAttribute(String key);
3.移除:removeAttribute(String key);

8.RequestDispatcher接口
在开发中访问到一个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向方法来实现,也可以RequestDispatcher转发对象的forward方法来实现。

得到转发对象:RequestDispatcher forwardobj =
request.geRequestDispatcher(“另一个资源的路径”);

常用方法:

1.实现请求转发:forwardobj.forward(request,response);
2.实现请求包含:forwardobj.include(request,response);

1.请求转发:
特点:发送了一次,响应了一次,和request域对象配合使用,可以实现值得传递
转发路径:转发动作是在服务器内部实现的,所以转发路径不要携带项目名称。

2.请求重定向:
特点:发送了两次请求,响应了两次,不能和request域对象配合使用。
重定向路径:重定向动作在浏览器端执行的,所以路径需要携带项目名称。
请求和响应详解_第4张图片

3.请求包含:
特点发送一次请求,请求包含是由服务器完成。
请求包含路径:在服务器内部完成的,路径不需要携带项目名称。
方法:include();

请求和响应详解_第5张图片

你可能感兴趣的:(java,web,javaweb)