这两个对象可以模拟成袋子和手机:
服务器每次收到请求,都会给这个请求开辟一个新的线程
服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体!(袋子)
服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应。(手机)
********************************************************************************************************************
request:
request是jsp中 重要的对象,每个request对象封装这一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。
除此之外,request可代表本次请求范围,所以还可用于操作request范围内的属性。
request的方法大家可以查看HttpServletRequest的API下面对其中的几个常用的方法做详细的解释
* 获取常用信息
> 获取客户端IP,案例:封IP。request.getRemoteAddr()
> 请求方式,request.getMethod(),可能是POST也可能是GET(HttpServlet中的service方法有判断是get和post请求的语句,好让子类通过该方法根据需要执行get或者post)
* 获取HTTP请求头(****标记的是最重要的方法)
> *****String getHeader(String name),适用于单值头
> int getIntHeader(String name),适用于单值int类型的请求头
> long getDateHeader(String name),适用于单值毫秒类型的请求头
> Enumeration<String> getHeaders(String name),适用于多值请求头
<span style="font-size:18px;">/**
* 演示:获取客户端IP地址,获取请求方式,获取user-Agent,得到客户端的信息(操作系统浏览器)。
* @author PC
*/
public class ASerlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String addr = request.getRemoteAddr();//获取客户端的IP地址
System.out.println("IP:"+addr);
System.out.println("请求方式:"+request.getMethod());//获取请求方式
String userAgent = request.getHeader("User-Agent");
System.out.println(userAgent);
}
}</span>
* 获取请求URL
假设一路径为:
http://localhost:8080/day10_2/AServlet?username=xxx&password=yyy
则执行下列方法分别取值为
> String getScheme():获取协议,http
> String getServerName():获取服务器名,localhost
> String getServerPort():获取服务器端口,8080
> *****String getContextPath():获取项目名,/day10_2
> String getServletPath():获取Servlet路径,/AServlet
> String getQueryString():获取参数部分,即问号后面的部分。username=xxx&password=yyy
> String getRequestURI():获取请求URI,等于项目名+Servlet路径。/day10_2/AServlet
> String getRequestURL():获取请求URL,等于不包含参数的整个请求路径。http://localhost:8080/day10_2/AServlet
* 获取请求参数:请求参数是由客户端发送给服务器的!有可能是在请求体(POST),也可能是在URL之后(GET)
请求参数:有一个参数一个值的,还有一个参数多个值!
> *****String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数
> String[] getParameterValues(String name):获取指定名称的请求参数值,适用于多值请求参数
> Enumeration<String> getParameterNames():获取所有请求参数名称
> *****Map<String,String[]> getParameterMap():获取所有请求参数,其中key为参数名,value为参数值。
* 请求转发和请求包含
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet"); 使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的Servlet路径
请求转发:*****rd.forward(request,response);
请求包含:rd.include(request,response);
有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
> 一个请求跨多个Servlet,需要使用转发和包含。
> 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
> 请求包含:由两个Servlet共同未完成响应体!(都留)
> 无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!
* 请求转发和重定向的区别
> 请求转发是一个请求一次响应,而重定向是两次请求两次响应
> 请求转发地址栏不变化,而重定向会显示后一个请求的地址
> 请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目
> 请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名!
> 请求转发和重定向效率是转发高!因为是一个请求!
<> 需要地址栏发生变化,那么必须使用重定向!
<> 需要在下一个Servlet中获取request域中的数据,必须要使用转发
* request域
Servlet中三大域对象:request、session、application,都有如下三个方法:
> void setAttribute(String name, Object value)
> Object getAttribute(String name)
> void removeAttribute(String name);
> 同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。
getAttribute和getParameter的区别:
getParameter是获取参数的方法,参数是客户端给服务器传的值,而getAttribute是servlet转发之间为了共享某些数据的方法,这是两者间的本质差别。
注意:请求参数的相关方法全是get方法,不允许设置,相当于用户传递什么你就得用什么,而request域中有设置属性的方法,因为转发的双方都是服务器,所以可以一个服务器使用setAttribute设置属性,一个服务器getAttribute使用属性