天天看点

Servlet请求、响应及其相关

首先,个人对Servlet请求与响应的理解:

当在浏览器中访问某个Servlet时,服务器就会依照web.xml中的设置对响应的Servlet进行初始化操作。接着便是Servlet的出生及一系列方法的调用。(通常继承HttpServlet),最主要的逻辑调用时service方法的事情,service方法会将要处理的请求进行分类,具体到是POST请求还是GET请求。POST请求的话,会调用doPost方法,GET请求的话,会调用doGet方法。

REQUEST:当浏览器发送请求到服务器端时,服务器都会创建一个request对象,并把请求数据封装到request对象中去,并通过request对象的相应方法来获取信息。具体request封装的信息有:

请求头,如Accept-Language,Host,User-Agent,及MIME类型等。浏览器在发送请求的时候还会将IP地址,请求的方式(个体或者post),URL等封装到request中。

Servlet请求、响应及其相关
Servlet请求、响应及其相关

因此可以通过其对象提供的方法来获取其封装的信息

下面列举常用的一些方法:

Servlet请求、响应及其相关
Servlet请求、响应及其相关
Servlet请求、响应及其相关
Servlet请求、响应及其相关
Servlet请求、响应及其相关

我们知道HttpServletRequest继承自ServletRequest,因此可以向上兼容ServletRequest的方法。

常用的方法如上:

可以获取Request请求头信息,获取MIME类型的,获取请求的参数等。

关于Request的请求转发与包含:

目前常用的只有请求转发,常用在Servlet,大多转发到jsp页面中。其格式如下:

RequestDispatcher dispatcher=request.getRequestDispatcher();

dispatcher.forward(request,response);

对转发举个具体的例子:

即是你找我借东西,我没这个东西,我找别人借这个东西,然后再把这个东西借给你。

请求包含:顾名思义,即是对所请求的多个Servlet或页面都包含,常用来完成多页面的合并。

RequestDispatcher dispatcher=request.getRequestDispatcher();

dispatcher.include(request,response);

需要注意的是,请求转发和包含都是对应的一个请求。但是请求转发与请求包含在使用的时候也有些不同。请求转发是留头不留体;请求包含是留头又留体。

举例子:

请求转发:

AServlet:

Servlet请求、响应及其相关

BServlet:

Servlet请求、响应及其相关

浏览器上输出结果是:

Servlet请求、响应及其相关

控制台输出的结果:

Servlet请求、响应及其相关
Servlet请求、响应及其相关

印证了留头不留体。

请求包含:

Servlet请求、响应及其相关
Servlet请求、响应及其相关

浏览器输出的结果:

Servlet请求、响应及其相关
Servlet请求、响应及其相关

印证了留头又留体

request作为Servlet中的三大域对象之一,当然也是可以具有存取数据的功能了。(注意:必须是在同一个request下才可以存取数据)

常用的与此相关的方法如下:

void setAttribute(String name,Object value);用来储存一个对象

Object getAttribute(String name);用来获取request中的数据

void removeAttribute(String name);用来移除request中的域属性

Enumeration getAttributeNames();获取所有域属性的名称

例子:

request获取参数的例子:

Servlet请求、响应及其相关

使用的时候注意超链接中的是get请求,表单中的可以是get请求,也可以是post请求。

RESPONSE:即服务器端对浏览器端请求作出的回应。

主要的用法:

设置响应头信息:

使用response对象的setHeader()方法来设置响应头。使用该方法设置的响应头最终会发送给客户端浏览器

response.setHeader(“content-type”,”text/html/charset=utf-8”);设置content-type响应头,该响应头的作用是告诉浏览器响应内容为html类型,编码是utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharacterEncoding(“utf-8”);

response.setHeader(“Refresh”,”5;URL=http://www.baidu.com“);5秒后自动跳转到指定页面

设置状态码及其方法

response.setContentType(“text/html;charset=utf-8”);等同于response.setHeader(“content-type”,”text/html;charset=utf-8”);

response.setCharacterEncoding(“utf-8”);设置字符响应流的字符编码为utf-8

response.setStatus(200);设置状态码

response.sendError(404,”您查找的资源不存在”);当发送错误状态码时,Tomcat会跳转到指定的固定的错误页面,但可以显示错误信息

重定向

即服务器通知浏览器去访问另一个地址,即再发出另一个请求;常来决定通过状态码302和Location来决定。先设置响应码为302,接着指定Location的地址

如response.setStatus(302);

response.setHeader(“Location”,”http://www.baidu.com“);

还有一种重定向方法为response.sendRedirect(“http://www.baidu.com“);

需要注意的是,重定向是两次请求,浏览器地址栏的地址发生了变化。

路径:

路径分为客户端路径和服务器端路径

客户端路径需要给出项目名称,如/wojiushiwo/Aservlet,主要有:

页面中都是客户端路径,如超链接,表单中的action,img中的src;重定向也是客户端路径

服务器端路径无需给出项目名称。如/Aservlet

如,请求转发和请求包含;ServletContext获取资源等

对于乱码的处理:

Tomcat的默认编码是iso-8859-1,因此会出现乱码的隐患

乱码的处理:

当浏览器端向服务器端发送请求时,因为默认会发送iso-8859-1的编码文件,因此要使用

POST请求:在request.getParameter()前面使用request.senCharacterEncoding();

GET请求:使用request.getParameter()获取到的数据一定是错误的使用了iso-8859-1解码的。可以再使用iso-8859-1把字符串转回到byte[],在重新使用正确的编码来解码

String s = request.getParameter(“s”);

byte[] bytes=s.getBytes(“iso-8859-1”);

s=new String(bytes,”utf-8”);

这样的方式,对请求进行编码处理。

继续阅读