struts 1.2配置文件
struts 1.2配置文件
2011-07-19 19:59 49人閱讀 評論(0) 收藏 舉報 ?????Struts中是apache組織的MVC框架下表列出了Struts中用到的lib包及其用途
| 包名稱 | 用途 |
| Common-beanutils.jar | 簡單易用的 Java 反射和內省 API 包裝器 |
| Commons-collections.jar | 一組用于擴展和增強 Java Collections Framework 的類 |
| Commons-digester.jar | 通常用于分析 XML 配置文件的 XML 到 Java 對象映射實用程序 |
| Commons-lang.jar | 一組公用實用程序類,可以為 java.lang 中的類提供附加功能 |
| Commons-logging.jar | 各種日志 API 實現(xiàn)的包裝器 |
| Commons-fileupload.jar | 一個處理文件上傳的包 |
| Commons-validator.jar | 用于定義 XML 文件中的驗證類(驗證方法)和驗證規(guī)則的可擴展框架 |
| Jakarta-oro.jar | 一組文本處理 Java 類,可以提供兼容 Perl 5 的正則表達式 |
| Struts.jar | Struts MVC框架包 |
?
WEB-INF/下的 后綴名為.tld的文件(標簽庫描述文件)
struts-bean.tld:??bean標簽的描述文件,bean標簽用于訪問JavaBeans和它們的關聯(lián)屬性,也可以用于定義新的Bean
struts-html.tld:??html標簽的描述文件,html標簽主要用來創(chuàng)建Html輸入表單的標記符
struts-logic.tld: logic標簽的描述的文件,logic標簽用于管理對輸出內容條件判斷,從一個集合對象中循環(huán)取出內容等以及應用程序的流程管理
struts-nested.tld: nested標簽的描述文件,又稱嵌套標簽,使用嵌套屬性可以自由的訪問任一層的bean屬性
struts-template.tld: 這個template標簽庫的描述文件,對于共享通用格式的頁面創(chuàng)建動態(tài)JSP模版是有用的,一般我們不用
struts-tiles.tld: tiles標簽的描述文件,只有我們在工程中加入了titles組件時才會用到,titles框架為創(chuàng)建Web頁面提供了一種模板機制,它能將網(wǎng)頁的布局和內容分離。它允許先創(chuàng)建模板,然后在運行時動態(tài)地將內容插入到模板中。
?
在我們的web工程中如何引入struts框架呢
在工程中引入struts框架要這么幾個步驟
1.將以上所述的 .jar文件和需要的.tld文件分別放在lib目錄和WEB-INF/目錄下
2.在web.xml文件中添加
????<servlet>
????<servlet-name>action</servlet-name>
????<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
????<init-param>
??????<param-name>config</param-name>
??????<param-value>/WEB-INF/struts-config.xml</param-value>
????</init-param>
????<init-param>
??????<param-name>debug</param-name>
??????<param-value>2</param-value>
????</init-param>
????<load-on-startup>2</load-on-startup>
??</servlet>
??<servlet-mapping>
????<servlet-name>action</servlet-name>
????<url-pattern>*.do</url-pattern>
??</servlet-mapping>
3.在web.xml文件中添加要用到的taglib描述文件,例如:
?????<jsp-config>
????<taglib>
??????<taglib-uri>struts-bean.tld</taglib-uri>
??????<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
????</taglib>
????<taglib>
??????<taglib-uri>struts-html.tld</taglib-uri>
??????<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
????</taglib>
????<taglib>
??????<taglib-uri>struts-logic.tld</taglib-uri>
??????<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
????</taglib>
??</jsp-config>
??然后我們就可以在頁面中如下引用
<%@ taglib uri="struts-bean.tld" prefix="bean" %>
<%@ taglib uri="struts-html.tld" prefix="html" %>
<%@ taglib uri="struts-logic.tld" prefix="logic" %>
?
?在web.xml中
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
可以看出web版本是2.4版本,在2.4版本中允許不在web.xml中配置taglib描述文件
而直接在頁面上引用,
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
其中的uri指向本地taglib描述文件的路徑即可,但是在web2.3版本中必須在web.xml文件中配置
?
4.WEB-INF/struts-cofig.xml配置文件中的struts配置版本必須和lib包中struts版本保持一致
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">??
5.如果工程中要用到validator驗證,還用在struts-config.xml文件中加入validator插件
??<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property ?property="pathnames"
?????????????value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
??</plug-in>
?相應得在WEB-INF/目錄下validator-rules.xml文件和validation.xml文件也要存在
?
所有的action from和acton都配在一個struct-config.xml文件中這樣的話,這個struts-config文件豈不是變得很大,難以維護
?從struts1.1開始可以支持多個配置文件,一般配置文件的分割原則是一個模塊使用一個獨立的配置文件,比如在工程中有個user模塊,我們可以用struts-config-user.xml文件,所有user模塊用到的actionform和action都配置在struts-config-user.xml文件中,注意在各個模塊的配置文件中,action元素的input、path屬性,forward元素的path屬性中的路徑都不用帶模塊名,struts在進行路徑解析的時候會自動把模塊名加上,如果forward中要跳轉到不屬于這個模塊的下的某個頁面,要將forward元素中的contextrelative="false"
?
那么在工程中我們如何配置多個struts配置文件呢?
修改web.xml文件中關于struts配置部分
????<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
????<init-param>
??????<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml, /WEB-INF/struts-config-user.xml</param-value>
</init-param>
<init-param>
??????<param-name>config/user</param-name>
??????<param-value>/WEB-INF/struts-config-user.xml</param-value>
</init-param>
????<init-param>
??????<param-name>debug</param-name>
??????<param-value>2</param-value>
????</init-param>
????<load-on-startup>2</load-on-startup>
??</servlet>
?
參考上面的配置即可,而在我們平時的開發(fā)過程中,(JBuilder開發(fā)環(huán)境中),要在webmodule下的Deployment description目錄中右鍵單擊在屬性中將所有struts的配置文件全部添加進來,這樣就可以了
?
在用Jbuilder開發(fā)的過程中經(jīng)常碰到strust1.1和struts1.2版本不一致造成的異常,那么struts1.1和struts1.2版本之間到底有哪些區(qū)別呢?
?其實在struts1.1和struts1.2種基本沒有什么區(qū)別, 我們平時碰到的這些異常,是因為Jbuilder2006中基于現(xiàn)有代碼創(chuàng)建工程的話,struts的默認版本是1.2,可是我們工程中采用的
Struts是1.1版本,這樣struts-config.xml文件中的指示的版本不一致就會出錯,
推薦在用Jbuilder2006開發(fā)工程時采用struts1.2版本,免得造成不必要的麻煩
1.1和1.2之間的區(qū)別在于錯誤信息的處理方式上
??在1.1中我們用如下的方式在action中保存錯誤信息
??????ActionErrors??errors= new ActionErrors ();
??????errors.add(Globals.ERROR_KEY ,new ActionError("要保存得錯誤信息"));
??????this.saveErrors(request,errors);
??在1.2中舍棄了ActionErrors類,統(tǒng)一用ActionMessages
??????ActionMessages??messages = new ActionMessages ();
??????messages.add(Globals.MESSAGE_KEY,new ActionMessage("要保存得錯誤信息"));
??????this.saveMessages(request,messages);
頁面部分顯示錯誤信息1.1中用
<html:errors>
而在1.2中
在頁面上顯示錯誤信息
<html:messages id="message" message="true">?
??????<bean:write name="message"/>
</html:messages>
?
其他的區(qū)別暫時還沒有發(fā)現(xiàn)
?
我要寫一個只有兩三個屬性的ActionForm,可是覺得又不值,還有什么別的辦法嗎?
?
像這種情況我們可以寫一個動態(tài)的ActionForm繼承自
org.apache.struts.action.DynaActionForm在struts-config文件中直接配置: 如下所示
???<form-bean name="categoryForm" type="org.apache.struts.action.DynaActionForm">
??????<form-property name="categoryId" type="java.lang.Integer" />
??????<form-property name="categoryName" type="java.lang.String" />
</form-bean>
然后我們就可以利用這個名為categoryForm的ActionForm了
?
我現(xiàn)在要用Struts進行服務器端效驗,我該怎么作?
?有兩種辦法:
1.在繼承自org.apache.struts.action. ActionForm的自定義的ActionForm中覆寫validate方法
在這個方法中寫入我們的驗證代碼
2.在struts-config文件將要進行效驗的action元素的validator屬性設為true
二 采用validator插件
?其實利用validator進行服務器端效驗要做到以下幾點:
1.首先確保struts-config.xml文件中已經(jīng)進行了Validator插件的配置
???<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
?????<set-property property="pathnames"
??????????value="/WEB-INF/validator-rules.xml,/WEB-INF/validations.xml"/>
?????<set-property property="pathnames" value="false"/>
</plug-in>
2.所要驗證的ActionForm必須繼承自org.apache.struts.validator.ValidatorForm
3.在struts-config文件將要進行效驗的action元素的validator屬性設為true
4.在validations.xml文件中指明要進行驗證的字段
?
如果即在Form Beans中重載了validate方法,又啟用了Validate框架,那會是什么效果呢?
?
由于要啟用Validate框架,Form Beans需要繼承ValidatorForm,查看ValidatorForm的源代碼,發(fā)現(xiàn)validate方法已經(jīng)作了處理(真是為Validate框架所服務的)。
那么在Form Beans中重載了validate方法的話,就會覆蓋原有ValidatorForm中對應的功能,所以如果想一起用的話,需要在Form Beans的validate方法中調用errors = super.validate(mapping, request);這句代碼是啟用Validate框架所要做的工作,然后可以判斷errors再作下一步的處理。
?
當然也可以先做Form Beans中的validate方法,然后啟用Validate框架,要看具體情況而定
?
Form Beans可以被多個Action應用,有的Aaction中需要驗證,我該怎么作?
?這時我們可以通過在struts-config.xml文件中設置action元素的validator屬性為true或false來實現(xiàn)
?
Form Beans可以被多個Action應用,而每個Action可能需要的驗證字段都不一樣。而在validation.xml中配置的驗證方式(如<form name="userForm">)是對這個Form Beans進行的。這樣的話,如何來驗證呢?
你的Form Beans可以繼承org.apache.struts.validator.ValidatorActionForm(當然可以直接配置DynaValidatorActionForm)
struts-config文件配置如下:
<action-mappings>
??<action path="/user/createUser"
?????????type="com.thewebpagestudio.user.CreateUserAction"
?????????name="userForm"/>
??<action path="/user/editUser"
?????????type= com.thewebpagestudio.user.EditUserAction"
?????????name="userForm"/>
</action-mappings>
?
validation.xml文件配置如下:
<formset>
??<form name="/user/ createUser ">----這里的采用的是action的path路徑
????<field property="city" depends="required">
??????<arg0 key="prompt.city"/>
????</field>
??</form>
??<form name="/user/editUser ">
????<field property="state" depends="required">
??????<arg0 key="prompt.state"/>
????</field>
??</form>
</formset>
?
這里說明一點
其中key=" prompt.city "和key=" prompt.state "需要在資源文件中配置,而如果配置成
例如:<arg key="prompt.city " resource="false"/>
如果多了resource="false"這句話,那么它不會再從資源文件中去取,而是直接用key值來表示
?
Struts中如何防止重復提交?
在做新增和修改時,一般我們在保存成功后,轉向list頁面,這時在action中的return mapping.findForward(“l(fā)ist”) 中的list在struts-cofig.xml文件中要指定redirect=true
如果要在request保存返回信息,而不能用redirect=true時,我們可以采用Struts的Token(令牌)機制能夠很好的解決表單的重復提交問題:
?基本原理是:服務器端在處理到達的請求之前,會將請求中包含的令牌值與保存在當前用戶會話中的令牌值進行比較,看是否匹配。在處理完該請求后,且在答復發(fā)送給客戶端之前,將會產(chǎn)生一個新的令牌,該令牌除傳給客戶端以外,也會將用戶會話中保存的舊的令牌進行替換。這樣如果用戶回退到剛才的提交頁面并再次提交的話,客戶端傳過來的令牌就和服務器端的令牌不一致,從而有效地防止了重復提交的發(fā)生?
?
?這時我們一般從Action中的一個方法比如 add()方法轉向新增頁面,在add方法中,在add方法中用saveToken(request);保存令牌,這時我們可以在輸入的jsp頁面中發(fā)現(xiàn)多了些代碼
<inpu ?type="hidden" ?name="org.apache.struts.taglib.html.TOKEN"
????????????value="6aa35341f25184fd996c4c918255c3ae">
這個value是TokenProcessor類中的generateToken()獲得的,是根據(jù)當前用戶的session id和當前時間的long值來計算的
?
現(xiàn)在我們點擊提交按鈕到action中的insert()方法,在insert()方法中我們要根據(jù)判斷在請求中包含的值是否和服務器的令牌一致,因為服務器每次提交都會生成新的Token,所以,如果是重復提交,客戶端的Token值和服務器端的Token值就會不一致
if (isTokenValid(request, true)) {
// 表單不是重復提交
//這里是保存數(shù)據(jù)的代碼
} else {
//表單重復提交
saveToken(request);
//其它的處理代碼
}
Struts中如何實現(xiàn)跨頁面提交?
?跨頁面提交時我們可以在Struts-config.xml文件中將所對應的actionForm的周期設為session周期即可
轉載于:https://www.cnblogs.com/moonvan/archive/2011/12/06/2278601.html
總結
以上是生活随笔為你收集整理的struts 1.2配置文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新来报道
- 下一篇: 连接查询_左连接/右连接/全连接的区别