IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Request(请求)&Response(响应) -> 正文阅读

[Java知识库]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;
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:27:33  更:2022-04-18 17:30:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:07:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码