JavaEE—— HttpServletRequest
HttpServletRequest
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,
一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,
HttpServletRequest是ServletRequest的子接口。
request的运行流程
通过抓包工具抓取Http请求
通过request获得请求行
获得请求的资源:
---web
应用的名称
String
getQueryString()
---- get
提交
url
地址后的参数字符串
username=zhangsan&password=123
注意:request获得客户机(客户端)的一些信息
request.getRemoteAddr() --- 获得访问的客户端IP地址
通过request获得请求头
long
getDateHeader(
String name)
Enumeration
getHeaders(
String name)
int
getIntHeader(
String name)
1 public class HeadServlet extends HttpServlet {
2
3 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
4 //1.获取指定的头
5 String header=request.getHeader("User-Agent");
6 System.out.println(header);
7 //2.获取所有头的名称
8 Enumeration<String> headerNames=request.getHeaderNames();
9 while(headerNames.hasMoreElements()){
10 String headerName=headerNames.nextElement();
11 String headerValue=request.getHeader(headerName);
12 System.out.println(headerName+"..."+headerValue);
13 }
14
15 }
referer头的作用:执行该此访问的的来源
做防盗链
代码演示:
1 //获取refer的信息
2 String refer=request.getHeader("referer");
3 //对referer进行判断
4 response.setContentType("text/html;charset=utf-8");
5 if(refer!=null&&refer.startsWith("http://localhost")){
6 response.getWriter().write("一、京东重创中国网络零售商京东创始人刘强东涉嫌犯罪事态升级。"
7 + "明尼拿波里斯警察局发言人埃尔德(John Elder)接受电话采访表示,刘强东涉嫌强暴重罪");
8 }else{
9 response.getWriter().write("你是盗链者,可耻");
10 }
11 }
通过request获得请求体
String
getParameter(
String name)
String[]
getParameterValues(
String name)
Enumeration
getParameterNames()
Map<String,String[]>
getParameterMap()
代码演示:
1 package com.oracle.demo01;
2
3 import java.io.IOException;
4 import java.util.Map;
5
6 import javax.servlet.ServletException;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 public class ContentServlet extends HttpServlet {
12
13 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
14 //获取单个值
15 String username=request.getParameter("username");
16 System.out.println(username);
17 //获取指定表单元素的value值
18 String[] hobbys=request.getParameterValues("hobby");
19 for(String h:hobbys){
20 System.out.println(h);
21 }
22 //获取所有参数并封装到一个Map<String,String[]>中
23 Map<String,String[]> map=request.getParameterMap();
24 for(Map.Entry<String, String[]> entry:map.entrySet()){
25 //参数name值
26 System.out.println(entry.getKey());
27 //参数value值(String[])
28 for(String str:entry.getValue()){
29 System.out.println(str);
30 }
31 System.out.println("--------------------------------------");
32 }
33 }
34
35 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
36 doGet(request, response);
37 }
注意:get请求方式的请求参数 上述的方法一样可以获得
解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");
解决get提交的方式的乱码:
parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
request是一个域对象
request对象也是一个存储数据的区域对象,所以也具有如下方法:
setAttribute(
String name,
Object o)
getAttribute(
String name)
removeAttribute(
String name)
注意:request域的作用范围:一次请求中
request完成请求转发
获得请求转发器----path
是转发的地址
RequestDispatcher
getRequestDispatcher(
String path)
通过转发器对象转发requestDispathcer.forward(
ServletRequest request,
ServletResponse response)
代码演示:
1 public class Servlet01 extends HttpServlet {
2
3 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
4 //往域对象中设置值
5 request.setAttribute("name","zhangsan");
6 //请求转发到Servlet02
7 request.getRequestDispatcher("/Servlet02").forward(request, response);;
8 }
9 }
10
11
12 public class Servlet02 extends HttpServlet {
13
14 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
15 String name=(String)request.getAttribute("name");
16 response.getWriter().write(name);
17 }
18 }
注意:ServletContext域与Request域的生命周期比较?
ServletContext
:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个
web
应用
request
:
创建:访问时创建
request
销毁:响应结束
request
销毁
域的作用范围:一次请求中
注意:转发与重定向的区别?
1
)重定向两次请求,转发一次请求
---
快
2
)重定向地址栏的地址变化,转发地址不变
3
)重新定向可以访问外部网站
转发只能访问内部资源
4
)转发的性能要优于重定向
总结:
request
获得行的内容
request.getMethod()
request.getRequestURI()
request.getRequestURL()
request.getContextPath()
request.getRemoteAddr()
request
获得头的内容
request.getHeader(name)
request
获得体(请求参数)
String request.getParameter(name)
Map<String,String[]> request.getParameterMap();
String[] request.getParameterValues(name);
注意:客户端发送的参数
到服务器端都是字符串
获得中文乱码的解决:
1 post:request.setCharacterEncoding(“UTF-8”); 2 3 get: 4 5 parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”); 6 7 8 9 request转发和域 10 11 request.getRequestDispatcher(转发的地址).forward(req,resp); 12 13 request.setAttribute(name,value) 14 15 request.getAttribute(name)