如何使用Servlet处理客户端的请求及响应.docx
《如何使用Servlet处理客户端的请求及响应.docx》由会员分享,可在线阅读,更多相关《如何使用Servlet处理客户端的请求及响应.docx(23页珍藏版)》请在冰豆网上搜索。
如何使用Servlet处理客户端的请求及响应
如何使用Servlet从客户端获取请求信息:
首先,让我们先来看一个请求的实例:
GET/default.asp?
username=zhangsanHTTP/1.1
Accept:
image/gif,image/x-xbitmap,image/jpeg,image/png,*/*
Accept-Language:
en
Connection:
Keep-Alive
Host:
User-Agent:
Mozilla/4.04[en](WinNT;I;Nav)
Cookie:
SITESERVER=ID=8dac8e0455f4890da220ada8b76f;ASPSESSIONIDGGQGGGAF=JLKHAEICGAHEPPMJKMLDEM
Accept-Charset:
iso-8859-1,*,utf-8
从以上请求信息中,我们可以看出请求信息大致可以分成这样几类:
第一类协议相关的信息,如使用的请求方法、请求使用的协议以及请求的资源地址等信息
第二类是请求头信息,如Accept以及Accept-language等等头部信息
第三类信息是用户组织的数据如username=zhangsan等信息
因此从服务器的角度必须能够获取以上信息,也就是通过请求对象对应的方法要能够获取响应的请求信息
第一类请求方法,获取协议相关的信息的方法:
getProtocal():
获取协议名称以及版本信息
getMethod();获取Http请求所使用的方法
getRequestURI()获取请求的URI
getRequestURL()获取请求的URL
下面我们看一个获取协议信息的示例:
packageneusoft;
import;
import;
import;
import;
import;
import;
import;
/**
*ServletimplementationclassRequestServlet
*/
@WebServlet("/r1")
publicclassRequestServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
/**
*@seeHttpServlet#HttpServlet()
*/
publicRequestServlet(){
super();
//TODOAuto-generatedconstructorstub
}
/**
*@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponse
*response)
*/
protectedvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
out.print("");
out.print("
");
out.print("");
out.print("
");
out.print("请求使用的协议为:
"+request.getProtocol()+"
");
out.print("请求提交数据所使用的方法为:
"+request.getMethod()+"
");
out.print("请求的URI为:
"+request.getRequestURI()+"
");
out.print("请求的URL为:
"+request.getRequestURL()+"
");
out.print("");
out.print("");
}
/**
*@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponse
*response)
*/
protectedvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
this.doGet(request,response);//TODOAuto-generatedmethodstub
}
}
输出的界面应为:
第二类获取请求头信息相关的方法:
getHeader(StringheaderName)获取指定的头部信息,返回字符串类型
getDateHeader(StringheaderName)获取指定的头部信息,返回日期类型
getIntHeader获取指定的头部信息,返回整数类型
getHeaders获取指定的头部信息,返回字符串数组类型
getDateHeaders获取指定的头部信息,返回字日期数组类型
getIntHeaders获取指定的头部信息,返回字整数数组类型
getHeaderNames()获取客户端传递过来所有头部的名称
Http1.1协议中定义的头部信息如下:
通用头部信息(即请求和响应均可以使用的头部信息)
general-header=Cache-Control
|Connection
|Date
|Pragma
|Trailer
|Transfer-Encoding
|Upgrade
|Via
|Warning
除此之外还有请求专用的请求头:
request-header=Accept
|Accept-Charset
|Accept-Encoding
|Accept-Language
|Authorization
|Expect
|From
|Host
|If-Match
|If-Modified-Since
|If-None-Match
|If-Range
|If-Unmodified-Since
|Max-Forwards
|Proxy-Authorization
|Range
|Referer
|TE
|User-Agent
例如我们想判断用户浏览器的类型以及所使用的地区语言可以使用如下语句:
packageneusoft;
import;
import;
import;
import;
import;
import;
import;
/**
*ServletimplementationclassRequestServlet2
*/
@WebServlet("/r2")
publicclassRequestServlet2extendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
/**
*@seeHttpServlet#HttpServlet()
*/
publicRequestServlet2(){
super();
//TODOAuto-generatedconstructorstub
}
protectedvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
out.print("");
out.print("
");
out.print("");
out.print("
");
out.print("您使用的浏览器信息为:
"+request.getHeader("User-Agent")+"
");
out.print("您使用的地区语言为"+request.getHeader("Accept-Language")+"
");
out.print("");
out.print("");
}
/**
*@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponse
*response)
*/
protectedvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
this.doGet(request,response);//TODOAuto-generatedmethodstub
}
}
其输出结果为:
第三类获取用户数据相关的方法:
getParameter(name)获取指定的用户参数,以字符串方式返回。
getParameterValues(name)获取指定的用户数据返回,以字符串数组返回。
getParameterNames()获取客户端传递过来用户数据的参数名称,返回值为枚举类型
getParameterMap()获取客户端传递的用户数据,返回值为Map
首先我们组织一个form表单:
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/html4/loose.dtd">
Inserttitlehere
信 息 统 计 表
|
姓名: | |
年龄: | |
性别: | 男 女 |
爱好: | 旅游
登山
健身
上网
游泳
|
学历: |
--请选择-- |
自我介绍: | 自我介绍: |
| |
然后我们编写一个处理该数据的Servlet,其代码如下:
packageneusoft;
import;
import;
import;
import;
import;
import;
import;
/**
*ServletimplementationclassRequestServlet3
*/
@WebServlet("/r3")
publicclassRequestServlet3extendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
/**
*@seeHttpServlet#HttpServlet()
*/
publicRequestServlet3(){
super();
//TODOAuto-generatedconstructorstub
}
protectedvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
request.setCharacterEncoding("UTF-8");
Stringusername,age,sex,fav[],degree,intro;
username=request.getParameter("username");
age=request.getParameter("age");
sex=request.getParameter("sex");
degree=request.getParameter("degree");
fav=request.getParameterValues("interest");
intro=request.getParameter("intro");
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
out.print("");
out.print("
");
out.print("");
out.print("
");
out.println("您的用户名为:
");
out.println(username+"
");
out.println("您的年龄为:
");
out.println(age+"
");
out.println("您的性别为:
");
out.println(sex+"
");
out.println("您的喜好为:
");
if(fav!
=null){
for(inti=0;iout.println(fav[i]+"
");
}
}
out.println("您的学历为:
");
out.println(degree+"
");
out.println("您的自我介绍为:
");
out.println(intro+"
");
out.print("");
out.print("");
}
/**
*@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponse
*response)
*/
protectedvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
this.doGet(request,response);//TODOAuto-generatedmethodstub
}
}
Form表单组织的数据如下:
处理后显示页面如下:
如何使用Servlet对客户端进行响应:
首先让我们看一个http响应的实例:
HTTP/1.1200OK
Content-Type:
text/html
Content-Length:
89
Server:
Apache-Coyote/1.1
HELLOWORLD
HelloWorld
从以上实例中我们可以看出对客户端的响应信息主要包括以下内容:
状态信息:
协议的版本,状态码,状态描述信息
响应头信息
空行
响应实际内容(响应体)
因此,请求对象应该提供设置和输出以上信息的方法:
1.设置状态码的方法:
voidsetStatus(intsc)设置状态码
voidsendError(intsc)设置表示错误的状态码
voidsendError(intsc,msg)设置表示错误的状态码,并提供错误信息描述
Http响应状态码及其表示的含义如下:
1**:
请求收到,继续处理
2**:
操作成功收到,分析、接受
3**:
完成此请求必须进一步处理
4**:
请求包含一个错误语法或不能完成
5**:
服务器执行一个完全有效请求失败
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
400——错误请求,如语法错误
401——请求授权失败
402——保留有效ChargeTo头响应
403——请求不允许
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
500——服务器产生内部错误
501——服务器不支持请求的函数
502——服务器暂时不可用,有时是为了防止发生系统过载
503——服务器过载或暂停维修
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
505——服务器不支持或拒绝支请求头中指定的HTTP版本
例如我们可以编写如下程序,人为制造错误:
packageneusoft;
import;
import;
import;
import;
import;
import;
/**
*ServletimplementationclassResponseServlet1
*/
@WebServlet("/resp1")
publicclassResponseServlet1extendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
/**
*@seeHttpServlet#HttpServlet()
*/
publicResponseServlet1(){
super();
//TODOAuto-generatedconstructorstub
}
/**
*@seeHttpSe