2.请求头 User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
3.请求体 username=superbaby&password=123
GET 请求方式和 POST 请求方式区别主要在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一 doGet 和 doPost 方法内的代码?
Map<String,String[]>getParameterMap():获取所有参数 Map 集合
String[]getParameterValues(String name):根据名称获取参教值(数组)
String getParameter(String name):根据名称获取参数值(单个值)
使用通用方式获取请求参数后,屏蔽了 GET 和 POST 的请求方式代码的不同,则代码可以定义为如下格式:
@WebServlet("/reqDemo3") public class RequestDemo3 extends HttpServlet{ @override protected void doGet(HttpServletRequest req,HttpServletResponse resp){ } @override protected void doPost(HttpServletRequest req,HttpServletResponse resp){ this.doGet(req,resp); } }
可以使用 Servlet 模板创建 Servlet 更高效
//POST的乱码
//1.解决乱码:PoST的底层实现是getReader
request.setCharacterEncoding("UTF-8");//设置字符输入流的编码
//要先设置编码格式,否则后续仍然会中文乱码
//2.获取username
String username = request.getParameter("username");
System.out.println(username);
//GET的乱码
//1.GET,获取参数的方式:getQuerystring
//乱码原因:tomcat进行URL解码,默认的字符集IS0-8859-1
//1.1先对乱码数据进行编码:转为字节数组
username.getByte(StandardCharsets.IS0_8859_1);
//1.2字节数组解码
username = new String(bytes,StandardCharsets.ISO_8859_1)
//1.1和1.2可合为一行
username = new String(username.getBytes((StandardCharsets.ISO_8859_1),StandardCharsets.ISO_8859_1);
URL 编码
1.将字符串按照编码方式转为二进制 2.每个字节转为 2 个 16 进制数并在前边加上 %
解决方案:
POST:设置输入流的编码 req.setCharacterEncoding("UTF-8"); 通用方式(GET/POST):先编码,再解码 new String(username.getBytes("ISO-8859-1"),"UTF-8");
Tomcat8.0 之后,已将 GET 请求乱码问题解决,设置默认的解码方式为 UTF-8
req.getRequestDispatcher(("资源B路径").forward(req,resp);
2.响应头: Content-Type:text/html
3.响应体: <html><head>head><body></body></html>
resp.setStatus(302);
resp.setHeader("location",“资源B的路径");
resp.sendRedirect("资源B的路径");
是否要加虚拟目录
明确路径谁使用?浏览器使用:需要加虚拟目录(项目访问路径)服务端使用:不需要加虚拟目录
//简化方式完成重定向
//动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/resp2");
PrintWriter writer = resp.getWriter()
2.写数据
writer.write("aaa");
正常写入数据就调用 write 方法即可,如想要写入 html 文本语言,则要设置 ContentType
response.setContentType("text/html;charset=utf-8");
//1.获取字符输出流
PrintWriter writer response.getWriter();
//content-type
//response.setHeader("content-type","text/html");
writer.write(s:"你好");
writer.write(s:"<h1>aaa</h1>");
//细节:流不需要关闭
resp.setContentType("text/html;charset=utf-8");
ServletOutputStream outputStream = resp.getOutputStream();
2.写数据
outputStream,write(字节数据):
<dependency>
<groupld>commons-io</groupld>
<artifactld>commons-io</artifactld>
<version>2.6</version>
</dependency>
2.使用
IOUtils.copy(输入流,输出流);
//2.1获取SqlSessionFactory对象
String resource "mybatis-config.xml";
Inputstream inputstream = Resources.getResourceAsstream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);