Request(请求)&Response(响应)

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);//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);
2、请求头	User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
	String getJeader(String name):根据请求头名称,获取值
		// 获取请求头:user-agent: 浏览器的版本信息
        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
        // 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
       //3.1 先对乱码数据进行编码:转为字节数组
        byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
        //3.2 字节数组解码
        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");
        //1. 获取字符输出流
        PrintWriter writer = response.getWriter();
        //content-type
        //response.setHeader("content-type","text/html");

        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;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值