4 HttpServletResponse 与 HttpServletRequest

  Web 服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest 和 HttpServletReponse 对象,response用于向客户端发送数据,request用于从客户端请求数据。

  1 HttpServletRequest 

HttpServletRequest 继承自ServletRequest,客户端浏览器发出的请求被封装成一个HttpServletRequest 对象。对象包含的信息主要为:请求的地址,请求的参数,提交的数据,上传文件客户端IP地址等信息。

① 获取客户机信息方法

getRequestURL() :返回客户端发出请求时的完整URL

getRequestURI() :返回请求行中的资源名部分

getQueryString() :返回请求行中的参数部分

getRemoteAddr() :返回发出请求的客户机的IP地址

getRemoteHost() :返回发出请求的客户机的完整主机名

getRemotePort() :返回客户机所使用的网络端口号

getLocalAddr() :返回WEB服务器的IP地址

getLocalName() :返回WEB服务器的主机名

getMethod() :得到客户机请求方式

getServerPath() :获取请求的文件的路径

 

② 获取客户机请求头方法

getHeader(string name)
getHeaders(String name) 
getHeaderNames()
 
③ 获取客户机请求参数
getParameter(name): 获取请求中的参数,该参数是由name指定的
getParameterValues(String name): 获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。
getParameterNames(): 返回一个包含请求消息中的所有参数名的Enumeration对象。通过遍历这个Enumeration对象,就可以获取请求消息中所有的参数名。
getCharacterEncoding() :返回请求的字符编码方式
getAttributeNames():返回当前请求的所有属性的名字集合赋值:setAttribute()
getAttribute(String name) :返回name指定的属性值
getsession():返回和客户端相关的session,如果没有给客户端分配session,则返回null
getParameterMap():返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组
RequestDispatcher.forward(HttpServletRequest request, HttpServletResponse response):请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为
request.setCharacterEncoding("utf-8"):设置请求数据的编码格式
getReader(): 获取请求体的数据流
getInputStream() :获取请求的输入流中的数据

 

④ 案例1:html表单提交实例

   

 1 提交页面
 2 out.println("<html></br>");
 3 
 4 out.println("<head></br>");
 5 out.println("<title></br>MyInfoForm</title></br>");
 6 out.println("</head></br>");
 7 
 8 out.println("<body></br>");
 9 out.println("<form action="/RequestProject/RegisterVeri" method="post">");
10 out.println("用户名:<input type="text" name="username"/> <br/>");
11 out.println("密码:    <input type="password"  name="password"/> <br/>");
12 out.println("性别:    <input type="radio"  name="sex" value='男'/><input type="radio"  name="sex" value='女'/><br/>");
13 out.println("爱好:    <input type="checkbox"  name="hobby" value='体育'/>体育  <input type="checkbox"  name="hobby" value='编程'/>编程<br/>"+
14                   "<input type="checkbox"  name="hobby" value='旅行'/>旅行<br/>");
15 
16 out.println("所在城市:<select name='city'><option value='成都'>成都</opiton> <option value='北京'>北京</opiton> <option value='贵阳'>贵阳</opiton></select><br/>");
17 out.println("自我介绍:<br/>");
18 out.println("<textarea cols='20' rows='10' name='introd'> </textarea> <br/>");
19 out.println("提交照片:<input type='file' name='subPoto'> <br/>");
20 //什么时候使用hidden传输数据,1不希望用户看到的数据  2提交的数据不影响界面
21 out.println("Hidden:<input type='hidden' name='hidden1' value='abc'> <br/>");
22 out.println("<input type="submit" value="提交">");
23 out.println("</form>");
24 out.println("</body></br>");
25 
26 out.println("</html></br>");
 1 获取数据页面
 2 String user=request.getParameter("username");
 3 String passw=request.getParameter("password");
 4 String sex = request.getParameter("sex");
 5 String[] hobby = request.getParameterValues("hobby");
 6 String city=request.getParameter("city");
 7 String introd = request.getParameter("introd");
 8 String hidden = request.getParameter("hidden1");
 9 
10 out.println("用户名:"+user+"<br/>");
11 out.println("密码:"+passw+"<br/>");
12 out.println("性别:"+sex+"<br/>");
13 out.println("兴趣:");
14 for(String ho:hobby)
15 {
16     out.println(ho+" ");
17 }
18 out.println("<br/>");
19 out.println("城市:"+city+"<br/>");
20 out.println("自我介绍:"+introd+"<br/>");
21 out.println("hidden:"+hidden+"<br/>");

  ⑤ 案例2:请求转发

//将传递的数据放入到request域中
request.setAttribute("user", username);
        
//request请求转向方法
request.getRequestDispatcher("/Servlet2").forward(request, response);
接受页面
String user =(String)request.getAttribute("user");
out.println(user+"<br/>");

  ⑥ sendRedirectforward区别

sendRedirect(请求重定向):一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源(任意的)。

forward(请求转发):一个web资源收到客户端请求后,通知服务器去访问同一个web应用下的web资源。

(1) sendRedirect转发,forward转向

(2) 发生的位置不同

sendRedirect 发生在浏览器

forward 发生在web服务器

(3) 用法不一样

request.getRequestDispatcher("/Servlet2").forward(request, response)

response.sendRedirect("/RequestProject/Servlet2");

(4) 跳转的范围不一样

sendRedirect 可以跳转到任何url

forward 只能跳转到当前web应用下的某个资源

  

  2 HttpServletResponse

HttpServletResponse 继承了ServletReponse 接口,并提供了与Http 协议有关的方法,这些方法主要功能是设置HTTP状态码和管理cookie。HttpServletResponse 对象代表服务器的响应 。这个对象中封装了向客户端发送数据,发送响应头,发送状态码的方法。

① 主要方法

  addHeader(String name,String value) :将指定的名字和值加入到响应的头信息中

  encodeURL(String url) :编码指定的URL

  sendError(int sc): 使用指定状态码发送一个错误到客户端

  setDateHeader(String name,long date): 将给出的名字和日期设置响应的头部

  setHeader(String name,String value) :将给出的名字和值设置响应的头部

  setStatus(int sc) :给当前响应设置状态码

HttpServletResponse.sendRedirect("/uri") :方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

response.setContentType("text/html;charset=utf-8"):设置response对象信息的中文编码格式

setContentType(String ContentType):设置响应的MIME类型 ,页面的设置文本类型,获取或设置输出流的 HTTP MIME 类型。输出流的 HTTP MIME 类型。默认值为“text/html”。

MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

 

② 消息实体内容通过输出流对象进行设置有以下两个方法:

getWriter():字符的输出流对象,用于向客户机回送字符数据

getOutputStream() :字节输出流对象,返回的对象可以回送字符数据,也可以回送字节数据(二进制数据)

getOutputStream() 和 getWriter() 这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。要不会出现错误java.lang.IllegalStateException

getOutputStream() 和 getWriter() 区别

(1) PrintWriter对象输出字符文本内容时,它内部还是将字符串转换成了某种字符集编码的字节数组后再进行输出,使用PrintWriter对象的好处就是不用编程人员自己来完成字符串到字节数组的转换。

(2) 使用ServletOutputStream 对象也能输出内容全为文本字符的网页文档,但是如果网页文档内容是在Servlet程序内部使用文本字符串动态拼凑和创建出来的,则需要先将字符文本转换成字节数组后输出。

(3) 如果一个网页文档内容全部为字符文本,但是这些内容可以直接从一个字节输入流中读取出来,然后再原封不动地输出到客户端,那么就应该使用ServletOutputStream对象直接进行输出,而不要使用PrintWriter对象进行输出。

 

③ 案例:使用response 对象下载文件

  (1) 获取要下载的文件的绝对路径

  (2) 获取要下载的文件名

  (3) 设置content-disposition响应头控制浏览器以下载的形式打开文件

  (4) 获取要下载的文件输入流

  (5) 创建数据缓冲区

  (6) 通过response对象获取OutputStream流

  (7) 将FileInputStream流写入到buffer缓冲区

  (8) 使用OutputStream将缓冲区的数据输出到客户端浏览器

  

 1      //1 获取要下载文件的全路径
 2         String path = this.getServletContext().getRealPath("images/2.png");
 3         
 4         //2 获取文件名
 5         String filename= path.substring(path.lastIndexOf("\")+1);
 6         //3 需要对文件名进行转码
 7         String encodeFileName= URLEncoder.encode(filename, "UTF-8");
 8         response.setHeader("content-disposition", "attachment;filename=" + encodeFileName);
 9         
10         //4 创建文件输入流
11         FileInputStream fis = new FileInputStream(path);
12         //5 做一个缓冲字节数组
13         byte buff[] = new byte[1024];
14         //实际每次读取了多少个字节
15         int len=0;
16         //6 创建输出流对象
17         OutputStream os = response.getOutputStream();
18         while((len=fis.read(buff))>0)
19         {
20             os.write(buff,0,len);
21         }
22         
23         //关闭文件流
24         if(fis!=null)
25         {
26             fis.close();
27         }
28 
29         if(os!=null)
30         {
31             os.close();
32         }

 

 

 

原文地址:https://www.cnblogs.com/Latiny/p/8398731.html