Servlet Request用法 常用的API(附案例源码)

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

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() 获取所有请求头的名称
request.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);
}

注意:在jsp中获取静态路径使用的是  req.getContextPath()

对应的jsp页面表达:${pageContext.request.contextPath}或<%=request.getContextPath()%>

获取请求参数

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

--根据参数名获取参数值
  String getParameter(String name)
--根据参数名获取参数值数组 例如 hobby=somke&hobby=drink
  String[] getParameterValues(String name)
--获取所有的参数名和参数值,封装map集合(key参数名,value参数值)
  Map<String,String[]> getParameterMap()

请求转发

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

域对象(共享数据)

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

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

获取ServletContext对象

public  ServletContext getServletContext(); 此对象为Servlet上下文对象,只会创建一个

补充案例:

  • 视频防盗链
/*
  视频播放源,判断是否合法...
*/
@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()    获取客户端请求的路径名
request.getServerName()  获取服务器地址,如:localhost
request.getServerPort()    获取服务器端口,如8080
request.getLocalName()    获取本地IP映射名,如:localhost
request.getLocalPort()    获取本地端口,如:8091
request.getRealPath("/")    获取项目所在服务器的全路径
request.getRemoteAddr()    获取远程主机地址,如:127.0.0.1
request.getRemoteHost()    获取远程主机,如:127.0.0.1
request.getRemotePort()    获取远程客户端端口
request.getRequestedSessionId()    获取会话session的ID
request.getRequestURI()    获取包含项目名称的请求路径
request.getRequestURL().toString()    获取请求的全路径

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值