国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
MyEclipse10 開發(fā) SSH2

1. 開發(fā)環(huán)境

本文開發(fā)環(huán)境為 MyEclipse10 和 Struts 2.1,Spring 和 Hibernate 使用 MyEclipse 內(nèi)置的版本。

2. 建立 Web 工程并添加 Struts 支持

File新建一個Web Project,命名為NeuqStudent,javaEE默認(rèn)5.0版本,右鍵工程名-->Add Struts Capabilities...選擇Struts2.1,下面是過濾器的名字和URL,如圖。

在系統(tǒng)中加入 Struts 支持,實際上就是要在系統(tǒng)中增加一個 Struts“過濾器(filter)”;所有的文件,在以頁面形式展示 到用戶的瀏覽器之前,先要通過該過濾器“過濾”(即處理)一遍,這樣給了 Struts 控制模塊一個處理頁面中特有的 Struts 標(biāo)簽的機會;也就是說,后臺程序可以將這些 Struts 標(biāo)簽“翻譯”成為相關(guān)的數(shù)據(jù)并處理后,才將生成的頁面提交給 終端用戶。

也可之后在系統(tǒng)中添加Struts “過濾器”,方法是設(shè)置系統(tǒng)的全局配置文件 web.xml ;該文件在工程的樹形結(jié)構(gòu)中位于 WebRoot/WEB-INF 目錄下。我們暫不需要理解復(fù)雜的配置語法,只需要在 MyEclipse 的 Package 窗口中,找到該文件 并雙擊,即可進入圖形化的 web.xml 配置界面。該界面中,樹型結(jié)構(gòu)的第二項,即是“Fileters”,選中后使用 窗體右邊的“Add”按鈕,彈出“Add Filters”對話框;這個框中只有兩項帶“*”號的項目是必填的:

第一項是要為我們的過濾器起一個名字,你可以隨便起一個好記的名稱,例如“struts2”;

第三項是實現(xiàn)該過濾器的 Java 類;點擊“Browse”按鈕,輸入 StrutsPrepareAndExecuteFilter(實際上你只需要輸 入前幾個字母,例如 strutsp 就可找到該類),將該類設(shè)為過濾器類即可。

添加完過濾器后,還需要指定哪些文件必須通過該過濾器。在我們的例子中,我們簡單地要求所有的文件都要通過 Struts 過濾器,因此我們可以這樣來設(shè)置過濾器的“mapping”:點擊 web.xml 樹形目錄的 Filters,在右邊“Filter Mappings” 列表框旁邊,點擊“Add”按鈕,輸入我們剛才的過濾器名“s2”,并在“URL-Pattern”處輸入“/*”,即要求系統(tǒng)根目 錄下所有的文件都需要通過該過濾器處理。保存 web.xml 文件;這時我們的 WarpSpeed 工程可以說已經(jīng)完全支持 Struts2 了。

配置完成后的web.xml如下:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.   <display-name></display-name>   
  8.   <welcome-file-list>  
  9.     <welcome-file>index.jsp</welcome-file>  
  10.   </welcome-file-list>  
  11.   <filter>  
  12.     <filter-name>struts2</filter-name>  
  13.     <filter-class>  
  14.         org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
  15.     </filter-class>  
  16.   </filter>  
  17.   <filter-mapping>  
  18.     <filter-name>struts2</filter-name>  
  19.     <url-pattern>/*</url-pattern>  
  20.   </filter-mapping></web-app>  

3. 設(shè)計一個最簡單的 Struts2 系統(tǒng)

在設(shè)計一個最簡單的 Struts 系統(tǒng)之前,我們需要理解這樣兩個概念:“action”的執(zhí)行和導(dǎo)航。

(1) 所謂“action”(“動作”),就是在表單提交后系統(tǒng)會自動執(zhí)行的一個 Java類,該類必須繼承 ActionSupport(在 com.opensymphony.xwork2 中)并重寫其中的 execute()方法。表單提交后,系統(tǒng)會將表單里包含的字段數(shù)據(jù)傳遞給 該 action 類,并執(zhí)行其中的 execute()方法。

(2) execute()方法必須返回一個字符串,而該字符其將決定系統(tǒng)要轉(zhuǎn)向那個頁面;這就是所謂的“導(dǎo)航”。 因此,一個最簡單的 Struts 系統(tǒng),起碼包括這樣幾個文件:

帶有表單的頁面文件(jsp 文件) 表單提交后要執(zhí)行的 action(java 類) Action 執(zhí)行完畢要轉(zhuǎn)向的頁面(jsp 文件)

因此,在構(gòu)建系統(tǒng)前,我們首先要構(gòu)思我們的系統(tǒng)到底需要怎樣的功能結(jié)構(gòu),以及需要哪些文件來實現(xiàn)這些功能—— 這正是軟件工程的“設(shè)計”階段的任務(wù)。作為最簡單的例子,我們可以這樣設(shè)計我們的系統(tǒng):

(1)  頁面 index.jsp,其中包含一個簡單的 form,該 form 的 action 名為“aCheck”,其中包含兩個文本字段:name和 password;

(2) 表單提交后要執(zhí)行的 action 類為 AccountCheck;

(3) AccountCheck 類執(zhí)行時,打印出傳遞過來的 name 和 password 參數(shù)的值

(4) AccountCheck 執(zhí)行后轉(zhuǎn)向頁面 index2.jsp。

為了將這一個構(gòu)思傳遞給系統(tǒng),我們需要使用 struts.xml 來配置這幾個文件之間的邏輯關(guān)系。

修改struts.xml代碼如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">  
  3. <struts>  
  4.     <package name="default" namespace="/" extends="struts-default">  
  5.         <action name="aCheck" class="com.neuq.check.AccountCheck">  
  6.             <result name="toIndex2">/index2.jsp</result>  
  7.         </action>  
  8.     </package>  
  9. </struts>    

說明:

(1)  “action”標(biāo)簽定義了一個動作,該動作由其 name 屬性確定,并和頁面表單中的“action=”屬性相對應(yīng);class 屬 性則指定了該動作由哪個 Java 類來實現(xiàn)。例如,上面的代碼相對應(yīng)的頁面表單應(yīng)該有如下形式:

<form action="aCheck">...</form>

則上述 form 提交時,系統(tǒng)將尋找 AccountCheck 類并執(zhí)行之。

(2) “result”標(biāo)簽定義了在動作執(zhí)行之后的跳轉(zhuǎn)(導(dǎo)航),其中 name屬性和動作中 execute()函數(shù)的返回值相應(yīng),也就 是說,如果動作中 execute()返回值為字符串“toIndex2”,則系統(tǒng)跳轉(zhuǎn)到 index2.jsp 頁面。

(3) package 是對 action 分類的標(biāo)簽,其最核心的屬性是“name”,該 name 是與其他 package 區(qū)分的依據(jù);而 namespace(命名空間)屬性則定義了到哪個地址尋找其下屬的 action;例如,namespace="/example" 表示,如果請求的動作的URL 是/example/HelloWorld.action的話,系統(tǒng)首先到/example 命名空間尋找“HelloWorld”動作對應(yīng)的 Java 類;如果沒有找到,系統(tǒng)還會到默認(rèn)的命名空間去尋找,以及到“/”根命名空間尋找。對于我們修改后的例子,我們只是簡單的定義了一個名為“default”的 package 并指定根命名空間。需要注意的是,命名空間只有“一層”,而不是像文件目錄那樣可以有多個層次。另注意:URL 中“xxx.action”和簡化形式的“xxx”是等同的。

4. 實現(xiàn)最簡單的 Struts2 系統(tǒng)

對于上面設(shè)計好的簡單 Struts2系統(tǒng),我們可以根據(jù) struts.xml 的要求按下面步驟實現(xiàn)之——注意這里體現(xiàn)的軟件工程 思想:先設(shè)計,后實現(xiàn):

(1) 頁面表單編碼:Web 工程默認(rèn)的“入口”頁面是 index.jsp,位于 WebRoot(相當(dāng)于網(wǎng)站的根目錄)下。最簡單的支持Struts2 框架的 JSP 文件結(jié)構(gòu)為:

  1. <%@ page contentType="text/html; charset=UTF-8" %>  
  2. <%@ taglib prefix="s" uri="/struts-tags" %>  
  3. <html>  
  4. <body>  
  5. </body>  
  6. </html>  

也就是說,最上面兩行最關(guān)緊要!使用上面的模板替換系統(tǒng)中 index.jsp 原來的內(nèi)容,并在<body>標(biāo)簽內(nèi)加入 struts 表 單:

  1. <s:form action="aCheck">  
  2. <s:textfield name="name" value="wang"></s:textfield>  
  3. <s:textfield name="password" value="123"></s:textfield>  
  4. <s:submit></s:submit>  
  5. </s:form>  

其中“s:”是由上面所示第二行代碼

<%@ taglib prefix="s" uri="/struts-tags" %>

規(guī)定的 struts 標(biāo)簽的前綴,也就是說,所有 struts 標(biāo)簽都要以“s:”打頭?!癴orm”和“submit”標(biāo)簽和 HTML 表單中類似的標(biāo)簽的意義相同,而“textfield”標(biāo)簽相當(dāng)于 HTML 表單的 input 標(biāo)簽。請注意下劃線的部分:action 屬性定義的 名稱"aCheck"和 struts.xml 中的 action name 是一致的;兩個 textfield 定義了兩個表單字段,一個名為“name”,另一個 名為“password”。用戶在這兩個字段中輸入的數(shù)據(jù)將被 Struts 傳遞到后臺 action 程序中。

(2) 動作編程:根據(jù) struts.xml 要求,我們要編寫一個名為“AccountCheck”的類來實現(xiàn) action“aCheck”,放在com.neuq.check下。這個類 有 4個要求:

a)    繼承 ActionSupport;

b)    包含表單字段對應(yīng)的屬性變量;

c)    對上面的屬性變量編寫 getter 和 setter 方法;


d)    重寫 execute()方法,并返回與 struts.xml 對應(yīng)的字符串以進行導(dǎo)航。

AccountCheck.java 的代碼如下:

  1. package com.neuq.check;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class AccountCheck extends ActionSupport {  
  6.     private String name;  
  7.     private String password;  
  8.   
  9.     public String getName() {  
  10.         return name;  
  11.     }  
  12.   
  13.     public void setName(String name) {  
  14.         this.name = name;  
  15.     }  
  16.   
  17.     public String getPassword() {  
  18.         return password;  
  19.     }  
  20.   
  21.     public void setPassword(String password) {  
  22.         this.password = password;  
  23.     }  
  24.   
  25.     public String execute() {  
  26.         System.out.println(name + password);  
  27.                 return "toIndex2";  
  28.     }  
  29. }  

上文中的核心代碼只有 4 行,前兩行只是聲明了與表單字段相對應(yīng)的變量(Struts 會自動在表單和 action 類之間進行數(shù)據(jù)傳遞);第三行將傳遞過來的字段值打印出來(一個簡單的數(shù)據(jù)處理 );最后一行返回字符串“toIndex2”以指示系統(tǒng)導(dǎo)航到/index2.jsp 頁面。注意其中的 setter 和 getter 函數(shù)分別用于設(shè)置和獲取字段變量的值;但是我們在上面的代碼中并沒有看到對 getter 和 setter 的引用,而其實這正是 Struts 的奇妙之處:當(dāng) execute()被執(zhí)行時, 所有的字段變量已經(jīng)在 Struts 的控制調(diào)度下被設(shè)置好了!

(3) 結(jié)果頁面編程:根據(jù) struts.xml 的要求,我們的結(jié)果頁面是 index2.jsp;目前我們暫不需要在該頁面中工作,因 此您可以隨便寫個頁面并命名為 index2.jsp 即可。

現(xiàn)在我們可以運行我們的系統(tǒng)了。在安裝了tomcat6.0后,將工程部署在tomcat下,運行。在瀏覽器中輸入http://localhost/NeuqStudent/index.jsp 

我們可以輸入一些內(nèi)容,點擊“Submit”按鈕,系統(tǒng)將自動轉(zhuǎn)到 index2.jsp, 并在控制臺打印出來您輸入的內(nèi)容(由 execute()函數(shù)中的 println()實現(xiàn))。

在這一階段常見的錯誤是

HTTP Status 404 - There isnoAction mapped for namespace / and action name xxx該錯誤意味著在你指定的命名空間沒有找到名為 xxx 的動作(同時在“根”命名空間也沒有找到)。你需要查看并修改你的struts.xml 配置文件。

 

5. 莫名其妙的錯誤?

MyEclipse 首次啟動的時候,會要求你建一個“工作區(qū)(workspace)”,后繼的工程文件均存放到這個工作區(qū)文件夾中。 如果在你的學(xué)習(xí)過程中,編寫了多個工程,有時候會出現(xiàn)莫名其妙的錯誤,那么除了認(rèn)真閱讀錯誤提示并進行更正意 外,有些錯誤可能是你前期的工程遺留下來的,即使你早已刪除了那些工程,其發(fā)布到 tomcat 中的應(yīng)用并沒有移除干凈!

解決的方法很簡單:

退出 MyEclipse,到 workspace 目錄,在.metadata\.me_tcat\webapps 中有你已經(jīng)發(fā)布所有工程的文件夾,找到原來的工程文件夾,刪除那些有問題的工程(或者干脆全部刪除,因為這并不影響你的源文件),然后重新啟動 MyEclispse 就可 以了。因此,如果你怕麻煩,最好一個工程使用一個獨立的工作區(qū)。

6. 結(jié)果頁面編程

從上面的實驗當(dāng)中可以看到,Java 的打印語句只能在服務(wù)器的控制臺上輸出結(jié)果,而不能將結(jié)果顯示到用戶的瀏覽器 中。Struts 將 action 處理的數(shù)據(jù)(包括表單提交給 action 的數(shù)據(jù))和應(yīng)用(Application)范圍內(nèi)的數(shù)據(jù),都存儲在一個 叫做“值?!保╲alueStack)的地方;有很多種方法可以從這里取出值來?,F(xiàn)在我們重新對 index2.jsp 編程,已將這些值 取出到頁面中:

首先,使用通用的 struts 頁面模板替換 index2.jsp 的內(nèi)容,并在<body>標(biāo)簽內(nèi)加上:

  1. <s:text name="password"/><hr/>  
  2. <s:property value="password" /><hr/>  
  3. ${password}<hr/>  

運行一下試試。可以看到,三種方法都可以將輸入的 password 顯示出來。其中前兩種為 Struts 標(biāo)簽形式,${password}的寫法是 OGNL 表達(dá)式語言,其用法暫略。

7. 結(jié)果頁面導(dǎo)航

如果我們需要根據(jù)后臺程序的處理結(jié)果轉(zhuǎn)向不同的頁面的話,必須同時配置 struts.xml 和 action。例如,如果要在傳遞過來的name 和 password 參數(shù)的值分別為“dj”和“123”時,系統(tǒng)導(dǎo)航轉(zhuǎn)向 index2.jsp 頁面,否則的話轉(zhuǎn)向驗證失敗頁面fail.jsp,則我們可以先配置 struts.xml 如下:

  1. <action name="aCheck" class="com.neuq.check.AccountCheck">  
  2. <span style="white-space:pre">            </span><result name="toIndex2">/index2.jsp</result>  
  3. <span style="white-space:pre">            </span><result name="toFail">/fail.jsp</result>  
  4. </action>  

根據(jù)這一配置,我們需要在 action 的 execute()方法作相應(yīng)修改:

  1. public String execute() {  
  2.         if (name.equals("dj") && password.equals("123"))  
  3.             return "toIndex2";  
  4.   
  5.         else  
  6.             return "toFail";  
  7.     }  

最后,需要實現(xiàn) fail.jsp;由于這個頁面比較簡單,只需要將 index2.jsp 另存為 fail.jsp,并將其頁面內(nèi)容修改為“失敗” 信息即可(略)。

再次運行工程,則輸入數(shù)據(jù)不同會導(dǎo)航到不同的頁面。至此,我們已經(jīng)完整的體驗了 Struts2 簡單而強大的前后臺交互及表現(xiàn)能力。下面我們看看如何方便地與底層數(shù)據(jù)處理進行交互。

8. 為工程添加 Spring 支持 在工程名上點鼠標(biāo)右鍵并選擇

“MyEclipse”—>“Add Spring Capabilities...”

為簡單起見,因為系統(tǒng)內(nèi)置的 Spring 支持是 2.5 版本的,我們選中所有 2.5 版的 Spring 包,并選擇“拷貝支持包到 lib

目錄”;另特別注意

(1)將 Spring 的配置文件 applicationContext.xml 放到 WEB-INF/目錄下(而不是缺省的 src目錄);

(2)重要:web.xml 中增加一個 listener:ContextLoaderListener; 上述第(2)項使得我們可以方便的獲取當(dāng)前程序的運行上下文,從而得到 DAO 對象以操縱數(shù)據(jù)庫。


  1. <listener>  
  2.   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  3.  </listener>  

9.添加 Hiberbate 支持

和上面的步驟類似,我們?yōu)楣こ烫砑?Hibernate 支持。同樣選擇將 Hibernate 的所有支持包拷貝到 lib 目錄下;在“配置文件”選項中,選擇使用已有的 Spring 配置文件(即上一步中的 WEB-INF/applicationContext.xml);


數(shù)據(jù)庫選用Sql Server2008,


在最后的選項窗口中,我們還要為 Hibernate 創(chuàng)建一個專用的包:點擊“Java Package”右邊的“New”按鈕,在 src 目錄下面輸入你的包名com.neuq.common即可;這個包是你以后放置 Hibernate 有關(guān)文件的包。

10.建立數(shù)據(jù)源

window-->showview-->DB Brower,在空白處右鍵,新建,選擇sqlserver驅(qū)動,填寫自己的驅(qū)動名稱,連接sqlserver2008的URLjdbc:sqlserver://localhost:1433;DatabaseName=student(其中student是數(shù)據(jù)庫的名稱),下面填寫數(shù)據(jù)庫用戶名和密碼,添加固定的連接jar包(需要自己網(wǎng)上下載)


下一步,選擇第三項,選擇自己的數(shù)據(jù)庫,點擊完成即可。

student數(shù)據(jù)庫的student表設(shè)計如下:

11.打開數(shù)據(jù)源

右擊剛才建立的數(shù)據(jù)源studentdriver,打開


12. 更為奇怪的錯誤(可能出現(xiàn))

直到目前為止,我們還沒有進行任何涉及底層數(shù)據(jù)庫操作的編碼工作,僅僅是為我們的工程添加了 Spring和 Hibernate 的支持而已。現(xiàn)在我們看看在新的支持下,原來的頁面還能正常運行否——竟然是“404”(資源無法找到)錯誤!

您可以仔細(xì)研究 Console 控制臺中顯示的異常信息,但是,我可以告訴你一個簡單得多的經(jīng)驗:這個錯誤本來不應(yīng)該發(fā)生!出錯的原因是你添加的各種支持里面所包含的 JAR 包有重復(fù)的,并且版本不一致!展開“Package Explorer”中的“Referenced Libraries”,可以看到工程中所引用的所有 JAR 包;現(xiàn)在知道為什么在前面的步驟中要將支持的 JAR 包拷貝到同一個 lib 目錄下面了吧:起碼我們檢查重復(fù) JAR 包的時候方便多了。 仔細(xì)檢查后可以發(fā)現(xiàn),“asm-2.2.3.jar”和“asm.jar”以及“cglib-nodep-2.1.3.jar”和“cglib-2.1.3.jar”是重復(fù)的;我們要 刪除這兩對中的后者,方法是:在要刪除的包上面點擊鼠標(biāo)右鍵并選擇“Build Path”—>“Remove From Build Path” 然后就可以刪除了。 再運行一下試試,如果還不行,就要按照上面第“6”步所說的方法,徹底地清空一下已經(jīng)發(fā)布的文件了。

13. 設(shè)計一個最簡單的 Table記錄顯示系統(tǒng)目的:從“student”表中讀出所有數(shù)據(jù),并顯示在頁面中。流程:

(1) 在 index3.jsp 中建立一個表單,對應(yīng)的動作是“showList”;

(2) “showList”對應(yīng)的 Java 類命名為“StudentList”,它在 Struts 的調(diào)控下獲取數(shù)據(jù)表中的記錄;

(3) “showList”執(zhí)行完畢后轉(zhuǎn)向 studentlist.jsp,在該頁面上顯示動作類獲取的數(shù)據(jù)。

14. 實現(xiàn)最簡單的 Table 記錄顯示系統(tǒng)

根據(jù)上述設(shè)計,首先修改 struts.xml 文件,添加如下的動作配置:

  1. <action name="showList" class="com.neuq.list.StudentList">  
  2.             <result name="toList">/studentlist.jsp</result>  
  3.             <result name="toFail">/fail.jsp</result>  
  4.         </action>  

然后依次編碼所需要的各個文件:首先是起始頁面 index3.jsp:

  1. <%@ page contentType="text/html; charset=UTF-8"%>  
  2. <%@ taglib prefix="s" uri="/struts-tags"%>  
  3. <html>  
  4. <body>  
  5.     <s:form action="showList">  
  6.         <s:submit value="List students"></s:submit>  
  7.     </s:form>  
  8. </body>  
  9. </html>  

這里面實際上只有一個 submit 按鈕。

然后是動作類 StudentList.java;因為該類需要讀取數(shù)據(jù)表“student”,因此在編寫該類之前需要 先對所涉及的表進行所謂“逆向工程”以生成相關(guān)的實體類和 DAO(數(shù)據(jù)存取對象)類。方法是:

(1) 在 Database Explorer 中 , 找 到 數(shù) 據(jù) 表 “student” 并 點 擊 右 鍵 , 選 擇 “ Hibernate Reverse Engineering”,設(shè)定 Java srcfolder(點擊 Browse 選擇/WarpSpeed/src)和 Java Package(創(chuàng)建的common包嗎?就是這個),勾選下面的三個復(fù)選框(其中“Create Abstract Class”不用選;這三個復(fù)選框的含義就是指定使 用逆向工程生成數(shù)據(jù)表相關(guān)的實體類或說 POJO 類以及對應(yīng)的 DAO類)。


(2) 第二頁中,比較重要的是確定 Id 生成策略,例如,如果你的主鍵是自增生成的 id,請使用 identity 策略。點擊“Next”到下一頁。

(3) 第三頁中,注意在表清單的下方,有兩個復(fù)選框,“Include referenced tables”和“Include referencing tables”,意思 是在逆向工程的時候要包含和當(dāng)前表有關(guān)聯(lián)的其他表。

執(zhí)行逆向工程后,在 Package Explorer 中可以看到 src/hib 包下面多了許多源文件,例如Student.java 是 student表對應(yīng)的實體類,而 StudentDAO.java 則是其 DAO 類。說明:DAO類:

DAO類中集成了對實體類的通用操作,例如 findAll(),findBy(),attachDirty()等;特別地,DAO 類包含一個靜態(tài)方法 用于從應(yīng)用上下文中獲取該 DAO 類的一個實例:getFromApplicationContext(ApplicationContext ctx);這樣只要我們獲取了當(dāng)前應(yīng)用的上下文(Context)后,即可取得 DAO 實例并通過該實例操作數(shù)據(jù)對象了(參見下面的步驟)。數(shù)據(jù)處理action的“三板斧”為:

(1) 獲取當(dāng)前應(yīng)用上下文;

(2) 獲取實體類的 DAO 對象實例;

(3) 使用 DAO 對象操作數(shù)據(jù);

特別提醒:在使用 DAO 對象操作數(shù)據(jù)時,經(jīng)常使用 Java的集合類對象,例如 List 等。

EmployeeList.java 核心代碼為:

  1. package com.neuq.list;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.struts2.ServletActionContext;  
  6. import org.springframework.context.ApplicationContext;  
  7. import org.springframework.web.context.support.WebApplicationContextUtils;  
  8.   
  9. import com.neuq.common.Student;  
  10. import com.neuq.common.StudentDAO;  
  11. import com.opensymphony.xwork2.ActionSupport;  
  12.   
  13. public class StudentList extends ActionSupport {  
  14.     public String execute() {  
  15.         ApplicationContext ct = WebApplicationContextUtils  
  16.                 .getWebApplicationContext(ServletActionContext  
  17.                         .getServletContext());  
  18.   
  19.         StudentDAO dao = StudentDAO.getFromApplicationContext(ct);  
  20.         List<Student> list = dao.findAll();  
  21.         int n = list.size();  
  22.         for (int i = 0; i < n; i++) {  
  23.             Student c = list.get(i);  
  24.             String name = c.getName();  
  25.             System.out.println(name);  
  26.         }  
  27.         return "toList";  
  28.     }  
  29. }  

我們暫且不實現(xiàn) studentlist.jsp,先測試一下已經(jīng)實現(xiàn)的部分: 運行工程;系統(tǒng)自動打開一個瀏覽器,其地址欄中顯示的是工程的 Web 主目錄,形如:

http://localhost/NeuqStudent/index3.jsp,即可顯示該起始頁面。點擊“List Students”按鈕,則瀏覽器提示“404” 無法找到資源錯誤(暫且不用管它,我們下面再來解決);但是你可以看到,控制臺中已經(jīng)打印出來所有的員工名單了。

15. 在結(jié)果頁面上顯示記錄

上面的實現(xiàn)還有缺陷:我們并沒有將 action 獲取的數(shù)據(jù)帶到結(jié)果頁面上。要做到這一點,必須進行兩項工作:

(1) 在 action 中將需要傳遞給結(jié)果頁面的數(shù)據(jù)聲明為類屬性并為其編寫 setter 和 getter 函數(shù)。

(2) 在頁面中使用 Struts 標(biāo)簽取出 action 傳遞過來的數(shù)據(jù)。

因此我們首先將 EmployeeList.java 做如下修改:將 list 聲明為類屬性,并為其 list 添加 getter 和 setter:

注意 execute()中對 list 引用的時候就不需要重復(fù)聲明了。

  1. package com.neuq.list;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.struts2.ServletActionContext;  
  6. import org.springframework.context.ApplicationContext;  
  7. import org.springframework.web.context.support.WebApplicationContextUtils;  
  8.   
  9. import com.neuq.common.Student;  
  10. import com.neuq.common.StudentDAO;  
  11. import com.opensymphony.xwork2.ActionSupport;  
  12.   
  13. public class StudentList extends ActionSupport {  
  14.     List<Student> list;  
  15.     StudentDAO studentDAO;  
  16.     public List<Student> getList() {  
  17.         return list;  
  18.     }  
  19.   
  20.     public void setList(List<Student> list) {  
  21.         this.list = list;  
  22.     }  
  23.   
  24.     public StudentDAO getStudentDAO() {  
  25.         return studentDAO;  
  26.     }  
  27.   
  28.     public void setStudentDAO(StudentDAO studentDAO) {  
  29.         this.studentDAO = studentDAO;  
  30.     }  
  31.   
  32.     public String execute() {  
  33.         ApplicationContext ct = WebApplicationContextUtils  
  34.                 .getWebApplicationContext(ServletActionContext  
  35.                         .getServletContext());  
  36.   
  37.         studentDAO = StudentDAO.getFromApplicationContext(ct);  
  38.         list = studentDAO.findAll();  
  39.         int n = list.size();  
  40.         for (int i = 0; i < n; i++) {  
  41.             Student c = list.get(i);  
  42.             String name = c.getName();  
  43.             System.out.println(name);  
  44.         }  
  45.         return "toList";  
  46.     }  
  47. }  

然后編寫 studentlist.jsp:

  1. <%@ page contentType="text/html; charset=UTF-8"%>  
  2. <%@ taglib prefix="s" uri="/struts-tags"%>  
  3. <html>  
  4. <body>  
  5.     <s:iterator value="list">  
  6.         studentid: <s:property value="studentid" />  
  7.         <br />  
  8.         name: <s:property value="name" />  
  9.         <br />  
  10.         department: ${department}  
  11.         <br />  
  12.         qq: <s:text name="qq" />  
  13.         <p>  
  14.     </s:iterator>  
  15.   
  16. </body>  
  17. </html>  


這里面,我們嘗試了幾種不同的表現(xiàn)方法。

首先看<s:iterator>標(biāo)簽:它的作用是遍歷由 value 指定的“集合型”對象(一般為 Map或 List 類型);在我們的例子中, 我們要遍歷的是“l(fā)ist”對象(該對象由 action 傳遞過來,對應(yīng)于 action 內(nèi)的一個類屬性)。其次要注意<s:property>標(biāo)簽,它的作用是將 iterator 中的對象的屬性取出來,即<s:property value="name"/>的作用 相當(dāng)于調(diào)用 list 的 getFirstname()方法(action 中的 getter 在這里得到了“隱形的”調(diào)用)。 從上面的代碼中可以看出,除了使用<s:property>之外,我們還嘗試了另外兩種標(biāo)簽方法,一是<s:text>,它可以生成一個國際化的信息文本;另一個是${department},用的是 OGNL 表達(dá)式語言。網(wǎng)上有爭論說,既然是 struts2,就盡量用 struts2 的標(biāo)簽;也有人說:OGNL 是主流,應(yīng)該和<s:>標(biāo)簽配合使用;請自行深入學(xué)習(xí)后選擇。

16.Spring與struts結(jié)合

(1)復(fù)制文件。復(fù)制struts2-spring-plugin-x-x-x.jar到WEB-INF/lib目錄下。其中的x對應(yīng)了Spring的版本號。還需要復(fù)制commons-logging.jar文件到WEB-INF/lib目錄下。

(2)配置struts.objectFactory屬性值。在struts.properties中設(shè)置struts.objectFactory屬性值:

struts.objectFactory = spring

或者在XML文件中進行常量配置:

  1. <struts>  
  2.        <constant name="struts.objectFactory" value="spring" />  
  3. </struts>  
(3)修改Spring配置文件applicationcontext.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:p="http://www.springframework.org/schema/p"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  7.   
  8.   
  9.     <bean id="dataSource"  
  10.         class="org.apache.commons.dbcp.BasicDataSource">  
  11.         <property name="driverClassName"  
  12.             value="com.microsoft.sqlserver.jdbc.SQLServerDriver">  
  13.         </property>  
  14.         <property name="url"  
  15.             value="jdbc:sqlserver://localhost:1433;DatabaseName=student">  
  16.         </property>  
  17.         <property name="username" value="sa"></property>  
  18.         <property name="password" value="123456"></property>  
  19.     </bean>  
  20.     <bean id="sessionFactory"  
  21.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  22.         <property name="dataSource">  
  23.             <ref bean="dataSource" />  
  24.         </property>  
  25.         <property name="hibernateProperties">  
  26.             <props>  
  27.                 <prop key="hibernate.dialect">  
  28.                     org.hibernate.dialect.SQLServerDialect  
  29.                 </prop>  
  30.             </props>  
  31.         </property>  
  32.         <property name="mappingResources">  
  33.             <list>  
  34.                 <value>com/neuq/common/Student.hbm.xml</value></list>  
  35.         </property></bean>  
  36.     <bean id="studentDAO" class="com.neuq.common.StudentDAO">  
  37.         <property name="sessionFactory">  
  38.             <ref bean="sessionFactory" />  
  39.         </property>  
  40.     </bean>  
  41.     <bean id="studentList" class="com.neuq.list.StudentList">  
  42.         <property name="studentDAO">  
  43.             <ref bean="studentDAO" />  
  44.         </property>  
  45.     </bean>  
  46.     </beans>  

注意將原來的bean id="StudentDAO"改成了bean id="studentDAO",并且要將對應(yīng)的StudentDAO.java中最后的getFromApplicationContext函數(shù)改為

  1. public static StudentDAO getFromApplicationContext(ApplicationContext ctx) {  
  2.         return (StudentDAO) ctx.getBean("studentDAO");  
  3.     }  
再次部署運行,成功!

關(guān)于Spring如何與struts2結(jié)合,參見http://hi.baidu.com/z57354658/blog/item/c8085234a431a1b0d1a2d36c.html  

至此,關(guān)于簡單的ssh開發(fā)就介紹到這里,筆者小白剛接觸此架構(gòu)不久,愿意與大家共同討論,第一次寫博文,希望錯誤之處大家指出啦~~


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
SSH架構(gòu)編程,一鍵搞定,申請加(精華帖)
作業(yè) - JAVA日志 - BlogJava
基于 Struts 2 構(gòu)建 WebSphere Portal 上的 Portlet 應(yīng)用
集成JSP/JSF和XML/XSLT
MyEclipse下開發(fā)JSF(2)
Struts2 Hibernate開發(fā)筆記(一) - Java企業(yè)開發(fā)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服