request既是请求对象,也是一个域对象。
一、HttpServletRequest request请求对象
HttpServletRequest request由服务器创建、管理、和销毁,我们只管使用。
request用来封装要请求的信息,我们通过request就可以获取这些请求信息。
1.配置Servlet的虚拟路径
servlet3.0以后支持注解配置,可以简化我们的配置
urlPatterns 和 value 一个意思,都是配置Servlet的虚拟路径
//方式1
@WebServlet(name = "MyServlet1",value = {"/demo1","haha","heihei"})
//方式2
@WebServlet(urlPatterns = "/demo2")
一个servlet可以配置多个虚拟路径;一个映射路径只能对应一个servlet;
当映射路径只有一个,value可以不写;但urlpatterns不可省略
2.通过request获取请求行的请求信息
- 获取请求参数
String queryString = request.getQueryString();//结果还需自己截取
- 获取请求方式
String method = request.getMethod();
- 获取请求ip
String ip = request.getRemoteAddr();
- 获取请求协议
String protocol = request.getProtocol();
- 获取标识符
URI:统一资源标识符(资源)
String uri = request.getRequestURI();
- 获取定位符
URL:统一资源定位符(协议:主机:端口://资源)
StringBuffer url = request.getRequestURL();
- 动态获取项目的上下文路径
String contextPath = request.getContextPath();
3.获取请求头的值
String header = request.getHeader("user-Agent");
user-Agent:用户设备
4.获取请求体的信息(只有post请求有)
- 获取请求参数
if(request.getMethod().equals("POST")){
//post请求获取请求参数
BufferedReader reader = request.getReader();
String s = reader.readLine();
}else if(request.getMethod().equals("GET")){
//get请求获取请求参数
String queryString = request.getQueryString();
}
- 上传文件
ServletInputStream in = request.getInputStream();
- 通用的获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
- 中文乱码问题
//tomcat8.0以上的版本,get请求中文不乱码;但post请求中文会乱码。
//解决中文乱码问题
request.setCharacterEncoding("utf-8");
- 去复选框里的数据——针对复选框
爱好:<input type="checkbox" name="hobby" value="running">跑步
<input type="checkbox" name="hobby" value="singing">唱歌
<input type="checkbox" name="hobby" value="swimmimg">游泳
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
- 一次性获取表单里的所有内容
Map<String, String[]> parameterMap = request.getParameterMap();
Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String, String[]> entry : entries) {
String key = entry.getKey();
System.out.println(key);
String[] value = entry.getValue();
System.out.println(Arrays.toString(value));
}
- 获取表单里的所有的键
//获取所有参数的名称,枚举类型
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String s = parameterNames.nextElement();
System.out.println(s);//键
String parameter = request.getParameter(s);//键找值
System.out.println(parameter);
}
5.请求转发
request.getRequestDispatcher("/demo2").forward(request,response);
- 请求转发、重定向
请求转发、重定向 | |
---|---|
共同点 | 都可以进行资源的跳转 |
不同点 | 重定向:两次请求,两次响应;请求转发:一次请求,一次响应 |
重定向:地址栏,会发生变化;请求转发:地址栏不发生变化 | |
重定向:既可以跳转内部资源,也可以跳转外部资源;请求转发只能跳转内部资源 |
6.request域对象
- 范围:是一次请求,一次响应(只存在于一次请求响应中)
- 存取数据:
request.setAttribute("name","张三");
Object name = request.getAttribute("name");
- ServletContext全局域对象、request请求域对象
ServletContext全局域对象 | request请求域对象 |
---|---|
ServletContext 代表整个web应用 | request 域对象:他代表的范围,是一次请求和一次响应 |
- 注意:
- request域对象共享数据时——>用请求转发
用重定向时——>不能用request,可以用ServletContext域对象共享数据 - WEB-INF下面的资源,重定向不能访问
WEB-INF下面的资源,要访问,只能请求转发
7.路径的书写
建议以/开头
- (html、jsp)页面上的都需要项目的上下文路径;
- 重定向也需要项目的上下文路径;
- 请求转发不需要,写了会报错(请求转发只能访问内部资源)。