Request:获取请求数据
Response:设置响应数据
Request继承体系
ServletRequest Java提供的请求对象根接口
HttpServletRequest Java提供的对Http协议封装的请求对象接口
RequestFacade Tomcat定义的实现类
1、Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
2、使用request对象,查阅JavaEE API文档的HttpServletRequest接口
请求数据分为3部分:
1、请求行:
String getMethod(): 获取请求方式
String getContextPath(): 获取虚拟目录(项目访问路径)
StringBuffer getRequestURL(): 获取URL(统一资源定位符)
String getRequestURI(): 获取URI(统一资源标识符)
String getQueryString(): 获取请求参数(GET方式)
2、请求头:
String getHeader(String name): 根据请求头名称,获取值
3、请求体:
ServletInputStream getInputStream(): 获取字节输入流
BufferedReader getReader(): 获取字符输入流
通用获取参数方法:
getParameterMap() 返回类型为Map<String, String[]>
getParameterValues() 返回类型为String[]
getParameter() 返回类型为String
快速创建Servlet:
如果点击new之后没有出现Servlet:
Request请求参数中文乱码处理:
请求参数如果存在中文数据,则会乱码
解决方案:
POST:设置输入流的编码 req.setCharacterEncoding("UTF-8")
GET: byte[] bytes = username.getBytes(StandardCharasets.ISO_8859_1);
username = new String(bytes, StandardCharasets.UTF_8);
GET获取参数的方式:getQueryString
乱码原因:tomcat进行URL解码,默认的字符ISO_8859_1
URL编码实现方式:
编码: URLEncoder.encode(str, "utf-8")
解码: URLDecoder.decode(str, "ISO-8859-1")
请求转发:一种在服务器内部的资源跳转方式
实现方法: req.getRequestDispatcher("资源B路径").forward(req, resp);
请求转发资源间共享数据:使用Request对象
void setAttribute(String name, Object o): 存储数据到request域中
Object getAttribute(String name): 根据key,获取值
void removeAttribute(String name): 根据key,删除该键值对
请求转发特点:
浏览器地址栏路径不发生变化
只能转发到当前服务器的内部资源
一次请求,可以再转发的资源间使用request共享数据
Response继承体系:
ServletResponse: Java提供的请求对象根接口
HttpServletResponse: Java提供的对Http协议封装的请求对象
ResponseFacade: Tomcat定义的实现类
Response设置响应数据功能介绍
响应数据分为3部分:
1、相应行: void setStatus(int sc):设置响应状态码
2、响应头: void setHeader(String name, String value): 设置响应头键值对
3、响应体: PrintWriter getWriter(): 获取字符输出流
ServletOutputStream getOutputStream(): 获取字节输出流
Response完成重定向:
重定向(Redirect):一种资源跳转方式
实现方式: resp.setStatus(302);
resp.setHeader("location", "资源B的路径");
简化方式: resp.sendRedirect("资源B的路径");
重定向特点:
浏览器地址栏路径发生变化
可以重定向到任意位置的资源(服务器内部、外部均可)
两次请求,不能在多个资源使用request共享数据
路径问题:
明确路径谁使用?
浏览器使用:需要加虚拟目录(项目访问路径)
服务端使用:不需要加虚拟目录
Response响应字符数据
使用:
1、通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();
2、写数据: writer.write("aaa");
如果出现中文乱码问题: resp.setContentType("text/html; charset=utf-8");
注意:该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
Response响应字节数据
使用:
1、通过Response对象获取字节输出流: ServletOutputStream outputStream = resp.getOutputStream();
2、写数据: outputStream.write(字节数据);
IOUtils工具类使用
1、导入坐标
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
2、使用
IOUtils.copy(输入流, 输出流);
代码优化:
创建SqlSessionFactory代码优化:
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
问题:
1、代码重复:工具类
2、SqlSessionFactory工厂只创建一次,不要重复创建:静态代码块