Servlet中Request用法和API

1.Request概述
--用户通过浏览器访问服务器时,Tomcat将HTTP请求中所有的信息都封装在Request对象中
--作用:开发人员可以通过request对象方法,来获取浏览器发送的所有信息.

 2.Request体系结构

ServletRequest
    |
HttpServletRequest
    |
org.apache.catalina.connector.RequestFacade(由tomcat厂商提供)

3.Request获取Http请求信息

String getMethod()  获取请求方式 GET
String getContextPath() 获取项目网络地址(虚拟路径)
String getRequestURI() 统一资源标识符(范围广)
StringBuffer getRequestURL() 获取URL(统一资源定位符)
String getProtocol() 获取协议和版本号 HTTP/1.1
String getRemoteAddr() 获取客户端ip地址
getLocalAddr() 获取用户ip地址
解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");
解决get提交的方式的乱码:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
String getHeader(String name) 根据请求头的名称获取对应的值,注意:不区分大小写
Enumeration<String> getHeaderNames() 获取所有请求头的名称--注意:Iterator前身迭代器
req.setCharacterEncoding("utf-8");
System.out.println("请求方式=" + req.getMethod());
System.out.println("项目名=" + req.getContextPath());
System.out.println("当前访问相对目录=" + req.getRequestURI());
System.out.println("当前访问绝对路径=" + req.getRequestURL());
System.out.println("http版本号=" + req.getProtocol());
System.out.println("获取用户ip地址=" + req.getLocalAddr());
System.out.println("获取ip地址=" + req.getRemoteAddr());
//
System.out.println("两个绝对路径=");
System.out.println(this.getServletContext().getRealPath("/"));
System.out.println(req.getSession().getServletContext().getRealPath("/"));
String path = req.getContextPath();
String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/";
System.out.println("拼接获取服务器加模块名=" + basePath);
//获取请求头
String header = req.getHeader("Host");
System.out.println(header);
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
   String sname = headerNames.nextElement();
   String header1 = req.getHeader(sname);
   System.out.print(sname + "::" + header1);
}

结果 (省略一堆header值)

请求方式=GET
项目名=/web08_servlet_anno
当前访问相对目录=/web08_servlet_anno/indexServlet
当前访问绝对路径=http://localhost:8080/web08_servlet_anno/indexServlet
http版本号=HTTP/1.1
获取用户ip地址=0:0:0:0:0:0:0:1
获取ip地址=0:0:0:0:0:0:0:1
两个绝对路径=
G:ouClassartifactsweb08_servlet_anno_war_exploded
G:ouClassartifactsweb08_servlet_anno_war_exploded
拼接获取服务器加模块名=http://localhost:8080/web08_servlet_anno/
localhost:8080
//header....

注意:在jsp中获取静态路径使用的是 

req.getContextPath()

对应jsp

${pageContext.request.contextPath}或<%=request.getContextPath()%>

详情查看  https://www.cnblogs.com/xiaozhang666/p/13355474.html

4.获取请求参数

--不论get还是post请求方式,都可以使用下列方法来获取请求参数
--在web阶段,get和post方法处理的业务逻辑是一样的...

--根据参数名获取参数值
String getParameter(String name) --根据参数名获取参数值数组 例如 hobby=somke&hobby=drink String[] getParameterValues(String name) --获取所有的参数名和参数值,封装map集合(key参数名,value参数值) Map<String,String[]> getParameterMap()
--前端传值为数组时
String[] likeList = request.getParameterValues("likearr[]");
--get:在tomcat8及以上版本,内部url编码(UTF-8)
post:编码和解码格式不统一,产生乱码...
浏览器  编码:UTF-8
服务器默认 解码:ISO-8859-1 西欧(拉丁文)
指定服务器解码方式
void setCharacterEncoding(String env)
注意:这哥们必须在post方法的行首
//中文乱码
request.setCharacterEncoding("utf-8");
//获取参数
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String[] likes = request.getParameterValues("like");
String[] likeList = request.getParameterValues("likearr[]");

5.请求转发

* API
  1.通过reuqest对象获取转发器对象
  RequestDispatcher getRequestDispatcher(String path)
  2.通过转发器对象,实现请求转发
  void forward(ServletRequest request, ServletResponse response) 
* 请求转发特点
  浏览器地址栏没有发生改变
  浏览器只发送了一次请求(request、response只创建一次,多个转发的servlet共享)
  只能转发服务器内部资源
* 链式编程
  request.getRequestDispatcher("/BServlet").forward(request, response); 

6.域对象(共享数据)

--域对象:一个有作用范围的对象,可以在范围内共享数据
--request域:代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据

* API
  1.存数据
  void setAttribute(String name,Object o);
  2.取数据
  Object getAttribute(String name);
  3.删数据
  void removeAttribute(String name);
* 生命周期
  1.创建?
  用户发送请求时,创建request
  2.销毁?
  服务器做出响应,销毁request
  3.范围?
  一次请求,多次转发

7.获取ServletContext对象

public  ServletContext getServletContext();

此对象为Servlet上下文对象,只会创建一个

补充案例和api

视频防盗链

/*
  视频播放源,判断...
*/
@WebServlet("/RefererRequest")
public class RefererRequest extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
    resp.setContentType("text/html;charset=utf-8");
    // 1.获取请求来源信息(注意:如果浏览器直接访问,这个头返回的值为null)
    String referer = req.getHeader("referer");
    // 2.判断是否为家族体系访问源
    if (referer != null &&
referer.startsWith("http://localhost:8080/web09_request")) {
      resp.getWriter().write("<h3>正常播放视频...</h3>");
   } else {
      resp.getWriter().write("<h3>想看吗?来腾讯把...</h3>");
   }
 }
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
 }
}

浏览器兼容性
user-agent:获取浏览器版本信息

/*
  浏览器兼容性
*/
@WebServlet("/UserAgentRequest")
public class UserAgentRequest extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
    resp.setContentType("text/html;charset=utf-8");
    // 1.获取浏览器信息
    String userAgent = req.getHeader("user-agent");
    // 2.判断
    if (userAgent.contains("Chrome")) {
      resp.getWriter().write("谷歌体系浏览器");
   } else if (userAgent.contains("Firefox")) {
      resp.getWriter().write("火狐体系浏览器");
   } else {
      resp.getWriter().write("其他体系浏览器");
   }
 }
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
 }
}
request.getServletPath()    获取客户端请求的路径名如:/object/delObject
request.getServerName()  获取服务器地址,如:localhost
request.getServerPort()    获取服务器端口,如8080
request.getLocalName()    获取本地IP映射名,如:localhost
request.getLocalPort()    获取本地端口,如:8090
request.getRealPath("/")    获取项目所在服务器的全路径,如:D:Program Filesapache-tomcat-7.0.25webappsTestSytem
request.getRemoteAddr()    获取远程主机地址,如:127.0.0.1
request.getRemoteHost()    获取远程主机,如:127.0.0.1
request.getRemotePort()    获取远程客户端端口,如:3623
request.getRequestedSessionId()    获取会话session的ID,如:823A6BACAC64FB114235CBFE85A46CAA
request.getRequestURI()    获取包含项目名称的请求路径,如:/TestSytem/object/delObject
request.getRequestURL().toString()    获取请求的全路径,如:http://localhost:8090/TestSytem/object/delObject
原文地址:https://www.cnblogs.com/xiaozhang666/p/13356690.html