Struts2配置文件詳解

解決在斷網環境下,配置文件無提示的問題
我們可以看到Struts.xml在斷網的情況下,前面有一個嘆號,這時,我們按alt+/ 沒有提示,這是因為” http://struts.apache.org/dtds/struts-2.0.dtd”是一個網絡地址,如果上網的話,IDE會自動幫我們下載此文件,如果斷網就沒有辦法了,但是我們還是有解決方法的.
首先在源碼包里找到struts-2.0.dtd這個文件
在MyEclipse中菜單欄中選擇:windowPreferencesMyEclipseFiles and Editors
Xmlxml Catalog在右邊的下拉框中選擇User Specified Entries點擊Add按鈕左邊選中Catalog Entry右邊的location中點擊File System在彈出的對話框中將搜索到的文件全路徑復制上去,并選中struts-2.0.dtd在key type下拉框中選擇URIkey文本框中填寫: http://struts.apache.org/dtds/struts-2.0.dtd ,點擊OK即可. 這時我們可以看到Struts.xml文件中還有嘆號,我們可以在Struts標簽與package標簽中打入一個回車后保存即可.

首先,我們先配置一個HelloWorld程序
環境的搭建和前面講的一模一樣,導6個jar包,復制struts.xml文件到src目錄下,改寫web.xml文件,將struts整合到web工程中,這里就不再演示
以下是代碼:
Chapter1Action
package chapter1.action;

public class Chapter1Action {
private String message;

public String getMessage() {
return message;
}

public String execute() {
message = "我的第一個Struts2程序";
return "success";
}
}

Struts.xml
<?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.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="false"/>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.serve.static.browserCache" value="false"/>

<include file="chapter1.xml"/>
</struts>

chapter1.xml
<?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>
<package name="chapter1" namespace="/chapter1" extends="struts-default">
<action name="HelloWorld" class="chapter1.action.Chapter1Action" method="execute">
<result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result>
</action>
</package>
</struts>

HelloWorld.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>HelloWorld</title>
</head>
<body>
${message}
</body>
</html>

問題一:大家可以看到這里用到了EL表達式,我們知道EL表達式只能取出page,request,session,application四個范圍之一里面的數據,但是我這里并沒有將任何數據放入到四個范圍中,為什么這里能夠取出數據來呢?

問題二: Chapter1Action是一個非常普通的類,它不是Servlet,為什么能夠處理用戶的請求呢?

Struts2用于處理用戶請求的Action,沒有與Servlet API耦合,顯示無法處理用戶請求,而Struts2提供了系列攔截器,該系列攔截器負責將HttpServletRequest請求中的請求參數解析出來,傳入到Action中,并調用Action的execute方法來處理用戶的請求.

Struts.xml配置中包與action的介紹
<package name="chapter1" namespace="/chapter1" extends="struts-default">
<action name="HelloWorld" class="chapter1.action.Chapter1Action" method="execute">
<result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result>
</action>
</package>

Struts2框架中使用包來管理action,避免了Servlet在web.xml中難以管理的與維護的局面.包的作用和java中的類包是非常類似的,它主要用于管理一組業務功能相關的action,在實際應用中,我們應該把一組業務功能相關的action 放在同一個包下.

配置包時必須指定name屬性,該name屬性值可以任意取名,但必須唯一,如果其他包要繼承該包,必須通過該屬性進行引用,包的namespace屬性用于定義該包的命名空間,命名空間作用為訪問該包下的action路徑的一部分,見示例.namespace屬性可以不配置,如果不指定該屬性,默認的命名空間為””

通常每個包都應該繼承struts-default包,因為struts2很多核心功能都是攔截來實現的,如,從請求中把請求參數封閉到action,文件上傳和數據驗證等都是通過攔截器實現的,struts-default定義了這些攔截器和Result類型,可以這么說,當包繼承了struts-default才能使用struts2提供的核心功能,struts-default包是在struts2-core-2.xx.jar文件中的struts-defalut.xml中定義,struts-default.xml也是struts2默認配置文件,struts2每次都會自動加載struts-default.xml文件.

package還有一個abstract=”true”屬性,指定此包為抽象包,和抽象類的概念差不多,說明此包只能被其他包繼承,則它里面不允許包含action元素.

<action name="HelloWorld" class="chapter1.action.Chapter1Action" method="execute">
<result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result>
</action>
Action 元素method屬性,默認值為method=”execute”,也就是當action接收到請求后,交給哪個方法去處理,默認的是交給execute方法去處理,當然,也可以交給其他方法,后面會講解到.

<result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result>
result元素主要定義視圖的跳轉和返回的行為及類型,后面會詳細介紹.

struts.xml文件的分離
從上一個項目實踐中可以看到,我們的web.xml文件非常之大,到后來是越來越難的查找與維護,看得頭都是大的,Struts2配置文件可以分離,很好的解決了此問題.
通過主次配置文件的分離,可以加強團隊間的合作,并且互不打擾彼此的配置文件,出了問題也知道責任在哪里.
在實例開發中也是這樣做的,通過一個主文件中,打開全局開關,引入其他子配置文件,如:
<?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.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="false"/>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.serve.static.browserCache " value="false"/>

<include file="chapter1.xml"/>
</struts>

常用開關的介紹
<constant name="struts.i18n.encoding" value="UTF-8"/>
指定Web應用的默認編碼集,相當于調用HttpServletRequest的setCharacterEncoding方法

<constant name="struts.action.extension" value="do"/>
該屬性指定需要Struts 2處理的請求后綴,該屬性的默認值是action,即所有匹配*.action的請求都由Struts 2處理。 如果用戶需要指定多個請求后綴,則多個后綴之間以英文逗號(,)隔開。

<constant name="struts.serve.static.browserCache " value="false"/>
設置瀏覽器是否緩存靜態內容,默認值為true,開發階段最好false

<constant name="struts.configuration.xml.reload" value="true"/>
當struts的配置文件修改后,系統是否自動重新加載該文件,默認值為false,開發階段最好true

<constant name="struts.devMode" value="true"/>
開發模式下設為true,這樣可以打印出更詳細的錯誤信息

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
動態方法調用,可以解決多個請求對應一個Servlet的問題,后面詳細講解,默認為true,關閉則設為false.

這里只是列舉了一些常用的開關,當然還有許多其他的開關,后面的學習中會逐漸介紹,大家在這里先了解一下.

以下是從網上摘得的,比較全的一個資料
struts.serve.static.browserCache 該屬性設置瀏覽器是否緩存靜態內容。當應用處于開發階段時,我們希望每次請求都獲得服務器的最新響應,則可設置該屬性為false。

struts.enable.DynamicMethodInvocation 該屬性設置Struts 2是否支持動態方法調用,該屬性的默認值是true。如果需要關閉動態方法調用,則可設置該屬性為false。

struts.enable.SlashesInActionNames 該屬性設置Struts 2是否允許在Action名中使用斜線,該屬性的默認值是false。如果開發者希望允許在Action名中使用斜線,則可設置該屬性為true。

struts.tag.altSyntax 該屬性指定是否允許在Struts 2標簽中使用表達式語法,因為通常都需要在標簽中使用表達式語法,故此屬性應該設置為true,該屬性的默認值是true。

struts.devMode該屬性設置Struts 2應用是否使用開發模式。如果設置該屬性為true,則可以在應用出錯時顯示更多、更友好的出錯提示。該屬性只接受true和flase兩個值,該屬性的默認值是false。通常,應用在開發階段,將該屬性設置為true,當進入產品發布階段后,則該屬性設置為false。

struts.i18n.reload該屬性設置是否每次HTTP請求到達時,系統都重新加載資源文件。該屬性默認值是false。在開發階段將該屬性設置為true會更有利于開發,但在產品發布階段應將該屬性設置為false。

提示 開發階段將該屬性設置了true,將可以在每次請求時都重新加載國際化資源文件,從而可以讓開發者看到實時開發效果;產品發布階段應該將該屬性設置為false,是為了提供響應性能,每次請求都需要重新加載資源文件會大大降低應用的性能。

struts.ui.theme該屬性指定視圖標簽默認的視圖主題,該屬性的默認值是xhtml。

struts.ui.templateDir該屬性指定視圖主題所需要模板文件的位置,該屬性的默認值是template,即默認加載template路徑下的模板文件。

struts.ui.templateSuffix該屬性指定模板文件的后綴,該屬性的默認屬性值是ftl。該屬性還允許使用ftl、vm或jsp,分別對應FreeMarker、Velocity和JSP模板。

struts.configuration.xml.reload該屬性設置當struts.xml文件改變后,系統是否自動重新加載該文件。該屬性的默認值是false。

struts.velocity.configfile該屬性指定Velocity框架所需的velocity.properties文件的位置。該屬性的默認值為velocity.properties。

struts.velocity.contexts該屬性指定Velocity框架的Context位置,如果該框架有多個Context,則多個Context之間以英文逗號(,)隔開。

struts.velocity.toolboxlocation該屬性指定Velocity框架的toolbox的位置。

struts.url.http.port該屬性指定Web應用所在的監聽端口。該屬性通常沒有太大的用戶,只是當Struts 2需要生成URL時(例如Url標簽),該屬性才提供Web應用的默認端口。

struts.url.https.port該屬性類似于struts.url.http.port屬性的作用,區別是該屬性指定的是Web應用的加密服務端口。

struts.url.includeParams該屬性指定Struts 2生成URL時是否包含請求參數。該屬性接受none、get和all三個屬性值,分別對應于不包含、僅包含GET類型請求參數和包含全部請求參數。


struts.custom.i18n.resources該屬性指定Struts 2應用所需要的國際化資源文件,如果有多份國際化資源文件,則多個資源文件的文件名以英文逗號(,)隔開。


struts.dispatcher.parametersWorkaround 對于某些Java EE服務器,不支持HttpServlet Request調用getParameterMap()方法,此時可以設置該屬性值為true來解決該問題。該屬性的默認值是false。對于WebLogic、Orion和OC4J服務器,通常應該設置該屬性為true。

struts.freemarker.manager.classname 該屬性指定Struts 2使用的FreeMarker管理器。該屬性的默認值是org.apache.struts2.views.freemarker.FreemarkerManager,這是Struts 2內建的FreeMarker管理器。

struts.freemarker.wrapper.altMap該屬性只支持true和false兩個屬性值,默認值是true。通常無需修改該屬性值。

struts.xslt.nocache 該屬性指定XSLT Result是否使用樣式表緩存。當應用處于開發階段時,該屬性通常被設置為true;當應用處于產品使用階段時,該屬性通常被設置為false。

struts.configuration.files 該屬性指定Struts 2框架默認加載的配置文件,如果需要指定默認加載多個配置文件,則多個配置文件的文件名之間以英文逗號(,)隔開。該屬性的默認值為struts-default.xml,struts-plugin.xml,struts.xml,看到該屬性值,讀者應該明白為什么Struts 2框架默認加載struts.xml文件了。


在請求時,路徑后的后綴action可要可不要,即下面的兩種請求都是可以的
http://localhost:8080/Struts2/chapter1/HelloWorld
http://localhost:8080/Struts2/chapter1/HelloWorld.action


Action配置中的各項默認值
請看下面的代碼
<action name="Login">
<result>/WEB-INF/JspPage/chapter1/Login.jsp</result>
</action>
我們發現,當我們請求的路徑為http://localhost:8080/Struts2/chapter1/Login時,同樣可以實現頁面的跳轉,這是怎么回事呢?

如果沒有為action指定class,默認是ActionSupport類
<action name="Login">
相當于
<action name="Login" class="com.opensymphony.xwork2.ActionSupport">

如果沒有為action指定method,默認執行action中的execute()方法
<action name="Login">
相當于
<action name="Login" class="com.opensymphony.xwork2.ActionSupport"
method="execute">

如果沒有指定result的name屬性,默認值為success.
<result>
相當于
<result name="success">

提出一個問題ActionSupport這個類到底是個什么類呢?
首先要肯定的一點是他是一個具有execute方法的類,并且execute方法返回”success”字符串,因為只有這樣,前面的運行結果才能說的通. ActionSupport還實現了很多其他的結果,提供了許多定制的功能.

ActionSupport類的作用
struts2不要求我們自己設計的action類繼承任何的struts基類或struts接口,但是我們為了方便實現我們自己的action,大多數情況下都會繼承com.opensymphony.xwork2.ActionSupport類,并重寫此類里的public String execute() throws Exception方法。因為此類中實現了很多的實用借口,提供了很多默認方法,這些默認方法包括國際化信息的方法、默認的處理用戶請求的方法等,這樣可以大大的簡化Acion的開發。
Struts2中通常直接使用Action來封裝HTTP請求參數,因此,Action類里還應該包含與請求參數對應的屬性,并且為屬性提供對應的getter和setter方法。

課堂筆記
默認值
class="" ActionSupport
method="" execute
name="" “success”

Action接口里提供了一些常量及execute方法,通常我們自己寫的Action可以實現這個接口, ActionSupport已經實現了這個接口,并且還實現了驗證,國際化等功能的接口,所以我們自己寫的Action類通常會繼承ActionSupport這個類來達到啟用驗證框架,國際化,自動轉換等功能的目的.

轉載于:https://www.cnblogs.com/kzhan/p/4360176.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273343.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql插入圖片數據

import java.sql.*; import java.util.Scanner; import java.io.*; public class mysql插入圖片 { private static final File File null;private static String String;public static Connection getConn() { Connection conn null; try { Class.forName("com.…

mybatis插入圖片處理--mysql

1. 數據庫Scheme 1.數據庫SchemeDROP TABLE IF EXISTS user_graphic_t; /*!40101 SET saved_cs_client character_set_client */; /*!40101 SET character_set_client utf8 */; CREATE TABLE user_graphic_t ( id int(11) NOT NULL AUTO_INCREMENT, graph…

careercup-高等難度 18.6

18.6 設計一個算法&#xff0c;給定10億個數字&#xff0c;找出最小的100萬個數字。假定計算機內存足以容納全部10億個數字。 解法&#xff1a; 方法1&#xff1a;排序 按升序排序所有的元素&#xff0c;然后取出前100萬個數&#xff0c;時間復雜度為O(nlog(n)) 方法2&#xff…

不浮躁的社會是什么樣的?

不浮躁就是該吃飯吃飯&#xff0c;該睡覺睡覺。該看書看書&#xff0c;該洗澡洗澡。聊事時聊事&#xff0c;陪朋友時陪朋友。萬事各得其所&#xff0c;各安其分&#xff0c;專心在此時此刻&#xff0c;做每一件事。而不是吃飯時想著別人的魚翅海參&#xff0c;睡覺時想著發票報…

java jre 中導入導出證書

導入證書&#xff1a; 將所要導入的證書放到Javahome的jre/lib/security文件夾中 運行命令jre/bin/keytool-import -alias cacerts -keystore cacerts -file 證書名稱 輸入默認密碼&#xff1a;changeit 導入過程中會交互詢問是否信任該證書&#xff0c;輸入 yes 導出證書 …

各種類庫網址學習

http://shouce.jb51.net/net/index.html轉載于:https://www.cnblogs.com/chenls/p/4362730.html

圖片的base64編碼實現以及網頁上顯示

生成、解析base64編碼的圖片 //圖片轉化成base64字符串 public static String GetImageStr(<span style"font-family: Arial, Helvetica, sans-serif;">String imgFile</span><span style"font-family: Arial, Helvetica, sans-serif;">…

nginx windows 下安裝和配置

去nginx官網下載相應的版本 下載地址&#xff1a;http://nginx.org/download/nginx-1.6.2.zip 下載完成解壓放到你喜歡的目錄下&#xff1b;樓主的放到了F:\nginx 進入windows的cmd窗口&#xff0c;輸入如下所示的命令&#xff1a; C:\Users\YiXian>F: F:\>cd nginx s…

c/c++學習書籍

一、c Primer . 目錄內容關鍵字第一章 面向過程編程&#xff0c;面向對象編程&#xff0c;泛型 轉載于:https://www.cnblogs.com/bzsh/p/4362930.html

applicationContext.xml 配置文件的存放位置

web.xml中classpath:和classpath*: 有什么區別? classpath&#xff1a;只會到你的class路徑中查找找文件; classpath*&#xff1a;不僅包含class路徑&#xff0c;還包括jar文件中(class路徑)進行查找. 存放位置&#xff1a; 1&#xff1a;src下面 需要在web.xml中定義如下&…

完美攻略心得之圣魔大戰3(Castle Fantisia)艾倫希亞戰記(艾倫西亞戰記)包含重做版(即新艾倫希亞戰記)...

&#xff08;城堡幻想曲3&#xff0c;糾正大家個錯誤哦&#xff0c;不是圣魔大戰3&#xff0c;圣魔大戰是城堡幻想曲2&#xff0c;圣魔大戰不是個系列,艾倫西亞戰記艾倫希亞戰記,一個游戲日文名&#xff1a;タイトル キャッスルファンタジア &#xff5e;エレンシア戦記&#x…

費波納茨

//非遞歸實現static int[] fun(int num){int result[] new int[num];for (int i 1; i < num; i) {if(i<3){result[i-1]i-1;}else{result[i-1]result[i-2]result[i-3];}}return result;} //遞歸實現static int method(int num){int result 0;if(num < 2){result --n…

Hadoop生態上幾個技術的關系與區別:hive、pig、hbase 關系與區別

初接觸Hadoop技術的朋友肯定會對它體系下寄生的個個開源項目糊涂了&#xff0c;我敢保證Hive,Pig,HBase這些開源技術會把你搞的有些糊涂&#xff0c;不要緊糊涂的不止你一個&#xff0c;如某個菜鳥的帖子的疑問&#xff0c;when to use Hbase and when to use Hive&#xff1f;…

可變形參

public class TestVarargs {/*** param args* YiXian* 2015-3-11*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("the program starting>>>>>>>>>>>");test(2,"java權威指…

解決android中Layout文件下的xml文件配好后,R類中不能自動生成相應代碼

不能更新的原因: 1.在xml文件中代碼錯誤或者格式錯誤 2.eclipse 編譯器是老版本 3.布局文件的文件名有大寫字母 4.含有相同文件名、格式的xml文件解決方法: 1.找到出錯的xml文件中的錯誤代碼格式改正&#xff0c;并執行project —clean 操作 2.eclipse 選擇Project--Bu…

邏輯運算與位移運算

異或運算True ⊕ False TrueFalse ⊕ True TrueFalse ⊕ False FalseTrue ⊕ True False同或運算True ⊙ False FalseFalse ⊙ True FalseFalse ⊙ False TureTrue ⊙ True Ture或運算True || False TrueFalse || True TrueFalse || False FalseTrue || True Tru…

log4net 日志框架的配置

log4net 日志框架的簡單配置 添加對log4net程序集的引用 選擇程序集文件添加引用即可&#xff0c;需要注意的是需要添加相應程序版本的程序集&#xff0c;如果你的應用是基于.netFramework2.0&#xff0c;則應選擇net 2.0版本的程序集 修改配置文件&#xff0c;配置log4net相…

原碼 反碼 補碼

一.機器數和真值 機器數&#xff1a; 由于一些硬件的限制計算機只能識別二進制數據&#xff0c;因此在計算機中只會存儲二進制數據&#xff1b;機器數是帶符號的&#xff0c;在計算機用一個數的最高位存放符號, 正數為0, 負數為1. 比如&#xff0c;十進制中的數 7&#xff0…

CSS 設計指南(第3版) 初讀筆記

第1章 HTML標記與文檔結構 關于<title>標簽&#xff1a;搜索引擎會給<title>標簽中的文字內容賦予很高的權重。而且這些文字也會作為網頁標題出現在搜索結果列表中。 無論你想了解哪個HTML元素&#xff0c;第一個要問的問題都應該是&#xff1a;它是塊元素&#xf…

win7安裝python開發環境,運行python

在win7上安裝python的開發環境是非常簡單的事情 Step1&#xff1a;下載python安裝文件 url&#xff1a;https://www.python.org/download 去這里找到你想要下載的文件 Step2&#xff1a;安裝 windows上當然是傻瓜式安裝了&#xff0c;你還在糾結什么呢 Step3&#xff1a;…