Request
Request继承体系
1、Tomcat需要解析请求数据,封装为Request对象,并且创建Request对象传递到service方法中 2、使用Request对象,查阅JavaEE API文档的HttpServletRequest接口
Request获取请求数据
请求数据分为三部分:
1、请求行 GET/request-demo/req1?username = zhangsan HTTP/1.1
String getMethod():获取请求方式:GET
String method = req.getMethod();
System.out.println(method);
String getContextPath():获取虚拟目录(项目访问路径):/request-demo
String contextPath = req.getContextPath();
System.out.println(contextPath);
StringBuffer getRequestURL():获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
StringBuffer url = req.getRequestURL();
System.out.println(url.toString());
String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
String uri = req.getRequestURI();
System.out.println(uri);
String getQueryString():获取请求参数(GET方式): username=zhangsan
String queryString = req.getQueryString();
System.out.println(queryString);
2、请求头 User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
String getJeader(String name):根据请求头名称,获取值
String agent = req.getHeader("user-agent");
System.out.println(agent);
3、请求体 username = superbaby & password = 123
ServletInputStream getInputStream():获取字节输入流
BufferedRead getReader():获取字符输入流
get通过String getQueryString()获取请求参数 post通过BufferedRead getReader()
Request通用方式获取请求参数
请求参数中文乱码处理
POST:设置输入流的编码
request.setCharacterEncoding("UTF-8");
GET,获取参数的方式:getQueryString
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
username = new String(bytes, StandardCharsets.UTF_8);
Request请求转发
请求转发:一种在服务器内部的资源跳转方式 特点: 1、浏览器地址栏路径不发生变化 2、只能转发到当前服务器的内部资源 3、一次请求,可以在转发的资源间使用request共享数据
实现方式:
req.getResquestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据:使用Request对象
void setAttribute(String name,Object o):存储数据到Request域中
Object getAttribute(String name):根据key,获取值
void removeAttribute(String name):根据key,删除该键值对
Response
Response设置响应数据功能介绍
响应数据分为三部分:
1、响应行 HTTP/1.1 200 OK
void setStatus(int sc):设置响应状态码
2、响应头 Content-Type:text/html
void setHeader(String name,String value):设置响应头键值对
3、响应体 <html><head></head><body></body></html>
PrintWriter getWriter():获取字符输入流
ServletOutputStream getOutputStream():获取字节输出流
Response完成重定向(Redirect)
一种资源跳转方式 特点: 1、浏览器地址栏路径发生变化 2、可以重定向到任意位置的资源(服务器内部、外部均可) 3、两次请求,不能在多个资源使用Request共享数据
实现方式:
1.设置响应状态码 302
response.setStatus(302);
2. 设置响应头 Location
response.setHeader("Location","/request-demo/resp2");
response.sendRedirect("/request-demo/resp2");
路径问题
明确路径谁使用? 浏览器使用:需要加虚拟目录(项目访问路径) 服务端使用:不需要加虚拟目录
动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/resp2");
Response响应字符数据
使用: 1、通过Response对象获取字符输入流
PrintWriter writer = response.getWriter();
2、写数据
writer.write("你好");
注意:
该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
中文数据乱码:原因用过response获取的字符输出流默认编码:ISO-8859-1
需要设置相应的ContentType
总:
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("你好");
writer.write("<h1>aaa</h1>");
Response响应字节数据
案例
用户登录
流程说明:
1、用户填写用户名密码,提交到LoginServlet 2、在LoginServlet中使用Mybatis查询数据库,验证用户名密码是否正确 3、如果正确,响应“登录成功”;反之,响应“登录失败”
页面 + LoginServlet + UserMapper(User select(username,password))
环境准备
1、静态页面 2、创建数据库 3、导入Mybatis坐标,MYSQL驱动坐标 4、创建mybatis-config.xml核心配置文件,UserMapper.xml映射文件,UserMapper接口
用户注册
流程说明:
1、用户填写用户名、密码等信息,点击注册按钮,提交到RegisterServlet 2、在RegisterServlet中使用MyBatis保存数据 3、保存前,需要判断用户名是否已经存在:根据用户名查询数据库
页面 + RegisterServlet + UserMapper(User selectByUsername(username) void add(User user))
代码优化
创建SqlSessionFactory代码优化
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
问题
1、代码重复:工具类 2、SqlSessionFactory工厂只创建一次,不要重复创建:静态代码块
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
|