request常用方法
request和ressponse对象的原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUWKVRlN-1638320358727)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130143623209.png)]
- 我们可以通过request获得请求响应数据,可以通过response对象设置相应消息,并传给浏览器
request继承体系结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vu0Ma5WK-1638320358731)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130144259784.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rPTah8bY-1638320358735)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130144342764.png)]
具体的实现类是tomcat的NamesEnumerator类
request获取数据
###获取请求行数据
-
获取请求方式:get 或post
//获取请求方式 String method = req.getMethod(); System.out.println(method);
-
获取虚拟目录
//获取虚拟目录 String contextPath = req.getContextPath(); System.out.println(contextPath);
-
获取Servlet路径
//获取Servlet路径 String servletPath = req.getServl System.out.println(servletPath);
4.获取get方式请求参数?name=zhangsan
String queryString = req.getQueryString();
System.out.println(queryString);
-
获取请求url
/servlet_http_request/reqtest5
http://localhost:8080/servlet_http_request/reqtest5//获取请求URI String requestURI = req.getRequestURI(); StringBuffer requestURL = req.getRequestURL(); System.out.println(requestURI); System.out.println(requestURL);
-
获取协议版本号HTTP/1.1
//获取协议版本
String protocol = req.getProtocol();
System.out.println(protocol);
- 获取客户机的ip地址127.0.0.1
//获取客户机的ip地址
String remoteAddr = req.getRemoteAddr();
System.out.println(remoteAddr);
获取请求头
- getHeader(String name):通过请求头的名称获取请求头的值
- getHeaderNames():获取所有的请求头
//获取请求头
Enumeration<String> headerNames = req.getHeaderNames();
System.out.println(headerNames);
while (headerNames.hasMoreElements()){
String name = headerNames.nextElement();
//通过请求头获取请求值
String value = req.getHeader(name);
System.out.println(name + ":" +value);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4OO34DIZ-1638320358737)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130151424156.png)]
-
常查看的请求头信息
//user-agent:浏览器的一些信息(是谷歌还是火狐) //referer:判断这个链接是从哪里跳转过来的(防盗链)
获取请求体
-
只有post请求方式才会有请求体
-
在req中的请求体将数据封装为流,字符流或字节流
//1,获取字符流 BufferedReader reader = req.getReader(); //2.读取数据 String line = null; while((line = reader.readLine()) != null){ System.out.println(line); }
//获取字节流
其他重要的方法
获取请求参数通用的方法
不论get还是post方法中都可以使用
-
String getParameter(String name) 根据参数名称获取参数值
@WebServlet("/reqtest6") public class RequestTest6 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //根据名称获取请求参数值 String parameter = req.getParameter("username"); System.out.println("post"); System.out.println(parameter); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //根据名称获取请求参数值 String parameter = req.getParameter("username"); System.out.println("get"); System.out.println(parameter); } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FabUBHQY-1638320358739)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130153913693.png)]
-
String[] getParamenterValues(String name) 根据参数值获取参数值的数组一般在使用复选框的时候使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PdXxfxU2-1638320358741)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130155030883.png)]
-
Enumeration getParamenterNames() 获取所用的请求参数名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRj7Zm97-1638320358742)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130160040314.png)]
-
Map<String,String[]> getParameterMap() 获取所用参数的Map集合
//Map<String,String[]> getParameterMap()方法,以map形式存储,防止有些参数有多个值,所以是<Map,String[]>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLksqVol-1638320358743)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130161148235.png)]
请求转发
请求转发:在服务器内部进行资源跳转
-
通过req对象获取请求转发的对象 RequestDispatcher getRequestDispatcher(String path)
-
使用RequestDispatcher 对象进行转发forword(req,reso);
@WebServlet("/reqtest8") public class RequestTest8 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("test8到此一游"); RequestDispatcher requestDispatcher = req.getRequestDispatcher("/reqtest9"); requestDispatcher.forward(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } } @WebServlet("/reqtest9") public class RequestTest9 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("test9到此一游"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BvURtzSg-1638320358744)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130164045542.png)]
特点:
1. 浏览器地址栏不会发生变化,
2. 只能转发到当前服务器内部资源,不能转发到其他网址
3. 转发是一次请求
共享数据
域对象:一个有作用范围的对象,可以咋范围内共享数据
request域:代表一次请求的范围,一般用于转发的多个资源*享对象
request共享域对象的方法
- void setAttribute(String name,Object obj):存储数据
- Object getAttribute(String name):通过键值获取
- void removAttribute(String name) :通过键值移除对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D7FRWcj5-1638320358745)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130194656144.png)]
获取ServletContext
请求参数乱码问题
-
get方式没有出现乱码,因为tomcat已经帮我们解决了,但是post方式还是会存在乱码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A1ARGLw5-1638320358745)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130162104246.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PZdykHEC-1638320358746)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130162357235.png)]
需要在获取参数前解决乱码问题
@WebServlet("/reqtest7")
public class RequestTest7 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
req.setCharacterEncoding("utf-8");
//获取请求参数
String username = req.getParameter("username");
System.out.println(username);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}