JavaWeb——基礎(chǔ)知識-創(chuàng)新互聯(lián)

Java Web開發(fā)的基礎(chǔ)內(nèi)容:

專注于為中小企業(yè)提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)平谷免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
  • Servlet
  • javabean
  • jsp

一、基礎(chǔ)知識:

  • Java Web是以線程為單位管理請求,處理能力更強(qiáng),占用的資源更少
  • CGI是以進(jìn)程為單位管理請求的,Servlet解決相同數(shù)量的請求,卻占用較少的系統(tǒng)資源
  • Java Web核心的組件就是Servlet

1.HTTP協(xié)議(超文本傳輸協(xié)議):一種主流B/S架構(gòu)中應(yīng)用的通信協(xié)議

  • 無狀態(tài):服務(wù)端不會記錄客戶端每次提交的請求,服務(wù)器一旦響應(yīng)客戶端之后,就會結(jié)束本次的通信過程??蛻舳讼乱淮蔚恼埱笫且粋€新的連接,和上一次通信沒有任何關(guān)系
  • 簡單靈活:HTTP是基于請求(request)和響應(yīng)(response)的模型
  • 支持客戶端與服務(wù)端:支持主流的B/S架構(gòu)的通信以及C/S架構(gòu)的通信
    • C/S架構(gòu)可選的協(xié)議有多種,例如:TCP/IP,UDP,HTTP,而B/S架構(gòu)通常只支持HTTP協(xié)議

2.服務(wù)器:通常由硬件和軟件部分構(gòu)成,統(tǒng)一對用戶提供多種不同的服務(wù)

  • 硬件:包括響應(yīng)的CPU、內(nèi)存、磁盤等等
  • 軟件:包括操作系統(tǒng)、運行環(huán)境、服務(wù)器軟件、數(shù)據(jù)庫等等

1)web服務(wù)器:

  • web服務(wù)器是提供服務(wù)端程序運行的一個環(huán)境,它本身也是一個軟件
    • 例如:將我們編寫HTML文件放入到web服務(wù)器中,那么外界就可以通過瀏覽器訪問我們的html頁面
  • 常見的web服務(wù)器有Apache,Tomcat、Jetty、Nginx等等
    • Tomcat、Jetty這些web服務(wù)器更準(zhǔn)確的說是一個Servlet容器

3.JavaWeb項目結(jié)構(gòu)?。?!

項目根目錄,例如:myweb、ch01通常存放靜態(tài)資源文件(如:html等等)
WEB-INF這個目錄是當(dāng)前項目私有的一個文件夾,只能提供給項目內(nèi)部訪問,對于客戶端來說是訪問不到了,通常這個目錄下存放的是Java源代碼、編譯后的字節(jié)碼文件以及Servlet的核心配置文件web.xml
src存放java源代碼的目錄
classes存放編譯后的字節(jié)碼文件
liblib目錄存放當(dāng)前項目所需要的jar文件
JSP用于存放JSP動態(tài)頁面
web.xml項目的配置文件,用于配置Servlet的請求映射、過濾器、監(jiān)聽器等等信息。每一個web項目都對應(yīng)一個web.xml配置文件
META-INF配置應(yīng)用程序、擴(kuò)展程序、類加載服務(wù)等等

二、servlet和jsp對比

1. servlet 和 jsp 的區(qū)別:????????

  • Servlet在Java代碼中可以通過HttpServletResponse對象動態(tài)輸出HTML內(nèi)容
  • JSP是在靜態(tài)HTML內(nèi)容中嵌入Java代碼,然后Java代碼在被動態(tài)執(zhí)行后生成HTML內(nèi)容
  • jsp經(jīng)編譯后就變成了Servlet(JSP的本質(zhì)就是Servlet,JVM只能識別java的類,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)
  • jsp更擅長表現(xiàn)于頁面顯示,servlet更擅長于邏輯控制
  • Servlet中沒有內(nèi)置對象,內(nèi)置對象都是必須通過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象得到
  • Jsp是Servlet的一種簡化,使用Jsp只需要完成程序員需要輸出到客戶端的內(nèi)容,Jsp中的Java腳本如何鑲嵌到一個類中,由Jsp容器完成
  • Servlet則是個完整的Java類,這個類的Service方法用于生成對客戶端的響應(yīng)
  • 對于靜態(tài)HTML標(biāo)簽,Servlet都必須使用頁面輸出流逐行輸出

2. servlet 和 jsp 的各自特點:

  • Servlet雖然能夠很好地組織業(yè)務(wù)邏輯代碼,但是在Java源文件中,因為是通過字符串拼接的方式生成動態(tài)HTML內(nèi)容,這樣就容易導(dǎo)致代碼維護(hù)困難、可讀性差
  • JSP雖然規(guī)避了Servlet在生成HTML內(nèi)容方面的劣勢,但是在HTML中混入大量、復(fù)雜的業(yè)務(wù)邏輯

3. MVC模式使用 servlet 和 jsp:

  • Servlet只負(fù)責(zé)業(yè)務(wù)邏輯部分,而不會生成HTML代碼
  • JSP中不會充斥著大量的業(yè)務(wù)代碼,這樣能大提高了代碼的可讀性和可維護(hù)性

MVC模式(Model-View-Controller):軟件工程中的一種軟件架構(gòu)模式,分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)

  • Controller(Servlet)——負(fù)責(zé)轉(zhuǎn)發(fā)請求,對請求進(jìn)行處理
  • View(JSP)——負(fù)責(zé)界面顯示
  • Model——業(yè)務(wù)功能編寫(例如算法實現(xiàn))、數(shù)據(jù)庫設(shè)計以及數(shù)據(jù)存取操作實現(xiàn)

  • Web瀏覽器發(fā)送HTTP請求到服務(wù)端,然后被Controller(Servlet)獲取并進(jìn)行處理(例如參數(shù)解析、請求轉(zhuǎn)發(fā))
  • Controller(Servlet)調(diào)用核心業(yè)務(wù)邏輯——Model部分,獲得結(jié)果
  • Controller(Servlet)將邏輯處理結(jié)果交給View(JSP),動態(tài)輸出HTML內(nèi)容
  • 動態(tài)生成的HTML內(nèi)容返回到瀏覽器顯示

三、servlet

  • Java Servlet 是運行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的程序
  • 是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務(wù)器上的數(shù)據(jù)庫或應(yīng)用程序之間的中間層
  • 使用 Servlet,以收集來自網(wǎng)頁表單的用戶輸入,呈現(xiàn)來自數(shù)據(jù)庫或者其他源的記錄,還可以動態(tài)創(chuàng)建網(wǎng)頁

1. servlet的優(yōu)勢(與CGI相比):

  • 性能明顯更好(相同數(shù)量請求,占用系統(tǒng)資源更少)
  • Servlet 在 Web 服務(wù)器的地址空間內(nèi)執(zhí)行;這樣它就沒有必要再創(chuàng)建一個單獨的進(jìn)程來處理每個客戶端請求
  • Servlet 是獨立于平臺的,因為它們是用 Java 編寫的
  • 服務(wù)器上的 Java 安全管理器執(zhí)行了一系列限制,以保護(hù)服務(wù)器計算機(jī)上的資源。因此,Servlet 是可信的
  • Java 類庫的全部功能對 Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機(jī)制與 applets、數(shù)據(jù)庫或其他軟件進(jìn)行交互

2.Servlet的生命周期

Servlet 生命周期可被定義為從創(chuàng)建直到毀滅的整個過程。以下是 Servlet 遵循的過程:

  • Servlet 通過調(diào)用?init ()?方法進(jìn)行初始化
    • init 方法被設(shè)計成只調(diào)用一次,用于一次性初始化,就像 Applet 的 init 方法一樣
    • 它在第一次創(chuàng)建 Servlet 時被調(diào)用,在后續(xù)每次用戶請求時不再調(diào)用
    • Servlet 創(chuàng)建于用戶第一次調(diào)用對應(yīng)于該 Servlet 的 URL 時,但是您也可以指定 Servlet 在服務(wù)器第一次啟動時被加載
  • Servlet 調(diào)用?service()?方法來處理客戶端的請求
    • service() 方法是執(zhí)行實際任務(wù)的主要方法
    • Servlet 容器(即 Web 服務(wù)器)調(diào)用 service() 方法來處理來自客戶端(瀏覽器)的請求,并把格式化的響應(yīng)寫回給客戶端
    • 每次服務(wù)器接收到一個 Servlet 請求時,服務(wù)器會產(chǎn)生一個新的線程并調(diào)用服務(wù);service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),并在適當(dāng)?shù)臅r候調(diào)用 doGet、doPost、doPut,doDelete 等方法
  • Servlet 通過調(diào)用?destroy()?方法終止(結(jié)束)
    • destroy() 方法只會被調(diào)用一次,在 Servlet 生命周期結(jié)束時被調(diào)用
    • destroy() 方法可以讓您的 Servlet 關(guān)閉數(shù)據(jù)庫連接、停止后臺線程、把 Cookie 列表或點擊計數(shù)器寫入到磁盤,并執(zhí)行其他類似的清理活動
    • 在調(diào)用 destroy() 方法之后,servlet 對象被標(biāo)記為垃圾回收
  • 最后,Servlet 是由 JVM 的垃圾回收器進(jìn)行垃圾回收的

例:

第一次請求:

繼續(xù)請求:

3.servlet相關(guān)面試題

1)不同的用戶同時對同一個業(yè)務(wù)(如注冊)發(fā)出請求,那這個時候容器里產(chǎn)生的有是幾個servlet實例呢?(怎樣理解Servlet的單實例多線程?)?。。?/p>

  • 只有一個servlet實例;一個servlet是在第一次被訪問時加載到內(nèi)存并實例化的
  • 同樣的業(yè)務(wù)請求共享一個servlet實例;不同的業(yè)務(wù)請求一般對應(yīng)不同的servlet
  • 由于Servlet/JSP默認(rèn)是以多線程模式執(zhí)行的,所以,在編寫代碼時需要非常細(xì)致地考慮多線程的安全性問題

2)JSP的中存在的多線程問題

  • 當(dāng)客戶端第一次請求某一個JSP文件時,服務(wù)端把該JSP編譯成一個CLASS文件,并創(chuàng)建一個該類的實例,然后創(chuàng)建一個線程處理CLIENT端的請求
  • 如果有多個客戶端同時請求該JSP文件,則服務(wù)端會創(chuàng)建多個線程。每個客戶端請求對應(yīng)一個線程。以多線程方式執(zhí)行可大大降低對系統(tǒng)的資源需求,提高系統(tǒng)的并發(fā)量及響應(yīng)時間

3)對JSP中可能用的的變量說明

  • 實例變量: 實例變量是在堆中分配的,并被屬于該實例的所有線程共享,所以不是線程安全的
  • JSP系統(tǒng)提供的8個類變量:
    • JSP中用到的OUT,REQUEST,RESPONSE,SESSION,CONFIG,PAGE,PAGECONXT是線程安全的(因為每個線程對應(yīng)的request,respone對象都是不一樣的,不存在共享問題)
    • APPLICATION在整個系統(tǒng)內(nèi)被使用,所以不是線程安全的
  • 局部變量: 局部變量在堆棧中分配,因為每個線程都有它自己的堆??臻g,所以是線程安全的
  • 靜態(tài)類: 靜態(tài)類不用被實例化,就可直接使用,不是線程安全的
  • 外部資源: 在程序中可能會有多個線程或進(jìn)程同時操作同一個資源(如:多個線程或進(jìn)程同時對一個文件進(jìn)行寫操作).此時也要注意同步問題

4)Servlet單實例多線程機(jī)制:

  • Servlet采用多線程來處理多個請求同時訪問
  • servlet依賴于一個線程池來服務(wù)請求;線程池實際上是一系列的工作者線程集合。Servlet使用一個調(diào)度線程來管理工作者線程
  • 當(dāng)容器收到一個Servlet請求,調(diào)度線程從線程池中選出一個工作者線程,將請求傳遞給該工作者線程,然后由該線程來執(zhí)行Servlet的service方法。
  • 當(dāng)這個線程正在執(zhí)行的時候,容器收到另外一個請求,調(diào)度線程同樣從線程池中選出另一個工作者線程來服務(wù)新的請求,容器并不關(guān)心這個請求是否訪問的是同一個Servlet
  • 當(dāng)容器同時收到對同一個Servlet的多個請求的時候,那么這個Servlet的service()方法將在多線程中并發(fā)執(zhí)行
  • Servlet容器默認(rèn)采用單實例多線程的方式來處理請求,這樣減少產(chǎn)生Servlet實例的開銷,提升了對請求的響應(yīng)時間,對于Tomcat可以在server.xml中通過元素設(shè)置線程池中線程的數(shù)目

5)如何開發(fā)線程安全的Servlet

  • 實現(xiàn) SingleThreadModel 接口
    • 該接口指定了系統(tǒng)如何處理對同一個Servlet的調(diào)用
    • 如果一個Servlet被這個接口指定,那么在這個Servlet中的service方法將不會有兩個線程被同時執(zhí)行,當(dāng)然也就不存在線程安全的問題。這種方法只要將前面的Concurrent Test類的類頭定義更改為:
Public class Concurrent Test extends HttpServlet implements SingleThreadModel { 
………… 
}

6)同步對共享數(shù)據(jù)的操作

  • 使用synchronized 關(guān)鍵字能保證一次只有一個線程可以訪問被保護(hù)的區(qū)段
  • 避免使用實例變量
    • 本實例中的線程安全問題是由實例變量造成的,只要在Servlet里面的任何方法里面都不使用實例變量,那么該Servlet就是線程安全的

7)Struts1 Action和Struts2的Action辨析

  • Struts2的Action是原型,非單實例的;會對每一個請求,產(chǎn)生一個Action的實例來處理
    • Struts2 Action對象為每一個請求產(chǎn)生一個實例,因此沒有線程安全問題(實際上,servlet容器給每個請求產(chǎn)生許多可丟棄的對象,并且不會導(dǎo)致性能和垃圾回收問題)
  • Struts1 Action是單實例的,mvc的controller也單實例的
    • 因此Struts1 Action和mvc的controller開發(fā)時要求必須是線程安全的,因為僅有Action的一個實例來處理所有的請求;單例策略限制了Struts1 Action能作的事,并且要在開發(fā)時特別小心
    • Struts1 Action資源必須是線程安全的或同步的
  • Struts1的Action,Spring的Ioc容器管理的bean默認(rèn)是單實例的
  • 當(dāng)Spring管理Struts2的Action時,bean默認(rèn)是單實例的,可以通過配置參數(shù)將其設(shè)置為原型(scope="prototype )

四、JDBC數(shù)據(jù)庫連接池

1. 為什么要使用連接池:

在使用開發(fā)基于數(shù)據(jù)庫的web程序時,傳統(tǒng)的模式基本是按以下步驟:

  • 在主程序(如servlet、beans)中建立數(shù)據(jù)庫連接
  • 進(jìn)行sql操作?
  • 斷開數(shù)據(jù)庫連接

這種模式存在的問題:

  • 普通的JDBC數(shù)據(jù)庫連接使用 DriverManager 來獲取,每次向數(shù)據(jù)庫建立連接的時候都要將 Connection 加載到內(nèi)存中,再驗證用戶名和密碼(得花費0.05s~1s的時間);需要數(shù)據(jù)庫連接的時候,就向數(shù)據(jù)庫要求一個,執(zhí)行完成后再斷開連接。這樣的方式將會消耗大量的資源和時間。數(shù)據(jù)庫的連接資源并沒有得到很好的重復(fù)利用.若同時有幾百人甚至幾千人在線,頻繁的進(jìn)行數(shù)據(jù)庫連接操作將占用很多的系統(tǒng)資源,嚴(yán)重的甚至?xí)斐煞?wù)器的崩潰
  • 對于每一次數(shù)據(jù)庫連接,使用完后都得斷開。否則,如果程序出現(xiàn)異常而未能關(guān)閉,將會導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄漏,最終將導(dǎo)致重啟數(shù)據(jù)庫
  • 這種開發(fā)不能控制被創(chuàng)建的連接對象數(shù),系統(tǒng)資源會被毫無顧及的分配出去,如連接過多,也可能導(dǎo)致內(nèi)存泄漏,服務(wù)器崩潰

連接池本質(zhì)上是構(gòu)建一個容器,容器來存儲創(chuàng)建好的線程、http連接、數(shù)據(jù)庫連接、netty連接等

2. 連接池技術(shù)核心:

  • 連接或者說創(chuàng)建的資源復(fù)用

3.使用連接池的好處:

  • 連接復(fù)用:通過建立一個數(shù)據(jù)庫連接池以及一套連接使用管理策略,使得一個數(shù)據(jù)庫連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫連接頻繁建立、關(guān)閉的開銷
  • 對于共享資源,有一個很著名的設(shè)計模式:資源池。該模式正是為了解決資源頻繁分配、釋放所造成的問題的。把該模式應(yīng)用到數(shù)據(jù)庫連接管理領(lǐng)域,就是建立一個數(shù)據(jù)庫連接池,提供一套高效的連接分配、使用策略,最終目標(biāo)是實現(xiàn)連接的高效、安全的復(fù)用
  • 連接池還有一個副作用就是實現(xiàn)了高可用,在微服務(wù)場景下一個連接不可用,那么再從netty連接池中取出一個進(jìn)行使用,避免了連接不可用問題

各個連接池構(gòu)建、使用管理詳細(xì)過程大概分成以下三部分:

  • 首先初始化連接池,根據(jù)設(shè)置相應(yīng)參數(shù),連接池大小、核心線程數(shù)、核心連接數(shù)等參數(shù),初始化創(chuàng)建數(shù)據(jù)庫、http、netty連接以及jdk線程
  • 連接池使用,前邊初始化好的連接池、線程池,直接從連接池、線程中取出資源即可進(jìn)行使用,使用完后要記得交還連接池、線程池,通過池容器來對資源進(jìn)行管理
  • 對于連接池維護(hù),連接池、線程池來維護(hù)連接、線程狀態(tài),不可用連接、線程進(jìn)行銷毀,正在使用連接、線程進(jìn)行狀態(tài)標(biāo)注,連接、線程不夠后并且少于設(shè)置大連接、線程數(shù),要進(jìn)行新連接、線程創(chuàng)建

4.連接池的實現(xiàn)

  • 數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護(hù)一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取方法和返回方法。
  • 外部使用者可通過 getConnection 方法獲取連接,使用完畢后再通過 close 方法將連接返回,此時連接并沒有關(guān)閉,而是由連接池管理器回收,并為下一次使用做好準(zhǔn)備
  • Java 中有一個 DataSource 接口, 數(shù)據(jù)庫連接池就是 DataSource 的一個實現(xiàn)

5.數(shù)據(jù)庫連接池

1)定義及理解:

  • 數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”;預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去
  • 數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是重新建立一個
  • 數(shù)據(jù)庫連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中
    • 數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設(shè)定的。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。
    • 連接池的大數(shù)據(jù)庫連接數(shù)量限定了這個連接池能占有的大連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過大連接數(shù)量時,這些請求將被加入到等待隊列中

2)數(shù)據(jù)庫連接池技術(shù)的優(yōu)點

  • 資源重用(復(fù)用):由于數(shù)據(jù)庫連接得以重用,避免了頻繁創(chuàng)建,釋放連接引起的大量性能開銷;在減少系統(tǒng)消耗的基礎(chǔ)上,另一方面也增加了系統(tǒng)運行環(huán)境的平穩(wěn)性
  • 更快的系統(tǒng)反應(yīng)速度:數(shù)據(jù)庫連接池在初始化過程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫連接置于連接池中備用。此時連接的初始化工作均已完成。對于業(yè)務(wù)請求處理而言,直接利用現(xiàn)有可用連接,避免了數(shù)據(jù)庫連接初始化和釋放過程的時間開銷,從而減少了系統(tǒng)的響應(yīng)時間
  • 新的資源分配手段:對于多應(yīng)用共享同一數(shù)據(jù)庫的系統(tǒng)而言,可在應(yīng)用層通過數(shù)據(jù)庫連接池的配置,實現(xiàn)某一應(yīng)用大可用數(shù)據(jù)庫連接數(shù)的限制,避免某一應(yīng)用獨占所有的數(shù)據(jù)庫資源
  • 統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄露:在較為完善的數(shù)據(jù)庫連接池實現(xiàn)中,可根據(jù)預(yù)先的占用超時設(shè)定,強(qiáng)制回收被占用連接,從而避免了常規(guī)數(shù)據(jù)庫連接操作中可能出現(xiàn)的資源泄露

3)兩種開源的數(shù)據(jù)庫連接池:

  • JDBC 的數(shù)據(jù)庫連接池使用 javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口通常由服務(wù)器(Weblogic, WebSphere, Tomcat)提供實現(xiàn),也有一些開源組織提供實現(xiàn):
    • DBCP 數(shù)據(jù)庫連接池
    • C3P0 數(shù)據(jù)庫連接池
  • DataSource 通常被稱為數(shù)據(jù)源,也可稱為連接池,它包含連接池和連接池管理兩個部分
  • 數(shù)據(jù)源和數(shù)據(jù)庫連接不同,數(shù)據(jù)源無需創(chuàng)建多個,它是產(chǎn)生數(shù)據(jù)庫連接的工廠,因此整個應(yīng)用只需要一個數(shù)據(jù)源即可
  • 當(dāng)數(shù)據(jù)庫訪問結(jié)束后,程序還是像以前一樣關(guān)閉數(shù)據(jù)庫連接:conn.close(); 但上面的代碼并沒有關(guān)閉數(shù)據(jù)庫的物理連接,它僅僅把數(shù)據(jù)庫連接釋放,歸還給了數(shù)據(jù)庫連接池

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

名稱欄目:JavaWeb——基礎(chǔ)知識-創(chuàng)新互聯(lián)
分享鏈接:http://bm7419.com/article10/dgogdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站改版、網(wǎng)站排名、品牌網(wǎng)站設(shè)計、動態(tài)網(wǎng)站、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司