<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-67  評論-522  文章-0  trackbacks-0
        這一章,大象將詳細(xì)分析web層代碼,以及struts2的注解插件——struts2-convention的用法和其它相關(guān)知識。
        第四部分:透析控制層
        上一章對daoentityservice三層進(jìn)行了詳細(xì)的分析,并對代碼進(jìn)行了測試。測試結(jié)果表明這部分功能沒問題,可以正常使用。本章將對最后一個(gè)web層進(jìn)行詳細(xì)說明,盡可能的講明白這些知識要點(diǎn)。
        數(shù)據(jù)庫
        本例使用MySQL數(shù)據(jù)庫,只有三張表,一張用于管理表主鍵的generator_table,另外兩張是人員表與角色表。
        
        
        
        這里我有一點(diǎn)需要說明一下,在學(xué)習(xí)JPA——Hibernate Annotation使用實(shí)例
    一文中,我將generator_table設(shè)了一個(gè)id主鍵字段,其實(shí)這個(gè)字段是不需要的,直接將g_key設(shè)為主鍵。這樣設(shè)計(jì)更好些,因?yàn)楸砻豢赡芤粯樱赃@個(gè)存放各個(gè)表主鍵的鍵名也不會(huì)一樣。
        userrole這兩張表只設(shè)了一個(gè)主鍵,沒有建立外鍵關(guān)聯(lián),而且大象也很反對建立表之間的外鍵關(guān)聯(lián)。因?yàn)檫@樣做之后,約束太多,在實(shí)際開發(fā)中,很容易出問題,這是我親身體會(huì)過的。所以我建議只對表設(shè)置一個(gè)流水號主鍵,其它的都可以根據(jù)業(yè)務(wù)關(guān)系來設(shè)計(jì)字段,這樣會(huì)更靈活。
        這里對各個(gè)字段都默認(rèn)將它們設(shè)置為null,因?yàn)獒槍Σ煌谋恚愣紩?huì)實(shí)現(xiàn)相應(yīng)的功能,你當(dāng)然會(huì)知道哪些字段是不能為空的,哪些是可以為空的。而且在做數(shù)據(jù)庫設(shè)計(jì)的時(shí)候,你也不可能在短時(shí)間內(nèi),面面俱到的把所有問題都考慮進(jìn)去,根據(jù)需求的變化,在開發(fā)過程中,也是經(jīng)常會(huì)遇到修改數(shù)據(jù)庫的情況。如果之前過于強(qiáng)調(diào)字段的非空設(shè)置,在編寫代碼時(shí),為了減少出錯(cuò),腦袋里可能會(huì)不停的想,啊,這個(gè)字段是非空的嗎?哪個(gè)字段不是非空的吧?然后反復(fù)對比數(shù)據(jù)庫進(jìn)行檢查,會(huì)使人束手束腳很不舒服。因?yàn)檫@些全部都可以人為來控制,所以除了主鍵外,將其它字段都設(shè)為null有利于開發(fā)人員更好的進(jìn)行工作。
        有人會(huì)說了,進(jìn)行非空設(shè)置是一種約束,當(dāng)程序出錯(cuò)時(shí),很容易發(fā)現(xiàn)問題。當(dāng)然,這話說得沒錯(cuò)。大象只是建議,從沒說過一定要這樣做,我只是說下自己的一點(diǎn)經(jīng)驗(yàn)總結(jié),僅此而已!想怎么實(shí)現(xiàn)都是你的自由。
        struts2-convention
        既然說了是全注解開發(fā),而且我們已經(jīng)實(shí)現(xiàn)了HibernateSpring的注解。同樣的,Struts2也能夠做到用注解來代替配置文件,struts2-convention插件可以幫助我們完成這一功能。它是struts2提供的一個(gè)插件,目前網(wǎng)上相關(guān)的中文文檔主要是一個(gè)叫石太洋的人根據(jù)官方文檔翻譯的,很多網(wǎng)站與博客都有轉(zhuǎn)載。我看了原文與譯文,感覺講的不夠清楚,例子也很簡單。大象根據(jù)自己在項(xiàng)目中的實(shí)際使用情況,現(xiàn)將個(gè)人對這個(gè)插件的經(jīng)驗(yàn)總結(jié)寫出來與各位分享,希望與大家多交流,共同提高。
        官方文檔 https://cwiki.apache.org/WW/convention-plugin.html
        請不要把地址中的兩個(gè)大寫W換成小寫,否則是打不開頁面滴!這個(gè)插件的使用其實(shí)非常簡單,如果光看文檔可能會(huì)覺得好像很麻煩。那么大象來告訴你怎樣快速學(xué)習(xí)這個(gè)插件。
        首先你要搞清楚,這個(gè)插件它會(huì)默認(rèn)掃描所有包名為strutsstruts2actionactions下面的類。然后它會(huì)對實(shí)現(xiàn)了Action接口以及類名以Action結(jié)尾的這些類,作為Action來進(jìn)行處理。
        你可以重新定義按哪種包名進(jìn)行掃描。比如本例設(shè)定,只掃描web包下面的所有類,因?yàn)槲覀儗?/span>Action類都放在這個(gè)包下面。
        那這個(gè)插件是怎么實(shí)現(xiàn)原來的配置信息的呢?它的映射規(guī)則是這樣的,對于以Action結(jié)尾的的類,去掉Action,取剩下的部分,將所有的字母轉(zhuǎn)換為小寫,如果有駝峰式的寫法,則用"-"連接符來連接不同的單詞,這是此插件的默認(rèn)方式。最終轉(zhuǎn)換之后的就是請求地址,還是用例子說明。
        com.bolo.examples.web.base.UserAction    
        按照上面的規(guī)則,請求地址就應(yīng)該是UserAction去掉Action后綴,將其余部分轉(zhuǎn)換為小寫,所以user就是我們的請求地址。不過,這還沒有完,因?yàn)檫@里面還有一個(gè)命名空間的路徑,在通常的配置文件中,一般會(huì)將不同的功能進(jìn)行劃分,在package標(biāo)簽里加上namespace屬性。使用這個(gè)插件,它會(huì)為你自動(dòng)配上命名空間,默認(rèn)的就是前面說到的以那四種名稱為根目錄的命名空間,它們之后的都將成為命名空間的名稱。
        com.bolo.examples.struts.UserAction 映射為 /user.action
        com.bolo.examples.struts.base.UserAction 映射為 /base/user.action

        要是我們不以struts或其它幾種默認(rèn)值為包名,又該怎么辦呢?沒關(guān)系,插件為我們提供了一種自定義根包的配置方式
        <constant name="struts.convention.package.locators" value="web" />
        上面這段配置是寫在struts.xml里面的,它指定web為根,作用就相當(dāng)于那四種默認(rèn)值。
        com.bolo.examples.web.base.UserAction映射為 /base/user.action
        
    com.bolo.examples.web.HelloAction 映射為 /hello.action
        com.bolo.examples.web.HelloWorldAction 映射為 /hello-world.action

        請一定注意駝峰寫法的映射方式,假如這里不是HelloWorld,而是Helloworld,那就不會(huì)再是hello-world.action,而是helloworld.action了。
        既然已經(jīng)知道了它的映射方式,接下來再看看這個(gè)插件是如何定義結(jié)果頁面的。
        convention默認(rèn)會(huì)到/WEB-INF/content文件夾下面查找對應(yīng)的結(jié)果頁面,這個(gè)文件夾的名字可以修改,需要在struts.xml中定義
        <constant name="struts.convention.result.path" value="/WEB-INF/jsp" />
        文件夾的名字改成了jsp,這樣定義后,convention就會(huì)在這個(gè)文件夾下面查找結(jié)果頁面。它的查找路徑與映射的命名空間有關(guān)。默認(rèn)規(guī)則是,在請求的命名空間下面,根據(jù)請求名稱再結(jié)合方法返回的字符串生成最終的結(jié)果頁面名稱,再配以后綴名。convention支持以jspftlvmhtmlhtm等五種后綴格式的文件。這里有個(gè)比較特殊的是如果方法返回success,那么可以不用將它與請求名稱拼接起來,直接使用請求名稱作為返回頁面的名稱。還是舉例子說明。
        
        比如上面這段代碼,HelloAction處于我們定義的根包(web)下面,因此,它的action請求為hello.action。這時(shí),會(huì)默認(rèn)執(zhí)行execute()方法,由于返回的是success字符串,所以頁面的名稱可以簡寫為hello.jsp,但是當(dāng)執(zhí)行welcome方法時(shí),由于返回的字符串為welcome,這時(shí)的頁面名稱則為hello-welcome.jspconvention就是遵循這樣的規(guī)則來進(jìn)行命名,當(dāng)然這只是最基本的,我們再來看看稍微復(fù)雜點(diǎn)的東東。
        
        這個(gè)RoleAction類的外部,加了兩種注解,它們的作用相當(dāng)于配置文件中的result標(biāo)簽。Results是一個(gè)Result類型的數(shù)組注解,里面可以包含多個(gè)Result配置。使用Result注解來設(shè)置返回類型與返回頁面,是不準(zhǔn)備采取默認(rèn)的定義方式。比如HelloAction就是我們采取的默認(rèn)方式。另外對于有些特殊的返回類型,也需要顯式的進(jìn)行定義。
        因?yàn)槲覍?/span>RoleAction中的execute()方法返回結(jié)果進(jìn)行了顯式的定義,所以,它將不再返回默認(rèn)的role.jsp,而是location指定的role-list.jspResult注解中的name值要與返回值對應(yīng)。
        當(dāng)請求路徑為role!input.action時(shí),會(huì)執(zhí)行input()方法,對于這個(gè)方法來說,由于沒有進(jìn)行顯式的定義,所以它會(huì)按照默認(rèn)的命名規(guī)則返回role-input.jsp
        redirectUser方法的返回結(jié)果指定了一個(gè)typeredirectAction的值,這表示要對Action重定向,在location中也說明了是跳轉(zhuǎn)到哪個(gè)Action。請注意這里指定的是user.action,當(dāng)程序跳轉(zhuǎn)到UserAction時(shí),會(huì)默認(rèn)執(zhí)行execute方法。
        假如說,你想執(zhí)行其它方法該怎么辦呢?可以在location里面這樣定義,location="user!input.action"。請記住,重定向時(shí),如果是跳轉(zhuǎn)到其它Action或本Action中的其它方法,type要寫成redirectAction
        更進(jìn)一步,我還想帶些參數(shù)過去,又該如何呢?請?zhí)砑?/span>params屬性,它是一個(gè)數(shù)組類型。可以這樣定義,params={"role_id","${role_id}","role_name","超級管理員"}convention文檔中有說明,里面的參數(shù)是一個(gè)鍵值對,總是形如key,value,key,value。所以第一個(gè)role_id與第三個(gè)role_name都叫參數(shù)名,二和四則是參數(shù)值。另外注意下"${role_id}"的含義,這是使用的OGNL表達(dá)式取出存在于值棧中的名叫role_id的值。這是一種動(dòng)態(tài)獲取并賦值的方式,在采用配置文件的方式中,也可以這樣運(yùn)用,而role_name參數(shù)則是一個(gè)固定字符串值。需要特別注意的就是,作為參數(shù)名的role_idrole_name,一定要在指向的Action中有這兩個(gè)同名的屬性,并且還有set方法,這是用來給這兩個(gè)屬性賦值。而對于${role_id},則要在當(dāng)前這個(gè)Action中,有它的get方法。用于取值。
        補(bǔ)充說明一下,在Action類中定義的全局變量,不是非得給它都加上setget方法,這是根據(jù)實(shí)際情況來設(shè)置的。簡單的說get()是獲得值,set()是設(shè)置值。比如,你現(xiàn)在要在頁面上顯示username,那么就對這個(gè)屬性設(shè)置get方法,如果只是對username設(shè)置值,從頁面?zhèn)髦档?/span>Action,那只需要對它設(shè)置set方法就可以了。除此之外,我們也可以不采用struts2提供的值棧方式得到參數(shù)值,而是使用非常熟悉的request. getParameter()方法來獲取參數(shù)。至于實(shí)際怎么使用,由各位自己決定,不知道我這樣說,大家能不能明白?
        大象根據(jù)實(shí)際使用情況,發(fā)現(xiàn)動(dòng)態(tài)參數(shù)的傳遞在struts2.1.6存在BUG,如果需要使用這個(gè)功能,請將struts2升級到2.1.8.1版。
        大象根據(jù)實(shí)際應(yīng)用,建議大家統(tǒng)一在類名上面定義Results設(shè)置,這樣做有利于開發(fā)與維護(hù);不建議單獨(dú)對方法使用@Action注解來重新定義它的訪問地址與返回結(jié)果,因?yàn)檫@樣做有些破壞統(tǒng)一性,不過可以根據(jù)實(shí)際情況進(jìn)行處理,但不要過多的使用。
        struts.xml
        
        整個(gè)struts.xml的配置文件就這么多,當(dāng)然你自己還可以擴(kuò)展,因?yàn)椴捎昧俗⒔猓砸郧暗哪切┡渲镁驮僖部床坏搅恕T谶@個(gè)文件中,package是繼承convention-default,而沒有繼承struts-default,為什么呢?查看conventionstruts-plugin.xml文件,我們可以發(fā)現(xiàn)convention-default繼承了struts-default,所以這樣寫是沒錯(cuò)的。另外的幾個(gè)constant配置就是對convention的常量設(shè)置,請看注釋。
        關(guān)于paramsPrepareParamsStack攔截器棧,我準(zhǔn)備在第五篇,對基礎(chǔ)框架進(jìn)行擴(kuò)展的時(shí)候再詳細(xì)的說明。大家如果等不急想學(xué)習(xí)下,可以在網(wǎng)上查找這方面的資料先看看。
        web
        大象是這樣想的,如果一次講的太多太復(fù)雜不利于理解和吸收,所以對于web層,大家從前面也看到了,代碼很簡單,因?yàn)楸酒饕侵vconvention插件的知識,然后實(shí)現(xiàn)一部分功能用于演示它的效果。下面貼上webWebRoot目錄結(jié)構(gòu)、UserAction的代碼,以及jsp代碼。
        
        
        
        請注意web包下面的層次結(jié)構(gòu),這與你的請求路徑相關(guān)。content文件夾是插件默認(rèn)指定的名字,你可以修改為別的名字。同樣請注意在這個(gè)目錄下面的文件與子文件夾的定義方式是和web層相同的。如果還沒有理解,請?jiān)倏聪挛覍?/span>convention插件的說明。
        web.xml文件中,設(shè)置了一個(gè)<welcome-file-list>標(biāo)簽,定義了一個(gè)index.jsp,這文件里就一句代碼 <% response.sendRedirect("hello.action"); %> 它會(huì)去執(zhí)行HelloActionexecute()方法,這方法里面什么邏輯都沒有,直接返回結(jié)果頁面hello.jsp
        
        ${ctx}是一個(gè)EL表達(dá)式,設(shè)置的是當(dāng)前項(xiàng)目名稱。我在文件開頭加了一個(gè)靜態(tài)包含,<%@ include file="/common/taglibs.jsp" %>
        
        不管是user.action還是role.action,它們默認(rèn)的執(zhí)行方法都是execute(),點(diǎn)擊這兩個(gè)鏈接,返回指定的結(jié)果頁面。
        
        
        user.jsp里面,用來循環(huán)的list,是根據(jù)getList()方法獲取的,struts2會(huì)自動(dòng)的分析出屬性名。想一下,listget方法是不是就是getList()呢?我之前說過,get()是獲得值,set()是設(shè)置值。在這里我只是要在列表頁面上得到list集合,沒有其它的需求,所以不用像這樣定義 private List list,再然后給它加上set()get()方法,因?yàn)橐玫?/span>list集合,所以還要在execute()方法里面寫上list = userManager.getUsers(),這樣做有必要么?我一直都在遵循優(yōu)雅、高效、簡潔的代碼風(fēng)格,并且一直都在朝這方面努力,也提倡大家這樣做。編程是門藝術(shù),而不是一種工作,不要把它當(dāng)工作看,只想著完成任務(wù),拼命的堆代碼。這樣做很難有提高。應(yīng)該換一種心態(tài)去對待它,用藝術(shù)的眼光來重新審視你的代碼,你會(huì)發(fā)現(xiàn)這很有樂趣,也會(huì)學(xué)到很多。自己的一點(diǎn)淺薄之見,讓各位見笑了。
        這部分的內(nèi)容就說到這里,下一篇將對paramsPrepareParamsStack攔截器棧進(jìn)行詳細(xì)說明,另外再對框架進(jìn)行一下擴(kuò)展,封裝CRUD功能,只要沒有特殊的業(yè)務(wù)邏輯,在你的實(shí)際Action中,再不會(huì)看到增刪改查這些基本功能。
        本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請注明出處。 http://bolo.blogjava.net/
    posted on 2010-05-08 16:07 菠蘿大象 閱讀(13243) 評論(16)  編輯  收藏 所屬分類: Struts2

    評論:
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2010-05-10 13:17 | 宋曉
    終于等來了大象的文章。間隔時(shí)間真長啊?……  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2010-05-10 13:42 | 菠蘿大象
    @宋曉
    謝謝支持,我對質(zhì)量要求比較高,寫得比較慢,寫完后又修改了幾遍,第五篇大概是兩星期后發(fā)布了,請到時(shí)候再來看吧。  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2010-05-14 14:35 | 愛上貓的魚
    呵呵 一直看您的文章,我也正在學(xué)習(xí)SSH2,收益頗多
    期待第五篇的推出  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2010-05-14 14:59 | 菠蘿大象
    @愛上貓的魚
    謝謝支持,能對大家有幫助,我非常開心。  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2010-06-19 10:37 | gonglianying
    學(xué)習(xí)中,文章寫的很好。  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2010-06-20 20:49 | 菠蘿大象
    @gonglianying
    謝謝你的支持。  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2011-03-07 15:11 | HCH
    牛人,學(xué)習(xí)了  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2011-04-22 17:52 | tsinglongwu
    請問在embedded tomcat5/6中使用struts2 convention要注意什么?我在embedded tomcat5/6使用struts2 convention老是報(bào)錯(cuò):
    問題代碼如下:
    1.web.xml:
    <web-app>
    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

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

    </web-app>

    2.struts.xml:
    <struts>
    <constant name="struts.convention.result.path" value="/WEB-INF/jsp/" />
    </struts>

    3.HelloAction.java:
    package com.synertone.ssh.paging.action;

    import com.opensymphony.xwork2.ActionSupport;

    public class HelloAction extends ActionSupport {

    private String message;

    public String getMessage() {
    return message;
    }

    @Override
    public String execute() {
    message = "lady gaga!";
    return SUCCESS;
    }
    }

    4.hello.jsp:
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <html>
    <body>
    The message is: ${message}
    </body>
    </html>

    5.tomcat啟動(dòng)類startup.java:
    Tomcat tomcat = new Tomcat();
    String projectPath = new File("").getAbsolutePath();
    tomcat.setBaseDir(projectPath);
    tomcat.setPort(8080);
    try {
    tomcat.addWebapp("", projectPath + "/webapps/SSH");
    } catch (ServletException e) {
    e.printStackTrace();
    throw e;
    }
    try {
    tomcat.start();
    } catch (LifecycleException e) {
    e.printStackTrace();
    throw e;
    }

    輸入http://localhost:8080/index.jsp,能訪問index.jsp頁面。輸入http://localhost:8080/hello或hello.action則報(bào)錯(cuò)
    There is no Action mapped for namespace / and action name hello. - [unknown location]

    同樣的代碼部署在非embeded tomcat中卻能訪問成功。
    這是為什么呢?望大象指點(diǎn)一下,感激不盡!  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2011-06-28 16:40 | vjame
    刪除角色之后頁面要手動(dòng)刷新下,才能看到新數(shù)據(jù),reload怎么無效啊  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四)[未登錄] 2011-07-14 16:42 | dudu
    我把源碼下下來,因?yàn)橛玫氖莝pring3+struts2.2.3+hibernate3.6,所以很多jar包不一樣,調(diào)試好了后,啟動(dòng)沒有問題了。
    首頁也出來了,但是到了hello。jsp,點(diǎn)擊 執(zhí)行UserAction的時(shí)候就報(bào)錯(cuò)了。

    Unable to instantiate Action, com.bolo.examples.web.base.UserAction, defined for 'user' in namespace '/base'Error creating bean with name 'com.bolo.examples.web.base.UserAction': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected com.bolo.examples.common.orm.hibernate3.HibernateDao com.bolo.examples.common.web.StrutsAction.hibernateDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDao' defined in file [E:\eclipseworkspace-3.7\.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\ssh2\WEB-INF\classes\com\bolo\examples\common\orm\hibernate3\HibernateDao.class]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer
    不曉得是什么原因  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四)[未登錄] 2011-07-14 17:24 | dudu
    好了。
    原來是cglib包的版本不一致造成的。
    發(fā)現(xiàn)版本后不一致真是要人命啊
      回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2011-07-15 09:06 | 菠蘿大象
    @dudu
    nested exception is java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer
    從這里就可以看出是cblib的問題了,大象我現(xiàn)在改用maven構(gòu)建項(xiàng)目,這樣對版本的控制會(huì)好些  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四)[未登錄] 2011-07-15 09:28 | dudu
    @菠蘿大象
    用maven有的時(shí)候也很無奈。
    我做一個(gè)客戶,用ofc2做了一個(gè)折線圖,但是這個(gè)jar包,在maven上找不到,
    按說可以自己在服務(wù)器上的repository安裝一個(gè)jar包,但是
    客戶就讓我必須改為jfreechart做。很是郁悶了半天。
      回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2011-09-29 13:30 | dup
    感謝樓主,看了好久才有點(diǎn)明白  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四)[未登錄] 2013-04-13 20:17 | momo
    為什么我的jsp讀取不到UserAction傳過來的值啊?  回復(fù)  更多評論
      
    # re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(四) 2013-11-13 10:32 |
    剛來看,不錯(cuò)的。  回復(fù)  更多評論
      
    主站蜘蛛池模板: 国产精品免费视频播放器| 成年女性特黄午夜视频免费看| 免费国产叼嘿视频大全网站 | 亚洲日本va午夜中文字幕一区| 亚洲成人免费在线| 亚洲欧洲日本天天堂在线观看| 亚洲中文字幕无码中文| 狠狠综合亚洲综合亚洲色| 国产精品极品美女自在线观看免费 | 亚洲欧洲国产综合AV无码久久 | 亚洲毛片基地4455ww| 亚洲精品欧美综合四区| 曰韩无码AV片免费播放不卡| a级毛片无码免费真人久久| 最近免费中文在线视频| 免费被黄网站在观看| 国产亚洲美女精品久久久| 亚洲三级电影网站| 亚洲色大成网站www永久网站| 一区二区三区精品高清视频免费在线播放 | 精品97国产免费人成视频| 三年片在线观看免费观看大全一 | 免费羞羞视频网站| 亚洲精品国产精品乱码不卡√ | 亚洲情XO亚洲色XO无码| 亚洲国产精品久久网午夜| 精品特级一级毛片免费观看| 国产一级淫片a免费播放口| 野花高清在线电影观看免费视频| 免费人妻av无码专区| 久久久久久亚洲精品| 亚洲国产欧美日韩精品一区二区三区| 久久av免费天堂小草播放| 1000部国产成人免费视频| 亚洲av无码国产精品色在线看不卡| 亚洲AV乱码一区二区三区林ゆな| 亚洲精品无码aⅴ中文字幕蜜桃| 中文字幕免费人成乱码中国| 免费影院未满十八勿进网站| 国产亚洲精品自在线观看| 99久久国产亚洲综合精品|