Request
-
概述:Request 和 Response 对象都是由 Web 服务器(Tomcat)创建的,我们来使用它们,Request 对象是用来 获取请求消息 的,Response 对象是用来 设置响应消息 的
-
Request 对象的原理
-
Request 对象的继承体系结构
Request 常用的功能
获取请求行数据
-
请求行
- 格式:请求方式 请求URL 请求协议/版本号
- 例子:GET /heng/demo?name=zs HTTP/1.1
-
统一资源
- URL:统一资源定位符
- 示例:http://localhost/heng/demo
- URI:统一资源标识符
- 示例:/heng/demo
- URL:统一资源定位符
-
方法
方法 作用 String getMethod() 获取请求方式 :GET String getContextPath() 获取虚拟目录(项目名称):/heng String getServletPath() 获取Servlet路径: /demo String getQueryString() 获取get方式请求参数:name=zs String getProtocol() 获取协议及版本:HTTP/1.1 String getRemoteAddr() 获取客户机的IP地址: String getRequestURI() 获取请求URI:/heng/demo StringBuffer getRequestURL() http://localhost/heng/demo -
示例代码
@WebServlet("/line") public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求方式String method = req.getMethod();// 获取虚拟目录,项目名称String contextPath = req.getContextPath();// 获取Servlet路径String servletPath = req.getServletPath();// 获取协议及版本String protocol = req.getProtocol();// 获取客户机的 IP 地址String remoteAddr = req.getRemoteAddr();// 获取请求 URIString requestURI = req.getRequestURI();// 获取请求 URLStringBuffer requestURL = req.getRequestURL();String s = method + " " +contextPath + " " +servletPath + " " +protocol + " " +remoteAddr + " " +requestURI + " " +requestURL;// 显示到页面上resp.getWriter().write(s);} }
获取请求头数据
-
方法
方法 作用 String getHeader(String name) 通过请求头的名称获取请求头的值 Enumeration getHeaderNames(): 获取所有的请求头名称 -
示例代码
@WebServlet("/header") public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");// 根据请求头名称获取其值String agent = req.getHeader("user-agent");String s = "";//判断是何种浏览器if(agent.contains("Chrome")){s += "Chrome" + "<br>";}else if(agent.contains("Firefox")){s += "Firefox" + "<br>";}else if(agent.contains("IE")){s += "IE" + "<br>";}// 获取所有请求头名称Enumeration<String> headerNames = req.getHeaderNames();while(headerNames.hasMoreElements()){s += headerNames.nextElement() + "<br>";}// 输出到页面resp.getWriter().write(s);} }
// 防盗链模板 public class MyServlet extends Servlet{protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String referer = request.getHeader("Referer");if (referer == null || !referer.contains("yourwebsite.com")) {response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden");} else {// 返回图片的逻辑// 例如,将图片写入响应流// response.setContentType("image/jpeg");// 将图片写入响应流}} }
获取请求体数据
-
请求体:只有 POST 请求方式,才有请求体,在请求体中封装了 POST 请求的请求参数
-
使用步骤:
- 获取流对象
- 再从流对象中拿取数据
-
方法
方法 作用 BufferedReader getReader() 获取字符输入流,只能操作字符数据 ServletInputStream getInputStream() 获取字节输入流,可以操作所有类型数据
获取请求参数
-
获取请求参数(请求体中)通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
-
方法
方法 作用 String getParameter(String name) 根据参数名称获取参数值 String[] getParameterValues(String name) 根据参数名称获取参数值的数组 Enumeration getParameterNames() 获取所有请求的参数名称 Map<String,String[]> getParameterMap() 获取所有参数的map集合 -
示例代码
//获取所有请求参数 Map<String, String[]> map = request.getParameterMap(); //创建 JavaBean 类 User loginUser = new User(); //使用 BeanUtils try {BeanUtils.populate(loginUser,map); } catch (IllegalAccessException e) {e.printStackTrace(); } catch (InvocationTargetException e) {e.printStackTrace(); }
请求转发
-
概述:一种在服务器内部的资源跳转方式
-
特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中
- 转发是一次请求
-
示例图
-
步骤
- 通过 request 对象获取请求转发器对象
- 使用 RequestDispatcher 对象来进行转发
-
方法
方法 作用 RequestDispatcher getRequestDispatcher(String path) 通过 request 对象获取请求转发器对象,path 是你想要转发到的 Servlet 的路径 forward(ServletRequest request, ServletResponse response) 通过 RequestDispatcher 对象进行转发 -
示例代码
/*** 本 Servlet 用来 转发请求*/ @WebServlet("/test1") public class ServletTest1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置需要传递的数据String data = "Hello from ServletTest1";// 存储数据到 request 域中req.setAttribute("data",data);// 转发请求req.getRequestDispatcher("/test2").forward(req,resp);} } /*** 本 Servlet 用于接收请求并处理*/ @WebServlet("/test2") public class ServletTest2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取转发的数据String data = (String) req.getAttribute("data");// 处理数据resp.getWriter().write("Data from ServletTest1" + data);} }
注意:可以看到当访问,test1 时候,会将资源跳转到 test2 中,路径不变,但是资源发送过去了
共享数据
-
域对象:一个有作用范围的对象,可以在范围内共享数据
-
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
-
方法
方法 作用 void setAttribute(String name,Object obj) 存储数据 Object getAttitude(String name) 通过键获取值 void removeAttribute(String name) 通过键移除键值对 ServletContext getServletContext() 获取 ServletContext