JavaWeb之Request和Response

目录

Reques

Reques继承体系

Reques获取请求数据

1、请求行 

获取请求方式

获取虚拟目录(项目访问路径)

获取URL(统一资源定位符)

获取URI(统一资源标识符)

获取请求参数(GET)

2、请求头

3、请求体

获取字节输入流

获取字符输入流

Ruquest通用方式获取请求参数

通用方法

乱码

GET乱码解决

Reques请求转发

存储数据到request域中

根据key,删除该键值对

请求转发特点

Response

Response设置响应数据功能介绍

响应行

响应头

响应体

Response重定向

重定向的特点

路径问题

Response响应字符数据


Reques

获取请求数据

Reques继承体系

ServletRequest<-----HttpServletRequest<---------RequestFacade

ServletRequest:Java提供的请求对象根接口

HttpServletRequest:Java提供的对Http协议封装的请求对象接口

RequestFacade:Tomcat定义的实现类

1、Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中

2、查看Request,查看HttpServletRequest就可以了

Reques获取请求数据

请求数据分为三部分

1、请求行 

GET /request-demo/req1?username=zhangsan GTTP/1.1

获取请求方式

String getMethod() //GET

获取虚拟目录(项目访问路径)

String getContextPath() //request-demo

获取URL(统一资源定位符)

StringBuffer getRequestURL() //http:localhost:8080/request-demo/req1

获取URI(统一资源标识符)

String getRequestURI()  //request-demo/req1

获取请求参数(GET)

String getQueryString() //username=zhangsan&password=123

package top.wogong.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/app")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        获取请求方式
        String method = req.getMethod();
        System.out.println("获取请求方式:"+method);

//        获取虚拟目录
        String contextPath = req.getContextPath();
        System.out.println("获取虚拟目录"+contextPath);

//        获取URL
        StringBuffer requestURL = req.getRequestURL();
        System.out.println("URL:"+requestURL);

//        获取URI
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);

//        获取请求参数

        String queryString = req.getQueryString();
        System.out.println("参数:"+queryString);

    }
}

2、请求头

User-Agent:Mozilla/5.0 Charome/91.0.4472.106

根据请求头名称,获取值

String getHeader(String name)

3、请求体

获取字节输入流

ServletInputSream getInputStream()

获取字符输入流

BuffereReader getReader()

Ruquest通用方式获取请求参数

GET方式

String getQueryString()

POST

BufferedReader getReader()

通用方法

获取所有参数Map集合

Map<String,String[]> getParameterMap()

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

String[] getParameterValues(Stirng name)

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

String getParameter(String name)

乱码

POST

rep.setCharacterEncoding("编码格式")

URL编码

将字符串按照编码方式转为二进制

每个字节转为2个16进制数并在前边加上%

package top.wogong.web;

import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class URLDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {

        String username="张三";

        //URL编码
        String encode = URLEncoder.encode(username, "utf-8");
        System.out.println(encode);

        //URL解码
        String decode = URLDecoder.decode(encode, "ISO-8859-1");
//        System.out.println(decode);

        //转换为字节数据
        byte[] bys=decode.getBytes("ISO-8859-1");

        //4.将字节数组转为字符串

        String s=new String(bys,"utf-8");
        System.out.println(s);
    }
}

GET乱码解决

1、先将乱码数据进行编码(转为字节数组)

//使用getBytes("编码格式")
//byte[] bytes=String.getBytes("编码格式")
byte[] bys=username.getBytes(StandardCharsets.ISO_8859_1)

2、字节数组解码

//new String(byte[],"编码方式")

username=new String(bys,StandardCharsets.UTF_8)

Reques请求转发

一种在服务器内部的资源跳转方式

req.getRequeestDispatcher("资源B路径").forward(req,resp)

 请求转发资源间共享数据:使用Request对象

存储数据到request域中

void setAttribute(String name,Object o)

根据key,获取值

Object getAttribute(String name)

根据key,删除该键值对

void removeAttribute(String name)

请求转发特点

浏览器地址栏路径不发生变化

只能转发到当前服务器的内部资源

一次请求,可以在转发的资源间使用request共享数据

Response

设置响应数据

Response体系结构

ServletResponse<-----HttpServletResponse<-----------ResponseFacade

ServletResponse:Java提供的请求对象根接口

HttpServletResponse:Java提供的对Http协议封装的请求

ResponseFacade:Tomcat定义的实现类

Response设置响应数据功能介绍

响应数据分为三部分

响应行

HTTP/1.1 200 OK

设置响应状态码

void setStatus(int sc)

响应头

Content-Type:text/html

设置响应头

void setHeader(String name,String value)

响应体

<html>

    <head>

    </head>
    <body>

    </body>


</html>

获取字符输出流

PrintWriter getWriter()

获取字节输出流

ServletOutputStream getOutputStream()

Response重定向

一种资源跳转方式

实现方式

//设置状态码
resp.setStatus(302)
//设置跳转路径
resp.setHeader("location","资源B的路径")

简化方式

resp.sendRedirect("资源路径")
package top.wogong.web.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/resp")
public class ResponseDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //重定向
        //设置响应状态码
//        resp.setStatus(302);

        //设置响应头
//        resp.setHeader("location","/resp2");


        //简化
        resp.sendRedirect("/resp2");

        System.out.println(req.getContextPath());
        System.out.println("ok");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

package top.wogong.web.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo2");
    }
}

重定向的特点

浏览器地址栏路径发生变化

可以重定向到任意位置的资源(服务器内部,外部)

两次请求,不能在多个资源使用request共享数据

路径问题

浏览器使用:需要加虚拟目录(项目访问路径)

服务器使用:不需要加虚拟目录

Response响应字符数据

使用

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

PrintWriter writer=resp.getWriter()

2、写数据

writer.write("aaa")

设置编码,放在流的前面

resp.setContentType()

package top.wogong.web.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置编码
        resp.setContentType("text/html;charset=utf-8");

        PrintWriter writer = resp.getWriter();
//        resp.setHeader("content-type","text/html");

        writer.write("aaaa");
        writer.write("<h1>张三</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

Response响应字节数据

使用

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

ServletOutputStream outputStream=resp.getOutputSream()

2、写数据

outputStream.write(字节数据)

使用IOUtils工具类

导入坐标

<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
</dependency>

使用

IOUtilscopy(输入流,输出流)
package top.wogong.web.response;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

@WebServlet("/reps4")
public class ResponseDemo4 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //读取文件
        FileInputStream fs = new FileInputStream("E:\\Projects\\ideaProject\\wogongwed\\src\\12.jpg");

        ServletOutputStream outputStream = resp.getOutputStream();
//        byte[] bytes=new byte[1024];
//        int i;
//        while ((i=fs.read(bytes))!=-1){
//            outputStream.write(bytes,0,i);
//        }
        
        //使用工具类
        IOUtils.copy(fs,outputStream);

        fs.close();



    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_53558470

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值