zoukankan      html  css  js  c++  java
  • JavaWeb学习笔记(9)

     ServletContext

    Context:上下文

    ServletContext: 代表的是整个应用。一个应用只有一个ServletContext对象。是单例对象

    作用:

    域对象:在一定范围内(当前应用),使多个Servlet共享数据

    常用方法:

    • void setAttribute(String name,object value);//向ServletContext对象的map中添加数据  
    • Object getAttribute(String name);//从ServletContext对象的map中取数据
    • void rmoveAttribute(String name);//根据name去移除数据
    package com.zx.web.lesson01;
    
    import java.io.IOException;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/Lesson01Servlet1")
    public class Lesson01Servlet1 extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            //1.获取一个应用的上下文
            ServletContext context=this.getServletContext();
            System.out.println(context);
            
            //2.往上下文存数据
            context.setAttribute("name", "zx it caiji");
            
        }
    }
    package com.zx.web.lesson02;
    
    import java.io.IOException;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/Lesson02Servlet1")
    public class Lesson02Servlet1 extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            /**
             * 注意:在web.xml中context-param配置的信息不是通过getAttribute方法获取的
             */
            //String str=(String) this.getServletContext().getAttribute("encoding");
            String str=(String) this.getServletContext().getInitParameter("encoding");
            System.out.println("web.xml中获取的encoding 值:"+str);
        }
    }
    
    
    结果:
    web.xml中获取的encoding 值:utf-8

    String getRealPath(String path);

    ü  根据资源名称得到资源的绝对路径.

    ü  可以得到当前应用任何位置的任何资源。

    package com.zx.web.lesson03;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Properties;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/Lesson03Servlet1")
    public class Lesson03Servlet1 extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            /**
             * 通过浏览器地址栏访问的路径都是get请求
             */
            /**
             * String path="src\com\zx\web\lesson03\info.properties";
             * 如果是web项目,查找文件时,要从类路径找
             */
            //String path="src\com\zx\web\lesson03\info.properties";
            String path=this.getServletContext().getRealPath("WEB-INF\classes\com\zx\web\lesson03\info.properties");
            System.out.println(path);
            //在Servlet中获取info.properties数据
            //1.创建属性对象
            Properties pro=new Properties();
            
            //2.关联属性文件的路径
            pro.load(new FileInputStream(path));
            
            System.out.println(pro.getProperty("username"));
            
            //响应客户端
            resp.getWriter().write(path);
        }
    }

     Servlet的转发

    package com.zx.web.lesson04;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/Lesson04Servlet1")
    public class Lesson04Servlet1 extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            /**
             * request:请求
             * response:响应,给客户端响应数据
             */
            //response.getWriter().write("data from servlet1");
            //1.获取请求转发的对象
            RequestDispatcher rd= request.getRequestDispatcher("/Lesson04Servlet2");
            
            //2.执行转发
            rd.forward(request, response);
        }
    }
    package com.zx.web.lesson04;
    
    import java.io.IOException;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/Lesson04Servlet2")
    public class Lesson04Servlet2 extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            /**
             * request:请求
             * response:响应
             */
            response.getWriter().write("data from servlet2");
        }
    }

    HTTP:

    HTTP消息头

    • HTTP消息头是指在超文本传输协议( Hypertext Transfer Protocol ,HTTP)的请求和响应消息中,协议头部分的那些组件。
    • HTTP消息头用来准确描述正在获取的资源、服务器或者客户端的行为
    • HTTP消息头定义了HTTP事务中的具体操作参数。
    • 消息头包括请求时的消息头(请求头)和响应时的消息头(响应头)

    HttpServletResponse

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。

    响应正文(主体)

    getWrite(); 字符输出流

    getOutputStream(); 字节输出流,可以用来下载文件

    响应编码

    案例:向客户端输出中文

    package com.zx.web.lesson06;
    
    import java.io.IOException;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/Lesson06Servlet2")
    public class Lesson06Servlet2 extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            //响应编码问题
            
            //1.设置响应头
            //resp.setContentType("text/html");//设置响应的类型
            //resp.setCharacterEncoding("UTF-8");        //设置响应的编码类型
            
            //另外一种解决乱码的写法
            resp.setHeader("Content-Type", "text/html;charset=UTF-8");
            resp.getWriter().write("张无改-张又改");
        }
    }

    响应状态码

    常见的状态码参照:http://tool.oschina.net/commons?type=5

    404请求失败,请求所希望得到的资源未被在服务器上发现

    200请求已成功,请求所希望的响应头或数据体将随此响应返回。

    302 重定向

    500 服务抛出异常

    package com.zx.web.lesson07;
    
    import java.io.IOException;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/Lesson07Servlet1")
    public class Lesson07Servlet1 extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            
            //响应状态码
            /**
             * 默认情况下,服务器响应给客户端的状态码为200
             * 200:ok,没有问题
             */
            resp.setStatus(404);
            resp.getOutputStream().write("hello".getBytes());
        }
    }

    文件下载

    package com.zx.web.lesson08;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.net.URLEncoder;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/Lesson08Servlet1")
    public class Lesson08Servlet1 extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            
            //处理文件下载[把文件的数据(二进制)响应给客户端]
            //1.文件名
            String fileName="啥子.jpg";
            String path="E:\"+fileName;
            /**
             * 注意:如果是文件下载,需要设置响应头Content-disposition
             * 如果文件名中有中文,下载时为了解决乱码问题,需要对文本进行URLEncode,把中文变成百分号形式%
             * 哈哈.txt=%E5%93%88%E5%93%88.txt
             * 一个中文会对应三个百分号数据
             */
            //设置响应类型
            fileName=URLEncoder.encode(fileName, "UTF-8");
            System.out.println(fileName);
            resp.setHeader("Content-disposition", "attachment;filename=" + fileName);
            
            //2.获取文件输入流
            FileInputStream fis=new FileInputStream(path);
            
            //3.获取输出流
            ServletOutputStream sos= resp.getOutputStream();
            
            //4.从文件中读取数据,响应给客户端
            byte[] buf=new byte[1024];
            int len=0;
            while ((len=fis.read(buf))!=-1) {
                sos.write(buf, 0, len);
            }
            
            //关闭资源(输出流会自动关闭)
            fis.close();
        }
    }

     手写验证码

    package com.zx.web.lesson09;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.net.URLEncoder;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/VerificationCode")
    public class VerificationCode extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            //1.创建一个图片对象
            int width=120;
            int height=30;
            BufferedImage bi=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            
            //2.拿到画笔
            Graphics graphics= bi.getGraphics();
            
            //3.涂个背景颜色
            graphics.setColor(Color.yellow);//设置画笔颜色
            graphics.fillRect(0, 0, width, height);
            
            //4.画干扰线
            //重新设置画笔颜色
            graphics.setColor(Color.BLACK);
            Random random=new Random();
            for (int i=0;i<4;i++) {
                //第一个点
                int x1=random.nextInt(width);
                int y1=random.nextInt(height);
                
                //第二个点
                int x2=random.nextInt(width);
                int y2=random.nextInt(height);
                graphics.drawLine(x1, y1, x2, y2);
            }
            
            //5.画验证码(4个随机数)
            graphics.setColor(Color.RED);
            int left=10;
            for (int i=0;i<4;i++) {
                int r=random.nextInt(10);
                graphics.drawString(r+"", (left+i*30), 20);
            }
            
            //设置响应类型
            resp.setContentType("image/jpeg");
            //把图片输出给客户端
            ImageIO.write(bi, "JPEG", resp.getOutputStream());
        }
    }
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
        function refreshCode(){
            //1.获取img标签
            var imgTag=document.getElementById("code");
            //2.获取img标签src的属性值
            console.log(imgTag.src);
            //3.重新赋值
            imgTag.src="/day09Web/VerificationCode?"+new Date().getTime();//改的值与原本的src一致,js就不会去访问后台
        }
    </script>
    </head>
    <body>
    <form action="">
        用户名:<input type="text"><br/>
        密码:<input type="password"><br/>
        <!-- src下面要添加项目名称 -->
        验证码:<input type="text">
        <img id="code" alt="" src="/day09Web/VerificationCode">
        <!-- 怎么在a标签中,调用js -->
        <a href="javascript:refreshCode()">看不清,换一张</a>
    </form>
    </body>
    </html>

    使用工具类实现验证码

    package com.zx.web.lesson10;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.net.URLEncoder;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import cn.dsna.util.images.ValidateCode;
    
    
    @WebServlet("/VerificationCode2")
    public class VerificationCodeServlet extends HttpServlet{
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            //使用工具来生成验证码,一个jar包
            /**
             * JavaWeb中,导入第三方的包,跟以前有点不一样
             * 导包都是放在WEB_INF/lib
             */
            //创建验证码对象
            ValidateCode validateCode=new ValidateCode(100, 30, 4, 6);
            
            //把验证码返回给客户端
            validateCode.write(resp.getOutputStream());
        }
    }

     自动刷新响应头

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            response.setContentType("text/html;charset=UTF-8");
            //response.setHeader("Refresh", "1");//每隔一秒刷新一次
            
            response.setHeader("Refresh", "5;URL=index.html");//3秒后转到另一页面
            response.getWriter().write("注册成功!3秒后会自动跳转,苦没有中转点击<a href='index.html'>这里</a>");
        }

    response需要注意的细节:

    1. getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。  会抛异常
    2. 这两个流不需要我们关闭,如果自己写close方法也没有问题,但是这样做等于重复做事

    HttpServletRequest

    request常用方法

    获得客户端信息

    • getRequestURL方法返回客户端发出请求时的完整URL。
    • getRequestURI方法返回请求行中的资源名部分。
    • getQueryString 方法返回请求行中的参数部分。
    • getRemoteAddr方法返回发出请求的客户机的IP地址
    • getRemoteHost方法返回发出请求的客户机的完整主机名
    • getRemotePort方法返回客户机所使用的网络端口号
    • getLocalAddr方法返回WEB服务器的IP地址。
    • getLocalName方法返回WEB服务器的主机名
    • getMethod得到客户机请求方式

    获得客户端请求头

    • getHead(name)方法
    • getHeaders(String name)方法
    • getHeaderNames方法

  • 相关阅读:
    别让猴子翻到背上
    python生成二维码
    50条经典爱情观
    智力测试题
    SQL数据库优化
    递归函数实现二分查找法
    软件开发类别
    递归函数的深度问题
    UVALive
    UVALive
  • 原文地址:https://www.cnblogs.com/zhangwugai/p/11299480.html
Copyright © 2011-2022 走看看