Request(请求)&Response(响应)

一:介绍

1.Request:获取请求数据

2.Response:设置响应数据

二:Request继承体系

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

2.使用request对象,查阅JavaEE API文档的HttpServletRequest接口

三:Request获取请求数据

请求数据分为3部分

1.请求行:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String method = req.getMethod();
    String contextPath = req.getContextPath();
    StringBuffer requestURL = req.getRequestURL();
    String requestURI = req.getRequestURI();
    String queryString = req.getQueryString();
    System.out.println(method);
    System.out.println(contextPath);
    System.out.println(requestURL);
    System.out.println(requestURI);
    System.out.println(queryString);
}

2.请求头:

//---------------user-agent:浏览器的版本信息
String header = req.getHeader("user-agent");
System.out.println(header);

3.请求体:

BufferedReader reader = req.getReader();
String line = reader.readLine();
System.out.println(line);

四:Request通用方式获取请求参数

1.普通请求参数获取方式:

GET方式:

POST方式:

2.通用方式:

Map<String,String[]> getParameterMap():获取所有参数Map集合

String[] getParameterValues(String name):根据名称获取参数值(数组)

String getParameter(String name):根据名称获取参数值(单个值)

@WebServlet("/req2")
public class requsetdemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<String, String[]> Map = req.getParameterMap();
        for (String key:Map.keySet()) {
            System.out.print(key+":");

            for (String s : Map.get(key)) {
                System.out.print(s+" ");
            }
            System.out.println();
        }

        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username+" "+password);
        for (String hobby : req.getParameterValues("hobby")) {
            System.out.println(hobby);
        }

    }

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

五:Request请求参数中文乱码处理

1.请求参数如果存在中文数据,则会乱码

2.解决方案:

POST:设置输入流的编码

req.setCharacterEncoding("UTF-8");

通用方式(GET/POST):先编码,再解码

new String(username.getBytes("ISO-8859-1"),"UTF-8");

3.URL编码

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

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

4.URL编码实现方式:

①编码:

URLEncoder.encode(str,"utf-8");

②解码:

URLDecoder.decode(s,"ISO-8859-1");

String username = req.getParameter("username");

//GET获取参数的方式:getQueryString
//乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
//1.先对乱码数据进行编码:转为字节数组
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//2.字节数组解码
//String name = new String(bytes,StandardCharsets.UTF_8);

String name = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
System.out.println(name);

六:请求转发

1.请求转发(forward):一种在服务器内部的资源跳转方式

2.实现方式:

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

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

4.请求转发特点:

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

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

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

@WebServlet("/req4")
public class requsetdemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("name","哈哈哈哈哈");
        System.out.println("req4...");
        req.getRequestDispatcher("/req5").forward(req,resp);
    }
}
@WebServlet("/req5")
public class requsetdemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object name = req.getAttribute("name");
        System.out.println(name);
        System.out.println("req5...");
    }
}

七:Response响应数据功能介绍

响应数据分为3部分:

1.响应行

void setStatus(int sc):设置响应状态码

2.响应头

void setHeader(String name,String value):设置响应头键值对

3.响应体

PrintWriter getWriter():获取字符输出流

ServletOutputStream getOutputStream():获取字节输出流

八:Response完成重定向

1.重定向(Redirect):一种资源跳转方式

2.实现方式:

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

//        resp.setStatus(302);
//        resp.setHeader("location","/Request-demo/res2");

        resp.sendRedirect("https://www.bilibili.com/");
    }

3.重定向特点:

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

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

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

九:路径问题

明确路径谁使用:

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

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

十:Response响应字符数据

1.使用:

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

PrintWriter writer = resp.getWriter();

②写数据

writer.writer("aaa")

2.注意:

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

②中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1

resp.setContentType("text/html;charset=utf-8");

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/html;charset=utf-8");

    PrintWriter writer = resp.getWriter();
    writer.write("张三");
    writer.write("<h1>aaa</h1>");
}

十一:Response响应字节数据

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

ServletOutputStream outputStream = resp.getOutputStream();

2.写数据

outputStream.writer(字节数据);

  • IOUtils工具类使用

①导入坐标

②使用

IOUtils.copy(输入流,输出流);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值