HttpServletRequest与HttpServletResponse

HttpServletRequest – 处理请求

1.请求正文 - 请求参数的获取

  • 写一个form表单,其中有各种类型的输入框,通过HttpServlet请求获得所有数据
<html>
  <head>
    <title>注册页面</title>
  </head>
  <body>
  <hr>
  <form action="http://localhost:8080/ZuoYe" method="post">
    用户名:<input type="text" placeholder="请输入用户名" name="username"><br>
    密码:<input type="password" placeholder="请输入密码" name="password"><br>
    性别:<br>
    <input type="radio" name="sex" value=""><br>
    <input type="radio" name="sex" value=""><br>
    爱好:<br>
    <input type="checkbox" name="hobby" value="游戏">游戏
    <input type="checkbox" name="hobby" value="学习">学习
    <input type="checkbox" name="hobby" value="旅游">旅游<br>
    邮箱:
    <input type="email" name="email"><br>
    照片:
    <input type="file" name="file"><br>
    input
    省份:
    <select name="province">
      <option value="河南">河南</option>
      <option value="河北">河北</option>
      <option value="湖北">湖北</option>
      <option value="北京">北京</option>
      <option value="湖南">湖南</option>
    </select>
    <br>
    生日:<input type="date" name="date"><br>
    个人简介:
    <textarea name="textarea" rows="10" cols="30"></textarea>
    <input type="submit" value="注册"></input>
  </form>
  </body>
</html>
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //post 获取请求参数
    //1. String getParameter(String name):根据参数名称获取参数值
    request.setCharacterEncoding("UTF-8");
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String sex = request.getParameter("sex");
    String province = request.getParameter("province");
    String textarea = request.getParameter("textarea");
    String date = request.getParameter("date");
    String email = request.getParameter("email");
    String file = request.getParameter("file");
    //2.根据参数名称获取参数值的数组
    String[] hobbies = request.getParameterValues("hobby");


    System.out.println("用户名为:"+username);
    System.out.println("密码为:"+password);
    System.out.println("性别为:"+sex);
    System.out.println("邮箱为:"+email);
    System.out.println("照片为:"+file);
    System.out.println("省份为:"+province);
    System.out.println("生日为:"+date);
    System.out.println("个人简介"+textarea);
    for (int i = 0; i <hobbies.length ; i++) {
        System.out.println("爱好是:"+hobbies[i]);
    }

}

注意:

  1. 如果getParameter()的参数与input等name属性值不一致,得到的结果为null

    如果getParameter()的参数与input等name属性值一致,但是没有传值,得到的结果是空字符串" "

  2. 复选框需要使用getParameterValues()

    如果不选中任何一个复选框,那么即使复选框没有值,则返回值数组是null,即不创建数组

  3. a标签是get请求,通过地址栏发送请求

    在路径中手动拼接参数

    路径?参数1=值1&参数2=值2

<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%--
  a 标签是get请求,通过地址栏发送请求
  在路径中手动拼接参数
  路径?参数1=值1&参数2=值2    
  --%>
  <a href="http://localhost:8080/Demo01?id=1&age=1&birthday=2021-11-11">点击发送请求,且携带数据</a>
  </body>
</html>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String id = req.getParameter("id");
    String age = req.getParameter("age");
    String birthday = req.getParameter("birthday");
    System.out.println(id+"--"+age+"--"+birthday);
}

2.请求转发 - forward

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

浏览器发出请求,到达一个Servlet,该Servlet可以将该请求转发至其他Servlet或者其它页面(HTML,jsp)

在这里插入图片描述

转发至另一个Servlet
  1. 获得转发对象
RequestDispatcher getRequestDispatcher(path);
参数:要转发的路径
    	如果要转发至Servlet,此处的路径path应该是Servlet的映射路径(需要在web.xml中配置)
返回值:请求转发对象
RequestDispatcher.forward() :真正执行转发    
  • 执行页面
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("Demo02Servlet执行了.....");

    //将请求转发至下一个Servlet
    /**
     * 获得转发对象
     * RequestDispatcher getRequestDispatcher(path)
     * 参数:要转发的路径
     *      如果要转发至Servlet,此处的路径应该是Servlet的映射路径(需要在web.xml中配置)
     * 返回值:请求转发对象
     * RequestDispatcher.forward()  :真正执行转发
     */
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Demo03");
    requestDispatcher.forward(req,resp);

    System.out.println("Demo02Servlet转发完成.....");
}
  • 转发到的Servlet
public class Demo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo03执行了......");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
转发至其它页面

在这里插入图片描述

请求转发的特点
  • 请求转发是服务器动作
  • 请求转发是一次浏览器请求
  • 浏览器的路径没有变化
  • 请求域中的数据可以在请求转发中共享
  • session域中的数据可以共享

3.请求域

HttpServletRequest对象可以当做请求域使用

请求域:理解为 req 对象内部有一片区域可以存储数据

Request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

如何存取:类似 map,存储时按照key-value存储,取出时,通过key取出value

  • 请求转发时请求域数据共享
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //请求域存数据
    req.setAttribute("name","张三");

    //请求转发
    req.getRequestDispatcher("Demo05_1").forward(req,resp);
}
  • 取出数据
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    //取出数据
    String name = (String) req.getAttribute("name");
    System.out.println(name);
}

4.session域

session是一种会话技术,用来保存会话中的数据.

特点:无论是请求转发还是重定向,session域中的数据都可以共享

  • Demo09Servlet
//session回会话
public class Demo09Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 1.请求转发,可以共享session域中的数据
         */

        //存入seeion
        //1.获得session
        HttpSession session = req.getSession();
        //2.存入数据
        session.setAttribute("birthday",new Date());
        //3.请求转发
        //req.getRequestDispatcher("/Demo10").forward(req,resp);
        /**
         * 2.重定向,可以共享session域中的数据
         */

        //3.重定向
        resp.sendRedirect(req.getContextPath()+"/Demo10");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
  • Demo10Servlet
//session会话
public class Demo10Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获得seeion对象
        HttpSession session = req.getSession();
        //2.取出数据
        Date birthday = (Date) session.getAttribute("birthday");
        System.out.println(birthday);
    }

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

HttpServletResponse – 做出响应

通过HTTPServletResponse对象设置响应头,响应行,响应正文

通常不关心如何设置响应头,响应行等数据,都会有默认操作

响应正文

  1. 请求到达该Servlet时,做出响应,给浏览器响应一个HTML页面
public class Demo06Servlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 响应正文
         */
        //resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        System.out.println("Demo06Servlet执行了。。。");
        //做出响应,响应一个html页面
        PrintWriter writer = resp.getWriter();
        writer.write("<html>");
        writer.write("<head>");
        writer.write("<title>响应的页面</title>");
        writer.write("</head>");
        writer.write("<body>");
        writer.write("<h1>响应成功 200 ok</h1>");
        writer.write("<hr>");
        writer.write("<div style=\"width:300px;height:300px;background-color:red\">块</div>");
        writer.write("<html>");
        writer.write("</body>");
        writer.write("</html>");
    }
}

重定向

请求到达该Servlet,通过响应对象,进行重定向,可以让浏览器重新再请求一个Servlet或页面

在这里插入图片描述

  1. 重定向到其它Servlet:resp.sendRedirect(path);

请求到达Demo07Servlet,Demo07Servlet设置响应重定向,告知浏览器重新请求Demo08Servlet

  • Demo07Servlet
public class Demo07Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo07Servlet执行了。。。");
        //响应,设置重定向
        //重定向到Demo08Servlet,此处不能加/,加/是到浏览器根路径,会缺乏项目名
        resp.sendRedirect("Demo08");
        
        
        //向请求域添加数据
        req.setAttribute("age",18);
    }
}
  • Demo08Servlet
public class Demo08Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo08Servlet执行了。。。。");
        
        //取出请求域中的数据
        Object age = req.getAttribute("age");
        System.out.println(age);//null
    }
}
  1. 重定向到其它页面

在这里插入图片描述

重定向的特点:

  1. 浏览器行为
  2. 两次请求
  3. 地址栏变化
  4. 请求域中的数据在重定向的多个Servlet不能共享
  5. seeion域中的数据可以共享

乱码问题

1.响应乱码

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

2.请求乱码

req.setCharacterEncoding("utf-8");

总结

请求 响应

1.如何处理请求 – HttPServletRequest

  1. 获得请求头,行,正文:req.getXxx
  2. 请求转发req.getRequestDispatcher(path).forward(req,resp)
  3. 请求域:
    1. 存入数据:req.setAttribute(key,value)
    2. 取出数据:req.getAttribute(key)
  4. session域
    1. 获取seesion对象:HttpSession session = req.getSession()
    2. 存入数据:session.setAttribute(key,value)
    3. 取出数据:session.getAttribute(key)

2.如何处理响应 – HttpServletResponse

  1. 响应正文:PrintWriter out = resp.getWriter()
  2. 重定向:resp.sendRedirect()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值