JavaWeb——RequestResponse笔记
Request
获取请求数据
一.Request继承体系
RequestFacade ------> HttpServletRequest ------> ServletRequest
ServletRequest:Java提供的请求对象根接口
HttpServletRequest:Java提供的对HTTP协议封装的请求对象接口
RequestFacade:Tomcat定义的实现类
Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
使用request对象,查阅Java EE API文档的HttpServletRequest接口
二.Request获取请求数据
1.获取请求数据
01.请求行
GET /request-demo/req1?username=zhangsan HTTP/1.1
方法名 | 功能 | 结果 |
---|---|---|
String getMethod() | 获取请求方式 | GET |
String getContextPath() | 获取虚拟目录 (访问路径) | /request-demo |
StringBuffer getRequestURL() | 获取URL (统一资源定位符) | http://localhost:8080/request-demo/req1 |
String getRequestURI() | 获取URI (统一资源标识符) | /request-demo/req1 |
String getQueryString() | 获取请求参数(GET方法) | username=zhangsan&password= |
案例:
localhost:8080/web-demo01/req1?username=zhangsan&password=123
/*** 方法:String getMethod()* 结果:method = GET*/String method = req.getMethod();System.out.println("method = " + method);/*** 方法:String getContextPath()* 结果:contextPath = /web-demo01*/String contextPath = req.getContextPath();System.out.println("contextPath = " + contextPath);/*** 方法:StringBuffer getRequestURL()* 结果:requestURL = http://localhost:8080/web-demo01/req1*/StringBuffer requestURL = req.getRequestURL();System.out.println("requestURL = " + requestURL);/*** 方法:String getRequestURI()* 结果:requestURI = /web-demo01/req1*/String requestURI = req.getRequestURI();System.out.println("requestURI = " + requestURI);/*** 方法:String getQueryString()* 结果:queryString = username=zhangsan&password=123*/String queryString = req.getQueryString();System.out.println("queryString = " + queryString);
02.请求头
User-Agent: Mozilla/5.0 Chrome/91.0.4472.106
方法 | 功能 |
---|---|
String getHeader(String name) | 根据请求头名称,获取值 |
/*** 获取请求头* user-agent:浏览器版本信息* 结果:header = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.47*/
String header = req.getHeader("user-agent");
System.out.println("header = " + header);
03.请求体
只有POST方式有
username=superbaby&password=123
方法 | 功能 |
---|---|
ServletInputStream getInputStream() | 获取字节输入流 |
BufferedReader getReader() | 获取字符输入流 |
/*** 获取post请求体* 结果:line = username=zhangsan&password=123*/
//1.获取字符输入流
BufferedReader br = req.getReader();
//2.读取数据
String line = br.readLine();
System.out.println("line = " + line);
2.通用方式获取请求参数
方法 | 功能 |
---|---|
Map<String, String[ ]> getParameterMap() | 获取所有参数Map集合 |
String[ ] getParameterValues(String name) | 根据名称获取参数值(数组) |
String getParameter(String name) | 根据名称获取参数值(单个值) |
只用写一个,就不用管它用的是GET还是POST方法
<form action="/web-demo01/req2" method="post"><input type="text" name="username"><br><input type="password" name="password"><br><input type="checkbox" name="hobby" value="1">游泳<input type="checkbox" name="hobby" value="2">爬山<br><input type="submit">
</form>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.获取所有参数的map集合Map<String, String[]> map = req.getParameterMap();for (String key : map.keySet()) {System.out.print(key+":");String[] values = map.get(key);for (String value : values) {System.out.print(value+" ");}System.out.println();}System.out.println("--------------------");//2.根据key获取参数值,数组String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}//3.根据key获取单个参数值String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username = " + username);System.out.println("password = " + password);
}@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);
}
控制台:
username:admin
password:123456
hobby:1 2
1
2
username = admin
password = 123456
3.请求参数中文乱码
01.POST方式
//设置POST方式乱码
request.setCharacterEncoding("UTF-8");
02.GET方式
String username = request.getParameter("username");
String username1 = new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("username1 = " + username1);
三、Request请求转发
一种在服务器内部的资源跳转方式
发送端:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo5");request.setAttribute("msg","hello");//请求转发request.getRequestDispatcher("/req6").forward(request,response);
}
接收端:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo6");Object msg = request.getAttribute("msg");System.out.println("msg = " + msg);
}
**实现方式:**req.getRequestDispatcher(“资源B路径”).forward(request,response);
方法 | 作用 |
---|---|
void setAttribute(String name, Object o) | 存储数据到 request域中 |
Object getAttribute(String name) | 根据 key,获取值 |
void removeAttribute(String name) | l根据 key,删除该键值对 |
请求转发特点:
浏览器地址栏路径不发生变化
只能转发到当前服务器的内部资源
一次请求,可以在转发的资源间使用request共享数据
Response
使用response对象来设置响应数据
一、Response体系结构
ResponseFacade ------> HttpServletResponse ------> ServletResponse
ServletResponse:Java提供的请求对象根接口
HttpServletResponse:Java提供的对Http协议封装的请求对象
ResponseFacade:Tomcat定义的实现类
二、Response 设置响应数据功能
响应数据分为3部分
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完成重定向
一种资源跳转方式
资源A给浏览器说这个我处理不了,找别人(状态码)去处理,那个人的位置是XXX(响应头 location:xxx)
实现方式:
resp.setStatus(302);
resp.setHeader(“location”,“资源B的路径");
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//重定向//1.设置响应状态码 302response.setStatus(302);//2.设置响应头 Locationresponse.setHeader("Location","/web-demo01//resp2");
}
简化实现方式:
resp.sendRedirect(“资源B的路径”);
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//简化重定向response.sendRedirect("/web-demo01//resp2");
}
重定向特点:
浏览器地址栏路径不发生变化
只能转发到当前服务器的内部资源
一次请求,可以在转发的资源间使用request共享数据
路径资源问题
明确路径谁使用?
- 浏览器使用:需要加虚拟目录
- 服务端使用:不需要加虚拟目录
动态路径:
String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/resp2");
四、Response 响应字符数据
- 使用
1.通过Response对象获取字符输出流
PrintWriter writer = resp.getWriter();
2.写数据
writer.write(“aaa”);
细节
1.该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
2.中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
resp.setContentType(“text/html;charset=utf-8”);
//简化了设置html解析和设置字符格式
response.setContentType("text/html;charset=utf-8");
//1.获取字符输出流
PrintWriter writer = response.getWriter();//content-type设置html解析
//response.setHeader("content-type","text/html");writer.write("<h1>你好</h1>");
打开后,网页就是一个h1标签的你好两个字
五、Response 响应字节数据
使用
1.通过Response对象获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
2.写数据
outputStream.write(字节数据);
- 麻烦的!!!
//1.读取文件
FileInputStream fis = new FileInputStream("C:\\Users\\刘浩\\Desktop\\07.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);
}
fis.close();
- IOUtils工具类
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>
- 简化后
//1.读取文件
FileInputStream fis = new FileInputStream("C:\\Users\\刘浩\\Desktop\\07.jpg");
//2.获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3.完成流的copy
IOUtils.copy(fis,os);
fis.close();
六、用户登录、注册功能案例
UserMapper
public interface UserMapper {/*** 根据用户名和密码查询用户对象* @param username* @param password* @return*/@Select("select * from tb_user where username = #{username} and password = #{password}")User select(@Param("username") String username, @Param("password") String password);/*** 根据用户名查询用户对象* @param username* @return*/@Select("select * from tb_user where username = #{username}")User selectByUsername(@Param("username") String username);@Insert("insert into tb_user values(null,#{username},#{password})")void add(User user);
}
RegisterServlet
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.接受用户数据String username = request.getParameter("username");String password = request.getParameter("password");//封装用户对象User user = new User();user.setUsername(username);user.setPassword(password);//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();//2.3获取MapperUserMapper userMapper = sqlSession.getMapper(UserMapper.class);//2.4调用方法User u = userMapper.selectByUsername(username);//3.判断用户是否存在if (u == null){//用户名不存在userMapper.add(user);//提交事务sqlSession.commit();//释放资源sqlSession.close();}else {//用户名存在response.setContentType("text/html;charset=utf-8");response.getWriter().write("用户名已存在");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
LoginServlet
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.接受用户名密码String username = request.getParameter("username");String password = request.getParameter("password");//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();//2.3获取MapperUserMapper userMapper = sqlSession.getMapper(UserMapper.class);//2.4调用方法User user = userMapper.select(username, password);//2.5释放资源sqlSession.close();//获取字符输出流,并设置content typeresponse.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();//3.判断user 是否为 nullif (user != null){writer.write("登录成功");}else {writer.write("登录失败");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
界面
<form action="/web-demo01/loginServlet" id="form" method="post"><h1 id="loginMsg">LOGIN IN</h1><p>Username:<input id="username" name="username" type="text"></p><p>Password:<input id="password" name="password" type="password"></p><div id="subDiv"><input type="submit" class="button" value="login up"><input type="reset" class="button" value="reset"> <a href="register.html">没有账号?点击注册</a></div>
</form>
<body><div class="form-div"><div class="reg-content"><h1>欢迎注册</h1><span>已有帐号?</span> <a href="login.html">登录</a></div><form id="reg-form" action="/web-demo01/registerServlet" method="post"><table><tr><td>用户名</td><td class="inputs"><input name="username" type="text" id="username"><br><span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span></td></tr><tr><td>密码</td><td class="inputs"><input name="password" type="password" id="password"><br><span id="password_err" class="err_msg" style="display: none">密码格式有误</span></td></tr></table><div class="buttons"><input value="注 册" type="submit" id="reg_btn"></div><br class="clear"></form></div>
</body>
sqlSessionFactoryUtils优化
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;}
}
以后调用直接
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryUtils.getSqlSessionFactory();
JavaWeb——RequestResponse笔记相关推荐
- JavaWeb学习笔记(十)--HttpServletRequest
1. HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中 2. Ht ...
- javaweb入门笔记(4)-request和response
2019独角兽企业重金招聘Python工程师标准>>> javaweb入门笔记(4)-request和response 标签: javaweb [TOC] API: Interfac ...
- JavaWeb学习笔记-目录(待完成)
JavaWeb学习笔记-目录(待完成) 01-基础加强(注解+反射) 02-mysql基础 03-mysql约束 04-mysql多表事务 05-jdbc 06-jdbc连接池JDBCTemplate ...
- javaweb入门笔记(5)-cookie和session
2019独角兽企业重金招聘Python工程师标准>>> javaweb入门笔记(5)-cookie和session 标签: javaweb [TOC] Cookie是客户端技术:Se ...
- JavaWeb自学笔记(一)
JavaWeb自学笔记(一) 学习视频:BV12J411M7Sj 文章目录 JavaWeb自学笔记(一) 1.基本概念 1.1 web应用程序 1.2 静态web 1.3 动态web 2.web服务器 ...
- JavaWeb学习笔记2 —— Web服务器简介
JavaWeb学习笔记2 -- Web服务器简介 参考教程B站狂神https://www.bilibili.com/video/BV12J411M7Sj 相关技术 ASP: 微软:国内最早流行的就是A ...
- B站狂神说JavaWeb学习笔记
JavaWeb学习笔记(根据b站狂神说java编写) 1.基本概念 1.1 前言 静态Web: 提供给所有人看数据不会发生变化! HTML,CSS 动态Web: 有数据交互,登录账号密码,网站访问人数 ...
- JavaWeb学习笔记(5)-B站尚硅谷
文章目录 十四.书城项目第三阶段--优化 (1)页面jsp动态化 (2)抽取页面中相同的内容 A.登录成功的菜单 B.base.css.jQuery标签 C.每个页面的页脚 D.manager模块的菜 ...
- javaweb课堂笔记(一)
文章目录 javaweb课堂笔记(一) 一.tomcat服务器 二.JSP 1.JSP执行特点 2.JSP语法特点 4.指令 1)page 2)指令 三.表单(登录) 1.表单 2.异常 3.登录界面 ...
- javaweb学习笔记2(jquery的使用,以及常用的方法,选择器,过滤器)
javaweb学习笔记2 javascript正则表达式 regfxp对象 方式1: var putt=new RegExp("e");//表示要求字符串中必须包含字符串evar ...
最新文章
- 南京超过广州!4 月程序员工资统计出炉,平均 14596 元
- centos 的epel源配置
- Oracle11gR2 数据库客户端PL/SQL中文乱码的问题
- Python列表元素操作相关的2个函数和匿名函数
- CAN 总线 之四 BOSCH CAN2.0 Part A
- Angular2学习笔记——在子组件中拿到路由参数
- Opencv--IplImage访问图像像素的值
- (转) mp4编码全介绍 (一)
- 测试驱动javascript开发 -- 3.测试驱动开发过程(上)
- java开根号函数_如何在Java中计算平方根和平方根?
- 阿里本地生活电话面试
- UMD算法讲义——Lecture 3:算法设计回顾:数学背景
- POJ 1392 Ouroboros Snake(数位欧拉:输出路径)
- WPS(word)批量给所有表格添加题注(标题)
- 微信企业支付到个人银行卡
- docx转换html(mammoth)
- 同一主机下进程间的通信方式
- jmu-python-生日悖论(熟练掌握随机数的生成以及检查重复)
- 仿云音乐黑胶唱片功能
- linux 电源管理 Generic PM之Suspend功能