zoukankan      html  css  js  c++  java
  • servlet和response

    servlet基础知识

    Servlet在内存中是单例----单实例对象一个Servlet类 在内存中最多有一个对象

     一个项目有多少功能,将来就有多少Servlet。

     servlet是自启动的,就是可以在服务器启动时,创建Servlet对象

    servlet的生命周期

    Servlet对象的生命周期是由服务器管理的。在第一次访问时,服务器创建Servlet对象并调用init方法一次。每一个访问,服务器会开启一个新的线程
    调用service()方法,根据请求方式调用doGet()doPost()方法。在服务器关闭时(正常关闭)销毁servlet对象,在销毁之前调用destroy方法一次

    servlet的相关配置

    url-pattern配置
    完全路径匹配 例如:
    /demo1 , /aaa/demo2 , /aaa/bbb/demo3 目录匹配 例如: /* (所有) ,/aaa/* (aaa目录下的所有) 扩展名匹配 例如: *.do , *.action 、*.jsp 、*.jpg 缺省路径/缺省匹配 / 优先级顺序:完全匹配 > 目录匹配 > 扩展名匹配 > 缺省匹配 ServletConfig配置

    ServletContext对象

    ServletContext context = this.getServletConfig();//获ServletContext对象,域对象
    context.setAttribute(String name,Object object);
    context.getAttribute(String name)
    只要是在同一个项目中,任意Servlet获取到的都是同一个ServletContext对象。

     整个项目的初始化参数(全局初始化参数), 通过ServletContext对象获得

    response对象操作响应行

        setStatus(int status);设置状态码
        sendError(int sc,String errorMsg);发送表示错误信息状态码

    response对象操作响应头

    void addHeader(String name, String value)    这两个方法都是用来设置HTTP协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段
    void setHeader(String name, String value)    
    void setCharacterEncoding(String charset)    该方法用于设置输出内容使用的字符编码,对HTTP 协议来说,就是设置Content-Type头字段中的字符集编码部分。
    void setContentType(String type)    该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法的还可以设置字符编码,如:text/html;charset=UTF-8void addIntHeader(String name,int value)    这两个方法专门用于设置包含整数值的响应头。避免了使用addHeader()与setHeader()方法时,需要将int类型的设置值转换为String类型的麻烦
    void setIntHeader(String name,int value)    
    void setContentLength(int len)    该方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值无需手动设置,由服务器自行设置

    response对象操作响应体

    getOutputStream()   向响应体输出二进制字节流信息。【文件下载】
    getWriter()   向响应体输出字符流信息。【字符串及前端代码输出】

     乱码解决

      setContentType("text/html;charset=UTF-8");

     一个响应体不可以同时被两种流操作 

    资源重定向和请求转发

    response.sendRedirect("客户端绝对路径");
    response.setHeader("refresh","X秒;url=客户端绝对路径")

    案例: servlet文件下载

     1 @WebServlet(name = "DownloadServlet",urlPatterns = "/DownloadServlet")
     2 public class DownloadServlet extends HttpServlet {
     3     
     4     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     5         this.doPost(request, response);
     6     }
     7 
     8     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     9 
    10         String filename =request.getParameter("filename");
    12         String folderPath = this.getServletContext().getRealPath("/download");
    14         InputStream is = new FileInputStream(folderPath+"/"+filename);
    16         filename = new String(filename.getBytes("UTF-8"),"iso-8859-1");
    18         response.addHeader("Content-Disposition","attachment;filename="+filename);
    20         OutputStream os = response.getOutputStream();
    22         int len=0;
    23         byte[] b = new byte[1024];
    25         while((len=is.read(b))!=-1){
    26             os.write(b,0, len);
    27         } 
    29         is.close();
    30         os.close();
    31     }
    32 
    33 }

    案例: servlet生成验证码

     1 @WebServlet(name = "CheckCodeServlet",urlPatterns = "/CheckCodeServlet")
     2 public class CheckCodeServlet extends HttpServlet {
     3     
     4     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     5         this.doPost(request, response);
     6     }
     7 
     8     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     9                 // 1 生成图片的高度和宽度    
    10                 int height = 30;
    11                 int width = 60;
    12                 //从这个字符串中选几个字符组成图片的内容
    13                 String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
    14                 Random random = new Random();
    15                 //2 创建一个图片
    16                 BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    17                 
    18                 //3 获得画板
    19                 Graphics g = image.getGraphics();
    20                 
    21                 
    22                 //4 填充一个矩形
    23                 // * 设置颜色
    24                 g.setColor(Color.BLACK);
    25                 g.fillRect(0, 0, width, height);
    26                         
    27                 g.setColor(Color.WHITE);
    28                 g.fillRect(1, 1, width-2, height-2);
    29                 // * 设置字体
    30                 g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 25));
    31                 
    32                 for(int i = 0 ; i < 4 ; i ++){
    33                     
    34                     // 设置颜色--随机数
    35                     g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
    36                     
    37                     // 获得随机字
    38                     int index = random.nextInt(data.length());
    39                     String str = data.substring(index, index + 1);
    40                     // 写入
    41                     g.drawString(str, width/6 * (i + 1), 20);
    42                 }
    43                 
    44                 //6 干扰线
    45                 for(int i = 0 ; i < 3 ; i ++){
    46                     // 设置颜色--随机数
    47                     g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
    48                     // 随机绘制线
    49                     g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width),random.nextInt(height));
    50                     // 随机点
    51                     g.drawOval(random.nextInt(width), random.nextInt(height), 2, 2);
    52                 }
    53                 
    54                 //end 将图片响应给浏览器
    55                 ImageIO.write(image, "jpg", response.getOutputStream());
    56     }
    57 
    58 }
    我凝视这恒星,等待这那场风暴,我已经准备好了
  • 相关阅读:
    JS字符串截取(获取指定字符后面的所有字符内容)
    vue图片上传插件
    php获取两个日期之间的所有日期
    laravel做定时任务时,加参数(也可缓存参数)
    前端传参数(数组,值为json字符串),后端接收json_decode()转为数组,数组为空值
    springboot的maven多模块项目
    如何给文件重命名
    springboot的get请求和post请求
    java调用ffmpeg
    mybatis批量插入List
  • 原文地址:https://www.cnblogs.com/cheng5350/p/11445274.html
Copyright © 2011-2022 走看看