鍍金池/ 教程/ Java/ 實(shí)例
注釋
主題/模板
驗(yàn)證
有用的資源
Struts 2 注解類型
實(shí)例
攔截器
異常處理
表單標(biāo)簽
結(jié)果類型
值棧/OGNL
Spring 集成
數(shù)據(jù)標(biāo)簽
環(huán)境配置
配置
類型轉(zhuǎn)換
動(dòng)作
Hibernate 集成
本地化
發(fā)送郵件
Ajax 標(biāo)簽
數(shù)據(jù)庫(kù)訪問(wèn)
體系結(jié)構(gòu)
文件上傳
Tiles 集成
概述
基本的 MVC 架構(gòu)
控制標(biāo)簽

實(shí)例

因?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)目。

創(chuàng)建動(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

  • xwork-core.x.y.z.jar

創(chuàng)建 Action 類

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 文件映射到其他的名字,如下所示。

創(chuàng)建視圖

我們需要一個(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() 方法返回的。

創(chuàng)建主頁(yè)

我們還需要在 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.devModetrue,是因?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)。

啟用詳細(xì)日志

你可以啟用完整的日志記錄功能,而通過(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)用程序。

執(zhí)行應(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>