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>
原文地址:https://www.cnblogs.com/bsfl-study/p/9058006.html
时间: 2024-10-20 11:56:04