12、HttpServletRequest接口
1、HttpServletRequest是一个接口,Servlet规范中重要接口之一
2、继承关系:
public interface HttpServletRequest extends ServletRequest{ }
3、HttpServletRequest接口的实现类是WEB容器负责实现的, Tomcat服务器有自己的实现。但是程序员还是只需要面向HttpServletRequest接口调用方法即可,不需要关心具体的实现了。
4、HttpServletRequest这个对象中封装了哪些信息呢?
封装了HTTP请求协议的全部内容:
- 请求方式
- URI
- 协议版本号
- 表单提交的数据
5、HttpServletRequest一般变量的名字叫做: request,表示请求
- HttpServletRequest对象代表一次请求,一次请求对应一个request对象,100个请求对应100个request对象,所以request对象的生命周期是短暂的,
什么是一次请求?
到目前为止,我们可以这样理解一次请求:在网页上点击超链接,到最终网页停下来,这就是一次完整的请求。
6、HttpServletRequest接口中常用的方法:
第一组
表单提交的数据,会自动被封装到request对象中,request对象中有Map集合存储这些数据: Map集合的key是name; value是一个字符串类型的一维数组
-
String getParameter(String name)
//通过表单key获取value这个一维数组中的首元素
(通常情况下这个一维数组中只有一个元素,所以这个方法使用最多) -
String[] getParameterValues(String name)
//通过Map集合key获取value -
Map getParameterMap()
//获取整个Map集合 -
Enumeration getParameterNames()
//获取整个Map集合的所有key
范例:
index.html
<form action="/prj-servlet-ServletRequeset/usersubmit" method="post">
用户名
<input type= "text" name= "username">
<br>
密码
<input type= "password" name= "password">
<br>
性别
男<input type= "radio" name="sex" value="m">
女<input type= "radio" name= "sex" value="f">
<br>
爱好
<input type= "checkbox" name= "interest" value= "sport">运动
<input type= "checkbox" name= "interest" value= "music">音乐
<input type= "checkbox" name= "interest" value= "dance">跳舞
<input type= "checkbox" name= "interest" value= "study">学习
<input type= "checkbox" name= "interest" value= "read">阅读
<br>
学历
<select name= "grade">
<option value= "gz">高中</option>
<option value= "dz">大专</option>
<option value="db">大本</option>
</select>
<br>
简介
<textarea rows="10" cols= "60" name= "introduce"></textarea>
<br>
<input type= "submit" value= "注册">
<input tvpe= "reset" value= "重置">
</form>
SaveUserServlet类:
public class SaveUserServlet extends HttpServlet {
@Override
protected void doPost (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取用户信息,表单提交的,这些数据被自动封装到request对象中了
//从request中获取这些信息
//表单数据是这样的格式提交的,POST请求,在请求体中提交,数据格式:
//usecname-admin&pas sword=123&sex=m&interest=sport&interest=music&grade=dz&introduc
/*
* Map<String, String[]>
* key value
* --------------------------
* username {"admin"}
* password {"123"}
* sex {"m"}
* interest {"sport", "music" }
* grade {"dz"}
* introduce {"ok"}
*/
String username = request.getParameter("username");
String password = request.getParameter("password" );
String sex = request. getParameter("sex");
//因为getParameter()只能获取首元素,所以这里不能用该方法
//String interest = request.getParameter("interest");
String grade = request.getParameter("grade");
String introduce = request.getParameter("introduce");
System.out.print1n(username);
System.out.println(password);
System.out.println(sex);
System.out.println(grade);
System.out.println(introduce);
//获取所有的兴趣爱好
//getParameterValues()这个方法适合取checkbox中的数据
String[] interests = request.getParameterValues("interest");
for(String in : interests) { //foreach
System.out.println(in);
}
//获取整个参数Map集合
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> names = parameterMap.keySet(); //获取key
for(String name : names) {
String[] values = parameterMap.get(name); //key获取value
System.out.print(name + " = "); //不用带有换行的println,使key,valuey同行展示
for(String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
//获取参数Map集合所有的key
Enumeration<String> keys = requet.getParameterNames();
while(keys.hasMoreElements()){
String name = keys.nextElement();
System.out.println(name);
}
}
}
第二组
-
String getContextPath()
//获取上下文路径,webapp的根路径 -
String getMethod()
//获取浏览器的请求方式 -
String getRequestURI()
//获取URI -
StringBuffer getRequestURL()
//获取URL -
String getServletPath()
//获取Servlet PATH ur1- pattern -
String getRemoteAddr()
//获取客户端IP地址
范例:
web.xml:
<servlet>
<servlet-name>myRequest</servlet-name>
<servlet-class>com.gkd.javaee.myRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myRequest</servlet-name>
<url-pattern>/myRequest</url-pattern>
</servlet-mapping>
myRequest类:
public class myRequest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//获取上下文路径[webapp的根路径]
String contextPath = request.getContextPath();
out.print("contextPath = " + contextPath + "<br>");
//获取浏览器的请求方式
String method = request.getMethod();
out.print("method = " + method + "<br>");
//获取请求的URI
String uri = request.getRequestURI();
out.print("uri = " + uri + "<br>");
//获取请求的URL
String url = request.getRequestURL().toString();
out.print("url = " + url + "<br>");
//获取Servlet Path
String servletPath = request.getServletPath();
out.print("servlet path = " + servletPath + "<br>");
//获取客户端IP地址
String clietIp = request.getRemoteAddr();
System.out.println("client ip =" + clietIp);
}
}
第三组
-
void setAttribute(String name, object o)
//向request范围中存储数据 -
Object getAttribute(String name )
//request范围中读取数据 -
void removeAttribute(String name)
//移除request范围中的数据
ServletContext是Servlet上下文对象,该接口中也有这样几个方法:
- void setAttribute(String name, Object o) //向ServletContext范围中添加数据
- Object getAttribute(String name ) //从ServletContext范围中读取数据
- void removeAttribute(String name ) //移除ServletContext范围中的数据
ServletContext是一个怎样的范围?
所有用户共享的一个范围对象,我们一般把ServletContext变量命名为: application
可见这个对象代表一个应用。一个webapp只有一个这样的对象。范围极大!
HttpServletRequest是一个怎样的范围呢?
HttpServletRequest类型的变里通常命名为: request,代表当前的本次请求
一次请求对应一个request对象,100个请求对应100个请求对象。
请求范围是极小的,request只能完成在同一次请求中传递数据。
注意:以下两个方法的区别
- String value = request.getParameter(name); //从表单上获取数据
- 0bject obi = request.getAttribute(name); //从request范围中获取数据(之前一 定调用过:setAttribute )
范例:一次请求对应一个request对象,这里点击一次算一个请求
index.html :
<a href="/prj-servlet-HttpServletRequest/a"> AServlet </a>
<a href="/prj-servlet-HttpServletRequest/b"> BServlet </a>
AServlet:
public class AServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
//创建User对象
User user = new User();
user.setUsercode("111");
user.setUsername("zhangsan");
//将User对象存储到request范围中
request.setAttribute("user0bj", user);
//从request范围中取出数据
0bject obi = request.getAttribute("user0bj");
resbonse.getWriter().print(obi);
}
}
BServlet:
public class BServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
//从request范围中取出数据
object obj = request.getAttribute("user0bj");
respons.getWriter().print(obj);
}
}
BServlet并不能从request中取出实体类user数据,因为点击BServlet的时候,其实是发送了一个新的请求,而BServlet并没有向这个请求里存入user数据,所以取出为null
这是个request的范围问题,如果把两个servlet放到同一个请求中,是不是就解决了?
执行完AServlet之后,跳转到BServlet执行,将AServlet执行和BServlet执行放到同一个请求当中
必须使用转发技术,forward [转发]
- 获取请求转发器对象
- 调用请求转发器的forward方法即可完成转发
第四组
-
RequestDispatcher getRequestDispatcher(String path)
//获取请求转发器,让转发器对象指向某个资源
public class AServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
//创建User对象
User user = new User();
user.setUsercode("111");
user.setUsername("zhangsan");
//将User对象存储到request范围中
request.setAttribute("user0bj", user);
//转发[转发属于同一次的请求]
request.getRequestDispatcher("/b").forward(request, response);
}
}
第五组
- void setCharacterEncoding(String env) //用于解决乱码问题,后面讲
第六组
- Cookie[] getCookies() //后面讲【讲Cooki e的时候讲】
- HttpSession getSession() //后面讲 【讲Sess ion的时候讲】
关于范围对象的选择:
- ServletContext应用范围,可以跨用户传递数据
- ServletRequest请求范围,只能在同一个请求中传递数据【可以跨Servlet传递数据,但是这多个Servlet必须在同一个请求当中】
- 优先选择request范围,因为占资源少,用完就回收
上一篇: java封装一个类MyStock存放在cn.com.my包中。
下一篇: 什么是纯函数