Request 和Response 说明
Request 和Response 说明
简单作用说明
从单词字面意思上看,我们明白一个人是请求,一个是响应。
我们写Servlet代码的时候我们会常常看见这两个参数。
我们需要了解这两个参数器到了什么样的作用。
引用黑马的说明
request:获取请求数据
浏览器会发送HTTP请求到后台服务器[Tomcat]
HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]
后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数
获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务
response:设置响应数据
业务处理完后,后台就需要给前端返回业务处理的结果即响应数据把响应数据封装到response对象中
后台服务器[Tomcat]会解析response对象,按照[响应行+响应头+响应体]格式拼接结果浏览器最终解析结果,把内容展示在浏览器给用户浏览
代码测试案例
package jgd;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet("/dod/*")
public class ServletDemo8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doGet(req, resp);
// 获取到请求方式
String method = req.getMethod();
System.out.println("请求方式:"+method);
// 获取虚拟访问目录(项目访问路径)
String contextPath = req.getContextPath();
System.out.println("虚拟目录:"+contextPath);
// 获取url
StringBuffer requestURL = req.getRequestURL();
System.out.println("url"+requestURL.toString());
// 获取资源标识符
String requestURI = req.getRequestURI();
System.out.println("资源标识符"+requestURI);
// 获取请求参数
String queryString = req.getQueryString();
System.out.println("请求参数"+queryString);
// 获取浏览器版本的一个请求头
String agent = req.getHeader("user-agent");//获取
System.out.println("浏览器"+agent);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doPost(req, resp);
// 获取post的2请求体
// 1:获取字符输入流
BufferedReader br = req.getReader();
// 读取数据
String line = br.readLine();
System.out.println(line);
// 一次请求完毕后,request对象被销毁后,流会自动关闭
}
}
package jgd;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo9")
public class ServletDemo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
resp.setHeader("content-type", "text/html;character=utf-8");
resp.setContentType("text/html;charset=utf-8");//html
// resp.setContentType("text/plain; charset=utf-8"); 文本
// charset=UTF-8.如果该方法在getWriter()方法被调用之前调用,那么响应的字符编码将仅从给出的内容类型 中设置。该方法如果在getWriter()方法被调用之后或者在被提交之后调用,
// 将不会设置响应的字符编码,在使用http协议的情况中,该方法设 置 Content-type实体报头。
resp.getWriter().write("<h1>" + name + ",欢迎你</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doPost(req, resp);
System.out.println("POST。。。");
}
}
==需要注意的地方请看代码注释==
==request对象是用来封装请求数据的对象
response对象是用来封装响应数据的对象==
当然这只是我们一个小小的理解
Request的继承体系
然后我们还会发现在不同的Servlet中其中这两个参数的写法也是不一样的。
package jgd;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo1")
public class ServletDemo01 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//Servlet被访问的时候service会自动执行
System.out.println("servlet hello world");
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
package jgd;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/jgdabc/666")
//可配置多个访问路径,这是精确匹配
//@WebServlet(urlPatterns = {"/demo7","/demo07"})
//@WebServlet(urlPatterns = "/user/*") 目录匹配
//当精确匹配和目录匹配同时都满足的时候,精确匹配优先级别更高
//@WebServlet("*.do") 扩展名匹配
//任意匹配
// /* 的优先级高于/
//@WebServlet("/")
//@WebServlet("/*")
public class ServletDemo7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo7get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doPost(req, resp);
}
}
一个是存在于继承Servlet的方法参数体中,一个是HttpServlet的doGet()和doPost()两个方法的参数体中。我们可以明显的发现这两个参数的写法是不一样的。但是其实还是一个实现请求一个实现响应。
现在我们来看Request,想必也是有自己的继承体系。
ServletRequest和HttpServletRequest都是Java提供的。然后它的实现是由Tomcat来完成的。实现类就是RequestFacade。
==该类实现了HttpServletRequest接口,也间接实现了ServletRequest接口。
Servlet类中的service方法、doGet方法或者是doPost方法最终都是由Web服务器[Tomcat]
来调用的,所以Tomcat提供了方法参数接口的具体实现类,并完成了对象的创建==
验证方法就是你把request打印出来,就可以理解了。
- 点赞
- 收藏
- 关注作者
评论(0)