JavaWeb03-servlet源码分析以及request和response的一些应用场景

参考:​​​​​​JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)_刘扬俊的博客-CSDN博客_servlet

我学习的代码主要还是以之前用的例子为例 ,之前写了个ServiceContext的实现案例

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletContext servletContext=this.getServletContext();
        String username=(String) servletContext.getAttribute("username");
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().print("名字"+username);
    }

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

首先了解一下Http的常见响应码

web服务器接收到http请求,分别会创建一个Request和Response。 然后看到我们经常使用的

HttpServletRequest(获取客户端传过来的参数)
HttpServletResponse(给客户端响应信息)

 

首先看HttpServletResponse

里面定义了很多状态码

 

Response一些实际应用:

1.向浏览器输出消息

例如

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer=resp.getWriter();
        writer.print("nice");
    }

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

2.下载文件

 

 

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取文件的路径(我这里直接写死了)
        String path="D:\\Javaproject\\SSM学习\\web\\src\\main\\resources\\d.jpg";
        //2.下载的文件名 substring截取字符段,最后出现 \ 的下标 截取的话 是包含 \ 下标的 所有 下标要 +1
        String fileName=path.substring(path.lastIndexOf("\\")+1);
        //3.Content-Disposition 的作用:当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型
        resp.setHeader( "Content-Disposition", "attachment;filename=" +fileName);
        //4.获取下载文件的输入流
        FileInputStream fis=new FileInputStream(path);
        //5.创建缓冲区
        int len=0;
        byte[] buffer=new byte[1024];
        //6.获取OutputStream对象
        ServletOutputStream out=resp.getOutputStream();
        //7.FileInputStream写入到buff缓冲区,再用获取OutputStream对象将缓冲区中的数据输出到客户端
        while ((len=fis.read(buffer))!=-1){
            out.write(buffer,0,len);
        }
        fis.close();
        out.close();

    }

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

3.随机数验证码(看看就好,代码过时了)

public class ImageServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //让浏览器三秒刷新一次
        resp.setHeader("refresh","3");
        //内存中创建一个图片
        BufferedImage image=new BufferedImage(80,20,BufferedImage.TYPE_INT_BGR);
        //得到图片
        Graphics2D g=image.createGraphics();
        //设置图片的背景色
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.BLUE);
        g.setFont(new Font(null,Font.BOLD,20));
        g.drawString(randomnum(),0,20);

        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");

        //把图片写给浏览器
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }

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

    private  String randomnum(){
        Random random=new Random();
        String num=random.nextInt(9999)+"";  //随机数范围
       StringBuffer sb=new StringBuffer();
       for(int i=0;i<7-num.length();i++){
           sb.append("0");        //随机数不足7位,拼接0
       }
       String s= sb.toString()+num;
     return  s;
    }

}

4.实现重定向(重要)

 resp.sendRedirect("/image");

理解原理 ,重定向要注意路径问题(发生404的时候)

总结:1.转发是一次请求,重定向是两次2.转发不会改变url,重定向会改变3.请求转发是在服务器内部完成的,而重定向是在客户端完成的4.转发的url必须是当前web工程内部的地址,重定向可以是任意地址

HttpServletRequest 

HttpServletRequest,代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获取客户端的所有信息。

Request的一些应用

1.获取前端传递的参数

 方法二,三不常用,一和四的区别是四的返回类型是数组

2.请求转发


public class RequestServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbys));
        //请求转发
        req.getRequestDispatcher(req.getContextPath()+"/success.jsp").forward(req,resp);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
    <servlet>
        <servlet-name>requestservlet</servlet-name>
        <servlet-class>com.wjc.servlet.RequestServlet01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>requestservlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
登陆页面
<div style="text-align: center">
  <form action="/login" method="post">
    用户名:<input type="text" name="username"> <br>
    密码:<input type="text" name="password"> <br>
    爱好:
    <input type="checkbox" name="hobbys" value="女孩">女孩
    <input type="checkbox" name="hobbys" value="电影">电影
    <input type="checkbox" name="hobbys" value="喝茶">喝茶
    <input type="checkbox" name="hobbys" value="按摩">按摩
    <br>
    <input type="submit">
  </form>
</div>
  </body>
</html>

在这里出现了个错误,如果tomcat里面的上下文配置了路径页面跳转会报错, 看到一个评论大佬的回答是

getRequestDispatcher分成两种,可以用request调用,也可以用getServletContext()调用     不同的是request.getRequestDispatcher(url)的url可以是相对路径也可以是绝对路径。而this.getServletContext().getRequestDispatcher(url)的url只能是绝对路径。

参考文章:

getRequestDispatcher 和sendRedirect区别_geekfly的博客-CSDN博客

ServletRequest.getRequestDispatcher和ServletContext.getRequestDispatcher的区别。_mark_to_win的博客-CSDN博客

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JagTom

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

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

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

打赏作者

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

抵扣说明:

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

余额充值