我们在编写一个Servlet程序的时候,要继承HttpServlet这个抽象类并重写doGet()或者doPost()方法,重写的方法要调用方法传入2个参数,request和response,这里我们来看看HttpServletRequest这个接口

HttpServletRequest代表客户端的请求,用户通过HTTP协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息
点进去这个接口,我们可以看到有如下方法

HttpServletRequest是继承ServletRequest接口的,ServletRequest里有如下方法

接下来将按照HttpServletRequest的实际应用演示这些方法
获取请求行数据
-
GET /Servlet01_war_exploded/hehe?name=zhangsan HTTP/1.1
-
方法:
-
获取请求方式 :GET String getMethod()
-
获取虚拟目录:/Servlet01_war_exploded String getContextPath()
-
获取Servlet路径: /hehe String getServletPath()
-
获取get方式请求参数:name=zhangsan String getQueryString()
-
获取请求URI:/Servlet01_war_exploded/hehe
String getRequestURI() /Servlet01_war_exploded/hehe
StringBuffer getRequestURL() http://localhost:8080/Servlet01_war_exploded/hehe
- URL:统一资源定位符
- URI:统一资源标识符
-
获取协议及版本:HTTP/1.1 String getProtocol()
-
获取客户机的IP地址: String getRemoteAddr()
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/hehe") public class ServletTest03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 获取请求方式 String method = req.getMethod(); System.out.println(method); //2.(*)获取虚拟目录 String contextPath = req.getContextPath(); System.out.println(contextPath); //3. 获取Servlet路径 String servletPath = req.getServletPath(); System.out.println(servletPath); //4. 获取get方式请求参数 String queryString = req.getQueryString(); System.out.println(queryString); //5.(*)获取请求URI String requestURI = req.getRequestURI(); StringBuffer requestURL = req.getRequestURL(); System.out.println(requestURI); System.out.println(requestURL); //6. 获取协议及版本 String protocol = req.getProtocol(); System.out.println(protocol); //7. 获取客户机的IP地址 String remoteAddr = req.getRemoteAddr(); System.out.println(remoteAddr); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
获取请求头数据
-
方法
-
String getHeader(String name):通过请求头的名称获取请求头的值
-
Enumeration getHeaderNames():获取所有的请求头名称
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Enumeration; @WebServlet("/ServletTest04") public class ServletTest04 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获取所有请求头名称 Enumeration<String> headerNames = req.getHeaderNames(); //2.遍历 while(headerNames.hasMoreElements()){ String name = headerNames.nextElement(); //根据名称获取请求头的值 String value = req.getHeader(name); System.out.println(name+"---"+value); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
相关应用
-
统计功能:判断来访用户使用的浏览器版本
package com.wang.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/ServletTest05") public class ServletTest05 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //演示获取请求头数据:user-agent String agent = req.getHeader("user-agent"); //判断agent的浏览器版本 if(agent.contains("Chrome")){ //谷歌 System.out.println("谷歌来了..."); }else if(agent.contains("Firefox")) { //火狐 System.out.println("火狐来了..."); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } -
防盗链
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/ServletTest06") public class ServletTest06 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //演示获取请求头数据:referer String referer = req.getHeader("referer"); System.out.println(referer); //防盗链 if(referer != null ) { if (referer.contains("/ServletTest06")) { //正常访问 resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write("播放电影...."); } else { //盗链 resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write("想看电影吗?土豆欢迎你"); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
获取请求体数据
只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
-
步骤:
- 获取流对象
- BufferedReader getReader():获取字符输入流,只能操作字符数据
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
- 再从流对象中拿数据
package cn.itcast.web.request; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; @WebServlet("/ServletTest07") public class ServletTest07 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求消息体--请求参数 //1.获取字符流 BufferedReader br = request.getReader(); //2.读取数据 String line = null; while((line = br.readLine()) != null){ System.out.println(line); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } } - 获取流对象
其他功能
- 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
- String getParameter(String name)根据参数名称获取参数值
- String[] getParameterValues(String name):根据参数名称获取参数值的数组
- Enumeration getParameterNames():获取所有请求的参数名称
- Map<String,String[]> getParameterMap():获取所有参数的map集合
package cn.itcast.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet("/ServletTest08")
public class ServletTest08 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post 获取请求参数
//根据参数名称获取参数值
String username = request.getParameter("username");
/* System.out.println("post");
System.out.println(username);*/
//根据参数名称获取参数值的数组
String[] hobbies = request.getParameterValues("hobby");
/*for (String hobby : hobbies) {
System.out.println(hobby);
}*/
//获取所有请求的参数名称
Enumeration<String> parameterNames = request.getParameterNames();
/*while(parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();
System.out.println(name);
String value = request.getParameter(name);
System.out.println(value);
System.out.println("----------------");
}*/
// 获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
Set<String> keyset = parameterMap.keySet();
for (String name : keyset) {
//根据键获取值
String[] values = parameterMap.get(name);
System.out.println(name);
for (String value : values) {
System.out.println(value);
}
System.out.println("-----------------");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//get 获取请求参数
/*
//根据参数名称获取参数值
String username = request.getParameter("username");
System.out.println("get");
System.out.println(username);*/
doPost(request,response);
}
}
-
中文乱码问题:
- get方式:tomcat 8 已经将get方式乱码问题解决了
- post方式:会乱码
- 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
package cn.itcast.web.request; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Enumeration; import java.util.Map; import java.util.Set; @WebServlet("/ServletTest08") public class ServletTest08 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.设置流的编码 request.setCharacterEncoding("utf-8"); //获取请求参数username String username = request.getParameter("username"); System.out.println(username); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } } -
请求转发:一种在服务器内部的资源跳转方式
- 步骤:
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

- 步骤:
package cn.itcast.web.request;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ServletTest09")
public class ServletTest09 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Test09被访问了。。。");
//转发到Test10资源
/*
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/ServletTest10");
requestDispatcher.forward(request,response);
*/
//存储数据到request域中
request.setAttribute("msg","hello");
request.getRequestDispatcher("/requestDemo9").forward(request,response);
//request.getRequestDispatcher("http://www.itcast.cn").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
package cn.itcast.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ServletTest10")
public class ServletTest10 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
System.out.println("Test10被访问了。。。");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
- 共享数据:
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
- 域对象:一个有作用范围的对象,可以在范围内共享数据
本文详细介绍了在JavaWeb开发中,HttpServletRequest接口的使用。包括获取请求行数据、请求头数据、请求体数据的方法,以及如何处理中文乱码问题、请求转发、数据共享等实际应用场景。
2394

被折叠的 条评论
为什么被折叠?



