JavaWeb(2) - Request/Response

JavaWeb(2) - Request/Response

Request

Request 继承体系

  • Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递导service方法中
  • 注意:使用request对象,查阅JavaEE API文档的HttpServletRequest接口
    在这里插入图片描述

获取请求数据

请求数据分为3部分

请求行GET/request-demo/req?username=zhangsan HTTP/1.1

// 获取请求方式: GET
String getMethod()

// 获取虚拟目录(项目访问路径):/request-demo
String getContextPath()

// 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
StringBuffer getRequestURL()

// 获取URI(统一资源标识符):/request-demo/req1
String getRequestURI()

// 获取请求参数(GET方式):username=zhangsan&password=123
String getQueryString()

请求头User-Agent:Mozilla/5.0 Chrome/91.0.4472.106

// 根据请求头名称,获取值(GET方式)
String getHeader(String name)

请求体username=superbaby&password=123

// 获取字节输入流
ServletInputStream getInputStream()

// 获取字符输入流(POST方式)
BufferedReader getReader()

通用方式获取请求参数

获取所有参数Map集合

Map<String,String[]> getParameterMap()

根据名称获取参数值(数组)

String[] getParameterValues(String name)

根据名称获取参数值(单个值)

String getParameter(String name)

提升开发效率的技巧:使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同;具体方法如下

  • 设置模板
    在这里插入图片描述
  • 生成代码:在指定的文件目录下右键选择新建servlet文件,根据要求命名
    @WebServlet("/req4")
    public class RequestDemo4 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    
    	@Override	
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    }
    

请求参数中文乱码处理

请求参数如果存在中文数据,则会乱码其解决方案如下:
POST:设置输入流的编码

request.setCharacterEncoding("UTF-8");

请求转发

定义:一种在服务器内部的资源跳转形式,即跳转到另一个servlet服务中
在这里插入图片描述

实现方式:

req.getRequestDispatcher("[资源B路径]").forward(request,response);

代码示例:

/**
 * 请求转发 servlet1
 */
@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo5...");
        
     	//请求转发
        request.getRequestDispatcher("/req6").forward(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

/**
 * 请求转发 servlet2
 */
@WebServlet("/req6")
public class RequestDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo6...");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

代码展示效果:
在这里插入图片描述请求转发资源间共享数据:使用Request对象

// 存储数据导 request域中
void setAttribute(String name,Object o)
// 根据key,获取值
Object getAttribute(String name)
// 根据key,删除该键值对
void removeAttribute(String name)

请求转发特点:

  • 浏览器地址栏路径不发生变化
  • 只能转发到当前服务器的内部资源
  • 一次请求,可以在转发的资源间使用request共享数据

Response

Response 设置响应数据功能介绍

响应数据分为3部分

  • 响应行:HTTP/1.1 200 OK

    //设置响应状态码
    void setStatus(int sc);
    
  • 响应头:Content-Type:text/html

    //设置响应头键值对
    void setHeader(String name,String value);
    
  • 响应体:<html><head><body></body></html>

    //获取字符输出流
    PrintWriter getWriter();
    //获取字节输出流
    ServletOutputStream getOutputStream();
    

Response 完成重定向

重定向:一种资源跳转方式
在这里插入图片描述
实现方式:

response.setStatus(302);
response.setHeadler("location","[资源B的路径]")

//简化版
response.sendRedirect("[资源B的路径]");

重定向特点:

  • 浏览器地址栏路径发生变化
  • 可以重定向任意位置的资源(服务器内部,外部均可)
  • 再次请求,不能在多个资源使用request共享数据

资源路径问题

明确路径谁使用:如果是浏览器使用则需要加虚拟目录(即项目访问路径);如果是服务端使用,则不需要加虚拟目录

Response 响应字符数据

注意:流不需要关闭,随着响应结束,response对象销毁,由服务器关闭

通过Response对象获取字符输出流

PrintWriter writer = response.getWriter();

写数据

writer.write("aaa");

Response 字节数据

通过Response对象获取字节输出流

ServletOutputStream outputStream = response.getOutputStream();

写数据

outputStream.write("[字节数据]")

IOUtils工具类使用

  • 导入坐标

    <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
     </dependency>
    
  • 使用

    IOUtils.copy(inputStream,outputStream);
    

代码实例

/**
 * 响应字节数据:设置字节数据的响应体
 */
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1. 读取文件
        FileInputStream fis = new FileInputStream("D://Downloads/搞笑.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);
        }*/

        IOUtils.copy(fis,os);

        fis.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值