HttpServletRequest和HttpServletResponse对象详解
《Servlet生命周期》一文提到,在 Servlet 生命周期的运行阶段,Servlet 容器会为当前的客户端请求创建一个 HttpServletRequest 对象和一个 HttpServletResponse 对象(这两个对象分别继承自 ServletRequest 和 ServletResponse),其中:
HttpServletRequest 对象HttpServletRequest 对象代表客户端(浏览器)的请求,当客户端通过 HTTP 协议访问服务器时,HTTP 请求中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。以下是 HttpServletRequest?对象获取请求信息的一些方法以及代码示例:
下面是一段简单的演示代码: protected void doGet(HttpServletRequest request,HttpServletResponse response) throws Exception { System.out.println("getRequestURL: " + request.getRequestURL()); System.out.println("getRequestURI: " + request.getRequestURI()); System.out.println("getQueryString: " + request.getQueryString()); System.out.println("getRemoteHost: " + request.getRemoteHost()); System.out.println("getRemotePort: " + request.getRemotePort()); System.out.println("getLocalAddr: " + request.getLocalAddr()); System.out.println("getLocalName: " + request.getLocalName()); System.out.println("getLocalPort: " + request.getLocalPort()); System.out.println("getMethod: " + request.getMethod()); System.out.println("-------request.getParamterMap()-------"); // 得到请求的参数Map,注意map的value是String数组类型 Map map = request.getParameterMap(); Set<String> keySet = map.keySet(); for (String key : keySet) { String[] values = (String[]) map.get(key); for (String value : values) { System.out.println(key + "=" + value); } } System.out.println("--------request.getHeader()--------"); // 得到请求头的name集合 Enumeration<String> em = request.getHeaderNames(); while (em.hasMoreElements()) { String name = (String) em.nextElement(); String value = request.getHeader(name); System.out.println(name + "=" + value); } }在浏览器地址栏中访问下面的 URL: http://127.0.0.1:8080/ServletDemo01/Servlet01?name=yanchangsheng&password=123456 ? 后面跟的是参数,多个参数之间用& 连接。控制台输出结果:
getRequestURL: http://127.0.0.1:8080/ServletDemo01/Servlet01 HttpServletResponse 对象与 HttpServletRequest 相反,HttpServletResponse 对象是专门用来封装 HTTP 响应消息的。客户端发出了请求,得对人家有所回应呀,HttpServletResponse 就是做这项工作的。由于 HTTP 响应消息分为状态行、响应消息头、响应消息体三部分,因此,在 HttpServletResponse 接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。 1) 发送状态码相关的方法① void setStatus(int status)该方法用于设置 Http 响应消息的状态码,并生成响应状态行。 由于响应状态行中的状态描述信息直接与状态码相关,而 HTTP 版本由服务器确定,因此,只要通过 setStatus() 方法设置了状态码,即可实现状态行的发送。 需要注意的是,在正常情况下,Web 服务器会默认产生一个状态码为 200 的状态行。 ② void sendError(int sc)该方法用于发送表示错误信息的状态码。例如,404 状态码表示找不到客户端请求的资源。 HttpServletResponse 对象提供了两个重载的 sendError(int sc) 方法,具体如下:
public void sendError(int code) throws java.io.IOException 2) 发送响应消息头相关的方法
3) 发送响应消息体相关的方法① ServletOutputStream getOutputStream()方法该方法所获取的字节输出流对象为 ServletOutputStream 类型。 由于 ServletOutputStream 是 OutputStream 的子类,它可以直接输出字节数组中的二进制数据,因此,要想输出二进制格式的响应正文,就需要使用 getOutputStream() 方法。 ② PrintWriter getWriter()方法 它返回了一个可以向客户端发送文本的的 Java.io.PrintWriter 对象。 由于 PrintWriter 类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用 getWriter() 方法。 默认情况下,PrintWriter 对象使用 ISO-8859-1 编码(该编码在输入中文时会发生乱码,乱码问题后面章节会讲到)。 注意:虽然HttpServletResponse 对象的 getOutSream() 和 getWriter() 方法都可以发送响应消息体,但是他们之间相互排斥,不可以同时使用,否则会发生异常。(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |