欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JSP中Servlet的Request与Response的用法与区别

程序员文章站 2022-03-26 07:59:57
jsp中servlet的request与response的用法与区别 简介:web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的reques...

jsp中servlet的request与response的用法与区别

简介:web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。

一,request

request代表请求对象,其中封装了对请求中具有请求行、请求头、实体内容的操作的方法,通过这个对象提供的方法,可以获得客户端请求的所有信息。

1. 作为容器

setattribute(string name,object o)将数据作为request对象的一个属性存放到request对象中 
getattribute(string name)        获取request对象的name属性的属性值 
removeattribute(string name)     移除request对象的name属性 
getattributenames()     获取request对象的所有属性名 

2. 获得客户端信息        

 getrequesturl()返回客户端发出请求时的完整url。 
getrequesturi()返回请求行中的资源名部分。 
getremoteaddr()返回发出请求的客户机的ip地址。 
getremotehost()返回发出请求的客户机的完整主机名。 
getremoteport()返回客户机所使用的网络端口号。 
getlocaladdr()返回web服务器的ip地址。 
getlocalname()返回web服务器的主机名。 
  getquerystring()返回请求行中的参数部分。 
getpathinfo()返回请求url中的额外路径信息。额外路径信息是请求url中的位于servlet的路径之后和查询参数之前的内容,它以“/”开头。 

3. 获得客户端请求头  

getheader(string name) 
getheaders(string name) 
getheadernames() 

4. 获得客户端请求参数(客户端提交的数据)

getparameter(string)方法(常用) 
getparametervalues(string name)方法(常用) 
getparameternames()方法(不常用) 
getparametermap()方法(编写框架时常用) 

5.request接收表单提交中文参数乱码问题解决

(1)get方式提交表单:

对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的(至于为什么无效我也没有弄明白),默认的还是使用iso8859-1这个字符编码来接收数据,客户端以utf-8的编码传输数据到服务器端,而服务器端的request对象使用的是iso8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。

解决办法:

1) 在接收到数据后,先获取request对象以iso8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。

string name = request.getparameter("name");//接收数据
     name =new string(name.getbytes("iso8859-1"), "utf-8") ;//获取request对象以iso8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题

     2) server.xml中配置

  uriencoding=utf-8

(2)post方式提交表单:

之所以会产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收。

 request.setcharacterencoding("utf-8");

6.request对象实现请求转发

request.getrequestdispatcher("/test.jsp").forward(request, response); 
request.getrequestdispatcher("/test.jsp").include(request, response); 
调用forward()方法后,原先存放在httpresponse对象中的内容将会自动被清除 
调用include()方法后,原先存放在httpresponse对象中的内容将不会被清除,内容追加 

二,response

response代表响应,于是响应消息中的状态码、响应头、实体内容都可以由它进行操作

1. 向客户端(浏览器)发送数据的相关方法

getoutputstream()
getwriter()

2.向客户端(浏览器)发送响应头的相关方法

adddateheader() 
addheader() 
addintheader() 
containsheader() 
      setdateheader() 
setheader() 
setintheader() 

例如:  

  response.setheader("content-type", "text/html;charset=utf-8"); 

3.向客户端(浏览器)发送响应状态码的相关方法--setstatus()

实例代码:

private void downloadfilebyoutputstream(httpservletresponse response) 
      throws filenotfoundexception, ioexception { 
    //1.获取要下载的文件的绝对路径 
    string realpath = this.getservletcontext().getrealpath("/download/1.jpg"); 
    //2.获取要下载的文件名 
    string filename = realpath.substring(realpath.lastindexof("\\")+1); 
    //3.设置content-disposition响应头控制浏览器以下载的形式打开文件 
    response.setheader("content-disposition", "attachment;filename="+filename); 
    //4.获取要下载的文件输入流 
    inputstream in = new fileinputstream(realpath); 
    int len = 0; 
    //5.创建数据缓冲区 
    byte[] buffer = new byte[1024]; 
    //6.通过response对象获取outputstream流 
    outputstream out = response.getoutputstream(); 
    //7.将fileinputstream流写入到buffer缓冲区 
    while ((len = in.read(buffer)) > 0) { 
    //8.使用outputstream将缓冲区的数据输出到客户端浏览器 
      out.write(buffer,0,len); 
    } 
    in.close(); 
  } 

它们的区别:

其实从字面上我们就可以知道他们俩的区别在于一个是请求(request),而另一个是响应(response),servlet作为服务端,请求便是来自浏览器的请求,响应便是服务器对浏览器的响应。在你想获取浏览器请求的数据时,我们就要用request,而在我们要向浏览器响应数据或页面时,我们就要用到response。

request 是请求的载体,它附带着,请求的参数,ip,cookie,表单,字符编码,或者上传文件。
你可以通过request去获得你所需要的信息。

response是响应的载体,你可以设置,表头,报文,响应文件类型,字符编码,response,自带一个输出流,当你需要将一个页面或者一个文件传到客户端时,你可以通过这个流来进行操作

希望通过本文能帮助到大家,如有疑问请留言或者到本站社区交流讨论,感谢阅读,谢谢大家对本站的支持!

相关标签: Request Response