Java Web请求与响应实例详解
servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,web容器在调用service()之前都会创建两个对象,分别是httpservletrequest和httpservletresponse。其中httpservletrequest封装http请求消息,httpservletresponse封装http响应消息。需要注意的是,web服务器运行过程中,每个servlet都会只创建一个实例对象,不过每次请求都会调用servlet实例的service(servletrequest req, servletresponse res)方法,这里httpservletrequest是servletrequest的子类,httpservletresponse是servletresponse的子类。
httpservletrequest和httpservletresponse接口继承关系图如下所示:
1、httpservletresponse
httpservletresponse接口继承自servletresponse接口,由于http响应消息分为状态行、响应消息体、消息体三部分,因此,在httpservletresponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。虽然httpservletresponse接口中的方法较多,但是我们常用的也就是那么几个,如果用到其他的方法了可以阅读响应的源码或者相关资料就行了。
发送状态码相关函数
方法
说明
public void setstatus(int sc)
设置响应消息状态码,web服务器默认产生一个状态码为200的状态行
public void senderror(int sc)
发送表示错误信息的状态码,第二个方法还增加了一个用于提示说明的文本信息
public void senderror(int sc, string msg)
发送响应消息头相关函数
方法
说明
public void addheader(string name, string value)
设置http响应头字段,name指定字段名称,value指定字段值。addheader可以增加同名的响应头字段,setheader则会覆盖同名的头字段
public void setheader(string name, string value)
public void setcontentlength(int len)
设置响应消息的实体内容的大小,单位为字节,即设置content-length字段的值
public void setcontenttype(string type)
设置servlet输出内容的mime类型,即设置content-type字段的值
public void setcharacterencoding(string charset)
设置输出内容字符编码,即设置content-type字段的值,注意,该方法优先级比setcontenttype的高
public void sendredirect(string location)
servlet请求重定向
发送响应消息体相关函数
方法 | 说明 |
public servletoutputstream getoutputstream() | 获取httpservletresponse的字节输出流servletoutputstram类型 |
public printwriter getwriter() | 获取httpservletresponse的字符输出流servletwriter类型 |
中文输出乱码问题
计算机中的数据都是以二进制形式存储的,因此,传输文本时,就会发生字符的字节之间的转换。字符与字节之间的转换时通过查码表完成的,字符转换为字节的过程称为编码,字节转换为字符的过程称为解码,如果编码和解码使用的码表不一样,则会出现乱码问题。
注意:httpservletresponse对象的字符输出流在编码时,默认采用的是iso 8859-1编码,该编码方式不兼容中文,比如会将"中国"编码为"63 63"(在iso 8959-1的码表中查不到的字符会显示63)。当浏览器对接收到的数据进行解码时,会默认采用gb2312,将"63"解码为"?",浏览器就将"中国"两个字符解码为"??"。
httpservletresponse程序示例
package zzz; import java.io.ioexception; import java.io.printwriter; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class hello extends httpservlet { @override public void doget(httpservletrequest request, httpservletresponse response) throws ioexception { // 设置响应消息编码,注释后"中国"会显示"??"乱码 response.setcontenttype("text/html;charset=utf-8"); printwriter out = response.getwriter(); out.println("hello 中国"); } @override public void dopost(httpservletrequest request, httpservletresponse response) throws ioexception { this.doget(request, response); } }
有时会遇到定时跳转页面的问题,http中refresh头字段可以通知浏览器在指定的时间内自动刷新并跳转到其他页面,网页定时刷新并跳转到指定页面。
package zzz; import java.io.ioexception; import java.io.printwriter; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class hello extends httpservlet { @override public void doget(httpservletrequest request, httpservletresponse response) throws ioexception { // 设置响应消息编码 response.setcontenttype("text/html;charset=utf-8"); response.setheader("refresh", "2;url=http://www.baidu.com"); printwriter out = response.getwriter(); out.println("hello 中国,2秒后跳转到百度..."); } @override public void dopost(httpservletrequest request, httpservletresponse response) throws ioexception { this.doget(request, response); } }
2、httpservletrequest
httpservletrequest接口继承servletrequest接口,专门用于封状http请求消息。由于http请求信息包括请求行、请求头和请求体三部分,所以httpservletrequest接口定义了获取请求行、请求头和请求体的相关方法。
获取请求行的相关方法
方法 | 说明 |
public string getmethod() | 获取http请求方式,post、get等 |
public string getrequesturi() | 获取请求行中资源名称部分 |
public string getquerystring() | 获取请求行中的参数部分 |
public string getprotocol() | 获取请求行中协议名称和版本,如http 1.1 |
public string getcontextpath() | 获取请求url中属于web应用程序的路径 |
其实关于请求行的方法从方法名中就可以看出其作用,这里就不一一贴出来了。
获取请求消息头的相关方法
方法 | 说明 |
public string getheader(string name) | 获取指定字段的值,如果没有返回null,如果有多个返回第一个值 |
public enumeration<string> getheaders(string name) | 返回一个指定字段的enumeration集合对象 |
public enumeration<string> getheadernames() | 返回一个包含所有字段的enumeration集合对象 |
public string getcontenttype() | 获取content-type字段的值 |
打印请求消息头字段的所有值
package zzz; import java.io.ioexception; import java.io.printwriter; import java.util.enumeration; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class hello extends httpservlet { @override public void doget(httpservletrequest request, httpservletresponse response) throws ioexception { // 设置响应消息编码 response.setcontenttype("text/html;charset=utf-8"); printwriter out = response.getwriter(); enumeration<string> names = request.getheadernames(); while (names.hasmoreelements()) { string name = names.nextelement(); string value = request.getheader(name); out.println(name + ": " + value + "</br>"); } } @override public void dopost(httpservletrequest request, httpservletresponse response) throws ioexception { this.doget(request, response); } }
获取请求体的相关方法
方法
说明
public servletinputstream getinputstream()
获取请求的servletinputstream对象,如果实体内容为非文本,只能通过getinputstream方法获取请求体消息体
public bufferedreader getreader()
获取请求的bufferedreader对象,该对象会将实体内容字节数据转换为指定字符集编码的文本字符串
获取请求参数
方法 | 说明 |
public string getparameter(string name) | 获取指定的参数值,没有该参数返回null |
public enumeration<string> getparameternames() | 返回一个包含所有参数名的enumeration对象 |
public string[] getparametervalues(string name) | http请求中可能有多个相同的参数,获取同一个参数名对应的所有参数值 |
3、requestdispatcher接口
当一个web资源受到客户端请求后,如果希望服务器通知另外一个资源如处理请求,除了使用功能sendredirect()实现重定向外,还可以通过requestdispatcher接口的实例对象来实现,在servletrequest接口中定义了一个获取requestdispatcher对象的方法--getrequestdispatcher(string path),它返回某个路径所指定资源的requestdispatcher对象,参数path必须以"/"开头,用于表示当前web应用的根目录,也就是path路径必须是在本web程序中,否则会出现异常。
requestdispatcher接口中方法
方法 | 功能 |
public void forward(servletrequest request, servletresponse response) | 将一个servlet传递给另外一个web资源,将请求传递给其他资源进行响应 |
public void include(servletrequest request, servletresponse response) | 用于将其他资源作为当前响应内容包含进来 |
以上所述是小编给大家介绍的java web请求与响应实例详解的相关内容,希望对大家有所帮助!