【JavaWeb】Servlet的应用全面讲解(二)获取请求和进行响应

一、request 请求

(一)获取请求

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*常用方法*/
        //获取请求时的完整路径(从http开始,到“?"前面结束)
        String url = req.getRequestURL() + "";
        System.out.println("获取请求时的完整路径:" + url);
        //获取请求时的部分路径(从项目的站名开始,到”?“前面结束)
        String uri = req.getRequestURI();
        System.out.println("获取项目部分路径:" + uri);
        //获取请求的参数字符串(从”?“后面开始,到最后的字符串)
        String queryString = req.getQueryString();
        System.out.println("获取请求时的参数字符串:" + queryString);
        //获取请求方式(Get和Post)
        String method = req.getMethod();
        System.out.println("获取请求方法" + method);
        //获取当前协议版本(HTTP/1.1)
        String protocol = req.getProtocol();
        System.out.println("获取当前协议版本:" + protocol);
        //获取项目的站点名(项目对外访问路径)
        String webapp = req.getContextPath();  //上下文路径
        System.out.println("" + webapp);


        /*获取请求的参数*/
        //获取指定名称的参数值,返回字符串 (重点!)
        String uname = req.getParameter("uname");
        String upwd = req.getParameter("upwd");
        System.out.println("uname:" + uname + ".upwd:" + upwd);

        //获取指定名称的参数的所有参数值,返回字符串数组(用于复选框传值)
        String[] hobbys = req.getParameterValues("hobby");
        //判断数组是否为空
        if(hobbys != null && hobbys.length > 0){
            for (String hobby: hobbys) {
                System.out.println("爱好:"+ hobby);
            }
        }
    }

(二)解决获取请求时发生乱码的问题

1. 原因和解决方法

/**
 * 乱码原因:
 *      由于在解析过程中默认使用的编码方式为:ISO-8859-1(此编码不支持中文),所以解析一定会出现乱码。
 *
 * 请求乱码问题
 *              Tomcat8.0以上版本                       TOmcat7及以下版本
 * GET请求        不会乱码                                会乱码,需要手动设置转码
 *                                                      new String(req.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
 *
 *
 * POST请求       会乱码,通过设置服务器解析编码的格式      会乱码,通过设置服务器解析编码的格式
 *              req.setCharacterEncoding("UTF-8");      req.setCharacterEncoding("UTF-8");
 *
 *
 * 乱码情况:
 *      POST请求:无论什么版本的服务器,post请求都会乱码。(req.setCharacterEncoding("UTF-8");)
 *
 * 注:
 *      1. req.setCharacterEncoding("UTF-8");  只针对POST请求乱码
 *      2. new String(req.getParameter(name).getBytes("ISO-8859-1"),"UTF-8")针对任何请求方式。
 *          但若是数据本身不乱码,还仍旧使用该方法转换,则会乱码。
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求的编码格式,解决POST请求获取参数时出现乱码的问题
        req.setCharacterEncoding("UTF-8");
        //获取客户端传递的参数
        String uname = req.getParameter("uname");
        String upwd = req.getParameter("upwd");
        System.out.println("姓名:" + uname);
        System.out.println("密码:" + upwd);

       /* //解决Tomcat7及以下版本的GET请求获取参数时出现乱码的问题
        String name = new String(req.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");
        System.out.println("姓名:" + name);*/
    }

(三)请求转发跳转

1. 方法和特点

/**
 * 请求转发跳转
 *      req.getRequestDispatcher("s04").forward(req,resp);
 *     可以让请求从服务端跳转到客户端(或跳转到指定Servlet)
 *
 *     特点:
 *          1. 服务端行为
 *          2. 地址栏不发生改变
 *          3. 从始至终只有一个请求
 *          4,request数据可以共享
 */

2. 代码演示

(1)发出请求跳转的Servlet类

    @Override
@WebServlet("/ser13")
public class Servlet13 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收客户端请求的参数
        String uname = req.getParameter("uname");
        System.out.println("Servlet13 uname : "+ uname);

        //请求转发跳转到Servlet04
        //req.getRequestDispatcher("s14").forward(req,resp);
        //请求跳转到jsp页面
        req.getRequestDispatcher("login.jsp").forward(req,resp);
    }
}

(2)接受其它Servlet跳转的Servlet类,接收到相应的request和respond对象

/**
 * 接受Servlet13的跳转
 */

@WebServlet("/ser14")
public class Servlet14 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收客户端请求的参数
        String uname = req.getParameter("uname");
        System.out.println("Servlet14 uname : "+ uname);
    }
}

(四)request作用域

1. request作用域的应用方法

/**
 * request作用域
 *      通过该对象在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。(请求转发跳转时有效)
 *      //设置对象内容
 *      req.setAttribute(String name,Object value);
 *      //获取对象内容
 *      req.getAttribute(String name);
 *      //删除域对象内容
 *      req.removeAttribute(String name);
 */

request域中的值可以通过请求转发,在其它Servlet或者jsp页面被调用

2.代码演示

(1)设置request域对象,进行请求转发

@WebServlet("/ser15")
public class Servlet15 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet15...");

        //设置对象内容
        req.setAttribute("name","admin");
        req.setAttribute("age",18);
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        req.setAttribute("list",list);

        //请求转发跳转到Servlet16
        //req.getRequestDispatcher("ser16").forward(req,resp);
        //请求转发跳转到jsp 并通过域对象传递数据
        req.getRequestDispatcher("index.jsp").forward(req,resp);
    }
}

(2)获取request域对象的Servlet

@WebServlet("/ser16")
public class Servlet16 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet16...");

        //获取域对象内容
        String name = (String) req.getAttribute("name");
        System.out.println("name :"+name);
        Integer age = (Integer) req.getAttribute("age");
        System.out.println("age :"+age);
        List<String> list = (List<String>) req.getAttribute("list");
        System.out.println(list.get(0));

    }
}

(3)获取request域对象的jsp页面

<%@ page import="java.util.List" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<h2>index页面</h2>
<%-- 如果要在jsp中写Java代码,需要写在脚本段中 --%>
<%
    //获取参数,request.getParameter("uname")是获取页面表单get/post到Servlet的数据
    String uname = request.getParameter("uname");
    //获取request作用域
    String upwd = (String) request.getAttribute("upwd");

    //输出内容
    out.print(uname);
    out.print(".....");
    out.print(upwd);
%>
</body>
</html>

二、response 响应

(一)response的应用

1. 方法

/**
 * 响应数据
 *      getWrite()      字符输出流(输出字符串)
 *      getOutputStream 字节输出流(输出一切数据)
 *
 *      两种流不可同时使用,若同时使用则会报错
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*getWrite() 字符输出流 (输出字符串)*//*
        //获取字符输出流
        PrintWriter writer = resp.getWriter();
        //输出数据
        writer.write("Hello");*/

        /*getOutputStream 字节输出流(输出一切数据)*/
        // 得到字节输出流
        ServletOutputStream out = resp.getOutputStream();;
        //输出数据
        out.write("Hi".getBytes());
    }

(二)解决response应用时发生乱码问题

1. 原因和解决方法

/**
 * 字符流响应数据
 *  乱码原因:
 *      对于getWrite()获取到的字符流,响应中文必定出现乱码。由于在服务器端在进行编码的过程中默认使用的编码方式为:ISO-8859-1(此编码不支持中文),所以解析一定会出现乱码。
 *  
 * 		乱码解决:
 *       1. 设置服务端编码格式
 *          resp.setCharacterEncoding("UTF-8");
 *       2.设置服务端编码格式
 *         resp.setHeader("content-type","text/html;charset=UTF-8");
 *       总结:设置客户端和服务端的编码都支持中文,且保持一致
 *
 *       同时设置客户端和服务端的编码样式
 *          resp.setContentType("text/html;charset=UTF-8");
 */

2. 代码演示

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

        /*//设置服务端编码格式
        resp.setCharacterEncoding("UTF-8");
        //设置客户端的编码格式和相应的MIME类型
        resp.setHeader("content-type","text/html;charset=UTF-8");*/

        //同时设置客户端和服务端的编码样式
        resp.setContentType("text/html;charset=UTF-8");

        /*getWrite() 字符输出流 (输出字符串)*/
        //获取字符输出流
        PrintWriter writer = resp.getWriter();
        //输出数据
        writer.write("<h2>你好</h2>");
    }

(三)response 进行重定向跳转

1. 重定向说明

/**
 * 重定向
 *      服务端指导,客户端行为
 *      存在两次请求
 *      地址栏会发生改变
 *      request对象不共享
 */

2. 代码演示

(1)跳转演示request对象不共享

例:跳转到Servlet的ser24站点

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

        //接收参数
        String uname = req.getParameter("uname");
        System.out.println("Servlet24 : " + uname);

        //重定向跳转ser25
        resp.sendRedirect("ser25");
    }

接收跳转的ser25站点

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

        //接收参数
        String uname = req.getParameter("uname");
        System.out.println("Servlet25 : " + uname);
    }

重定向后,无法接收到request对象
在这里插入图片描述

3. 重定向和转发跳转的区别

/**
 * 重定向和转发跳转的区别
 *  1。请求转发的地址栏不会发生改变,重定向的地址栏才会发生改变
 *  2.请求转发只有一次请求,而重定向有两次请求
 *  3.请求转发时request对象可共享,重定向时则不共享
 *  4.请求转发是服务端行为,重定向是客户端行为
 *  5.请求转发时的地址只能是当前站点下(当前项目)的资源,重定向地址可以是任何地址
 */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet25...");

        //接收参数
        String uname = req.getParameter("uname");
        System.out.println("Servlet25 : " + uname);

        //设置request对象
        req.setAttribute("upwd","123456");

        //请求转发
        //req.getRequestDispatcher("index.jsp").forward(req,resp);

        //重定向
        //resp.sendRedirect("index.jsp");

        //重定向跳转到百度
        //resp.sendRedirect("http://www.baidu.com");

        //请求转发到百度,(404)
        //req.getRequestDispatcher("http://www.baidu.com").forward(req,resp);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

peng_YuJun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值