Servlet重要类及其方法的应用

Servlet重要类及其方法的应用

Servlet重要类及其方法的应用

1.1 HttpServlet的一些方法介绍

//        this.getInitParameter();得到初始化参数
//        this.getServletConfig();得到servlet配置就是web.xml中我们写的配置
//        this.getServletContext();得到servlet上下文

1.2 ServletContext

web容器(tomcat)在启动的时候,它会为每个web程序创建一个对应的ServletContext对象,它代表当前的web应用。

作用:

  • 共享数据:不同servlet之间(类似vue的store)

    //第一个servlet中
    ServletContext servletContext = this.getServletContext();
    String username = "lihua";
    //将数据保存在其中,通过第一个参数取出数据,第二个参数是值
    servletContext.setAttribute("username",username);
    
    //另外一个servlet
            ServletContext servletContext2 = this.getServletContext();
            String username = (String)
     //取出
                servletContext2.getAttribute("username");
    //设置格式
    resp.setContentType("text/html;charset=utf-8")
    //打印到响应中
            resp.getWriter().print(username);
    
    • 获取初始化参数
    <!--在web.xml中-->
    <!--    配置一些web应用初始化参数:就是一些键值对-->
        <context-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
        </context-param>
    
    //获取初始化参数
    ServletContext servletContext = this.getServletContext();
    String url = servletContext.getInitParameter("url");
        //jdbc:mysql://localhost:3306/mybatis
    
  • 请求转发

    ServletContext servletContext = this.getServletContext();
            //需要转发的请求路径
            RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/hello");
            requestDispatcher.forward(req,resp);//实现请求转发
            //合并前两句
    //        servletContext.getRequestDispatcher("/hello").forward(req,resp);
            
    

    现在本servlet路径显示的是/hello路径的页面

  • 读取资源文件

    Properties:

    • 在java目录下新建properties(如db.properties)
    • 在resources目录下新建properties

    发现都被打包到同一个路径下:classes,俗称类路径

    ServletContext servletContext = this.getServletContext();
    //把资源变成流
    InputStream resourceAsStream = servletContext.getResourceAsStream("/WEB-INFO/classes/db.properties");
    Properties properties = new Properties();
    properties.load(resourceAsStream);
    String username = properties.getProperty("username");
    //得到:helloworld
    
    //db.properties中:
    username=helloworld
    

1.3 HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpsServletRequest代表,代表响应的一个HttpServletResponse

  • 如果要获取客户端请求过来的参数,找HttpServletRequest
  • 如果要给客户端响应一些信息,找HttpServletResponse

简单分类方法:

  1. 负责向浏览器发送信息的方法

    • getOutputStream()//字节流
      getWriter()//字符,用来写中文等
      //这些方法都是继承自ServletResponse
      
  2. 负责向浏览器发送响应头的方法

    • setCharacterEncoding(String charset)
      setContentLength(int len)
      setContentLengthLong(long len)
      setContentType(String type)
      //上述方法继承自ServletResponse
      addDateHeader(String name, long date)
      setHeader(String name, String value)
      addHeader(String name, String value)
      setIntHeader(String name, int value)
      addIntHeader(String name, int value)
      //这些是自己类的方法,而且不止这些
      
  3. 响应码和设置响应码的方法

一些应用:

  1. 向浏览器输出消息:不多说,上面一直在演示

  2. 下载文件

    //        1.获取下载路径
            String realPath ="C:\\Users\\adminster\\Desktop\\雨夜.png";
    //        2.获取下载文件名
    //            截取字符串获取文件名字
    
            String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
    //        3.想办法让浏览器支持下载(设置响应头)
    //            如果文件路径有中文的话需要UrlEncoder
            resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
    //        4.获取下载文件的输入流
            FileInputStream fileInputStream = new FileInputStream(realPath);
    //        5.创建缓冲区
            int len = 0;
            byte[] bytes = new byte[1024];
    //        6.获取OutputStream对象
            ServletOutputStream outputStream = resp.getOutputStream();
    //        7.将OutputStream流写入缓冲区
            while ((len=fileInputStream.read(bytes))>0){
                outputStream.write(bytes,0,len);
            }
            fileInputStream.close();
            outputStream.close();
    //最后成功下载文件
    
  3. 验证码功能

    验证码是怎么来的:

    • 前端实现
    • 后端实现,需要用到java的图片类生成一个图片
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //       让浏览器三秒刷新一次
            resp.setHeader("refresh","3");
    //        在内存创建一个图片,参数宽高颜色
            BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
    //        图片的画笔
            Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();
    //        设置图片背景颜色
            graphics2D.setColor(Color.RED);
    //        填充图形
            graphics2D.fillRect(0,0,80,20);
    //        给图片写数据
            graphics2D.setColor(Color.blue);
            graphics2D.setFont(new Font(null,Font.BOLD,20));
            graphics2D.drawString(makeNum(),0,20);
    
    //        告诉浏览器这个请求以图片jpeg的形式打开
            resp.setContentType("image/jpeg");
    //        网站存在缓存,我们阻止其缓存,下面三行可以不掌握
            resp.setDateHeader("expires",-1);
    //        缓存控制,设置为不缓存
            resp.setHeader("Cache-Control","no-cache");
    //        Pragma
            resp.setHeader("Pragma","no-cache");
    
    //        把图片写给浏览器,以imageIO的形式
            ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
    
        }
        private  String makeNum(){
            Random random = new Random();
    //        生成随机数[0,10000000) int ;
            String s = random.nextInt(10000000) + "";
            //以下步骤都是为了当为啥不够七位时补零
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < 7 - s.length(); i++) {
                sb.append("0");
            }
            s = sb.toString() + s;
            return s;
    
        }
    

    效果:同时每三秒刷新一次为不同数字

  1. Response重定向(最重要)

    至于什么是重定向?感觉说过很多次了,就是web资源收到客户端请求之后,让它去访问另外一个资源的过程

    //重定向操作:
    resp.sendRedirect("/SonMaven_war/img");
    //重定向路径不能只写个/img,还需要加上部署的项目名
    

    状态码3开头都是重定向请求

    转发和重定向的区别:(131条消息) 请求转发和重定向_豆虫儿的博客-CSDN博客

    请求转发:request.getRequestDispatcher(URL地址).forward(request, response)

    重定向:response.sendRedirect(URL地址)

    重定向之后url地址变化,转发不变

1.4 HttpServletRequest

代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装得到HttpServletRequest

方法介绍一些重要的:

  1. 获取前端传递的参数

    //一个表单,index.jsp中
    //修改编码
    <%@ page language="java" contentType="text/html; charset=UTF-8"
            pageEncoding="UTF-8"%>
    <form action="${pageContext.request.contextPath}/hello" method="get">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"> <br>
        <input type="submit">
            
     servlet中      
    //        解决后台中文乱码
            req.setCharacterEncoding("utf-8");
    //        得到表单参数
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            
            resp.setCharacterEncoding("utf-8");
    //       一组同名的可以用
    // String[] password =req.getParameterValues("password")
    
    
  2. 请求转发

    //        请求转发,不像重定向不需要写部署项目路径
    req.getRequestDispatcher("/error").forward(req,resp);
    //只改变页面,路径不变
    

问题一如何解决封装到端口被占用?

打开cmd,输入netstat -aon | find "1099",数字是被占用的端口号,然后打开任务管理器,输入该进程的pid号结束进程

问题二不允许有匹配 [xX][m M][lL] 的处理指令目标

原因web.xml中

<?xml version="1.0" encoding="UTF-8" ?>

必须放在第一行

热门相关:洪荒二郎传         重生当学神,又又又考第一了!   法医娇宠,扑倒傲娇王爷