一:介绍
1.Request:获取请求数据
2.Response:设置响应数据
二:Request继承体系
1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
2.使用request对象,查阅JavaEE API文档的HttpServletRequest接口
三:Request获取请求数据
请求数据分为3部分
1.请求行:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
String contextPath = req.getContextPath();
StringBuffer requestURL = req.getRequestURL();
String requestURI = req.getRequestURI();
String queryString = req.getQueryString();
System.out.println(method);
System.out.println(contextPath);
System.out.println(requestURL);
System.out.println(requestURI);
System.out.println(queryString);
}
2.请求头:
//---------------user-agent:浏览器的版本信息
String header = req.getHeader("user-agent");
System.out.println(header);
3.请求体:
BufferedReader reader = req.getReader();
String line = reader.readLine();
System.out.println(line);
四:Request通用方式获取请求参数
1.普通请求参数获取方式:
GET方式:
POST方式:
2.通用方式:
Map<String,String[]> getParameterMap():获取所有参数Map集合
String[] getParameterValues(String name):根据名称获取参数值(数组)
String getParameter(String name):根据名称获取参数值(单个值)
@WebServlet("/req2")
public class requsetdemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String, String[]> Map = req.getParameterMap();
for (String key:Map.keySet()) {
System.out.print(key+":");
for (String s : Map.get(key)) {
System.out.print(s+" ");
}
System.out.println();
}
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+" "+password);
for (String hobby : req.getParameterValues("hobby")) {
System.out.println(hobby);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
五:Request请求参数中文乱码处理
1.请求参数如果存在中文数据,则会乱码
2.解决方案:
POST:设置输入流的编码
req.setCharacterEncoding("UTF-8");
通用方式(GET/POST):先编码,再解码
new String(username.getBytes("ISO-8859-1"),"UTF-8");
3.URL编码
①将字符串按照编码方式转化为二进制
②每个字节转为2个16进制数并在前面加上%
4.URL编码实现方式:
①编码:
URLEncoder.encode(str,"utf-8");
②解码:
URLDecoder.decode(s,"ISO-8859-1");
String username = req.getParameter("username");
//GET获取参数的方式:getQueryString
//乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
//1.先对乱码数据进行编码:转为字节数组
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//2.字节数组解码
//String name = new String(bytes,StandardCharsets.UTF_8);
String name = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
System.out.println(name);
六:请求转发
1.请求转发(forward):一种在服务器内部的资源跳转方式
2.实现方式:
req.getRequsetDispatcher("资源B路径").forward(req,resp);
3.请求转发资源间共享数据:使用Requset对象
4.请求转发特点:
①浏览器地址栏路径不发生变化
②只能转发到当前服务器的内部资源
③一次请求,可以在转发资源间使用request共享数据
@WebServlet("/req4")
public class requsetdemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("name","哈哈哈哈哈");
System.out.println("req4...");
req.getRequestDispatcher("/req5").forward(req,resp);
}
}
@WebServlet("/req5")
public class requsetdemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object name = req.getAttribute("name");
System.out.println(name);
System.out.println("req5...");
}
}
七:Response响应数据功能介绍
响应数据分为3部分:
1.响应行:
void setStatus(int sc):设置响应状态码
2.响应头:
void setHeader(String name,String value):设置响应头键值对
3.响应体:
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
八:Response完成重定向
1.重定向(Redirect):一种资源跳转方式
2.实现方式:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("res1...");
// resp.setStatus(302);
// resp.setHeader("location","/Request-demo/res2");
resp.sendRedirect("https://www.bilibili.com/");
}
3.重定向特点:
①浏览器地址栏路径已经发生变化
②可以重定向到任意位置的资源(服务器内部、外部均可)
③两次请求,不能在多个资源使用request共享数据
九:路径问题
明确路径谁使用:
浏览器使用:需要加虚拟目录(项目访问路径)
服务端使用:不需要加虚拟目录
十:Response响应字符数据
1.使用:
①通过Response对象获取字符输出流
PrintWriter writer = resp.getWriter();
②写数据
writer.writer("aaa")
2.注意:
①该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
②中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
resp.setContentType("text/html;charset=utf-8");
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("张三");
writer.write("<h1>aaa</h1>");
}
十一:Response响应字节数据
1.通过Response对象获取字符输出流
ServletOutputStream outputStream = resp.getOutputStream();
2.写数据
outputStream.writer(字节数据);
- IOUtils工具类使用
①导入坐标
②使用
IOUtils.copy(输入流,输出流);