因?yàn)槟銓W(xué)習(xí)了 Struts 2 架構(gòu),當(dāng)你在 Struts 2 web 應(yīng)用程序中點(diǎn)擊一個(gè)超鏈接或者提交一個(gè) HTML 表單時(shí),控制器會(huì)收集輸入并且發(fā)送到一個(gè)稱作 Actions 的 Java 類。當(dāng) Action 執(zhí)行后,結(jié)果選擇一個(gè)資源來(lái)顯現(xiàn)響應(yīng)。資源通常是一個(gè) JSP,但是它也可以是一個(gè) PDF 文件,Excel 電子表格或者 Java applet 窗口。
假設(shè)你已經(jīng)建立了開(kāi)發(fā)環(huán)境。現(xiàn)在讓我們繼續(xù)建立我們的第一個(gè) Hello World struts2 項(xiàng)目。這個(gè)項(xiàng)目的目的是建立一個(gè) Web 應(yīng)用程序,該項(xiàng)目收集用戶的姓名,并且在用戶名后面顯示 “Hello World”。為了任何的 Struct 2 項(xiàng)目,我們將必須創(chuàng)建四個(gè)組件:
序號(hào) | 組件 & 描述 |
---|---|
1 |
動(dòng)作
創(chuàng)建一個(gè)包含完整的業(yè)務(wù)邏輯和控制用戶,模型和視圖之間的交互的動(dòng)作類。 |
2 |
攔截器
如果需要,則創(chuàng)建攔截器,或者使用已存在的攔截器。這是控制器的部分。 |
3 |
視圖
創(chuàng)建一個(gè)與用戶交互的 JSPs,它接受輸入并且顯示最后的信息。 |
4 |
配置文件
創(chuàng)建連接動(dòng)作,視圖和控制器的配置文件。這些文件是 struts.xml,web.xml,struts.properties。 |
我將使用 Eclipse IDE,所以在一個(gè)動(dòng)態(tài) Web 項(xiàng)目中所有必需的組件都將會(huì)被創(chuàng)建。因此,讓我們開(kāi)始創(chuàng)建一個(gè)動(dòng)態(tài) Web 項(xiàng)目。
啟動(dòng)你的 Eclipse,然后使用 File > New > Dynamic Web Project,并且輸入項(xiàng)目名稱為 HelloWorldStruts2,根據(jù)下面畫(huà)面中給出的選項(xiàng)設(shè)置其他的選項(xiàng):
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts1.jpg" alt="" />
在下面的畫(huà)面中選擇所有的默認(rèn)選項(xiàng),最后檢查 Generate Web.xml deployment descriptor 選項(xiàng)。這將在 Eclipse 中創(chuàng)建一個(gè)動(dòng)態(tài) web 項(xiàng)目?,F(xiàn)在使用 Windows > Show View > Project Explorer,你會(huì)看到一些東西在你的項(xiàng)目窗口中,如下所示:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts2.jpg" alt="" />
現(xiàn)在從 struts 2 lib 文件夾 C:\struts-2.2.3\lib 中復(fù)制下列文件到我們項(xiàng)目的 WEB-INF\lib 文件夾中。為了做到這個(gè),你可以簡(jiǎn)單地把所有的下列文件拖拽到 WEB-INF\lib 文件夾中。
commons-fileupload-x.y.z.jar
commons-io-x.y.z.jar
commons-lang-x.y.jar
commons-logging-x.y.z.jar
commons-logging-api-x.y.jar
freemarker-x.y.z.jar
javassist-.xy.z.GA
ognl-x.y.z.jar
struts2-core-x.y.z.jar
Action 類是 Struts 2 應(yīng)用程序的關(guān)鍵,并且我們?cè)?action 類中實(shí)現(xiàn)大部分的業(yè)務(wù)邏輯。所以讓我們?cè)?Java Resources > src 下的包名 com.tutorialspoint.struts2 中創(chuàng)建一個(gè)java 文件 HelloWorldAction.java,下面給出它的內(nèi)容。
當(dāng)用戶點(diǎn)擊一個(gè) URL 時(shí),Action 類響應(yīng)用戶動(dòng)作。執(zhí)行一個(gè)或多個(gè) Action 類中的方法并且返回一個(gè)字符串結(jié)果?;诮Y(jié)果的值,將呈現(xiàn)一個(gè)指定的 JSP 頁(yè)面。
package com.tutorialspoint.struts2;
public class HelloWorldAction{
private String name;
public String execute() throws Exception {
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
它是一個(gè)非常簡(jiǎn)單的帶有一個(gè)名為 “name” 屬性的類。對(duì)于 “name” 屬性,我們有標(biāo)準(zhǔn)的 getter 和 setter 方法,還有返回字符串 “success” 的執(zhí)行方法。
Struts 2 框架將創(chuàng)建一個(gè) HelloWorldAction 類的對(duì)象并且為了響應(yīng)用戶的動(dòng)作調(diào)用執(zhí)行方法。你把業(yè)務(wù)邏輯放在執(zhí)行方法中,最后返回字符串常量。簡(jiǎn)單地說(shuō)為了每個(gè)網(wǎng)址,你將必須實(shí)現(xiàn)一個(gè)動(dòng)作類,你可以直接使用這個(gè)類名作為你的動(dòng)作名,或者你也可以使用 struts.xml 文件映射到其他的名字,如下所示。
我們需要一個(gè) JSP 提交最后的信息,當(dāng)一個(gè)預(yù)定義的動(dòng)作發(fā)生時(shí),這個(gè)頁(yè)面會(huì)被 Struts 2 框架調(diào)用,這種映射將被定義在 struts.xml 文件中。所以讓我們?cè)?Eclipse 項(xiàng)目的 WebContent 文件夾中創(chuàng)建下面的 jsp 文件 HelloWorld.jsp。為了做到這個(gè),在項(xiàng)目資源管理器的 WebContent 文件夾上單擊右鍵,選擇 New >JSP File。
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Hello World</title> </head> <body> Hello World, <s:property value="name"/> </body> </html>
標(biāo)簽庫(kù)指令告訴 Servlet 容器這個(gè)頁(yè)面將使用 Struts 2 的標(biāo)簽,而且這些標(biāo)簽將在 s 之前。 s:property 標(biāo)簽顯示動(dòng)作類屬性 "name> 的值,它是由 HelloWorldAction 類的 getName() 方法返回的。
我們還需要在 WebContent 文件夾中創(chuàng)建 index.jsp。這個(gè)文件將作為初始動(dòng)作 URL,用戶可以點(diǎn)擊它來(lái)告訴 Struts 2 框架調(diào)用 HelloWorldAction 類定義的方法,并且呈現(xiàn)給 HelloWorld.jsp 視圖。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Hello World</title> </head> <body> <h1>Hello World From Struts2</h1> <form action="hello"> <label for="name">Please enter your name</label><br/> <input type="text" name="name"/> <input type="submit" value="Say Hello"/> </form> </body> </html>
使用 struts.xml 文件將把在上面的視圖文件中定義的 hello 動(dòng)作映射到 HelloWorldAction 類和它的執(zhí)行方法中。當(dāng)用戶點(diǎn)擊提交按鈕時(shí),將引起 Struts 2 框架運(yùn)行在 HelloWorldAction 類中定義的執(zhí)行方法,根據(jù)方法的返回值一個(gè)適當(dāng)?shù)囊晥D將被作為響應(yīng)進(jìn)行選擇和呈現(xiàn)。
我們需要一個(gè)將 URL,HelloWorldAction 類(模型)和 HelloWorld.jsp(視圖)連結(jié)在一起的映射。該映射告訴 Struts 2 框架哪個(gè)類將響應(yīng)用戶的動(dòng)作(URL),這個(gè)類的哪個(gè)方法將被執(zhí)行,根據(jù)方法返回的字符串結(jié)果將呈現(xiàn)什么視圖。
因此,讓我們創(chuàng)建一個(gè)名為 struts.xml 的文件。由于 Struts 2 需要在類文件夾下展示 struts.xml。所以在 WebContent/WEB-INF/classes 文件夾下創(chuàng)建 struts.xml 文件。默認(rèn)的情況下,Eclipse 不會(huì)創(chuàng)建 “classes” 文件夾,所以需要自己創(chuàng)建。為了做到這個(gè),在項(xiàng)目資源管理器的 WEB-INF 文件夾上點(diǎn)擊右鍵,并選擇 New > Folder。struts.xml 中應(yīng)該像這樣:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="hello"
class="com.tutorialspoint.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
關(guān)于上述配置文件有幾點(diǎn)需要注意。在這里我們?cè)O(shè)置常量 struts.devMode 為 true,是因?yàn)槲覀冋ぷ髟诔绦蜷_(kāi)發(fā)環(huán)境中,我們需要看到一些有用的日志信息。然后,我們定義了一個(gè)名為 helloworld 的包。當(dāng)你想要把你的動(dòng)作分成一組時(shí),創(chuàng)建一個(gè)包是有用的。在我們的例子中,我們命名我們的動(dòng)作為 “hello”,它對(duì)應(yīng)著 URL /hello.action 和通過(guò) HelloWorldAction.class 進(jìn)行備份。當(dāng) URL /hello.action 調(diào)用時(shí),HelloWorldAction.class 的執(zhí)行方法是運(yùn)行的方法。如果執(zhí)行方法的結(jié)果返回 “success”,然后我們把 HelloWorld.jsp 呈現(xiàn)給用戶。
下一步是創(chuàng)建一個(gè) web.xml 文件,它是一個(gè)任何對(duì) Struts 2 請(qǐng)求的入口點(diǎn)。Struts2 應(yīng)用程序的入口點(diǎn)將是一個(gè)在部署描述符(web.xml)中定義的過(guò)濾器。因此,我們將在 web.xml 中定義一個(gè) oforg.apache.struts2.dispatcher.FilterDispatcher 類。 web.xml 文件需要在 WebContent的WEB-INF 文件夾下創(chuàng)建。當(dāng)你創(chuàng)建項(xiàng)目時(shí),Eclipse 已經(jīng)創(chuàng)建了初始的 web.xml 文件。所以,我們只需要修改它,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
我們已經(jīng)指定 index.jsp 為我們的 welcome 文件。然后我們已經(jīng)配置了 Struts2 的過(guò)濾器來(lái)運(yùn)行所有的 URL(即任何匹配模式 /* 的 URL)。
你可以啟用完整的日志記錄功能,而通過(guò)在 WEB-INF/classes 文件夾下創(chuàng)建 logging.properties 文件使用 Struts 2 工作。在你的屬性文件中保留下面兩行語(yǔ)句:
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \
java.util.logging.ConsoleHandler
默認(rèn)的 logging.properties 指定一個(gè) ConsoleHandler 用于把路由記錄發(fā)送到 stdout,也指定一個(gè) FileHandler??梢允褂?SEVERE,WARNING,INFO,CONFIG,F(xiàn)INE,F(xiàn)INER,F(xiàn)INEST 或 ALL 設(shè)置處理程序的日志級(jí)別的閾值。
就是這樣。我們已經(jīng)準(zhǔn)備好使用 Struts 2 框架來(lái)運(yùn)行我們的 Hello World 應(yīng)用程序。
在項(xiàng)目名稱上點(diǎn)擊右鍵,并且單擊 Export > WAR File 來(lái)創(chuàng)建一個(gè) War 文件。然后在 Tomcat 的 webapps 目錄下部署這個(gè) WAR。最后,啟動(dòng) Tomca t服務(wù)器和嘗試訪問(wèn) URL http://localhost:8080/HelloWorldStruts2/index.jsp
. 將會(huì)給出下面的畫(huà)面:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts4.jpg" alt="" />
輸入一個(gè)值 “Struts2”,并且提交頁(yè)面。你應(yīng)該看到下一個(gè)頁(yè)面:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts5.jpg" alt="" />
注意,你可以在 struts.xml 文件中定義索引作為一個(gè)動(dòng)作。在這種情況下,你可以調(diào)用索引頁(yè)面 http://localhost:8080/HelloWorldStruts2/index.action/
檢查下面如何定義索引作為一個(gè)動(dòng)作:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="index">
<result >/index.jsp</result>
</action>
<action name="hello"
class="com.tutorialspoint.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>