HttpServletRequest 是一个接口HttpServletRequest 接口是Servlet规范中的一员。HttpServletRequest 的父接口:ServletRequestorg.apache.catalina.connector.RequestFacade 这个类实现了HttpServletRequest 接口。HttpServletRequest 中封装了 HTTP 的请求信息。
HttpServletRequest 接口中常用的方法:
getParameter(String name)
获取value数组中第一个元素
这是比较常用的
getParameterMap()
获取map集合
getParameterNames()
获取集合中所有的key
getParameterValues(String name)
获取集合中所有的value
以上四个方法,与用户提交的数据有关。
可以思考一下:当前端发送请求信息的时候,那么数据是怎么存储的?
前端发送的数据:userName=m0001&password=123&hobby=drink&hobby=smoke
我们首先可以想到的是 Map 集合:
map
: key 存储 name,value 存储value key value
---------------------------------------------------
userName "m0001"
password "123"
hobby "drink"
hobby " smoke"
但是这样存储当 key 重复的时候,value 会被覆盖。
我们可以采用:map
这样的形式存储数据 key value
---------------------------------------------------
userName {"m0001"}
password {"123"}
hobby { "drink","smoke"}
测试方法:
public class RequestTest extends HttpServlet { //重写 doGet @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); response.setCharacterEncoding("GBK"); PrintWriter writer = response.getWriter(); Mapmap = request.getParameterMap(); writer.print("遍历map集合"+ "
"); Setset = map.keySet(); for (String s : set) { writer.print(s + "=" + Arrays.toString(map.get(s)) + "
"); } Enumerationkey = request.getParameterNames(); writer.print("遍历集合中key"+ "
"); while (key.hasMoreElements()) { String k = key.nextElement(); writer.print(k + "
"); } writer.print("遍历集合中所有的value"+ "
"); String[] userName = request.getParameterValues("userName"); String[] password = request.getParameterValues("password"); String[] hobby = request.getParameterValues("hobby"); writer.print(Arrays.toString(userName) + "
"); writer.print(Arrays.toString(password) + "
"); writer.print(Arrays.toString(hobby) + "
"); writer.print("hobby数组中第一个元素" + "
"); String first = request.getParameter("hobby"); writer.print(first + "
"); } }
Request 对象 又叫 请求域。
请求域相对应用域来说,生命周期短很多,范围小很多。请求域中也有 存,取,删,三个方法。
getAttribute(String name)
从请求域中取数据
setAttribute(String name, Object o)
向请求域中存放数据
removeAttribute(String name)
从请求域中删除数据
如果我们在 AServlet 中 向请求域中存放数据,在BServlet 中取出数据。能取出来吗?
不能,因为这是俩次请求。请求域存在每次请求之中。那么,可不可以将AServlet 和 BServlet 都放在一次请求当中呢?
思考一个问题:既然我们想 把 AServlet 和 BServlet 放到一次请求当中,那么看看下面的代码行不行:new 一个 BServlet 对象,调用 doGet方法,将 request 和 response 传进去,这样 AServlet 和 BServlet 使用的就是一个 Request 对象。是不是就能访问到了呢?
这样是不行的。虽然看着能实现功能,但是我们自己所new的Servlet对象,它的生命周期不会受Tomcat 服务器的管理,无法销毁。无法被回收。
BSerlvet b = new BServlet() ; b.doGet(request,response);我们可以使用跳转/转发 机制。
getRequestDispatcher(String path)
ServletRequest中的方法:获取请求转发器对象
path:跳转资源的路径
forward(ServletRequest request, ServletResponse response)
RequestDispatcher中的方法:实现转发功能
// 第一步:获取请求转发器对象 RequestDispatcher request = req.getRequestDispatcher("/b"); // 第二步:使用RequestDispatcher中的forward方法,实现跳转 request.forward(req,resp); // 也可以一行代码搞定 RequestDispatcher request = req.getRequestDispatcher("/b").forward(req,resp);
如果实现俩个Servlet共享数据?
使用 ServletContext 域【应用域】,可以实现,但是范围太广。生命周期太长【Tomcat 启动创建,关闭销毁】。使用请求域,使用跳转/转发机制,保证俩个Servlet在同一次请求当中。即可实现共享。跳转不仅能跳转到一个 Servlet 还能跳转到一个HTML 页面。
HttpServlet 接口中的其他常用方法:
getRemoteAddr()
获取客户端IP地址
setCharacterEncoding(String env)
设置请求体的字符编码形式
可以解决Post请求乱码的问题【Post请求在请求体中,Get请求在请求行上】
当我们发送POST请求时乱码问题:使用setCharacterEncoding()方法解决发送请求时乱码问题。
当我们发送GET请求出现乱码问题时:修改 Tomcat 中的 webappsdocsconfig 下的 service.html 文件中
注意:Tomcat 8 之后 默认就是UTF-8,不会出现乱码问题。
Tomcat 10 默认就是UTF-8 字符集,所以不会出现乱码问题!
当我们响应中出现乱码问题:Tomcat 10 不会出现乱码问题。
//使用response中的设置编码的方法 response.setCharacterEncoding();
getMethod()
获取请求方式(七种中的一种)
getRequestURI()
获取请求信息的URI
getServletPath()
获取Servlet路径
//获取 请求方式 String method = request.getMethod(); System.out.println(method); //获取请求信息的URI String uri = request.getRequestURI(); // /servlet10/a System.out.println(uri); // 获取Servlet的路径 String servletPath = request.getServletPath(); // /a System.out.println(servletPath);
控制台输出结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)