1. 程式人生 > >動態方法調用和通配符

動態方法調用和通配符

cut 調用 模擬 包括 erro borde mic 登錄 action

一、動態方法調用

  1. Action執行的時候並不一定要執行execute方法,也可以在配置文件中配置Action的時候用method=”name”來指定執行哪個方法;

Login.jsp

<form action="log.action">

<font color="red">${loginError }</font>

<table align="center">

<tr><td>用戶名:<input type="text" name="uname"></td></tr>

<tr><td>密&nbsp;&nbsp;碼:<input type="password" name="upass"></td></tr>

<tr><td><input type="submit" value="登錄"></td></tr>

</table>

</form>

Struts.xml

<action name="log" class="com.inspur.action.LoginAction"

method="login">

<result name="success">/success.jsp</result>

<result name="error">/error.jsp</result>

</action>

LoginAction.java

public String login(){

if("ross".equals(this.uname) && "111".equals(this.upass)){

return SUCCESS;

}else{

return ERROR;

}

}

  1. 也可以在URL地址中動態指定(動態方法調用DMI)(推薦)

動態調用案例

Login.jsp

<form action="log!login">

<font color="red">${loginError }</font>

<table align="center">

<tr><td>用戶名:<input type="text" name="uname"></td></tr>

<tr><td>密&nbsp;&nbsp;碼:<input type="password" name="upass"></td></tr>

<tr><td><input type="submit" value="登錄"></td></tr>

</table>

</form>

Struts.xml

<action name="log" class="com.inspur.action.LoginAction">

<result name="success">/success.jsp</result>

<result name="error">/error.jsp</result>

</action>

LoginAction.java

public String login() {

// 模擬用戶登錄處理(登錄正確)

if ("ross".equals(uname) && "111".equals(upass)) {

session.put("uname", uname);

// 返回邏輯視圖名

return SUCCESS;

// 登錄失敗

} else {

request.put("loginError", "登錄名稱或者密碼錯誤");

// 返回邏輯視圖名

return ERROR;

}

}

  • 如果action中存在多個方法時,可以使用“!方法名”的方式調用指定方法
  • 默認情況下,Struts的動態方法調用處於激活狀態,若想禁用該功能,可以在struts.xml文件中添加如下常量元素:

  <constant name="struts.enable.DynamicMethodInvocation" value="false"/>

二、通配符

  1. 一個Web應用可能有成千上萬個action聲明,可以利用Struts提供的通配符映射機制把多個彼此相似的映射關系簡化為一個映射關系

反面案例

Login.jsp

<form action="login_add.action">

<font color="red">${loginError }</font>

<table align="center">

<tr><td>用戶名:<input type="text" name="uname"></td></tr>

<tr><td>密&nbsp;&nbsp;碼:<input type="password" name="upass"></td></tr>

<tr><td><input type="submit" value="登錄"></td></tr>

</table>

</form>

</body>

Struts.xml

<package name="struts2" extends="struts-default">

<action name="login_add" class="com.inspur.action.LoginAction" method="add">

<result name="success">/login_add_success.jsp</result>

</action>

<action name="login_upd" class="com.inspur.action.LoginAction" method="upd">

<result name="success">/login_upd_success.jsp</result>

</action>

</package>

loginAction.xml

public String add(){

//第一種方式:actioncontext

ActionContext context = ActionContext.getContext();

Map<String, String> requestMap = (Map<String, String>) context.get("request");

requestMap.put("msg", "add success!");

return SUCCESS;

}

public String upd(){

//第一種方式:actioncontext

ActionContext context = ActionContext.getContext();

Map<String, String> requestMap = (Map<String, String>) context.get("request");

requestMap.put("msg", "upd success!");

return SUCCESS;

}

Struts.xml中add和upd可以用*代替,這樣每個action都只配置一次就好了,但是在系統裏面很多模塊的時候action依然會比較多,不利於配置。同理將action名稱也用通配符進行配置。

最終Struts.xml配置樣式:

<action name="*_*" class="com.inspur.action.{1}Action" method="{2}">

<result name="success">/{1}_{2}_success.jsp</result>

</action>

  1. 通配符的映射規則
  • 若找到多個匹配,沒有通配符的那個勝出
  • 若指定的動作不存在,Struts會嘗試把這個uri與任何一個包含著通配符*的動作名進行匹配
  • 若Struts找到的帶有通配符的匹配不止一個,最後一個匹配將勝出
  • 被通配符匹配到的uri字符串的子串可以用{1},{2}來引用。{1}匹配第一個子串,{2 }匹配第二個子串……
  • {0}匹配整個uri
  • *可以匹配零個或多個字符,但不包括/字符,如果想把/字符包括在內,需要使用**,如果需要對某個字符進行轉義,需要使用\。

動態方法調用和通配符