一、request
request封装了客户端所有的请求
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。
request对象的功能
1)获取Http的请求头
String getHeader(String name)
获取指定名称的请求头int getIntHeader(String name)
获取值为int类型的请求头Enumeration getHeaderNames()
获取所有请求头名称
小栗子:
获取客户端的IP地址、获取请求方式、获取User-Agent,得到客户端的信息(操作系统 浏览器)。
import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 获取客户端的IP地址、获取请求方式、获取User-Agent,得到客户端的信息(操作系统 浏览器)。 * */public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String addr = request.getRemoteAddr();//获取客户端的IP地址 response.sendRedirect("http://www.baidu.com"); if(true) return; System.out.println("IP: " + addr); System.out.println("请求方式:" + request.getMethod());//获取请求方式 String userAgent = request.getHeader("User-Agent");//获取名为User-Agent的请求头! // 是否包含Chrome,如果包含,说明用户使用的是google浏览器 if(userAgent.toLowerCase().contains("chrome")) { System.out.println("您好:" + addr + ", 你用的是谷歌"); } else if(userAgent.toLowerCase().contains("firefox")) { System.out.println("您好:" + addr + ", 你用的是火狐"); } else if(userAgent.toLowerCase().contains("msie")) { System.out.println("您好:" + addr + ", 你用的是IE"); } } }
运行结果
2)获取请求url
例如地址:http://localhost:8080/visitCount/AServlet?username=xxx&pwd=yyy
String getScheme()
获取协议http
String getServerName()
获取服务器名localhost
String getServerPort()
获取服务器端口8080
String getContextPath()
获取项目名/visitCount
String getServletPath()
获取Servlet路径/AServlet
String getQueryString()
获取参数部分,即问号后面的部分username=xxx&password=yyy
String getRequestURI()
获取请求URI,即项目名+Servlet路径/visitCount/AServlet
String getRequestURL()
获取请求URL,即不包含参数的整个请求路径http://localhost:8080/visitCount/AServlet
获取请求url
3)获取请求参数
请求参数是由客户端发送给服务器的
有可能是在请求体中(POST),也可能是在URL之后(GET)String getParameter(String name)
获取指定名称的请求参数值,适用于单值请求参数String[] getParameterValues(String name)
获取指定名称的请求参数值,适用于多值请求参数Enumeration<String> getParameterNames()
获取所有请求参数名称Map<String,String[]> getParameterMap()
获取所有请求参数,其中key为参数名,value为参数值。
4)请求转发和请求包含
在一个请求链中,涉及到多个Servlet
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的Servlet路径请求转发
rd.forward(request,response);请求包含
rd.include(request,response);
在什么时候使用请求转发和请求包含
需要多个Servlet协作才能完成,需要在一个Servlet跳到另一个Servlet。
一个请求跨多个Servlet,需要使用转发和包含。
请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(针对第一个Servlet来说:留头不留体)
请求包含:由两个Servlet共同未完成响应体!(都留)
无论是请求转发还是请求包含,都在一个请求范围内,使用同一个request和response。
小栗子:请求转发
OneServlet.java
package cn.itcast.servlet.forward;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 请求转发 * */public class OneServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("OneServlet..."); response.setHeader("aaa", "AAA");//设置响应头 response.getWriter().print("a");//设置响应体//如果要转发给其他页面做,就不要在本页面做太多动作,不然会抛异常//如果执行下面注释的代码就会抛异常// for(int i = 0; i < 1024 * 24 + 1; i++) {// response.getWriter().print("a");//设置响应体// } //请求转发 request.getRequestDispatcher("/TwoServlet").forward(request, response); } }//只保留请求头内容显示TwoServlet.java的内容
5)request域
在两个Servlet中通过转发或包含来完成传递中会用到request域
request是Servlet三大域对象之一。
request,session,application。这三大域都有一下几种方法void setAttribute(String name, Object value)
用来存储一个对象,也可以称之为存储一个域属性Object getAttribute(String name)
用来获取request中的数据,当前在获取之前需要先去存储才行void removeAttribute(String name)
用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做Enumeration getAttributeNames()
获取所有域属性的名称
同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。
6)请求转发和重定向的区别
请求转发是一个请求一次响应,而重定向是两次请求两次响应
请求转发地址栏不变化,而重定向会显示后一个请求的地址
请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目
请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名!
转发的效率比重定向的效率高
需要地址栏发生变化,那么使用重定向!
需要在下一个Servlet中获取request域中的数据,要使用转发!
二、response
response是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletResponse。
ServletResponse和HttpServletResponse的区别
ServletResponse是与协议无关的类型
HttpServletResponse是与协议相关的类型
1.response对象的功能
1)发送状态码
状态码:200表示成功、302表示重定向、404表示客户端错(访问的资源不存在)、500表示服务器端错sendError(int sc)
发送错误状态码,eg:404,500sendError(int sc, String msg)
发送错误状态码,携带一个错误信息setStatus(int sc)
发送成功的状态码,可以用来发送302
小栗子:发送404
import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 发送404状态码 * */public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendError(404, "您访问的资源存在,就不给你看!"); } }
2)设置响应头信息
响应头:Content-Type、Refresh、Location等等
头就是键值对setHeader(String name, String value)(常用)
适用于单值的响应头,
例如:response.setHeader("aaa", "AAA");
名字叫aaa,值是AAAaddHeader(String name, String value)
适用于多值的响应头
例如:
response.addHeader("aaa", "A");
response.addHeader("aaa", "AA");
response.addHeader("aaa", "AAA");setIntHeader(String name, int value)
适用于单值的int类型的响应头
例如:response.setIntHeader("Content-Length", 888);addIntHeader(String name, int value)
适用于多值的int类型的响应头setDateHeader(String name, long value)
适用于单值的毫秒类型的响应头
例如:response.setDateHeader("expires", 1000 * 60 * 60 * 24);addDateHeader(String name, long value)
适用于多值的毫秒类型的响应头
小栗子:
①发送302,设置Location头,完成重定向
重定向思路图
import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 重定向! * * 用户请求BServlet,然后BServlet响应302,给出Location头 */public class BServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("BServlet"); /* * 重定向: * 1. 设置Location * 2. 发送302状态码 */// response.setHeader("Location", "/text/CServlet");// 项目名/Servlet路径(请求url)// response.setStatus(302); //快捷的重定向方法 response.sendRedirect("/text/CServlet"); } }
作者:乐乐亲么么哒
链接:https://www.jianshu.com/p/66fc154b7d73
共同学习,写下你的评论
评论加载中...
作者其他优质文章