STUTH2

  博客分類: struts2

struts2框架是一個非常優秀的mvc框架,時至今日已有很多公司採用其作爲表示層的控制轉發工具,我非常喜歡struts2的攔截器特性和一整套的自定義標籤。在這根據個人使用struts2的經驗,與大家分享一些常用的struts2標籤,希望對大家有所幫助。

 

  • 實例場景
假設有這樣一個網站:需要用戶填寫個人的信息,包括:編號、姓名、密碼、生日、性別、城市、愛好。其中編號需要填入整數,姓名是字符串,密碼在頁面中必須以密碼框的形式顯示,生日必須是日期格式,性別單選,城市用下拉列表選擇,愛好複選框可以多選。那麼用戶填寫完信息以後,點擊“提交”按鈕,到下一個頁面顯示用戶填寫的信息。
  • 需求分析
這是一個非常常見的需求,裏面囊括了整形、字符串和日期類型等處理,另外用到了文本框、密碼框、單選、複選和下拉列表等控件。
如果採用servlet/jsp的開發模式是可以實現該功能的,但是很多地方可能需要一些複雜處理,比如用戶點擊提交到後臺需要通過request.getParameter的形式把頁面的字段逐個取出來解析;單選、複選和下拉列表中的數據需要使用jsp代碼逐個迭代顯示;如果加上表單驗證的話,這又需要花費更大的精力。
struts2提供了一整套的自定義標籤解決方案,其功能在原生html標籤基礎上做了很大的改進:控件的name屬性可以採用對象圖的形式定義,點擊提交按鈕通過攔截器自動封裝屬性,這樣在後臺就不需要用request獲取每個屬性字段了;struts2對的單選、複選和下拉列表等控件進行了改進,開發人員只需要用一行代碼設置集合數據和key/value即可顯示出與html同樣功能的組件;同時它提供了獨有的錯誤顯示標籤,用於顯示驗證不通過的錯誤信息,非常方便。
  • 實例效果
按照我的習慣,我首先把運行的效果展示出來,再根據效果分析每個功能的具體實現。

【表單數據填寫頁面】


 
【驗證不通過顯示的錯誤消息】


 
【提交成功後的頁面】


 
  • 後臺java代碼
爲了減少大家看代碼的疲憊感,我儘量將每個類的核心內容展示出來,具體的代碼實現在此就省略掉,如果需要全部代碼,可在附件中下載。

首先創建一個UserBean存放用戶信息,這是一個javabean:
Java代碼 複製代碼 收藏代碼
  1. public class UserBean implements Serializable{   
  2.     private static final long serialVersionUID = -5808037703808170288L;   
  3.        
  4.     private int userId;   //編號   
  5.     private String userName; //姓名   
  6.     private String password; //密碼   
  7.     private Date birthday = new Date(); //生日:格式yyyy-MM-dd,默認爲當前時間   
  8.     private int sex;   //性別:0男,1女   
  9.     private int[] hobby; //愛好,數組   
  10.     private int city; //所屬 城市   
  11.           
  12.         getter、setter...   
  13. }  
public class UserBean implements Serializable{
	private static final long serialVersionUID = -5808037703808170288L;
	
	private int userId;   //編號
	private String userName; //姓名
	private String password; //密碼
	private Date birthday = new Date(); //生日:格式yyyy-MM-dd,默認爲當前時間
	private int sex;   //性別:0男,1女
	private int[] hobby; //愛好,數組
	private int city; //所屬 城市
       
        getter、setter...
}
 
UserBean中的性別、愛好和所屬城市均使用int表示,但是在頁面中,需要用字符串來展示每個int對應的內容(key/value),所以需要分別創建它們對應的javabean,下面以SexBean爲例,其它與此完全類似:
Java代碼 複製代碼 收藏代碼
  1. public class CityBean implements Serializable{   
  2.     private static final long serialVersionUID = -6562852059776509594L;   
  3.        
  4.     private int cityId;   
  5.     private String cityValue;   
  6.        
  7.     public CityBean(int cityId, String cityValue) {   
  8.         super();   
  9.         this.cityId = cityId;   
  10.         this.cityValue = cityValue;   
  11.     }   
  12.   
  13.         getter、setter   
  14. }  
public class CityBean implements Serializable{
	private static final long serialVersionUID = -6562852059776509594L;
	
	private int cityId;
	private String cityValue;
	
	public CityBean(int cityId, String cityValue) {
		super();
		this.cityId = cityId;
		this.cityValue = cityValue;
	}

        getter、setter
}
 
然後編寫一個TagsService,用於處理業務邏輯,供action調用:
Java代碼 複製代碼 收藏代碼
  1. public class TagsService {   
  2.        
  3.     /**  
  4.      * Function  : 獲取城市的集合  
  5.      */  
  6.     public List<CityBean> getCitys()   
  7.        
  8.     /**  
  9.      * Function  : 獲取興趣的集合  
  10.      */  
  11.     public List<HobbyBean> getHobbis()   
  12.        
  13.     /**  
  14.      * Function  : 獲取性別的集合  
  15.      */  
  16.     public List<SexBean> getSexs()   
  17.        
  18.     /**  
  19.      * Function  : 獲取被選中的興趣愛好集合  
  20.      */  
  21.     public List<HobbyBean> getCheckedHobbies(int hobbies[])   
  22.        
  23.     /**  
  24.      * Function  : 獲取被選擇的城市集合  
  25.      */  
  26.     public CityBean getSelectedCity(int cityId)   
  27. }  
public class TagsService {
	
	/**
	 * Function  : 獲取城市的集合
	 */
	public List<CityBean> getCitys()
	
	/**
	 * Function  : 獲取興趣的集合
	 */
	public List<HobbyBean> getHobbis()
	
	/**
	 * Function  : 獲取性別的集合
	 */
	public List<SexBean> getSexs()
	
	/**
	 * Function  : 獲取被選中的興趣愛好集合
	 */
	public List<HobbyBean> getCheckedHobbies(int hobbies[])
	
	/**
	 * Function  : 獲取被選擇的城市集合
	 */
	public CityBean getSelectedCity(int cityId)
}
 
最後是mvc的核心Controller-TagsAction,有經驗的人看了下面代碼或許會覺得有些地方不合理,因爲相同功能會有多種實現,我這是做例子,隨後會告訴大家哪種方式會更好。
Java代碼 複製代碼 收藏代碼
  1. public class TagsAction extends ActionSupport {   
  2.     private static final long serialVersionUID = 4361410156958515185L;   
  3.     private TagsService tagsService = new TagsService();   
  4.        
  5.     //****formbean*****   
  6.     private List<CityBean> lstCityBean;   
  7.     private List<HobbyBean> lstHobbyBean;   
  8.     private UserBean userBean;   
  9.        
  10.     //*******action method***********   
  11.     /**   
  12.      * 進入表單填寫頁面   
  13.      */   
  14.     public String goIndex(){   
  15.         userBean = new UserBean();   
  16.         HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);   
  17.         request.setAttribute("lstSexBean", tagsService.getSexs());   
  18.         return SUCCESS;   
  19.     }   
  20.     /**  
  21.      * Function  : 提交表單  
  22.      */  
  23.     public String doSubmit(){   
  24.         HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);           
  25.         request.setAttribute("lstHobby", tagsService.getCheckedHobbies(userBean.getHobby()));   
  26.         request.setAttribute("cityBean", tagsService.getSelectedCity(userBean.getCity()));   
  27.         return SUCCESS;   
  28.     }   
  29.     /**  
  30.      * Function  : 驗證表單數據  
  31.      */  
  32.     public void validateDoSubmit(){   
  33.         if(userBean.getCity()<1){   
  34.             this.addFieldError("userBean.city""請選擇城市!");   
  35.             return;   
  36.         }   
  37.     }   
  38.   
  39.     public List<CityBean> getLstCityBean() {   
  40.         return tagsService.getCitys();   
  41.     }   
  42.   
  43.     public List<HobbyBean> getLstHobbyBean() {   
  44.         return tagsService.getHobbis();   
  45.     }   
  46.   
  47.         gettter、setter........   
  48. }  
public class TagsAction extends ActionSupport {
	private static final long serialVersionUID = 4361410156958515185L;
	private TagsService tagsService = new TagsService();
	
	//****formbean*****
	private List<CityBean> lstCityBean;
	private List<HobbyBean> lstHobbyBean;
	private UserBean userBean;
	
	//*******action method***********
	/**
	 * 進入表單填寫頁面
	 */
	public String goIndex(){
		userBean = new UserBean();
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
		request.setAttribute("lstSexBean", tagsService.getSexs());
		return SUCCESS;
	}
	/**
	 * Function  : 提交表單
	 */
	public String doSubmit(){
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);		
		request.setAttribute("lstHobby", tagsService.getCheckedHobbies(userBean.getHobby()));
		request.setAttribute("cityBean", tagsService.getSelectedCity(userBean.getCity()));
		return SUCCESS;
	}
	/**
	 * Function  : 驗證表單數據
	 */
	public void validateDoSubmit(){
		if(userBean.getCity()<1){
			this.addFieldError("userBean.city", "請選擇城市!");
			return;
		}
	}

	public List<CityBean> getLstCityBean() {
		return tagsService.getCitys();
	}

	public List<HobbyBean> getLstHobbyBean() {
		return tagsService.getHobbis();
	}

        gettter、setter........
}
 
  • 表單數據填寫頁面代碼分析
要使用struts2標籤,必須引用struts2的taglib
Java代碼 複製代碼 收藏代碼
  1. <%@ taglib prefix="s" uri="/struts-tags"%>  
<%@ taglib prefix="s" uri="/struts-tags"%>
 
【表單數據填寫頁面】
Html代碼 複製代碼 收藏代碼
  1. <body>  
  2.     <h3>Debug標籤</h3>  
  3.     <s:debug></s:debug>  
  4.     <hr/>  
  5.     <h3>表單標籤</h3>  
  6.     <form action="<%=root%>/doSubmit.action" method="post">  
  7.         <s:fielderror cssStyle="color:red"></s:fielderror>  
  8.         <table>  
  9.             <tr>  
  10.                 <td>編號:</td>  
  11.                 <td><s:textfield name="userBean.userId"/></td>  
  12.             </tr>  
  13.             <tr>  
  14.                 <td>姓名:</td>  
  15.                 <td><s:textfield name="userBean.userName"></s:textfield></td>  
  16.             </tr>  
  17.             <tr>  
  18.                 <td>密碼:</td>  
  19.                 <td><s:password name="userBean.password"></s:password></td>  
  20.             </tr>  
  21.             <tr>  
  22.                 <td>生日:</td>  
  23.                 <td>  
  24.                     <s:textfield name="userBean.birthday">  
  25.                         <s:param name="value">  
  26.                             <s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" />  
  27.                         </s:param>  
  28.                     </s:textfield>  
  29.                 </td>  
  30.             </tr>  
  31.             <tr>  
  32.                 <td>性別:</td>  
  33.                 <td><s:radio name="userBean.sex" list="#request.lstSexBean" listKey="sexId" listValue="sexValue"></s:radio></td>  
  34.             </tr>  
  35.             <tr>  
  36.                 <td>城市:</td>  
  37.                 <td><s:select name="userBean.city" list="lstCityBean" listKey="cityId" listValue="cityValue" headerKey="0" headerValue="--請選擇--"></s:select></td>  
  38.             </tr>  
  39.             <tr>  
  40.                 <td>愛好:</td>  
  41.                 <td><s:checkboxlist name="userBean.hobby" list="lstHobbyBean" listKey="hobbyId" listValue="hobbyValue"></s:checkboxlist></td>  
  42.             </tr>  
  43.             <tr>  
  44.                 <s:hidden></s:hidden>  
  45.                 <td><s:submit value="提交"/></td>  
  46.                 <td><s:reset value="重置"/></td>  
  47.             </tr>  
  48.         </table>  
  49.     </form>  
  50.        
  51. </body>  
<body>
	<h3>Debug標籤</h3>
	<s:debug></s:debug>
	<hr/>
	<h3>表單標籤</h3>
	<form action="<%=root%>/doSubmit.action" method="post">
		<s:fielderror cssStyle="color:red"></s:fielderror>
		<table>
			<tr>
				<td>編號:</td>
				<td><s:textfield name="userBean.userId"/></td>
			</tr>
			<tr>
				<td>姓名:</td>
				<td><s:textfield name="userBean.userName"></s:textfield></td>
			</tr>
			<tr>
				<td>密碼:</td>
				<td><s:password name="userBean.password"></s:password></td>
			</tr>
			<tr>
				<td>生日:</td>
				<td>
					<s:textfield name="userBean.birthday">
						<s:param name="value">
							<s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" />
						</s:param>
					</s:textfield>
				</td>
			</tr>
			<tr>
				<td>性別:</td>
				<td><s:radio name="userBean.sex" list="#request.lstSexBean" listKey="sexId" listValue="sexValue"></s:radio></td>
			</tr>
			<tr>
				<td>城市:</td>
				<td><s:select name="userBean.city" list="lstCityBean" listKey="cityId" listValue="cityValue" headerKey="0" headerValue="--請選擇--"></s:select></td>
			</tr>
			<tr>
				<td>愛好:</td>
				<td><s:checkboxlist name="userBean.hobby" list="lstHobbyBean" listKey="hobbyId" listValue="hobbyValue"></s:checkboxlist></td>
			</tr>
			<tr>
				<s:hidden></s:hidden>
				<td><s:submit value="提交"/></td>
				<td><s:reset value="重置"/></td>
			</tr>
		</table>
	</form>
	
</body>
 
<s:textfield>標籤:文本框標籤,可填寫文本內容,同時該標籤含有很多有用的屬性:
readonly 只讀屬性
disabled  可用/不可用屬性,如果設置爲不可用在提交表單的時候該文本框的值不會傳到後臺
cssClass 指定css的class
cssStyle  自定義css樣式
maxlength 文本框可輸入的文字個數
tooltip 冒泡提示
上面只是一小部分屬性,另外還有各種事件屬性:


 
<s:password>標籤:密碼框標籤,其附帶的屬性與textfield相似
<s:textarea>標籤:定義多行的文本輸入控件,其核心屬性cols和rows分別指定文本域的寬度和高度
<s:date>標籤:時間顯示標籤,用於顯示指定格式的時間對象,很多人不知道如何在文本框中顯示指定日期格式,大家可以參考通過<s:textfield>+<s:date>的形式:
Java代碼 複製代碼 收藏代碼
  1. <s:textfield name="userBean.birthday">   
  2.     <s:param name="value">   
  3.         <s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" />   
  4.     </s:param>   
  5. </s:textfield>  
<s:textfield name="userBean.birthday">
	<s:param name="value">
		<s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" />
	</s:param>
</s:textfield>
  <s:radio>標籤:單選按鈕,該控件依然採用key/value的形式處理數據,即key值傳到後臺,value值顯示給用戶,結合上面的例子,我們知道性別男的key=0,value="男",性別女的key=1,value="女",這就是爲什麼在後臺將性別以SexBean這種javabean的形式來存儲。開發用struts2的<s:radio>標籤展示單選按鈕完全是傻瓜式的操作:設置需要顯示的數據集合(collection或array),設置key和value,如下面的代碼:
Html代碼 複製代碼 收藏代碼
  1. <s:radio name="userBean.sex" list="#request.lstSexBean" listKey="sexId" listValue="sexValue"></s:radio>  
<s:radio name="userBean.sex" list="#request.lstSexBean" listKey="sexId" listValue="sexValue"></s:radio>
  注意list就是從後臺獲取的集合數據,listKey的值最終會賦給name="userBean.sex",listValue用於顯示給用戶。
從後臺向頁面傳list數據有多種方式,第一種方法是通過request.setAttribut的形式:
Java代碼 複製代碼 收藏代碼
  1. request.setAttribute("lstSexBean", tagsService.getSexs());  
request.setAttribute("lstSexBean", tagsService.getSexs());
  第二種更加好些,這也是個人推薦的:首先在action中定義一個集合formbean,設置formbean的get方法,然後重寫get方法,返回集合數據:
Java代碼 複製代碼 收藏代碼
  1. private List<SexBean> lstSexBean;   
  2.     public List<SexBean> getLstSexBean(){   
  3.         return tagsService.getSexs();   
  4.     }  
private List<SexBean> lstSexBean;
	public List<SexBean> getLstSexBean(){
		return tagsService.getSexs();
	}
  其實<s:radio>最後還是轉換成html的radio標籤顯示內容,我們可以看看通過<s:radio>轉換後的代碼:
Html代碼 複製代碼 收藏代碼
  1. <input type="radio" name="userBean.sex" id="userBean_sex0" checked="checked" value="0"/><label for="userBean_sex0"></label>  
  2. <input type="radio" name="userBean.sex" id="userBean_sex1" value="1"/><label for="userBean_sex1"></label>  
<input type="radio" name="userBean.sex" id="userBean_sex0" checked="checked" value="0"/><label for="userBean_sex0">男</label>
<input type="radio" name="userBean.sex" id="userBean_sex1" value="1"/><label for="userBean_sex1">女</label>
  <s:select>標籤:下拉列表,該標籤的使用方法跟<s:radio>標籤完全類似,另外可以通過headerKey和headerValue屬性設置下拉列表默認值和顯示的內容
<s:select>轉換成普通html後的代碼:
Html代碼 複製代碼 收藏代碼
  1. <select name="userBean.city" id="userBean_city">  
  2.     <option value="0"  
  3.     selected="selected"  
  4.     >--請選擇--</option>  
  5.     <option value="1">北京</option>  
  6.     <option value="2">上海</option>  
  7.     <option value="3">廣州</option>  
  8.     <option value="4">成都</option>  
  9.     <option value="5">深圳</option>  
  10. </select>  
<select name="userBean.city" id="userBean_city">
    <option value="0"
    selected="selected"
    >--請選擇--</option>
    <option value="1">北京</option>
    <option value="2">上海</option>
    <option value="3">廣州</option>
    <option value="4">成都</option>
    <option value="5">深圳</option>
</select>
  <s:checkboxlist>標籤:複選標籤,該標籤的使用方法跟<s:radio>標籤完全類似
<s:checkboxlist>轉換成普通html後的代碼:
Html代碼 複製代碼 收藏代碼
  1. <input type="checkbox" name="userBean.hobby" value="1" id="userBean.hobby-1"/>  
  2. <label for="userBean.hobby-1" class="checkboxLabel">唱歌</label>  
  3. <input type="checkbox" name="userBean.hobby" value="2" id="userBean.hobby-2"/>  
  4. <label for="userBean.hobby-2" class="checkboxLabel">跳舞</label>  
  5. <input type="checkbox" name="userBean.hobby" value="3" id="userBean.hobby-3"/>  
  6. <label for="userBean.hobby-3" class="checkboxLabel">運動</label>  
  7. <input type="checkbox" name="userBean.hobby" value="4" id="userBean.hobby-4"/>  
  8. <label for="userBean.hobby-4" class="checkboxLabel">旅遊</label>  
  9. <input type="checkbox" name="userBean.hobby" value="5" id="userBean.hobby-5"/>  
  10. <label for="userBean.hobby-5" class="checkboxLabel">宅神</label>  
  11. <input type="hidden" id="__multiselect_userBean_hobby" name="__multiselect_userBean.hobby" value="" />  
<input type="checkbox" name="userBean.hobby" value="1" id="userBean.hobby-1"/>
<label for="userBean.hobby-1" class="checkboxLabel">唱歌</label>
<input type="checkbox" name="userBean.hobby" value="2" id="userBean.hobby-2"/>
<label for="userBean.hobby-2" class="checkboxLabel">跳舞</label>
<input type="checkbox" name="userBean.hobby" value="3" id="userBean.hobby-3"/>
<label for="userBean.hobby-3" class="checkboxLabel">運動</label>
<input type="checkbox" name="userBean.hobby" value="4" id="userBean.hobby-4"/>
<label for="userBean.hobby-4" class="checkboxLabel">旅遊</label>
<input type="checkbox" name="userBean.hobby" value="5" id="userBean.hobby-5"/>
<label for="userBean.hobby-5" class="checkboxLabel">宅神</label>
<input type="hidden" id="__multiselect_userBean_hobby" name="__multiselect_userBean.hobby" value="" />
  <s:hidden>標籤:隱藏標籤,可以設置變量值,但是不在頁面顯示
<s:submit>標籤:表單提交按鈕
<s:reset>標籤:表單重置按鈕
<s:debug>標籤:struts2獨有的調試標籤,在開發中使用,可以在頁面看到值棧中的所有信息,方便調試。

  • 提交後顯示的頁面
點擊提交按鈕後,經過後臺處理,數據傳到另一個jsp顯示:
Html代碼 複製代碼 收藏代碼
  1. <body>  
  2.     <table>  
  3.         <tr>  
  4.             <td>編號:</td>  
  5.             <td><s:property value="userBean.userId"></s:property></td>  
  6.         </tr>  
  7.         <tr>  
  8.             <td>姓名:</td>  
  9.             <td><s:property value="userBean.userName"></s:property></td>  
  10.         </tr>  
  11.         <tr>  
  12.             <td>密碼:</td>  
  13.             <td><s:property value="userBean.password"></s:property></td>  
  14.         </tr>  
  15.         <tr>  
  16.             <td>生日:</td>  
  17.             <td><s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" /></td>  
  18.         </tr>  
  19.         <tr>  
  20.             <td>性別:</td>  
  21.             <td>  
  22.                 <s:if test="userBean.sex==0">  
  23.                     男   
  24.                 </s:if>  
  25.                 <s:else>  
  26.                     女   
  27.                 </s:else>  
  28.             </td>  
  29.         </tr>  
  30.         <tr>  
  31.             <td>城市:</td>  
  32.             <td>  
  33.                 <s:property value="#request.cityBean.cityValue"/>  
  34.             </td>  
  35.         </tr>  
  36.         <tr>  
  37.             <td>愛好:</td>  
  38.             <td>  
  39.             <s:if test="#request.lstHobby!=null">  
  40.                 <s:iterator value="#request.lstHobby" var="hobby" status="index" begin="0" end="#request.lstHobby.length-1">  
  41.                     第[<s:property value="%{#attr.index.index+1}"/>]條愛好:<s:property value="%{#attr.hobby.hobbyValue}"/><br/>  
  42.                 </s:iterator>  
  43.             </s:if>  
  44.             </td>  
  45.         </tr>  
  46.     </table>  
  47. </body>  
<body>
	<table>
		<tr>
			<td>編號:</td>
			<td><s:property value="userBean.userId"></s:property></td>
		</tr>
		<tr>
			<td>姓名:</td>
			<td><s:property value="userBean.userName"></s:property></td>
		</tr>
		<tr>
			<td>密碼:</td>
			<td><s:property value="userBean.password"></s:property></td>
		</tr>
		<tr>
			<td>生日:</td>
			<td><s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" /></td>
		</tr>
		<tr>
			<td>性別:</td>
			<td>
				<s:if test="userBean.sex==0">
					男
				</s:if>
				<s:else>
					女
				</s:else>
			</td>
		</tr>
		<tr>
			<td>城市:</td>
			<td>
				<s:property value="#request.cityBean.cityValue"/>
			</td>
		</tr>
		<tr>
			<td>愛好:</td>
			<td>
			<s:if test="#request.lstHobby!=null">
				<s:iterator value="#request.lstHobby" var="hobby" status="index" begin="0" end="#request.lstHobby.length-1">
					第[<s:property value="%{#attr.index.index+1}"/>]條愛好:<s:property value="%{#attr.hobby.hobbyValue}"/><br/>
				</s:iterator>
			</s:if>
			</td>
		</tr>
	</table>
</body>
  <s:property>標籤:用於顯示變量值的標籤,沒有什麼可說的
<s:if><s:elseif><s:else>標籤:這三個標籤結合使用就能實現java的if...elseif...else的邏輯操作,標籤中的test屬性用於分之條件判斷。
<s:iterator>標籤:迭代標籤,這個標籤的功能類似於java的for循環操作,value屬性裝的是集合對象,var屬性是集合中的某一對象,status表示迭代的次數,begin和end表示循環開始位置和結束位置。最後看上面例子的代碼:
Html代碼<s:iterator value="#request.lstHobby" var="hobby" status="index" begin="0" end="#request.lstHobby.length-1">  
  1. <SPAN style="WHITE-SPACE: pre"> </SPAN>第[<s:property value="%{#attr.index.index+1}"/>]條愛好:<s:property value="%{#attr.hobby.hobbyValue}"/><br/>  
  2. </s:iterator>  
<s:iterator value="#request.lstHobby" var="hobby" status="index" begin="0" end="#request.lstHobby.length-1">
	第[<s:property value="%{#attr.index.index+1}"/>]條愛好:<s:property value="%{#attr.hobby.hobbyValue}"/><br/>
</s:iterator>
 
  • OGNL簡介
OGNL是一個功能強大的EL,通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能,它使用相同的表達式去存取對象的屬性。

之所以命名爲OGNL,就是因爲它處理對象很給力,struts能夠將對象層層解析,把各個對象的關係以圖的樣式展示出來。比如userBean.userId,之所以能找到這個對象,就是因爲OGNL會先找userBean對象,然後再找userBean對象裏的userId屬性。假設UserBean這個類還包含了名爲Role的javabean的實例,Role裏面包含字段roleName,我們要找到roleName就可以直接寫<s:property value="user.role.roleName">,OGNL通過對象逐級導航找到子對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章