国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Struts中action線程安全問題解析

Struts中action線程安全問題解析

2021-01-23 12:55virgoboy2004 Java教程

這篇文章主要介紹了Struts中action線程安全問題解析,涉及實例代碼,還是挺不錯的,具有一定參考價值,需要的朋友可以了解下。

【問題描述】

最近公司安排我面試Java的FreshMan,面試者一般是工作1年多點的新人(這里我就裝老一下,其實我也才工作3年不到),在被問及Struts1和Struts2的Action的線程安全問題的時候,大多是支支吾吾,答不出所以然。所以在這里我整理一下我個人的理解。

【問題答案】

這是由于Servlet的工作原理產生的。我們先來簡單回顧一下Servlet的生命周期“初始化->init->service->destroy->卸載”。
這里大家都知道,我們在web.xml里面定義一個servlet的時候,我們可以給他們設置一個“load-on-startup” 的值,如果 Servlet 的 load-on-startup 配置項大于 0,那么在 Context 容器啟動的時候就會被實例化,并且tomcat給每一個servlet加載并且實例化一個對象(注解:也就是說,我們用戶在web.xml里面配置的每一個servlet都會被實例成一個servlet對象)

a, 下面的配置表示會有兩個servlet對象被實例化,即使他們對應的是同一個servlet class

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <servlet>
  <servlet-name>ServletTest1</servlet-name>
  <servlet-class>web.servlet.ServletTest1</servlet-class>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>ServletTest1</servlet-name>
  <url-pattern>/servlet/ServletTest1</url-pattern>
 </servlet-mapping>
  
 <servlet>
  <servlet-name>ServletTest2</servlet-name>
  <servlet-class>web.servlet.ServletTest1</servlet-class>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>ServletTest2</servlet-name>
  <url-pattern>/servlet/ServletTest1</url-pattern>
 </servlet-mapping>
</web-app>

b, 下面的配置表示只會有一個servlet被實例化

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <servlet>
  <servlet-name>ServletTest1</servlet-name>
  <servlet-class>web.servlet.ServletTest1</servlet-class>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>ServletTest1</servlet-name>
  <url-pattern>/servlet/ServletTest1</url-pattern>
 </servlet-mapping>
  
 <servlet-mapping>
  <servlet-name>ServletTest1</servlet-name>
  <url-pattern>/servlet/ServletTest1</url-pattern>
 </servlet-mapping>
</web-app>

也就是說,tomcat容器對servlet的實現采用的是單例模式,對于一個servlet類,永遠只有一個servlet對象存在。
下面我們來解釋為什么Struts1是線程不安全的。

1、Struts1

Struts1是對Java web servlet接口的直接實現,所以它繼承了tomcat對servlet的實現,每一個struts1里面的action都對應的是一個servlet class,所以這里的action在被tomcat實例化之后也是單例的,所以,struts1就產生了多線程問題。

例如:

你在Action定義了一個 int i = 0;

然后在這個Action里面的某一個方法里面對這個i進行操作。

像下面代碼這樣:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author Jack Zhang
 * @version vb1.0
 * @Email virgoboy2004@163.com
 * @Date 2013-4-21
 */
public class ServletTest1 extends HttpServlet
{
  public int i = 0;
  /**
   * Constructor of the object.
   */
  public ServletTest1()
  {
    super();
  }
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   *
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException,
    IOException
  {
    i++;
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out
      .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    out.println("<HTML>");
    out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    out.println(" <BODY>");
    out.print("  i="+i);
    out.println(" </BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
  }
}

當訪問這個servlet的時候,你訪問多少次,I的值就是多少。

所以:我們在用struts1的時候不能在action里面定義屬性。要用到只的話只能在方法里面定義。

那至于為什么把屬性的定義放到方法里面就不會有多線程的問題了,這個問題希望各位讀者去查看有關JMM(java memory model)里面有關java內存模式如何給方法分配內存的內容, 我相信你們會找到答案。

2、struts2

上面我們了解了Struts1里面的多線程問題,那Struts2是怎么解決這個問題的呢?其實道理非常簡單,原因就是Strtus2會獲取到用戶的http請求,然后負責給每個請求實例化一個Action 對象,但是大家注意,這里的action對象和Struts1里面的action對象完全不是一個概念,struts1里面的action類就是一個servlet類,而這里的action類只是一個普通的java class。這也就是為什么Struts1里面的action是線程不安全的,而struts2里面的action是線程安全的原因。

那我們在回頭來看看struts2對servlet的處理和struts1有什么不同。看過前面分析的讀者肯定知道,struts1的 action對servlet沒有進行任何的包裝,它是直接實現的Java WEB API 里面的servlet 接口。所以才會有線程安全的問題,但是struts2底層幫我們封裝了Servlet,使開發人員不用直接接觸Servlet。具體做法是:

Strtus2截獲servlet請求,然后給每個請求實例化一個Action對象,請求結束之后銷毀Action對象。至于Strtus2具體是怎么做的,我這里不贅敘,大家可以去參看Struts2的有關介紹。

在Struts2中由于 Action和普通的Java類沒有任何區別(也就是不用像Struts1里面那樣去實現一個Struts的接口,有興趣的朋友可以自己去了解),所以我們可以用Spring去管理Struts2的Action,這個時候我們就要注意了,因為當我們在spring里面去定義bean的時候,spring默認用的是單例模式。所以在這個時候,你就要修改Spring的配置文件---即修改scope為prototype。

總結

以上就是本文關于Struts中action線程安全問題解析的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的。希望大家能夠喜歡!

原文鏈接:http://blog.csdn.net/virgoboy2004/article/details/5876133

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩一区欧美 | 在线观看国产成人av片 | 欧美视频区 | 国产精品久久久久久久美男 | 淫语视频| 久久国产精品久久久久久 | 国产在线一区二区三区 | 亚洲激情在线观看 | 日韩在线观看中文字幕 | 日韩国产一区二区 | 免费观看黄色12片一级视频 | 成年人毛片视频 | 日韩一区二区电影 | 亚洲国产中文字幕 | 91中文字幕在线观看 | 国产欧美日韩一区二区三区四区 | 人人射在线视频 | 亚洲午夜精品片久久www慈禧 | 色综合久| 国产成人99久久亚洲综合精品 | 99久久久国产精品 | 成人高清网站 | 中文字幕第33页 | 一本大道专区 | 亚洲区欧美区 | 亚洲人免费 | 黄色一级毛片 | 日韩福利在线 | 中文字幕 亚洲一区 | 日韩免费视频一区二区 | 欧美日韩精品一区二区 | 视频一区中文字幕 | 天堂欧美城网站网址 | av电影在线免费 | 韩日一区二区三区 | 正在播放国产一区 | 伦理午夜电影免费观看 | 国产超碰人人爽人人做人人爱 | 婷婷精品久久久久久久久久不卡 | 国产精品尤物在线观看 | 亚洲精品免费在线观看 |