Servlet

作者: 强某某 | 来源:发表于2018-12-18 14:49 被阅读5次

    Servlet

    Servlet是一个接口,常用方法是service

    package com.tjsmc.servlet;
    import java.io.IOException;
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    public class Hello implements Servlet{
    
        public void destroy() {
        }
        public ServletConfig getServletConfig() {
            return null;
        }
        public String getServletInfo() {
            return null;
        }
    
        public void init(ServletConfig arg0) throws ServletException {
        }
        public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
            System.out.println("测试");
        }
    }
    
    在webcontent下面的web-inf文件夹下面的web.xml文件中配置servlet和路由
    
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>HelloServlet</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
     <!--  向tomcat说明,项目里面有哪些servlet,不注册的话无效 -->
      <servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>com.tjsmc.servlet.Hello</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
    </web-app>
    

    HttpServlet

    HttpServlet是Servlet的实现类,可选择实现对应的方法,但是一般此类中不重写service方法
    因为该类的service自身也是判断请求方式,然后调用doget或者dopost,所以一般直接写doGet或doPost

    package com.tjsmc.servlet;
    import java.io.IOException;
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class Hello2 extends HttpServlet{
    
        @Override
        protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
            super.service(arg0, arg1);
        }
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    

    Servlet的生命周期

    public class Hello implements Servlet{
    
        /**
         * 默认情况下:创建类的实例时候调用
         * 初次访问servlet才会创建实例
         * init方法只会执行一次
         */
        public void init(ServletConfig arg0) throws ServletException {
            System.out.println("init");
        }
        
        /**
         * 客户端请求到达就执行
         * 可多次执行
         * 一次请求对应一次service执行
         */
        public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
            System.out.println("service");
            
        }
        /**
         * servlet销毁的时候,执行该方法
         * 1. 项目从tomcat中移除
         * 2. tomcat中shutdown.bat执行正常关闭时候执行
         */
        public void destroy() {
            System.out.println("destroy");
        }
    }
    

    Servlet的提前初始化

    <!--  向tomcat说明,项目里面有哪些servlet -->
      <servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>com.tjsmc.servlet.Hello</servlet-class>
        <!--默认情况下,servlet的init初始化在第一次访问到达时候执行
        如果想提前初始化(在项目部署到tomcat中就进行初始化),则通过下面的标签,而且值是一个数字
         数字越小,创建时机越早,一般不写负数,从2开始即可,1被tomcat内部占用 -->
        <load-on-startup>2</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
    

    ServletConfig

    servlet的配置,通过这个对象可以获取servlet在配置时候的一些信息

    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //ServletConfig 可以获取servlet的配置信息
            
            //1. 获取servlet的配置对象
            ServletConfig config= getServletConfig();
            //2.获取servlet的名称:是servlet-name的文本内容
            String servletName = config.getServletName();
            //3.获取初始化参数
            String initParameter = config.getInitParameter("name");
    //      System.out.println("初始化:"+initParameter);
            //4.获取所有初始化参数的名称的枚举集合
            Enumeration<String> initParameterNames = config.getInitParameterNames();
            while (initParameterNames.hasMoreElements()) {
                String string = (String) initParameterNames.nextElement();
                String pars = config.getInitParameter(string);
                System.out.println(pars);
            }
        }
    
    <servlet>
        <servlet-name>Hello2</servlet-name>
        <servlet-class>com.tjsmc.servlet.Hello2</servlet-class>
        
        <!-- 添加初始化参数 -->
        <init-param>
            <param-name>name</param-name>
            <param-value>qiang</param-value>
        </init-param>
      </servlet>
    

    路径匹配


    1. 全路径匹配
    • 例如:/aa /bb
    1. 前半段匹配(以*结束)
    • 例如: /a/* /*
    1. 以扩展名匹配(此时不需要/)
    • 写法 *.扩展名 *.aa *.bb

    ServletContext(上下文)

    public class Hello3 extends HttpServlet {
           
       /**
        * 一个web程序只有一个上下文对象ServletContext 
        * 也就是说不论哪个servlet获取的ServletContext都是同一个
        * ServletContext作用:
        *   1. 获取全局配置参数
        *   2. 获取web应用的资源(因为项目发布到tomcat中之后资源文件路径用相对路径不对,绝对路径又不合适)
        *   3. 存储数据(servlet间共享数据,域对象)
        */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1.获取上下文对象
            ServletContext servletContext = getServletContext();
            //2.获取全局配置的参数
            String initParameter = servletContext.getInitParameter("name");
            //3.获取给定的文件在服务器上面的绝对路径,该方法如果不添加参数,则是项目根目录
            String realPath = servletContext.getRealPath("props/stus.properties");
            //D:\DevelopSoft\Tomcat\apache-tomcat-7.0.52\wtpwebapps\HelloServlet\stus.properties
            Properties properties=new Properties();
    //      properties.load(new FileInputStream(realPath));
    //      String name = (String) properties.get("name");
            //3.获取资源方式二
    //      InputStream resourceAsStream = servletContext.getResourceAsStream("props/stus.properties");
    //      properties.load(resourceAsStream);
    //      String name = (String) properties.get("name");
            //3.利用classloader获取资源方式三
            /**
             * classloader的路径是:
             * D:\DevelopSoft\Tomcat\apache-tomcat-7.0.52\wtpwebapps\HelloServlet\WEB-INF\classes
             * 
             * 但是真实需要的是:
             * D:\DevelopSoft\Tomcat\apache-tomcat-7.0.52\wtpwebapps\HelloServlet\stus.properties
             * 所以需要回两级目录
             */
            InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("../../props/stus.properties");
            properties.load(resourceAsStream);
            String name = (String) properties.get("name");
            System.out.println(name);
            
            //4.存储数据和取出数据
            //获取get请求来的参数
            String username = request.getParameter("username");
            Object loginnum =servletContext.getAttribute("loginnum");
            int total=0;
            if (loginnum!=null) {
                total=(Integer) loginnum;
            }
            servletContext.setAttribute("loginnum", ++total);
            //返回给客户端
            response.getWriter().write(username+"..."+total);
        }
    
    }
    
    资源路径.png
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
      <p>
          请输入内容并提交
      </p>
      <!-- 注意此处不需要/Hello3 直接Hello3即可 -->
      <form action="Hello3" method="get">
        <input type="text" name="username" value="请输入用户名">
        <input type="submit" value="提交">
      </form>
    </body>
    </html>
    
     <!--  全局参数 -->
     <context-param>
        <param-name>name</param-name>
        <param-value>全局参数</param-value>
     </context-param>
    
    全局参数.png

    HttpServletRequest和HttpServletResponse

    HttpServletRequest客户端提交数据的封装,HttpServletResponse是响应对象

    public class Hello4 extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 获取单个提交的参数
            String username = request.getParameter("username");
            // 获取所有参数得到一个枚举集合
            Enumeration<String> parameterNames = request.getParameterNames();
            // 获取所有参数的map集合
            Map<String, String[]> parameterMap = request.getParameterMap();
            /**
             * GET请求方式中文乱码问题 tomcat收到数据,getParameter默认使用ISO-8859-1编码
             * 所以先利用username.getBytes("ISO-8859-1")通过ISO-8859-1解码 然后通过new
             * String编码为UTF-8
             * 
             * 解决方案二: 在tomcat中配置get请求过来的数据永远使用UTF-8编码即可
             * tomcat文件夹下面的conf文件夹内部的server.xml中的64行
             *  <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" * redirectPort="8443" URIEncoding="UTF-8"/>
             */
            username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
            /**
             * 响应也有中文乱码问题
             */
            // 以字符流的方式写,默认是ISO-8859-1会中文乱码
            // 1.首先设置响应体的编码格式
            // response.setCharacterEncoding("UTF-8");
            // 2. 设置浏览器使用的解码格式
            // response.setHeader("Content-Type", "text/html;charset=UTF-8");
            // response.getWriter().write("呵呵");
            // 以字节流的方式写也可能有会中文乱码
            /**
             * 默认使用的是utf-8的编码
             */
            //方式一:
            //response.setContentType( "text/html;charset=UTF-8");
            //方式二
             response.setHeader("Content-Type", "text/html;charset=UTF-8");
             //起始因为默认是utf-8的编码所以getBytes("utf-8")可以直接写getBytes()
            response.getOutputStream().write("呵呵呵".getBytes("utf-8"));
            
            // 设置状态码
            // response.setStatus(200);
            // 设置消息头
            // response.setHeader(arg0, arg1);
            // 设置响应类型
            // response.setContentType(arg0);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // post请求中文乱码问题,通过下面代码设置编码即可解决
            // 设置请求体内容编码格式
            resp.setCharacterEncoding("UTF-8");
            String username = req.getParameter("username");
    
            resp.getWriter().write(username);
        }
    }
    

    下载文件的案例

    代码实现下载:
    public class down extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String filename = request.getParameter("filename");
            /**
             * 这句代码:
             * 表示是使用下载的方式操作文件,而不是浏览器默认行为
             * 比如说浏览器默认打开图片,xml,而不是下载
             */
            response.setHeader("Content-Disposition", "attachment;filename="+filename);
            InputStream is = getServletContext().getResourceAsStream("download/" + filename);
            OutputStream os = response.getOutputStream();
            int len = 0;
            byte[] bys = new byte[1024];
            while ((len = is.read(bys)) != -1) {
                os.write(bys, 0, len);
            }
            os.close();
            is.close();
        }
    }
    
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <p>使用tomcat默认servlet实现下载</p>
         <!-- 不需要java代码配合,但是浏览器是按照默认行为操作的 -->
        <a href="download/a.zip">下面</a>
    
        <p>编码实现下载</p>
        <a href="down?filename=a.zip">下面</a>
        <a href="down?filename=a.png">下面</a>
    </body>
    </html>
    
    download.png

    相关文章

      网友评论

        本文标题:Servlet

        本文链接:https://www.haomeiwen.com/subject/lxhlkqtx.html