一.概述
-
Request:获取请求数据的
-
请求头,请求行,请求体
-
tomcat 会把请求数据解析,并且存储在 request 对象中,然后我们直接从 servlet 对象中取就可以用了
-
-
Response:响应数据的
-
响应头,响应行,响应体
-
业务的封装数据设置到响应数据包中来
-
封装数据进 response 对象中,tomcat 会把封装数据解析成特定格式返回给浏览器
-
二、Request
1.Request继承体系
-
ServletRequest 规范接口
-
HttpServletRequest 封装 http 协议内容
-
HttpServletRequestWrapper 这个是提供具体的实现
2.Request 获取请求数据
2.1获取请求头数据
String getHeader(String name)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/**
/* *
* 获取请求头
*/
String accept = req.getHeader("Accept");
System.out.println(accept);
}
2.2获取请求行数据
String method = req.getMethod();//获取请求方法
System.out.println(method);
String contextPath = req.getContextPath();//获取请求路径(项目的访问路径)
System.out.println(contextPath);
StringBuffer requestURL = req.getRequestURL();//获取URL(统一资源定位符)
System.out.println(requestURL);
String requestURI = req.getRequestURI();//获取URI(统一资源标识符)
System.out.println(requestURI);
String queryString = req.getQueryString();//获取get 的请求参数
System.out.println(queryString);
2.3获取请求体数据
- 获取字符输入流
BufferedReader getReader()throws IOException
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求体
System.out.println("==================请求体==================");
BufferedReader reader = req.getReader();
String s = reader.readLine();
System.out.println(s);
}
- 获取字节输入流
ServletInputStream getInputStream() throws IOException
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = req.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1 ){
System.out.println(new String(buffer, 0, len));
}
inputStream.close();
}
2.4获取请求参数
-
如果是Get请求,那么请求参数就在请求行中
-
如果是Post 请求,请求参数一般就在请求体中
-
Get 请求参数获取
String getQueryString()
-
Post 请求获取参数
BufferedReader getReader()throws IOException ServletInputStream getInputStream() throws IOException
-
获取所有参数的 map 集合
Map<String,String[]> getParameterMap()
-
获取单个参数
String getParameter(String name)
-
2.5请求参数乱码问题
解决办法:获取之前修改一下字符编码
-
tomcat 默认编码 iso-8859-1
-
浏览器以 utf-8 编码,所以解码需要以 utf-8解码
req.setCharacterEncoding("UTF-8");
3.请求转发
请求转发(forward):在服务器内部做资源跳转
请求转发的实现方式
RequestDispatcher getRequestDispatcher(String path)
void forward(ServletRequest request,ServletResponse response)
throws ServletException,IOException
数据共享问题:使用 request
void setAttribute(String name, Object o)
Object getAttribute(String name)
void removeAttribute(String name)
请求转发特点 :
-
浏览器地址不会改变
-
只能内部服务之间转发
-
只发起一次请求
三、Response
1.Response 继承体系
-
ServletResponse 规范接口
-
HttpServletResponse 封装 http 协议内容
-
HttpServletResponseWrapper 这个是提供具体的实现
2.Response 响应数据
2.1设置响应头数据
void addHeader(String name, String value)
@WebServlet("/resp")
public class RespServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应头
resp.addHeader("userdiv","123654");
}
}
2.2设置响应行数据
void setStatus(int sc)
@WebServlet("/resp")
public class RespServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应行
resp.setStatus(520);
}
}
2.3设置响应体数据
ServletOutputStream getOutputStream()
PrintWriter getWriter()
@WebServlet("/resp")
public class RespServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应体
resp.getOutputStream().write(12123);
}
}
3.重定向
资源能够实现跳转访问
void sendRedirect(String location)
-
重定向的特点
-
浏览器地址栏发生了变化
-
可以重定向任何位置
-
两次请求
-
4.重定向和请求转发的区别
重定向 | 请求转发 |
---|---|
浏览器地址变化 | 不变 |
可以重定向任何位置 | 只能是当前服务器内部 |
两次请求 | 一次请求 |
不可以资源共享 | 资源可以共享 |