
注:
1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中。
2.使用request对象,查阅javaEE API文档的 HttpServletRequest接口
1.请求行:
GET /request-demo/req1?username=zhangsan HTTP/2
2.请求头
User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
3.请求体
POST请求才有请求体
GET:
String getQueryString()
POST
BufferedReader getReader()
思考:
get请求方式与post请求方式区别在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGet与doPost方法内的代码?
Request通用方式获取请求参数
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;
import java.util.Map;
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get.....");
//1.获取所有的Map集合
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
//username;zhangsan
System.out.print(key+":");
String[] values = map.get(key);
for (String value : values) {
System.out.print(value+" ");
}
System.out.println();
}
//根据key获取参数值,数组
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//根据key获取单个参数值
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username );
System.out.println(password );
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}

实现方式:
req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据:使用Request对象
void setAttribute(String name,Object o):存储数据到request域中
Object getAttribute(String name): 根据key,获取值
void removeAttribute(String name): 根据key删除键值对
例:
/**
* 请求转发
*/
@WebServlet("/req5")
public class requestDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo5...");
//存储数据
request.setAttribute("ityc","yc");
//删除数据
request.removeAttribute("ityc");
//请求转发
request.getRequestDispatcher("/req6").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
@WebServlet("/req6")
public class requestDemo06 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo6...");
//获取数据
Object ityc = request.getAttribute("ityc");
System.out.println(ityc);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
结果:


响应数据分为3部分:
响应行:
HTTP/2 200 OK
void setStatus(int sc):设置响应状态码
响应头
content-type: text/html
void SetHeader(String name,String value):设置响应头键值对
响应体
<html><head></head><body></body></html>
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流

实现方式:
resp.setStatus(302);
resp.setHeader("location","资源B的路径");
联系
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("resp1.....");
//重定向
//1.设置响应状态码302
//response.setStatus(302);
//2.设置响应头location
//response.setHeader("location","/Request-Tomcat/resp2");
//简化方式完成重定向
response.sendRedirect("/Request-Tomcat/resp2");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("sesp2....");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
重定向特点:
使用:
1.通过Response对象获取字符输出流
PrintWriter writer = response.getWriter();
2.写数据:
writer.write("aaa");
writer.write("<h1>啊啊啊<h2>");//还可以写标签
3.写标签时要设置对应的ContentType
response.setContentType("text/html;charset=UTF-8");
注意:
该流不需要关闭,随着响应的结束,response对象销毁,由服务器关闭
中文乱码问题,原因通过Response获取的字符输出流默认编码是:.ISO-8859-1
resp.setContentType("text/html;charset=utf-8")
使用:
1.通过Response对象获取字符输出流
ServletOutputStream outputStream = resp.getOutputStream();
2.写数据
outputStream.write(字节数据);
例:将一张图片通过流,响应至浏览器
/*
* 响应字节数据:设置字节数据的响应体
* */
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.读取文件
FileInputStream fileInputStream = new FileInputStream("D://a.jpg");
//2.获取response字节输出流
ServletOutputStream outputStream = response.getOutputStream();
//3.完成流的copy
/*byte[] bytes = new byte[1024];
int len = 0;
while((len =fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}*/
//简化书写版
IOUtils.copy(fileInputStream,outputStream);
fileInputStream.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}