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">&nbsp;&nbsp;&nbsp;<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笔记相关推荐

  1. JavaWeb学习笔记(十)--HttpServletRequest

    1. HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中 2. Ht ...

  2. javaweb入门笔记(4)-request和response

    2019独角兽企业重金招聘Python工程师标准>>> javaweb入门笔记(4)-request和response 标签: javaweb [TOC] API: Interfac ...

  3. JavaWeb学习笔记-目录(待完成)

    JavaWeb学习笔记-目录(待完成) 01-基础加强(注解+反射) 02-mysql基础 03-mysql约束 04-mysql多表事务 05-jdbc 06-jdbc连接池JDBCTemplate ...

  4. javaweb入门笔记(5)-cookie和session

    2019独角兽企业重金招聘Python工程师标准>>> javaweb入门笔记(5)-cookie和session 标签: javaweb [TOC] Cookie是客户端技术:Se ...

  5. JavaWeb自学笔记(一)

    JavaWeb自学笔记(一) 学习视频:BV12J411M7Sj 文章目录 JavaWeb自学笔记(一) 1.基本概念 1.1 web应用程序 1.2 静态web 1.3 动态web 2.web服务器 ...

  6. JavaWeb学习笔记2 —— Web服务器简介

    JavaWeb学习笔记2 -- Web服务器简介 参考教程B站狂神https://www.bilibili.com/video/BV12J411M7Sj 相关技术 ASP: 微软:国内最早流行的就是A ...

  7. B站狂神说JavaWeb学习笔记

    JavaWeb学习笔记(根据b站狂神说java编写) 1.基本概念 1.1 前言 静态Web: 提供给所有人看数据不会发生变化! HTML,CSS 动态Web: 有数据交互,登录账号密码,网站访问人数 ...

  8. JavaWeb学习笔记(5)-B站尚硅谷

    文章目录 十四.书城项目第三阶段--优化 (1)页面jsp动态化 (2)抽取页面中相同的内容 A.登录成功的菜单 B.base.css.jQuery标签 C.每个页面的页脚 D.manager模块的菜 ...

  9. javaweb课堂笔记(一)

    文章目录 javaweb课堂笔记(一) 一.tomcat服务器 二.JSP 1.JSP执行特点 2.JSP语法特点 4.指令 1)page 2)指令 三.表单(登录) 1.表单 2.异常 3.登录界面 ...

  10. javaweb学习笔记2(jquery的使用,以及常用的方法,选择器,过滤器)

    javaweb学习笔记2 javascript正则表达式 regfxp对象 方式1: var putt=new RegExp("e");//表示要求字符串中必须包含字符串evar ...

最新文章

  1. 南京超过广州!4 月程序员工资统计出炉,平均 14596 元
  2. centos 的epel源配置
  3. Oracle11gR2 数据库客户端PL/SQL中文乱码的问题
  4. Python列表元素操作相关的2个函数和匿名函数
  5. CAN 总线 之四 BOSCH CAN2.0 Part A
  6. Angular2学习笔记——在子组件中拿到路由参数
  7. Opencv--IplImage访问图像像素的值
  8. (转) mp4编码全介绍 (一)
  9. 测试驱动javascript开发 -- 3.测试驱动开发过程(上)
  10. java开根号函数_如何在Java中计算平方根和平方根?
  11. 阿里本地生活电话面试
  12. UMD算法讲义——Lecture 3:算法设计回顾:数学背景
  13. POJ 1392 Ouroboros Snake(数位欧拉:输出路径)
  14. WPS(word)批量给所有表格添加题注(标题)
  15. 微信企业支付到个人银行卡
  16. docx转换html(mammoth)
  17. 同一主机下进程间的通信方式
  18. jmu-python-生日悖论(熟练掌握随机数的生成以及检查重复)
  19. 仿云音乐黑胶唱片功能
  20. linux 电源管理 Generic PM之Suspend功能

热门文章

  1. MATLAB实现巴特沃斯数字滤波器
  2. 开放阿里云指定端口及设置本地代理访问自己的阿里云服务器
  3. vue项目中页面打印插件(去除页眉页脚)
  4. 跟我一起水疗的哥俩儿,其实挺猛的!
  5. Unity3D 场景中图片模糊问题
  6. 图片,让PPT富有冲击力(师从于珞珈老师)
  7. 360校招笔试题总结4
  8. html天气js,H5 实现天气效果(心知天气插件)
  9. Python爬取中国银行外汇牌价(爬虫 + PyFlux简单预测分析)--(一)
  10. 产品目标拆解:结构化思维