Request
1.简介
request:获取请求数据
response:设置响应数据
2.Request继承体系
tomcat接受request信息并且封装到request对象中,并且传给service方法中
使用request,只用查询javaEE中的httprequest方法即可
3.Request获取请求数据
获取请求行数据
// String getMethod():获取请求方式: GET
String method = req.getMethod();
System.out.println(method);//GET
// 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);
获取请求头数据
//------------
// 获取请求头:user-agent: 浏览器的版本信息
String agent = req.getHeader("user-agent");
System.out.println(agent);
键值对的形式
4.Request通用方式获取请求方式
1.获取所有参数Map集合
//1. 获取所有参数的Map集合
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
// username:zhangsan lisi
System.out.print(key+":");
//获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
2.根据名称获取参数值(不止一个)
//2. 根据key获取参数值,数组
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
3.根据名称获取参数值(只有一个)
//3. 根据key 获取单个参数值
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
5.解决Request的中文乱码问题
post方法的乱码:getReader()
get方法: getQueryString
发生乱码的原因:编码和解码的语言不一样
浏览器会自动帮我们进行URL编码:URL一个汉字3个字节,一个字节八位二进制,每个字节前面再加上%
//1. URL编码
String username="嘿嘿嘿";
String encode = URLEncoder.encode(username, "utf-8");
System.out.println(encode);
//2. URL解码
String decode = URLDecoder.decode(encode, "utf-8");
System.out.println(decode);
//3. 转换为字节数据,编码
byte[] bytes = decode.getBytes("ISO-8859-1");
for(byte b:bytes){
System.out.print(b+" ");
}
//4. 将字节数组转为字符串,解码
String s = new String(bytes,StandardCharsets.UTF_8);
System.out.println(s);
以上是模拟的流程,真正在操作过程中,我们获取到的就是用iso-8859-1解码后的乱码。所以这个时候,我们把乱码转换为字节组,再将字节组用utf-8解码就好(因为本质的二进制是一样的,所以先转换为字节数据)
直接用以下代码就能解决了:
username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
这两章总结:
6.Request请求转发
请求转发:在服务器内部请求跳转
写以下这句话就行了,绿色的部分是可以变化的,就和@WebServlet("/req6")的统一就好了
request.getRequestDispatcher("/req6").forward(request,response);
请求共享数据:
在req5里面把信息放进request中
request.setAttribute("msg","我是美女");
在req6中就可以get到了
Object msg = request.getAttribute("msg");
Response
1.设置响应数据
response设置响应数据,request是get,response是set
2.完成重定向
重定向状态码是302
//重定向
//1.设置响应状态码 302
response.setStatus(302);
//2. 设置响应头 Location
response.setHeader("Location","/request-demo/resp2");
以后直接这么写就好了
response.sendRedirect("/request-demo/resp2");
重定向和请求跳转的区别
3.资源路径的问题
要不要加虚拟目录?
要是给浏览器用,就要加虚拟目录
要是给服务端用,就不用加
为了避免耦合性,我们可以动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/resp2");
4.Response响应字符流数据&字节流数据
字符流
1.设置可以读html和中文
2.获取字符输出流
3.往里面写东西
4.小细节,不用关闭,字符流会随着response的销毁而关闭
//1.设置可以读html和中文
response.setContentType("text/html;charset=utf-8");
//2.获取字符输出流
PrintWriter writer = response.getWriter();
//3.往字符流里面写东西
writer.write("你好");
writer.write("<h1>嘻嘻嘻</h1>");
//细节,可以不用关闭
字节流
//1.获取字节文件
FileInputStream fis = new FileInputStream("C:/Users/93992/Pictures/Saved Pictures/Camera_XHS_16920221123641000g0082jgabh20im06g5n86.jpg");
//2.获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3.完成流的copy
byte[] buff = new byte[1024];
int len=0;
while((len=fis.read(buff))!=-1){
os.write(buff,0,len);
}
还可以导入依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
直接用就好了IOUtils.copy(输入流,输出流)
//1.获取字节文件
FileInputStream fis = new FileInputStream("C:/Users/93992/Pictures/Saved Pictures/Camera_XHS_16920221123641000g0082jgabh20im06g5n86.jpg");
//2.获取response字节输出流
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(fis,os);
fis.close();
案例
登录
环境准备:静态页面放在webapp下,mybatis
mybatis:
创建一个pojo,放实体类
导入mybatis和mysql的依赖
配置mybatis的配置文件xml
在java main里面创建一个mapper包,创建一个usermapper接口
resourse里面创建一个mapper目录结构(记得要用/分割)
form表单:
action里面写servlet的地址(静态html页面,不能动态获取,jsp才能动态获取)
然后创建loginservlet
1.获取数据,getParmeter
//1. 接收用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
2.调用mybatis完成查询
2.1创建sqlSessionFactory
2.2获取sqlsession对象
2.3获取Mapper
2.4调用方法usermapper.select()
2.5释放资源sqlSession
//2. 调用MyBatis完成查询
//2.1 获取SqlSessionFactory对象
/* String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);*/
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//2.2 获取SqlSession对象
// SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.3 获取Mapper
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
//2.4 调用方法
// User user = userMapper.select(username, password);
User user= usermapper.select(username, password);
//2.5 释放资源
sqlSession.close();
3.判断并且打印
如果select返回是null,就打印失败
//3. 判断user释放为null
if(user != null){
// 登陆成功
writer.write("登陆成功");
}else {
// 登陆失败
writer.write("登陆失败");
}
用户注册
1.现在UserMapper写好查找和添加语句
@Select("select * from tb_user where username=#{username}")
User selectByUsername(String username);
/**
* 添加用户
* @param user
*/
// @Insert("insert into tb_user values(null,#{username},#{password})")
// void add(User user);
@Insert("insert into tb_user values(null,#{username},#{password})")
void add(User user);
2.完善register.html的代码
3.创建register的servlet
3.1封装用户对象
//封装用户对象
User user = new User();
user.setUsername(username);
user.setPassword(password);
3.2调用mybatis代码(一模一样的,背过就好)
//2. 调用mapper 根据用户名查询用户对象
//2.1 获取SqlSessionFactory对象
/* String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);*/
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//2.2 获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.3 获取Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
3.3调用usermapper的对应的方法
//2.4 调用方法
User u = userMapper.selectByUsername(username);
//3. 判断用户对象释放为null
if( u == null){
// 用户名不存在,添加用户
userMapper.add(user);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}else {
// 用户名存在,给出提示信息
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("用户名已存在");
}
注意!!!!!!!!
User u = userMapper.selectByUsername(useraname);
//
这个里面的username千万不能打 “ ” 号。我真的会谢
是null的看看selecrByname里面的username是不是打“”了,还有就是add里面传的是user,不要传成u了
5.sqlsessionfactory的完善
静态代码块,当类加载的时候自动创建
static {
//静态代码块会随着类的加载而自动执行,且只执行一次
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}