HttpServletRequest接口
看完本文章可看Servlet请求转发
HttpServletRequest接口
-
HttpServletRequest是一个接口,Servlet规范中重要的接口之一
-
继承关系
public interface HttpServletRequest extends ServletRequest
-
HttpServletRequest接口的实现类时Web容器负责的,Tomcat服务器有自己的实现。但是程序要还是只需要面向HttpServletRequest接口调用方法即可,不需要关心具体的实现类
-
HttpServletRequest这个对象中封装了哪些信息?
封装了HTTP请求协议的全部内容:
-
请求方式
-
URI
-
协议版本号
-
表单提交的数据
…
-
-
HttpServletRequest一般对象的名字叫做:request;
HttpServletRequest对象代表一次请求,一次请求执行一次service()方法,对应一个request对象,100个请求对应100个request对象,所以request对象的生命周期是短暂的;
什么是一次请求?到目前为止,我们可以这样理解一次请求:在网页上点击超链接,到最终网页停下来,这就是一次完整的请求;
-
获取用户信息,表单提交的这些数据被自动封装在request对象中了
表单数据是这样的格式提交的,POST请求,在请求体中提交,数据格式:username=admin&password=123&sex=boy&interest=sport&interest=music&grade=gz&introduce=student
表单提交的数据会自动封装到request对象中,request对象中有一个Map集合,存储这些数据
Map<String, String> key value(value是数组) ------------------------------- username {"admin"} password {"123"} sex {"boy"} interest {"sport",music} grade {"gz"} introduce {"IAmAStudent"}
-
HttpServletRequest中常用的方法
表单提交的数据会封装在request对象的Map集合中,key是name,value是一个一维数组
/*获取浏览器提交的数据*/ String getParameter(String name) 获取key对应的一维数组的首元素 Map getParameterMap() 获取request对象中的Map集合 Enumeration getParameterNames() 获取所有的Map集合中所有的key String[] getP arameterValues(String name) 返回String数组,数组包含key对应的多个value值 /*获取路径、URL、URI、IP*/ String getContextPath() 获取上下文路径(web项目根路径) String getMethod() 获取浏览器请求方式 String getRequestURI() 获取请求的URI StringBuffer getRequestURL() 获取请求的URL String getServletPath() 获取请求的ServletPath,即servlet对应的请求路径 String getRemoteAddr() 获取客户端IP地址 /*从一次请求对应的HttpServletRequest对象范围中增删查数据*/ Object getAttribute(String name) 从此次请求对应的request对象范围中获取数据 void setAttribute(String name, Object o) 从此次请求对应的request对象范围中存储数据 void removeAttribute(String name) 从此次请求对应的request对象范围中删除数据 /*请求转发器*/ RequestDispatcher getRequestDispatcher(String path) 获取请求转发器 /*编码*/ void setCharacterEncoding(String env) 覆盖此请求正文中使用的字符编码的名称 /**/ HttpSession getSession() 返回与此请求关联的当前会话,或者如果该请求没有会话,则创建一个。 Cookie[] getCookies() 返回一个数组,其中包含Cookie 客户端与此请求一起发送的所有对象。
-
HttpServletRequest和ServletContext的范围
-
HttpServletRequest是一次请求对应一个request对象,所以范围小
-
ServletContext是webapp的上下文对象,范围极大
-
setAttribute、getAttribute、removeAttribute这些方法,在ServletContext和ServletContext接口中都存在,用来在其各自的范围内进行数据的增删查,所以在request对象的范围增删查和在Servlet上下文对象的范围增删查是不一样,且互不干扰的
-
-
一次请求Servlet对应的request对象,在此request中存储数据,可以在此request对象中取出;但是在另一次请求Servlet对应的request对象,是没有第一次请求时在request对象中添加的数据的。
要解决这个不同请求对应的不同request对象之间无法共享数据的问题,需要使用请求转发技术。