功能參考
SAStruts的各項功能說明。
プロジェクト構成
SAStruts在包下做成action,actionForm等包。 報名可以任意指定,比如sa-struts-tutorial工程,報名定義為tutorial。
報名需要在convention.dicon中指定。sa-struts-tutorial工程中的配置如下。
convention.dicon
<components> <component class="org.seasar.framework.convention.impl.NamingConventionImpl"> <initMethod name="addRootPackageName"> <arg>"tutorial"</arg> </initMethod> </component> <component class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/> </components>
Action放置在包名.action下。 比如URLhttp://host/project/xxx/對應的Action類的名稱為XxxAction。
ActionForm放置在包名.form下。 比如XxxAction對應的ActionFrom的名稱為XxxFor。ActionForm對Request的參數進行管理。
entity放置在包名.entity下。 實體是數據庫中保存的數據。實體可以任意命名,但一般使用對應的表名。
對實體進行操作的類稱為Service。Service放置在包名.service下。 一般使用XxxService這樣的以Service結尾的名稱。Xxx可以為任意名稱,但一般使用實體名。
utility一般放在包名.util下。 類名可以自由定義。utility類一般由static方法構成。
JSP放在Action對應的目錄下。 比如XxxAction使用的JSP,放在/xxx/目錄下比較好。
應用架構
SAStruts是實現MVC(Model View Controller)模式的架構,Model是Entity、View是JSP,Controller是Action。
Action可以包含多個方法,通常1個用例 映射為1個Action。 一個用例可以包含多個畫面,表現層關聯的邏輯,在Action里定義。
業務邏輯可以定義在entity或者Service中。 數據訪問邏輯也包含在業務邏輯中比較好。 業務邏輯和數據訪問層框架分離,用Dao來實現數據訪問。 但實際開發過程中,極少會出現中途換數據訪問框架的場面,所以認為業務邏輯中包含數據訪問比較好。
業務邏輯是定義在Entity還是Service里是個重要的問題。 數據訪問邏輯,定義在Service里比較好。比如查詢方法,因為得到實體本身的方法,不可能在實體中定義。 當然,如果定義為實體的static方法,也是能實現,但靜態方法,在測試時不能被重載,所以不這樣做比較好。/p>
還有,更新的方法,使用Entity也行。但是需要繼承又更新方法的特定類,這不符合最近的POJO傾向。 所以數據訪問邏輯,還是放在Service中比較好。
實體的導出屬性,在實體中定義比較好。如果有需要進行計算的屬性,需要實現對應的getter方法。 導出屬性,實體屬性的一種,在實體中定義是自然的。
除了數據訪問和導出屬性外,需要根據實際情況,在Entity和Service中處理邏輯。
我的判斷基准是,怎么樣能減少代碼量,因為代碼量少,出錯的幾率就小。 當然這不可能是解決所有的問題,但是也可以作為一個判斷基准。
最后,特定Entity關聯的常量,分別定義在對應的Entity中。
Action
對用戶請求進行相應的類稱為Action。Struts中,URL和Action的關系在struts-config.xml里進行定義。SAStruts根據下面的規則自動映射,不需要再配置文件中定義。
比如 http://localhost:8080/sa-struts-tutorial/login/。sa-struts-tutorial是Web應用的名稱。SAStruts根據下面的規則將URL轉換為Action的類名。
- Web應用名后面的路徑(/login/)的最后的反斜線“/”加上Action轉換為/loginAction。 沒有反斜線直接加Action。
- 開始的字母大寫化為/LoginAction。
- 反斜線轉換成點(.LoginAction)。
- 在類名之前加上包名.action轉換成報名.action.LoginAction。 包名的詳細信息請參考這里。
- 最重,/login/對應的類為tutorial.action.LoginAction。
Action對應的路徑不存在的情況下,如果存在Action包名.action.IndexAction,則調用對應的IndexAction。 比如輸入http://localhost:8080/sa-struts-tutorial/則調用tutorial.action.IndexAction。
如果要調用IndexAction,在Web的根目錄下不要放置index.jsp文件。index.jsp將被優先調用。
如果是大型的應用開發,也可以增加包的層數。比如/aaa/bbb/對應的Action為: 包名.action.aaa.BbbAction。
Action已經POJO化(普通的JAVA類),不需要像Strus一樣繼承Action。
Scope為請求(請求),不像Struts為singleton。ActionForm等請求或者Session管理的對象作為Property進行讀取。因為是請求進行管理, 所以不用像Struts那樣擔心線程安全。
使用ActionForm的時候,像下面一樣進行定義。加上@ActionFormと@Resource注釋。@Resource是用來定義Seasar2能夠讀取的Annotation。 變量名是將類名的開頭字母小寫化轉換而成。
@ActionForm @Resource protected AddForm addForm;
只有需要在JSP中輸出的值,在Action里定義變量。 請求需要的變臉,請通過ActiomForm進行傳輸。
通過Session管理用戶信息的時候, 在包名.dto下創建XxxDto,加上注釋@Component注明使用Session進行管理。
Seasar2、Dto定義為public時,能夠自動判別為屬性。
@Component(instance = InstanceType.SESSION) public class UserDto implements Serializable { private static final long serialVersionUID = 1L; public String userName; ... }
利用創建的UserDto時,需要像以下的定義一樣加上@Resource定義。(以下的代碼由於聲明為非public,通過JSP不能查看) 變量名為類名開頭字母小寫。
@Resource protected UserDto userDto;
利用Session管理Dto的時候,Dto在熱部署時可能失效。 使用Tomcat時,請參照context.xml進行修改。
業務邏輯放在Service包下時,在包名.service下創建XxxService。
public class XxxService { ... }
使用XxxService,需要像以下的定義一樣加上@Resource定義。 變量名為類名開頭字母小寫。
@Resource protected XxxService xxxService;
需要使用HttpServletRequest,HttpServletResponse等Servlet API相關對象的時候、 需要像以下的定義一樣加上@Resource定義。 變量名定義如下所示。
public class MyAction { @Resource protected HttpServletRequest request; @Resource protected HttpServletResponse response; @Resource protected HttpSession session; @Resource protected ServletContext application; ... }
請求對應的處理,請參考執行方法。
執行方法
實際處理請求的Action方法。執行方法名可為任意,需加上注釋@Execute,返回值 為String,不能有參數。
@Execute public String xxx() { ... return ...; }
執行方法的返回值,是需要跳轉頁面的路徑,是Action的相對路徑。
例如/add/的Action的返回值為index.jsp的時候,路徑轉換為/add/index.jsp。 然后加上web.xml的VIEW_PREFIX定義的路徑做為前綴。sa-struts-tutorial工程,VIEW_PREFIX定義為/WEB-INF/view則將跳轉到/WEB-INF/view/add/index.jsp。
如果跳轉String為/結尾的時候,則跳轉到對應的Action。 比如返回值為/select/的時候,則跳轉到http://localhost:8080/sa-struts-tutorial/select/。
默認為forward跳轉,如果需要進行Redirect跳轉時,需要最末尾加上redirect=true=前后不能有空白。
... return "xxx.jsp?redirect=true";
... return "xxx.jsp?key=value&redirect=true";
如果需要跳轉到別的Site,需要返回完整的URL。
... return "https://主機名/應用名/路徑/?redirect=true";
如果是文件下載或者又Response來響應的時候,返回值設為null。
1個Actio可以包含多個執行方法,通過URL來選擇對應的執行方法。 請求的參數的鍵中包含了方法名,請求的參數SAStruts.method中指定了方法名。
比如,調用AddAction#index()方法時。
http://localhost:8080/sa-struts-tutorial/add/index
沒有制定方法時,則調用默認的index()方法、所有下面的URL調用的也是AddAction#index()。
http://localhost:8080/sa-struts-tutorial/add/
通過制定@Execute的urlPattern,URL跟Pattern一直的方法將被調用。 並且URL的一部分參數的值能夠被接收。
內部邏輯為,RoutingFilter來過濾URL一致的Pattern。一致的時候,則調用對應的方法,Pattern的{參數名}部分,將對應的值保存進取,然后Forward給Struts。
比如下面的EmployeeAction#edit()定義。
@Execute(urlPattern = "edit/{id}") public String edit() { ... }
/employee/list.jsp頁面中的超鏈接定義為。
<a href="edit/1">編輯</a>
RoutingFilter過濾重新組裝成下面的參數返回給Struts。
/employee.do?id=1&SAStruts.method=edit
SAStruts,參數id作為Action的屬性,SAStruts.method參數指定調用的方法名。
進行表單提交的時候,按鈕的name屬性就是要調用方法的名字。 比如,下例就是調用confirm方法。
<input type="submit" name="confirm" value="確認"/>
調用執行方法前,使用Annotation進行驗證, @Execute的validator設置為true。默認為true。
validator=true的時候,如果驗證結果為NG,則跳轉input制定的路徑。input路徑的定義方法,類似於執行方法的返回值,不過可以像urlPattern一樣指定({參數})。 驗證的詳細請參照這里。
@Execute(validator = true, input = "edit.jsp")
調用執行方法前,如果要進行調用自己定義的驗證方法。@Execute的validate中定義ActionForm的驗證方法名。
如果驗證結果為NG,則跳轉input制定的路徑。 如果在validator和validate中都定義了的情況下、聲明式驗證優先,然后是validate定義的自定義方法。 自定義方法請參照這里。
@Execute(validate = "validate", input = "login.jsp")
roles指定調用該法觀念法需要的角色。 需要指定多個角色時用逗號分隔。 如果不是定義的角色,則拋出org.seasar.struts.exception.NoRoleRuntimeException異常。NoRoleRuntimeException異常被拋出時,調轉到對應的異常頁面(/error/norole.jsp)、 對應的(errors.norole)消息已經被定義。
application_jp.properties
errors.norole=適切なロールがありません。
struts-config.xml
<global-exceptions> <exception path="/error/norole.jsp" key="errors.norole" type="org.seasar.struts.exception.NoRoleRuntimeException"/> </global-exceptions>
/error/norole.jsp
<html> <head> <title>Role error</title> </head> <body> <html:errors property="errors.norole"/> </body> </html>
ActionForm
ActionForm是管理請求參數的類。 對於SAStruts,ActionFrom也可以用POJO來實現。
ActionForm中,請求的參數名作為變量被定義。 為了接受參數而定義的變量,也可以存放檢驗的錯誤信息。 類型為String或者Boolean。Seasar2,ActionForm里聲明為public的變量,可以被視為屬性。
使用ActionForm時,請注意不能用Action的屬性來接收請求的參數。
ActionForm存放在包名.form下,類名以Form結尾。
SAStruts的ActionForm默認的Scope為請求,但是可以通過下面的 聲明來指定Scope為Session.如果Scope為Seesion的時候需要實現接口java.io.Serializableをimplements。
@Component(instance = InstanceType.SESSION) public class XxxForm implements Serializable { private static final long serialVersionUID = 1L; ... }
ActionForm的Scope為Session的時候,、 可以通過將Execute的removeActionForm元素的值設為true來實現,當執行方法結束時刪除ActionForm。 默認值為False,不刪除。
利用Session管理ActionForm的時候,ActionForm在熱部署時可能失效。 使用Tomcat時,請參照context.xml進行修改。
可以如下所示對變量實現聲明式的驗證。 聲明式的驗證的詳細信息請參考、這里。
@Required public String arg1;
也可以如下所示,添加自己的驗證方法。 驗證方法的詳細請參考這里。
public ActionMessages validate() { ActionMessages errors = new ActionMessages(); ... return errors; }
CheckBox等的初始化,可以參考下面的reset方法進行。reset方法的詳細請參考這里。
public void reset() { checked = false; }
聲明式驗證
通過使用注解(Annotation)來對ActionForm來進行驗證。 驗證用的注解(Annotation)請參考這里。
@Required public String userName;
驗證NG的時候輸出的錯誤信息在信息資源里進行了定義。 驗證用的注解和對應錯誤信息的鍵入下所示。
Annotation | 信息鍵 |
---|---|
Required | errors.required |
Validwhen | 開發者自己定義 |
Minlength | errors.minlength |
Maxlength | errors.maxlength |
Minbytelength | errors.minbytelength |
Maxbytelength | errors.maxbytelength |
Mask | errors.invalid |
IntRange | errors.range |
LongRange | errors.range |
FloatRange | errors.range |
DoubleRange | errors.range |
ByteType | errors.byte |
ShortType | errors.short |
IntegerType | errors.integer |
LongType | errors.long |
FloatType | errors.float |
DoubleType | errors.double |
DateType | errors.date |
CreditCardType | errors.creditcard |
EmailType | errors.email |
UrlType | errors.url |
需要對已經定義的信息進行修改的時候,只需要修改信息鍵對應的值。
對於特別的屬性,需要追加自定義信息的時候,信息資源里追加對應的信息, 然后再注解中使用msg元素來指定。
errors.required2={0}必須有值。
@Required(msg = @Msg(key = "errors.required2"))
信息中,{位置}中的值可以指定。位置從0開始。 注解中,可以通過參數arg0, arg1, ..., args元素來指定。
@Required(arg0 = @Arg(key = "ほげ", resource = false))
@Validwhen(test = "((validwhen1Text == null) or (*this* != null))", msg = @Msg(key = "errors.required.other"), args = @Arg(key = "validwhen1Text", resource = false, position = 1))
最開始的參數,自動設置為屬性名。需要對屬性進行定制的時候, 可以在信息資源中
追加labels.屬性名=...的定義。
labels.userName=用戶名
使用target元素可以在指定的方法調用時,進行參數驗證。如果是多個方法的時候, 使用逗號進行分隔。target元素沒有被定義,@Execute的validator=true則調用所有方法的時候都需要進行驗證。 下例為,屬性second在調用goThird方法時,驗證必須有值
@Required(target = "goThird") public String second;
JSP中輸出錯誤信息時,使用如下所示的html:errors標簽。
<%@taglib prefix="html" uri="http://struts.apache.org/tags-html"%> ... <html:errors />
需要追加自定義注解驗證的時候,請參照org.seasar.struts.validator.S2FieldChecks來實現驗證邏輯,然后 將方法添加到validator-rules.xml。
validator-rules.xml定義validator名指定為Validator Annotation。
想要使用JavaScript進行客戶端驗證時,請參考指南。
使用驗證方法
如果需要自己定制驗證方法的時候,可以在ActionForm或者Action里追加方法。 不過推薦在有驗證對象的ActionForm里進行。
驗證方法,方法名任意,沒有參數,返回值為ActionMessages。 返回值不為空的時候,驗證結果NG。
public ActionMessages validate() { ActionMessages errors = new ActionMessages(); ... return errors; }
執行方法上,通過validate元素來指定驗證方法。設定好validate的時候,如果驗證失敗將跳轉回input指定的頁面。
@Execute(validate = "validate", input = "login.jsp")
使用任意方法驗證的時候,驗證結果為NG的時候,拋出ActionMessagesException異常。
public void validateLogin(String userName, String password) { if (!userName.equals(password)) { throw new ActionMessagesException("errors.invalid.login"); } }
ActionMessagesException的處理,在app.dicon中定義
org.seasar.struts.interceptor.ActionMessagesThrowsInterceptor,customizer.dicon里定義的攔截器能夠使用。app.dicon和customizer.dicon,在工程sa-struts-tutorial下,放置在src/main/resources目錄下。
app.dicon
<component name="actionMessagesThrowsInterceptor" class="org.seasar.struts.interceptor.ActionMessagesThrowsInterceptor"/>
customizer.dicon
<component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> ... <initMethod name="addAspectCustomizer"> <arg>"actionMessagesThrowsInterceptor"</arg> </initMethod> ... </component>
重置方法
CheckBox(<input type="checkbox" .../>)或者多選列表(<select multiple="multiple" ...></select>),選中的值被傳請求傳送。 使用Session管理ActionForm的時候,需要將CheckBox或者多選列表重置。
為此可以在ActionForm中添加重置(reset)方法。 重置方法,在請求將參數傳入ActionForm之前被調用。
@Component(instance = InstanceType.SESSION) public class XxxForm implements Serializable { private static final long serialVersionUID = 1L; public boolean foo; public String[] bar; ... public void reset() { foo = false; bar = new String[0]; } }
重置方法名可以在執行方法中定義。默認為reset。
@Execute(reset = "執行方法名", ...)
文件上傳
文件上穿,在Action或者ActionForm中定義FormFile類型的屬性,通過FormFile得到上傳的文件。
如果定義為FormFile[]類型的數組,這可以上傳多個文件。請參照 詳しくは指南的文件上傳。
Ajax
SAStruts可以組合使用任意的Ajax庫。 這里以使用jQuery為例進行說明。
在Action的執行方法中,使用ResponseUtil.write("文字列")來向Response寫入返回字符串。 因為不需要進行頁面跳轉,返回值為null。
@Execute(validator = false) public String hello() { ResponseUtil.write("こんにちは"); return null; }
JSPでは、jQueryを使うためにヘッダでjquery.jsを取り込みます。あるタグをアクションの実行メソッドがレスポンスに書き込んだ値で置き換える場合は、$('タグのid').load('実行メソッド名');を呼び出します。
<script src="${f:url('/js/jquery.js')}"></script> ... <span id="message"></span><br /> <input type="button" value="hello" onclick="$('#message').load('hello');"/>
需要向Action傳遞參數的時候,在load的第二個參數中追加,如下例
public String greeting; ... @Execute(validator = false) public String hello() { ResponseUtil.write(greeting); return null; }
<input type="button" value="hello" onclick="$('#message').load('hello',{'greeting':'Hello'});"/>
也可以通過URL傳遞參數。
public String greeting; ... @Execute(validator = false, urlPattern = "hello/{greeting}) public String hello() { ResponseUtil.write(greeting); return null; }
<input type="button" value="hello" onclick="$('#message').load('hello/Hello');"/>
服務
業務邏輯定義在Service里。S2JDBC中已經定義好服務的原型,可以加以利用。
使用S2JDBC的時候,數據庫聯接的信息定義在jdbc.dicon。jdbc.dicon的配置請參照這里。sa-struts-tutorial工程,jdbc.dicon放置在目錄src/main/resources下。
S2JDBC自身的配置在s2jdbc.dicon中。s2jdbc.dicon的配置請參照這里。sa-struts-tutorial工程,s2jdbc.dicon放置在目錄src/main/resources下。
S2JDBC通過使用JdbcManager。 服務中使用JdbcManager的時候,如下所示定義變量,並添加注解@Resource。
@Resource protected JdbcManager jdbcManager;
事務處理
SAStruts的事務處理,依靠JTA。JTA的使用在s2container.dicon中進行定義,詳細信息請參照這里。sa-struts-tutorial工程,s2container.dicon放置在目錄src/main/resources下。
調用Action或者Service方法的時候,自動開始事務處理,是在customizer.dicon中設定。sa-struts-tutorial工程,s2container.dicon放置在目錄src/main/resources下。
cutomizer.dicon
<component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> <initMethod name="addCustomizer"> <arg> <component class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/> </arg> </initMethod> ... </component> <component name="serviceCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> <initMethod name="addCustomizer"> <arg> <component class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/> </arg> </initMethod> ... </component>
使用TxAttributeCustomizer,調用Object類以外的public方法的時候,自動開始事務處理。 默認的事務處理屬性為Required。
Required的時候,如果事務處理沒開始,則自動開始,如果已經存在事務處理,則繼續操作。 發生異常的時候自動回滾。
如果某個特別類需要改變事務屬性的時候,可以在類上追加注解@TransactionAttribute。
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public class XxxAction { ... }
某個特別的方法也可以追加注解@TransactionAttribute。 如下例,someMethod()為TransactionAttributeType.NEVERで、someMethod2()為TransactionAttributeType.REQUIRES_NEW。
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public class XxxAction { @TransactionAttribute(TransactionAttributeType.NEVER) public void someMethod() { ... } public void someMethod2() { ... } ... }
數據變換
Action和實體進行數據變換的時候,可以使用Beans。 不僅是單純的值拷貝,也可以進行字符串和數值等的類型變換。Commons BeanUtils沒有public變量對應的處理,如果 想對public變量進行變換的時候,請使用Beans。
將使用主鍵取得的數據拷貝到ActionForm中。
Employee emp = employeeService.findById(Integer.valueOf(employeeForm.id)); Beans.copy(emp, employeeForm).execute();
使用ActionForm的值跟新數據的時候。
Employee emp = Beans.createAndCopy(Employee.class, employeeForm).execute(); employeeService.update(emp);
JSP
JSP保存在Action的目錄下。 比如XxxAction對應的JSP保存在/xxx/。
Action或者Action的屬性名和 請求的屬性名保持一致。如下所示:
${f:h(プロパティ名)} <a href="${f:u(プロパティ名)}">...</a> <c:forEach items="${プロパティ名}" ... ${f:br(f:h(プロパティ名))} <fmt:formatDate value="${f:date(hireDate, 'yyyyMMdd')}" pattern="yyyy/MM/dd"/> <fmt:formatNumber value="${f:number(salary, '####')}" pattern="#,###"/>
需要進行HTML的Escape(為防止XSS將"<"轉換成"<")變換的時候,請使用f:h()。f:h()也可以用於顯示數組和列。
為防止XSS,需要對URL進行編碼的時候請使用f:u()。
EL使用items="${プロパティ名}"這樣的定義,為防止XSS,請對tag體使用f:h()。
a標簽的href元素,上下文的根目錄自動添加的時候,請使用f:url()。 路徑以/開始的時候,自動補上根目錄路徑。 如果不是以/開頭的時候,JSP參照的路徑。
textArea傳入的值表示時,需要通過<br />換行是,使用f:br()。空白就那樣表示的時候,使用f:nbsp()。f:br()和f:nbsp()可以組合使用。
${f:br(f:nbsp(f:h(textarea)))}
日付をフォーマットして表示するには、fmt:formatDateを使いますが、value要素に設定する値はDate型である必要があります。Strutsの場合、入力値は、文字列で定義するのが一般的なので、 文字列で定義されている入力値は、fmt:formatDateでフォーマットできません。このような場合は、f:date()を使って文字列をDate型に変換します。2番めの引數は、SimpleDateFormatの形式で指定します。
數值的表示形式需要變換的時候,可以使用fmt:formatNumber、value值必須是Number,如果是字符串則無法使用fmt:formatNumber進行變換。 需要先使用f:number()將字符串轉換為Number。 第2個參數為DecimalFormat的形式。
內聯的屬性可以通過點訪問。
${屬性名.內聯的屬性名}
Action或者ActionForm屬性,為了public變量可以被EL或者Struts使用、JavaBeans用Map,數組用List進行封裝。 屬性訪問(.)或者數組訪問([數値])以外的使用方法,變量的訪問請留意。
為了顯示任意對象的值,可以使用f:label(value, dataList, valueName, labelName)。value、任意對象的值。dataList是JavaBeans或者Map<String, Object>List等需要表示對象。valueName是value的屬性名(Map的時候是鍵名)、labelName是label的屬性名(Map的時候是鍵名)。
比如想在name屬性中顯示部門ID的信息,可以如下進行定義。
${f:label(e.departmentId, deptItems, "id", "name")}
どのJSPでも共通で使うような宣言は、1つのJSPにまとめ、web.xmlでそのJSPを指定します。sa-struts-tutorialプロジェクトでは、webapp/WEB-INF/view/common/common.jspに共通で使う宣言が定義されています。
commons.jsp
<%@page pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@taglib prefix="html" uri="http://struts.apache.org/tags-html"%> <%@taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%> <%@taglib prefix="tiles" uri="http://jakarta.apache.org/struts/tags-tiles"%> <%@taglib prefix="s" uri="http://sastruts.seasar.org"%> <%@taglib prefix="f" uri="http://sastruts.seasar.org/functions"%>
web.xml
<web-app> ... <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>false</el-ignored> <page-encoding>UTF-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude>/common/common.jsp</include-prelude> </jsp-property-group> </jsp-config> </web-app>
SAStruts在繼承Struts的html:form基礎上作成了s:form。action屬性可以自動生成,如果使用Tiles進行布局的JSP請加上action定義。
SAStruts在繼承Struts的html:link基礎上作成了s:link。
默認禁止直接跳轉到JSP上。如果違反將拋出400錯誤。JSP首先經過Action然后跳轉比較好。
redirect到其他JSP頁面時,如下定義返回值。就像經過ActionAction然后跳轉一樣。
return "/Action/method?redirect=true";
如果必須直接跳轉到JSP的時候,web.xml的routingfilter的init-param中的jspDirectAccess設為true。 詳細信息請參照web.xml。
Application自動生成
通過使用Dolteng可以自動生成應用。 詳細信息請參照Database View。