zoukankan      html  css  js  c++  java
  • Servlet学习(三)

    servlet线程安全:单实例,多线程。

    解决方法:将全局变量改为局部变量。

    不安全:

    package servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class ServletDemo5
     */
    @WebServlet("/ServletDemo5")
    public class ServletDemo5 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public ServletDemo5() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
        int num = 1;
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		num ++;
    		
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		System.out.println(num);
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(request, response);
    	}
    	
    	//运行结果,不停刷新页面出现:12345678889910101111
    
    }
    

    安全写法:

    package servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class ServletDemo5
     */
    @WebServlet("/ServletDemo5")
    public class ServletDemo5 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public ServletDemo5() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
        
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		int num = 1;
    		num ++;
    		
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		System.out.println(num);
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(request, response);
    	}
    	
    	//运行结果,不停刷新页面出现:22222222222
    
    }
    

      因为每个用户访问时候都开一个线程,每个线程都会执行一次dopost/doget方法,而num是局部变量,每次访问都是新的num。

    servlet获取配置信息(web.xml):

    1.servletConfig.getInitParamter   自己创建sevletConfig对象,再getInitParamter方法获取
    2.this.getInitParamter/super.getInitParamter 直接使用父类的getInitParamter方法获取
    3.this.getServletConfig().getInitParamter 继承父类sevletConfig对象,再getInitParamter方法获取

    第一种方法:

    package servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class ServletDemo6
     */
    @WebServlet("/ServletDemo6")
    public class ServletDemo6 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public ServletDemo6() {
           this.config = config;
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		response.getWriter().append("Served at: ").append(request.getContextPath());
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(request, response);
    	}
    	
    	private ServletConfig config;
    	
    	@Override
    	public void init(ServletConfig config) throws ServletException {
    		String encoding = config.getInitParameter("encoding");
    		System.out.println(encoding);
    	}
    
    }
    

      第二种和第三种方法:

    package servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class ServletDemo7
     */
    @WebServlet("/ServletDemo7")
    public class ServletDemo7 extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public ServletDemo7() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //第二种方式
            //        String encoding = this.getInitParameter("encoding");//或者用super,继承父类方法
    //        System.out.println(encoding);
            
            //第三种方式
            String value = this.getServletConfig().getInitParameter("encoding");
            System.out.println(value);
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }

     web.xml

      <servlet>
        <servlet-name>ServletDemo6</servlet-name>
        <servlet-class>servlet.ServletDemo6</servlet-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>ServletDemo6</servlet-name>
        <url-pattern>/demo6</url-pattern>
      </servlet-mapping>
        <servlet>
        <servlet-name>ServletDemo7</servlet-name>
        <servlet-class>servlet.ServletDemo7</servlet-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>ServletDemo7</servlet-name>
        <url-pattern>/demo7</url-pattern>
      </servlet-mapping>
  • 相关阅读:
    SpringBoot2.0 整合 QuartJob ,实现定时器实时管理
    SpringBoot2.0 整合 Swagger2 ,构建接口管理界面
    SpringBoot 2.0 整合sharding-jdbc中间件,实现数据分库分表
    基于 CODING 轻松搞定持续集成
    CODING 受邀参与 DevOps 标准体系之系统和工具&技术运营标准技术专家研讨会
    CODING 受邀参加《腾讯全球数字生态大会》
    CODING 告诉你硅谷的研发项目管理之道系列(6)
    CODING 告诉你硅谷的研发项目管理之道(3)
    CODING 告诉你硅谷项目经理的项目管理之道(2)
    CODING 签约天津大学,助力高校“产学”接轨
  • 原文地址:https://www.cnblogs.com/bsfl-study/p/9058006.html
Copyright © 2011-2022 走看看