标签:java 配置信息 rate 直接 this AC out ota 线程
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>
标签:java 配置信息 rate 直接 this AC out ota 线程
原文地址:https://www.cnblogs.com/bsfl-study/p/9058006.html