Struts是應用較爲廣泛的MVC框架,對servlet作了較好的封裝,可以快速的實現MVC模式及攔截器等功能,並且可以方便的和spring結合使用。本文將對struts2的基本配置進行簡單說明(這裏僅涉及純Struts2配置,不涉及與Spring的整合)。
首先下載並應用struts2的jar包,官網地址http://struts.apache.org/,本配置說明基於struts2.1.8版本。需要說明的是,Struts2與原Struts1完全不同,Struts2已經整合了xwork,並且已經完全重構,整個Struts2包括一個struts2-core-2.1.8.1.jar核心包和十幾個plugin插件包,使用不同的插件包,在配置上略有不同,需要根據實際需要對插件包進行功能裁剪,否則很可能發生配置錯誤而無法運行。
1.創建一個Action。創建一個Action比較簡單,類型擴展自com.opensymphony.xwork2.ActionSupport類型,然後在類型中實現execute方法即可。
package com.test.action; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class ActionTestAction extends ActionSupport { private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String execute() { //do something here userName = "Your Name is somebody!"; return this.SUCCESS; } }
2.創建jsp視圖。創建一個普通的jsp頁面ActionTest.jsp作爲輸出視圖。在視圖中進行邏輯控制和數據輸出就需要使用Struts標籤了。Struts標籤需要在頁面上先聲明,然後就可以直接使用struts標籤訪問Action中的各個get屬性了。JSP視圖如下:
<?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Insert title here</title> </head> <body> 下面是action屬性輸出:<br /> <s:property value="userName" /> </body> </html>
3.配置struts的配置文件。struts配置文件可以是任意名稱存放到任意位置,但爲了方便加載和維護,一般使用struts的默認配置名稱和默認加載位置。默認配置名稱爲struts.xml,默認加載位置爲webroot/WEB-INF/classes/struts.xml。配置文件實現由action到jsp視圖的映射,內容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- include節點是struts2中組件化的方式 可以將每個功能模塊獨立到一個xml配置文件中 然後用include節點引用 --> <include file="struts-default.xml"></include> <constant name="struts.devMode" value="true" /> <constant name="struts.ui.theme" value="simple" /> <constant name="struts.enable.SlashesInActionNames" value="true" /> <constant name="struts.multipart.maxSize" value="20000000"></constant> <package name="strutsTest" extends="struts-default" abstract="true"> <!-- 定義默認的攔截器 每個Action都會自動引用,如果Action中引用了其它的攔截器 默認的攔截器將無效 --> <default-interceptor-ref name="defaultStack"></default-interceptor-ref> <global-results> <result name="error">/error.jsp</result> <result name="text" type="plainText"></result> </global-results> </package> <package name="test" extends="strutsTest" namespace="/"> <action name="ActionTest" class="com.test.action.ActionTestAction"> <result name="input">/ActionTest.jsp</result> <result name="success" type="dispatcher">/ActionTest.jsp</result> </action> </package> </struts>
在struts.xml中配置了一些全局參數和一個全局的頂級package——strutsTest(從struts-default擴展),然後又從strutsTest擴展了另一個package——test,在test Package中配置了action ActionTest,該action由com.test.action.ActionTestAction類實現,success視圖映射到/ActionTest.jsp文件。
4.配置web.xml。struts.xml文件配置完成以後,需要在web.xml中配置struts的過濾器。struts並沒有使用servlet和servlet-mapping,而是使用filter和filter-mapping,配置內容如下:
<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>*.action</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/struts/*</url-pattern> </filter-mapping>
一般並不需要所有的請求都經過struts(像css、js、gif、jsp等文件並不需要由struts來處理),因此在url-pattern中最好使用後綴匹配策略,所有需要struts處理的url請求都使用相同的後綴,後綴名稱可以是任意字符串,但一般會使用.action或.do或其它非後綴形式的特徵字符串。需要注意的是有一些資源是在struts的jar包中的,對於這些資源的請求也需要由struts來處理,否則會出現無法找到腳本、css、模板等錯誤,這些資源都通過“/struts/”來訪問,這裏配置爲“/struts/*”即可。
經過以上的配置,在瀏覽器中用http://127.0.0.1:8080/jtest/ActionTest.action來訪問該action,頁面輸出:
下面是action屬性輸出: Your Name is somebody!
前面已經提過到過,如果加入了不同的struts插件,那麼在配置上會有一些細微的差別。如果沒有整合Spring框架,那麼就不要引入struts2-spring-plugin-2.1.8.1.jar包,否則會出現com/opensymphony/xwork2/spring/SpringObjectFactory.getClassInstance找不到對象工廠的異常。如果用到json並引入了struts2-json-plugin-2.1.8.1.jar包,那麼在配置頂級package包時就不是從struts-default擴展了,而是從json-default擴展。這些細節雖小,但如果不注意很能導致struts無法啓動運行。
完