Request翻译过来就是请求的意思,当客户端(网页)想要得到服务器提供的资源,就要向服务器发起请求,发起请求服务器会自动生成一个Request对象。我们可以使用这个request对象进行相应,请求转发等等事情。
关于request对象的应用我们大致可以分为以下部分:
- 获取头的参数
- 获取请求参数
- request域
- 请求转发
- 其他方法
我们在看request对象有关的类的时候是看Request类的实现类,我们下面讲的都是他的实现类HttpServletRequest类。
1. 获取请求头的参数
//获取请求头
request.getHeader("Host"); //一个请求头对应一个值
Enumeration<String> headers = request.getHeaders("Accept");//一个请求头对应多个值
while (headers.hasMoreElements()){
String s = headers.nextElement();
System.out.println(s);
}
2. 获取请求参数
为了防止获取的数据产生乱码我们要使用setCharacterEncoding()
来进行对请求的内容进行设置字符集编码
获取请求参数一共有三种方法
getParameter()
这个方法只能获取的是一个参数名对应一个参数值,比如表单里面的输入框getParameterValues()
这个方法获取的是一个参数名对应多个参数值.比如表单里面的多选框getParameterMap()
这个方法获取的是一个全部参数名与参数值组合的一个map集合
request.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");
String[] parameterValues = req.getParameterValues("love");
//下面的方法返回的ArrayList是自己内部的一个ArrayList,进行删除,修改,增加,会报异常
List<String> list = Arrays.asList(parameterValues);
Map<String, String[]> parameterMap = req.getParameterMap();
//1.遍历map集合
//先得到key,再得到value
//2.得到Entryset集合,再遍历这个集合
Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String, String[]> entry:entries) {
String[] value = entry.getValue();
String key = entry.getKey();
}
3. request域
request的作用域只能是在当前请求中有效。这里举个例子当李四通过访问网页发送一个请求给服务器,发送的请求里面附带了参数名为name,参数值为lisi的信息给Aservlet,李四又发送了一个请求给服务器,发送的第二次请求是不能访问到参数名为name,参数值为lisi的信息。所以作用域只能在当前请求中有效,在别的请求是无法访问到改请求的参数信息。
4. 请求转发
请求转发通俗的来说就是用户张三发送一条请求到服务器的Aservlet中,Aservlet不能完成该请求,Aservlet又把请求转发给Bservlet,这个过程就叫做请求转发。在这个过程中Aservle只能把请求转发给服务器内部的资源,不可以转发给服务器的外部资源,这个过程中张三不知道Aservlet又把请求转发给Bservlet,所以请求转发对于用户张三来说就只请求了一次服务器。
请求转发的特点
- 只能转发到服务器的内部资源
- 对于客户端来说只发生一次请求
- 地址栏不发生改变(客户端请求url没有改变)
- request域在请求转发有效
下面是请求转发的代码
//请求转发
RequestDispatcher d1= request.getRequestDispatcher("/Bservlet");//里面的参数 是路径 得到转发器
d1.forward(request,response); //进行转发
5. 其他方法
request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法。
- int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;
- String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;
- String getMethod():返回请求方法,例如:GET
- Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;
- String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;
- void setCharacterEncoding(String code):设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!
- String getContextPath():返回上下文路径,例如:/hello
- String getQueryString():返回请求URL中的参数,例如:name=zhangSan
- String getRequestURI():返回请求URI路径,例如:/hello/oneServlet
- StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;
- String getServletPath():返回Servlet路径,例如:/oneServlet
- String getRemoteAddr():返回当前客户端的IP地址;
- String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
- String getScheme():返回请求协议,例如:http;
- String getServerName():返回主机名,例如:localhost
- int getServerPort():返回服务器端口号,例如:8080
System.out.println("request.getContentLength(): " + request.getContentLength()); System.out.println("request.getContentType(): " + request.getContentType()); System.out.println("request.getContextPath(): " + request.getContextPath()); System.out.println("request.getMethod(): " + request.getMethod());
System.out.println("request.getLocale(): " + request.getLocale());
System.out.println("request.getQueryString(): " + request.getQueryString()); System.out.println("request.getRequestURI(): " + request.getRequestURI());
System.out.println("request.getRequestURL(): " + request.getRequestURL());
System.out.println("request.getServletPath(): " + request.getServletPath()); System.out.println("request.getRemoteAddr(): " + request.getRemoteAddr());
System.out.println("request.getRemoteHost(): " + request.getRemoteHost());
System.out.println("request.getRemotePort(): " + request.getRemotePort());
System.out.println("request.getScheme(): " + request.getScheme());
System.out.println("request.getServerName(): " + request.getServerName());
System.out.println("request.getServerPort(): " + request.getServerPort());
3.2.4.1案例:request.getRemoteAddr():封IP
可以使用request.getRemoteAddr()方法获取客户端的IP地址,然后判断IP是否为禁用IP。
String ip = request.getRemoteAddr();
System.out.println(ip);
if(ip.equals("127.0.0.1")) {
response. getWriter().print("您的IP已被禁止!");
}else{
response.getWriter().print("Hello!");
}