黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Struts由入門到精通(第一章)- Struts的體系結(jié)

系統(tǒng) 1917 0

1.2 Struts的體系結(jié)構(gòu)

Struts 有一組相互協(xié)作的類、 Serlvet 以及 Jsp TagLib 組成。基于 Struts 構(gòu)架的 web 應(yīng)用程序基本上符合 JSP Model2 的設(shè)計(jì)標(biāo)準(zhǔn),可以說是 MVC 設(shè)計(jì)模式的一種變化類型。根據(jù)上面對(duì) framework 的描述,我們很容易理解為什么說 Struts 是一個(gè) web framwork ,而不僅僅是一些標(biāo)記庫(kù)的組合。但 Struts 也包含了豐富的標(biāo)記庫(kù)和獨(dú)立于該框架工作的實(shí)用程序類。

Struts 有其自己的控制器( Controller ),同時(shí)整合了其他的一些技術(shù)去實(shí)現(xiàn)模型層( Model )和視圖層( View )。在模型層, Struts 可以很容易的與數(shù)據(jù)訪問技術(shù)相結(jié)合,包括 EJB,JDBC Object Relation Bridge 。在視圖層, Struts 能夠與 JSP, Velocity Templates,XSL 等等這些表示層組件想結(jié)合。

?

1.2.1 Struts的與Web App的關(guān)系


???? 既然 struts 叫做 web framework ,那么其肯定主要基于 web 層的應(yīng)用系統(tǒng)開發(fā)。按照 J2EE Architecture 的標(biāo)準(zhǔn), struts 應(yīng)當(dāng)和 jsp/servlet 一樣,存在于 web container 一層。

?

Struts由入門到精通(第一章)- Struts的體系結(jié)構(gòu)

?

?

?

1.2.2 Struts 的體系結(jié)構(gòu) ? ?

?

???? Struts 是一個(gè)基于 Sun J2EE 平臺(tái)的 MVC 框架,主要是采用 Servlet JSP 技術(shù)來實(shí)現(xiàn)的。其最初萌芽于 Craig McClanahan 的構(gòu)思, 2000 1.0 版本誕生至今年已經(jīng)快 10 年了。現(xiàn)在, Struts Apache 軟件基金會(huì)旗下 Jakarta 項(xiàng)目組的一部分,其官方網(wǎng)站是 http://jakarta.apache.org/struts 。由于 Struts 能充分滿足應(yīng)用開發(fā)的需求,簡(jiǎn)單易用,敏捷迅速,一直是 WEB 開發(fā)的主流框架。 Struts Servlet JSP 、自定義標(biāo)簽和信息資源 (message resources) 整合到一個(gè)統(tǒng)一的框架中,開發(fā)人員利用其進(jìn)行開發(fā)時(shí)不用再自己編碼實(shí)現(xiàn)全套 MVC 模式,極大的節(jié)省了時(shí)間,所以說 Struts 是一個(gè)非常不錯(cuò)的應(yīng)用框架。

我們說 struts framework MVC 模式的體現(xiàn),下面我們就從分別從模型、視圖、控制來看看 struts 的體系結(jié)構(gòu)( Architecture )。下圖顯示了 struts framework 的體系結(jié)構(gòu)響應(yīng)客戶請(qǐng)求時(shí)候,各個(gè)部分工作的原理。

?

?

Struts由入門到精通(第一章)- Struts的體系結(jié)構(gòu)

?

Struts 的體系結(jié)構(gòu)實(shí)現(xiàn)了 Model-View-Controller 設(shè)計(jì)模式的概念,它將這些概念映射到 web 應(yīng)用程序的組件和概念中,如下圖所示:

?

Struts由入門到精通(第一章)- Struts的體系結(jié)構(gòu)

?

?

?

?

1.2.3 Struts 的基本組件包

整個(gè) struts 大約有 15 包,近 200 個(gè)類所組成,而且數(shù)量還在不斷的擴(kuò)展。在此我們不能一一介紹,只能列舉幾個(gè)主要的簡(jiǎn)要的介紹一下。下表說明了目前 struts api 中基本的幾個(gè)組件包,包括 action,actions,config,util,taglib,validator 。下圖則顯現(xiàn)了這幾個(gè)組件包之間的關(guān)系。其中 action 是整個(gè) struts framework 的核心

org.apache.struts.action

基本上,控制整個(gè) struts framework 的運(yùn)行的核心類、組件都在這個(gè)包中,比如我們上面提到的控制器 ActionServlet 。已經(jīng)有 Action,ActionForm,ActionMapping 等等。 struts1.1 1.0 多了 DynaActionForm 類。增加了動(dòng)態(tài)擴(kuò)展生成 FormBean 功能

org.apache.struts.actions

這個(gè)包是主要作用是提供客戶的 http 請(qǐng)求和業(yè)務(wù)邏輯處理之間的特定適配器轉(zhuǎn)換功能,而 1.0 版本中的部分動(dòng)態(tài)增刪 FromBean 的類,也在 struts1.1 中被 Action 包的 DynaActionForm 組件所取代

org.apache.struts.config

提供對(duì)配置文件 struts-config.xml 元素的映射。這也是 sturts1.1 中新增的功能

org.apache.struts.util

Struts 為了更好支持 web application 的應(yīng)用,體統(tǒng)了一些常用服務(wù)的支持,比如 Connection Pool Message Source 。詳細(xì)信息請(qǐng)參考

http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html

org.apache.struts.taglib

這不是一個(gè)包,而是是一個(gè)客戶標(biāo)簽類的集合。下面包括 Bean Tags HTML Tags Logic Tags Nested Tags Template Tags 這幾個(gè)用于構(gòu)建用戶界面的標(biāo)簽類。

org.apache.struts.validator

Struts1.1 framework 中增加了 validator framework ,用于動(dòng)態(tài)的配置 from 表單的驗(yàn)證。

?

Struts 的基本組件關(guān)系圖

?
1.2.4 Struts 的框架

?

Struts 的框架可分為以下四個(gè)主要部分,其中三個(gè)就和 MVC 模式緊密相關(guān):可分為以下四個(gè)主要部分,其中三個(gè)就和 MVC 模式緊密相關(guān):

1. 模型 (Model) ,本質(zhì)上來說在 Struts Model 是一個(gè) Action ( 這個(gè)會(huì)在后面詳細(xì)討論 ) ,開發(fā)者通過其實(shí)現(xiàn)商業(yè)邏輯,同時(shí)用戶請(qǐng)求通過控制器 (Controller) Action 的轉(zhuǎn)發(fā)過程是基于由 struts-config.xml 文件描述的配置信息的。

2. 視圖 (View) View 是由與控制器 Servlet 配合工作的一整套 JSP 定制標(biāo)簽庫(kù)構(gòu)成,利用她們我們可以快速建立應(yīng)用系統(tǒng)的界面。

3. 控制器 (Controller) ,本質(zhì)上是一個(gè) Servlet ,將客戶端請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的 Action 類。

4. 一堆用來做 XML 文件解析的工具包, Struts 是用 XML 來描述如何自動(dòng)產(chǎn)生一些 JavaBean 的屬性的,此外 Struts 還利用 XML 來描述在國(guó)際化應(yīng)用中的用戶提示信息的 ( 這樣一來就實(shí)現(xiàn)了應(yīng)用系統(tǒng)的多語(yǔ)言支持 )

好,下一步咱們來看看構(gòu)成這個(gè)框架的各個(gè)部分以及相互之間是怎樣運(yùn)作的吧!

? ???? 在使用 Struts 之前,咱們必先設(shè)置好 JSP 服務(wù)器,以便讓服務(wù)器在用戶請(qǐng)求時(shí),知道該如何將指定后綴的請(qǐng)求轉(zhuǎn)到相應(yīng)的 Controller Struts ActionServlet 處理,當(dāng)然,這些配置信息都一般在服務(wù)器啟動(dòng)時(shí)通過 web.xml 文件讀入的。我們可以在 web.xml 定義多個(gè) Controlloer ,為每一個(gè)應(yīng)用定義一個(gè)。一個(gè)典型的 web.xml 文件配置如下,其中有相應(yīng)的注釋,很好懂的,在后面討論 Action 的時(shí)候,我們將主要分析 struts-config.xml

<web-app>

<servlet>

<!--

以下配置信息聲明了 Struts 中的 ActionServlet ,即一個(gè)名為 OreillyAction Servlet ,其具體實(shí)現(xiàn)為 org.apache.struts.action.ActionServlet 。在這個(gè)配置中還有這個(gè) Servlet 的兩個(gè)參數(shù): debug level detail ,此處這兩個(gè)參數(shù)的值都設(shè)為了 2 ,此外還設(shè)置了在啟動(dòng)載入時(shí)創(chuàng)建兩個(gè)實(shí)例。

-->

?

<servlet-name>OreillyActionServlet</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>

<param-name>config</param-name>

<param-value>/WEB-INF/struts-config.xml</param-value>

</init-param>

<init-param>

<param-name>debug</param-name>

<param-value>2</param-value>

</init-param>

<init-param>

<param-name>detail</param-name>

<param-value>2</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

<!--

設(shè)置所有后綴為 .action 的請(qǐng)求,都轉(zhuǎn)發(fā)到 OreillyActionServlet

-->

<servlet-mapping>

<servlet-name> OreillyActionServlet </servlet-name>

<url-pattern>*.action</url-pattern>

</servlet-mapping>

<!--

將初始請(qǐng)求頁(yè)面設(shè)置為 login.jsp

-->

<welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>

<!--

設(shè)置 Struts JSP 頁(yè)面要用到的標(biāo)簽庫(kù)和她們的路徑

-->

<taglib>

<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>

<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

</taglib>

<taglib>

<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>

<taglib-location>/WEB-INF/struts-html.tld</taglib-location>

</taglib>

<taglib>

<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>

<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>

</taglib>

</web-app>

?

1. 控制器 (Controller)

?

Controller 是這個(gè)框架中扮演“交通警察”的角色,當(dāng)客戶端與服務(wù)器有交互動(dòng)作時(shí),都由她來控制。 Controller HTTP 請(qǐng)求封包并轉(zhuǎn)發(fā)到框架中相應(yīng)的對(duì)象,這些對(duì)象可能是一個(gè) JSP 頁(yè)面或一個(gè) Action

Controller web.xml 中設(shè)置為 org.apache.struts.action.ActionServlet 的一個(gè)實(shí)例,在本例中,這個(gè)實(shí)例就是 OreillyActionServlet 。在一個(gè)完整的控制過程中,也就是處理一個(gè) HTTP 請(qǐng)求時(shí),在控制過程之初,這個(gè) Servlet 會(huì)從一個(gè)配置文件 struts-config.xml 中獲取請(qǐng)求與控制動(dòng)作向?qū)?yīng)的配置信息,這個(gè)我們會(huì)在后面詳細(xì)討論, Controller 通過這些配置信息來決定 HTTP 請(qǐng)求該往何處轉(zhuǎn)發(fā),而這些 Action 在接收到轉(zhuǎn)發(fā)來的請(qǐng)求后,實(shí)現(xiàn)真正的商業(yè)邏輯。我們要注意的非常重要的一點(diǎn)是 Action 對(duì)象要能夠調(diào)用這個(gè) ActionServlet 的若干方法,通過這個(gè)有力的特性,當(dāng) Action 對(duì)象在控制過程中將請(qǐng)求再向別的 Action 對(duì)象轉(zhuǎn)發(fā)時(shí) ( 最初的請(qǐng)求是由 ActionServlet 獲取,向 Action 對(duì)象轉(zhuǎn)發(fā),而 Action 對(duì)象還可以再轉(zhuǎn)發(fā)到別的對(duì)象 ) ,我們可以將一些需要共享的數(shù)據(jù)對(duì)象通過調(diào)用一些方法放入這個(gè) Servlet 相關(guān)的一些標(biāo)準(zhǔn)容器中捎帶過去。

?

2. 模型 (Model)

?

所謂 Model 就是在對(duì)用戶請(qǐng)求的整個(gè)控制過程中,真正處理用戶請(qǐng)求并保存處理結(jié)果的對(duì)象,在整個(gè)過程中,我們一般利用 JavaBean 來把一些信息保存起來以便在各個(gè)對(duì)象之間傳遞。因?yàn)樵诳蚣苤校? Model 對(duì)象是真正處理商業(yè)邏輯功能的對(duì)象,因此也就是框架中應(yīng)用需求實(shí)現(xiàn)相關(guān)性最大的部分。在 Struts 的實(shí)現(xiàn)里, Model 的具體表現(xiàn)形式就是 ActionForm 對(duì)象和與其對(duì)應(yīng)的 Action 對(duì)象了。對(duì)用戶提交表單的數(shù)據(jù)進(jìn)行校驗(yàn),甚至對(duì)數(shù)據(jù)進(jìn)行預(yù)處理都能在 ActionForm 中完成。通常的應(yīng)用中,一般是一個(gè) Model 對(duì)象和一個(gè)請(qǐng)求頁(yè)面對(duì)應(yīng)的關(guān)系,但也可以一個(gè) Model 對(duì)象對(duì)應(yīng)多個(gè)頁(yè)面請(qǐng)求。如果 struts-config.xml 配置文件沒有指定一個(gè) Model 對(duì)象對(duì)應(yīng)的 Action ,那么控制器將直接把 ( 通過 Model 對(duì)象完成數(shù)據(jù)封裝的 ) 請(qǐng)求轉(zhuǎn)到一個(gè) View 對(duì)象。

?

3.struts-config.xml 文件

?

前面多次提到的 struts-config.xml 配置文件是整個(gè)框架的主心骨。 web.xml 文件定義了一個(gè)請(qǐng)求到來應(yīng)向何處轉(zhuǎn)發(fā)后,后面的工作就全權(quán)由 struts-config.xml 管理控制了。可以說 struts-config.xml 就是整個(gè) Struts 框架的“扛把子” ( 譯注 3) ,只有這位“老大”清楚所有請(qǐng)求與動(dòng)作的映射關(guān)系,要是他哪里沒有搞定或不爽的話,整個(gè)“社團(tuán)”就什么也擺不平了 :) 如今的應(yīng)用系統(tǒng), XML 形式的配置文件越來越多,如果整個(gè)系統(tǒng)只使用一個(gè)這樣的配置文件的話,那么保持整個(gè)系統(tǒng)的模塊化和可維護(hù)性都非常的輕松。使用配置文件來描述請(qǐng)求 - 動(dòng)作的控制過程和相互關(guān)系,而不是在代碼中將對(duì)象之間的調(diào)用關(guān)系寫死,那么都應(yīng)用系統(tǒng)有變動(dòng)時(shí),我們只用修改配置文件就行了,而不是再重新編譯發(fā)布程序了。

Controller 通過 struts-config.xml 文件的配置信息確定當(dāng)有請(qǐng)求時(shí)應(yīng)該調(diào)用那個(gè)對(duì)象來處理,從效率的角度出發(fā),這些信息都是在系統(tǒng)啟動(dòng)時(shí)讀入并存在內(nèi)存中的。下面我們將講解一個(gè)極短小的 struts-config.xml 文件,文件中定義了一個(gè)與登錄請(qǐng)求對(duì)應(yīng)的登錄動(dòng)作,請(qǐng)求到達(dá)后將被轉(zhuǎn)發(fā)到 com.oreilly.ui.authentication.actions.LoginAction 這個(gè) Action 對(duì)象,該對(duì)象處理的結(jié)果決定向用戶返回的頁(yè)面。這個(gè)例子同時(shí)還示范了一個(gè) Action 對(duì)象將請(qǐng)求轉(zhuǎn)發(fā)到別的 Action 對(duì)象,而例子中另一個(gè)返回的對(duì)象則是一個(gè) View 對(duì)象,即我們看到的 login.jsp 頁(yè)面。

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts-config PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"

"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">

?

<struts-config>

<!-- ========== Action 映射定義 =================== -->

<action-mappings>

<!-- <action> 屬性的說明 -->

<!-

type - 完整的 Action 實(shí)現(xiàn)類名

name - Action 要用到的 ActionForm

path - 請(qǐng)求該 Action URI

unknown 如果將該屬性設(shè)置為 true ,那么就是聲明這個(gè) Action 將處理整個(gè)應(yīng)用中所有未找到相應(yīng)處理 Action 的請(qǐng)求,當(dāng)然,一個(gè)應(yīng)用系統(tǒng)中也只會(huì)有一個(gè) Action unknown 屬性可以設(shè)為 true

validate - 如果本屬性為 true 則在 Action 動(dòng)作之前其對(duì)應(yīng)的 ActionForm validate 方法會(huì)自動(dòng)被調(diào)用,一般用以校驗(yàn)用戶輸入的數(shù)據(jù)

-->

<!-- ~~~~~~~~~~~~~~~~~~~~~ -->

<!-- O'Reilly Main Actions -->

<!-- ~~~~~~~~~~~~~~~~~~~~~ -->

<action path="/Login"

type="com.oreilly.ui.authentication.actions.LoginAction">

<forward name="success" path="/DisplayMainPage.action"/>

<forward name="failure" path="/login.jsp"/>

</action>

</action-mappings>

</struts-config>

?

4. 視圖 (View)

?

View 對(duì)象通常來說都是指的 JSP 頁(yè)面。 Struts 框架實(shí)際上并沒有真正的 JSP 的要求規(guī)范,而是提供了大量的標(biāo)簽庫(kù)來為開發(fā)者更簡(jiǎn)便的將 JSP 整合到 Struts 框架中。在 Struts 中通過標(biāo)簽定義方式的 JSP 頁(yè)面能夠?qū)⒂脩敉ㄟ^表單輸入的數(shù)據(jù)存入一個(gè) JavaBean 中,也就是我們前面提到的 ActionForm bean 。通過 Action 類調(diào)用 ( 自動(dòng)或手動(dòng) )ActionForm 的校驗(yàn)方法來檢查用戶輸入的數(shù)據(jù),如果發(fā)現(xiàn)不合法的數(shù)據(jù),再通過 Struts 的一個(gè)通用機(jī)制將錯(cuò)誤信息返回給用戶顯示。

Struts 框架提供了若干個(gè)標(biāo)簽庫(kù),它們有各自不同的用途。由于這些庫(kù)還可以脫離 Struts 框架單獨(dú)使用,這樣我們也可以在其他系統(tǒng)中嘗試使用這些標(biāo)簽庫(kù),它們包括:

* struts-html - 這個(gè)標(biāo)簽庫(kù)用來創(chuàng)建動(dòng)態(tài)的 HTML 頁(yè)面和表單。

* struts-bean - 提供了類似甚至更強(qiáng)于 <jsp:useBean> 中的功能。

* struts-logic - 用于在頁(yè)面輸出文本信息時(shí)的條件、循環(huán)等流程的控制。

* struts-template - 用于產(chǎn)生有共同風(fēng)格的動(dòng)態(tài) JSP 頁(yè)面模板。

此外,可定制標(biāo)簽庫(kù)在 Struts 中還有一大用處是,通過資源文件的方式來實(shí)現(xiàn)應(yīng)用系統(tǒng)的多語(yǔ)言特性,應(yīng)用 Struts 的系統(tǒng)若想將系統(tǒng)中的用戶交互信息換一種語(yǔ)言的會(huì)很簡(jiǎn)單,更換一個(gè)不同的資源文件就可以了。

?

?

?

1. ?????? 從視圖角度( View

?

首先, Struts 提供了 Java org. apache.struts.action.ActionForm Java 開發(fā)者將該類細(xì)分來創(chuàng)建表單 bean 。在運(yùn)行時(shí),該 bean 有兩種用法:

(1) 當(dāng) JSP 準(zhǔn)備相關(guān)的 HTML ,表單以進(jìn)行顯示時(shí), JSP 將訪問該 bean( 它保存要放入表單中的值 ) 。那些值是從業(yè)務(wù)邏輯或者是從先前的用戶輸入來提供的。

(2) 當(dāng)從 Web 瀏覽器中返回用戶輸入時(shí),該 bean 將驗(yàn)證并保存該輸入以供業(yè)務(wù)邏輯或 ( 如果驗(yàn)證失敗的話 ) 后續(xù)重新顯示使用。

(3) 其次, Struts 提供了許多定制 JSP 標(biāo)記,它們的使用簡(jiǎn)單,但是它們?cè)陔[藏信息方面功能強(qiáng)大。例如,除了 bean 名稱和給定 bean 中每個(gè)段的名稱必須相同。 StudentView.jsp :它從 Student.java 獲得學(xué)生數(shù)據(jù)來顯示。

?

2 .模型角度( Model

?

Struts 雖然不直接有助于模型開發(fā)。 Struts 中,系統(tǒng) 模型 的狀態(tài)主要由 ActiomForm Bean 和值對(duì)象體現(xiàn)。如: Student.java- 學(xué)生信息,它提供一個(gè)簡(jiǎn)單的組件方法來維護(hù)學(xué)生信息。

?

3 .控制器角度( Controller

?

??? Struts framework 中, Controller 主要是 ActionServlet ,但是對(duì)于業(yè)務(wù)邏輯的操作則主要由 Action ActionMapping ActionForward 這幾個(gè)組件協(xié)調(diào)完成(也許這幾個(gè)組件,應(yīng)該劃分到模型中的業(yè)務(wù)邏輯一塊)。其中, Action 扮演了真正的控制邏輯的實(shí)現(xiàn)者,而 ActionMapping ActionForward 則指定了不同業(yè)務(wù)邏輯或流程的運(yùn)行方向。 StudentAction.java :用來幫助用戶輸入數(shù)據(jù)的確認(rèn),并選擇哪個(gè) View 來顯示結(jié)果,如果出錯(cuò)則顯示一個(gè)錯(cuò)誤頁(yè)面。

??? 總之: model 提供了一個(gè)內(nèi)部數(shù)據(jù)的表示。 View 不做任何決定,只顯示數(shù)據(jù)。 Controler 決定處理的過程以及下一步要做什么?

Struts由入門到精通(第一章)- Struts的體系結(jié)構(gòu)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論