因為你學(xué)習(xí)了 Struts 2 架構(gòu),當(dāng)你在 Struts 2 web 應(yīng)用程序中點擊一個超鏈接或者提交一個 HTML 表單時,控制器會收集輸入并且發(fā)送到一個稱作 Actions 的 Java 類。當(dāng) Action 執(zhí)行后,結(jié)果選擇一個資源來顯現(xiàn)響應(yīng)。資源通常是一個 JSP,但是它也可以是一個 PDF 文件,Excel 電子表格或者 Java applet 窗口。
假設(shè)你已經(jīng)建立了開發(fā)環(huán)境?,F(xiàn)在讓我們繼續(xù)建立我們的第一個 Hello World struts2 項目。這個項目的目的是建立一個 Web 應(yīng)用程序,該項目收集用戶的姓名,并且在用戶名后面顯示 “Hello World”。為了任何的 Struct 2 項目,我們將必須創(chuàng)建四個組件:
序號 | 組件 & 描述 |
---|---|
1 |
動作
創(chuàng)建一個包含完整的業(yè)務(wù)邏輯和控制用戶,模型和視圖之間的交互的動作類。 |
2 |
攔截器
如果需要,則創(chuàng)建攔截器,或者使用已存在的攔截器。這是控制器的部分。 |
3 |
視圖
創(chuàng)建一個與用戶交互的 JSPs,它接受輸入并且顯示最后的信息。 |
4 |
配置文件
創(chuàng)建連接動作,視圖和控制器的配置文件。這些文件是 struts.xml,web.xml,struts.properties。 |
我將使用 Eclipse IDE,所以在一個動態(tài) Web 項目中所有必需的組件都將會被創(chuàng)建。因此,讓我們開始創(chuàng)建一個動態(tài) Web 項目。
啟動你的 Eclipse,然后使用 File > New > Dynamic Web Project,并且輸入項目名稱為 HelloWorldStruts2,根據(jù)下面畫面中給出的選項設(shè)置其他的選項:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts1.jpg" alt="" />
在下面的畫面中選擇所有的默認(rèn)選項,最后檢查 Generate Web.xml deployment descriptor 選項。這將在 Eclipse 中創(chuàng)建一個動態(tài) web 項目?,F(xiàn)在使用 Windows > Show View > Project Explorer,你會看到一些東西在你的項目窗口中,如下所示:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts2.jpg" alt="" />
現(xiàn)在從 struts 2 lib 文件夾 C:\struts-2.2.3\lib 中復(fù)制下列文件到我們項目的 WEB-INF\lib 文件夾中。為了做到這個,你可以簡單地把所有的下列文件拖拽到 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)鍵,并且我們在 action 類中實現(xiàn)大部分的業(yè)務(wù)邏輯。所以讓我們在 Java Resources > src 下的包名 com.tutorialspoint.struts2 中創(chuàng)建一個java 文件 HelloWorldAction.java,下面給出它的內(nèi)容。
當(dāng)用戶點擊一個 URL 時,Action 類響應(yīng)用戶動作。執(zhí)行一個或多個 Action 類中的方法并且返回一個字符串結(jié)果。基于結(jié)果的值,將呈現(xiàn)一個指定的 JSP 頁面。
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;
}
}
它是一個非常簡單的帶有一個名為 “name” 屬性的類。對于 “name” 屬性,我們有標(biāo)準(zhǔn)的 getter 和 setter 方法,還有返回字符串 “success” 的執(zhí)行方法。
Struts 2 框架將創(chuàng)建一個 HelloWorldAction 類的對象并且為了響應(yīng)用戶的動作調(diào)用執(zhí)行方法。你把業(yè)務(wù)邏輯放在執(zhí)行方法中,最后返回字符串常量。簡單地說為了每個網(wǎng)址,你將必須實現(xiàn)一個動作類,你可以直接使用這個類名作為你的動作名,或者你也可以使用 struts.xml 文件映射到其他的名字,如下所示。
我們需要一個 JSP 提交最后的信息,當(dāng)一個預(yù)定義的動作發(fā)生時,這個頁面會被 Struts 2 框架調(diào)用,這種映射將被定義在 struts.xml 文件中。所以讓我們在 Eclipse 項目的 WebContent 文件夾中創(chuàng)建下面的 jsp 文件 HelloWorld.jsp。為了做到這個,在項目資源管理器的 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)簽庫指令告訴 Servlet 容器這個頁面將使用 Struts 2 的標(biāo)簽,而且這些標(biāo)簽將在 s 之前。 s:property 標(biāo)簽顯示動作類屬性 "name> 的值,它是由 HelloWorldAction 類的 getName() 方法返回的。
我們還需要在 WebContent 文件夾中創(chuàng)建 index.jsp。這個文件將作為初始動作 URL,用戶可以點擊它來告訴 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 動作映射到 HelloWorldAction 類和它的執(zhí)行方法中。當(dāng)用戶點擊提交按鈕時,將引起 Struts 2 框架運行在 HelloWorldAction 類中定義的執(zhí)行方法,根據(jù)方法的返回值一個適當(dāng)?shù)囊晥D將被作為響應(yīng)進(jìn)行選擇和呈現(xiàn)。
我們需要一個將 URL,HelloWorldAction 類(模型)和 HelloWorld.jsp(視圖)連結(jié)在一起的映射。該映射告訴 Struts 2 框架哪個類將響應(yīng)用戶的動作(URL),這個類的哪個方法將被執(zhí)行,根據(jù)方法返回的字符串結(jié)果將呈現(xiàn)什么視圖。
因此,讓我們創(chuàng)建一個名為 struts.xml 的文件。由于 Struts 2 需要在類文件夾下展示 struts.xml。所以在 WebContent/WEB-INF/classes 文件夾下創(chuàng)建 struts.xml 文件。默認(rèn)的情況下,Eclipse 不會創(chuàng)建 “classes” 文件夾,所以需要自己創(chuàng)建。為了做到這個,在項目資源管理器的 WEB-INF 文件夾上點擊右鍵,并選擇 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)于上述配置文件有幾點需要注意。在這里我們設(shè)置常量 struts.devMode 為 true,是因為我們正工作在程序開發(fā)環(huán)境中,我們需要看到一些有用的日志信息。然后,我們定義了一個名為 helloworld 的包。當(dāng)你想要把你的動作分成一組時,創(chuàng)建一個包是有用的。在我們的例子中,我們命名我們的動作為 “hello”,它對應(yīng)著 URL /hello.action 和通過 HelloWorldAction.class 進(jìn)行備份。當(dāng) URL /hello.action 調(diào)用時,HelloWorldAction.class 的執(zhí)行方法是運行的方法。如果執(zhí)行方法的結(jié)果返回 “success”,然后我們把 HelloWorld.jsp 呈現(xiàn)給用戶。
下一步是創(chuàng)建一個 web.xml 文件,它是一個任何對 Struts 2 請求的入口點。Struts2 應(yīng)用程序的入口點將是一個在部署描述符(web.xml)中定義的過濾器。因此,我們將在 web.xml 中定義一個 oforg.apache.struts2.dispatcher.FilterDispatcher 類。 web.xml 文件需要在 WebContent的WEB-INF 文件夾下創(chuàng)建。當(dāng)你創(chuàng)建項目時,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 的過濾器來運行所有的 URL(即任何匹配模式 /* 的 URL)。
你可以啟用完整的日志記錄功能,而通過在 WEB-INF/classes 文件夾下創(chuàng)建 logging.properties 文件使用 Struts 2 工作。在你的屬性文件中保留下面兩行語句:
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \
java.util.logging.ConsoleHandler
默認(rèn)的 logging.properties 指定一個 ConsoleHandler 用于把路由記錄發(fā)送到 stdout,也指定一個 FileHandler??梢允褂?SEVERE,WARNING,INFO,CONFIG,F(xiàn)INE,F(xiàn)INER,F(xiàn)INEST 或 ALL 設(shè)置處理程序的日志級別的閾值。
就是這樣。我們已經(jīng)準(zhǔn)備好使用 Struts 2 框架來運行我們的 Hello World 應(yīng)用程序。
在項目名稱上點擊右鍵,并且單擊 Export > WAR File 來創(chuàng)建一個 War 文件。然后在 Tomcat 的 webapps 目錄下部署這個 WAR。最后,啟動 Tomca t服務(wù)器和嘗試訪問 URL http://localhost:8080/HelloWorldStruts2/index.jsp
. 將會給出下面的畫面:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts4.jpg" alt="" />
輸入一個值 “Struts2”,并且提交頁面。你應(yīng)該看到下一個頁面:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts5.jpg" alt="" />
注意,你可以在 struts.xml 文件中定義索引作為一個動作。在這種情況下,你可以調(diào)用索引頁面 http://localhost:8080/HelloWorldStruts2/index.action/
檢查下面如何定義索引作為一個動作:
<?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>