亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

struts2常用標(biāo)簽詳解

系統(tǒng) 2123 0

struts2框架是一個(gè)非常優(yōu)秀的mvc框架,時(shí)至今日已有很多公司采用其作為表示層的控制轉(zhuǎn)發(fā)工具,我非常喜歡struts2的攔截器特性和一整套的自定義標(biāo)簽。在這根據(jù)個(gè)人使用struts2的經(jīng)驗(yàn),與大家分享一些常用的struts2標(biāo)簽,希望對(duì)大家有所幫助。

?

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

【表單數(shù)據(jù)填寫(xiě)頁(yè)面】

struts2常用標(biāo)簽詳解
?
【驗(yàn)證不通過(guò)顯示的錯(cuò)誤消息】

struts2常用標(biāo)簽詳解
?
【提交成功后的頁(yè)面】

struts2常用標(biāo)簽詳解
?
  • 后臺(tái)java代碼
為了減少大家看代碼的疲憊感,我盡量將每個(gè)類的核心內(nèi)容展示出來(lái),具體的代碼實(shí)現(xiàn)在此就省略掉,如果需要全部代碼,可在附件中下載。

首先創(chuàng)建一個(gè)UserBean存放用戶信息,這是一個(gè)javabean:
        public class UserBean implements Serializable{
	private static final long serialVersionUID = -5808037703808170288L;
	
	private int userId;   //編號(hào)
	private String userName; //姓名
	private String password; //密碼
	private Date birthday = new Date(); //生日:格式y(tǒng)yyy-MM-dd,默認(rèn)為當(dāng)前時(shí)間
	private int sex;   //性別:0男,1女
	private int[] hobby; //愛(ài)好,數(shù)組
	private int city; //所屬 城市
       
        getter、setter...
}
      
?
UserBean中的性別、愛(ài)好和所屬城市均使用int表示,但是在頁(yè)面中,需要用字符串來(lái)展示每個(gè)int對(duì)應(yīng)的內(nèi)容(key/value),所以需要分別創(chuàng)建它們對(duì)應(yīng)的javabean,下面以SexBean為例,其它與此完全類似:
        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
}
      
?
然后編寫(xiě)一個(gè)TagsService,用于處理業(yè)務(wù)邏輯,供action調(diào)用:
        public class TagsService {
	
	/**
	 * Function  : 獲取城市的集合
	 */
	public List<CityBean> getCitys()
	
	/**
	 * Function  : 獲取興趣的集合
	 */
	public List<HobbyBean> getHobbis()
	
	/**
	 * Function  : 獲取性別的集合
	 */
	public List<SexBean> getSexs()
	
	/**
	 * Function  : 獲取被選中的興趣愛(ài)好集合
	 */
	public List<HobbyBean> getCheckedHobbies(int hobbies[])
	
	/**
	 * Function  : 獲取被選擇的城市集合
	 */
	public CityBean getSelectedCity(int cityId)
}
      
?
最后是mvc的核心Controller-TagsAction,有經(jīng)驗(yàn)的人看了下面代碼或許會(huì)覺(jué)得有些地方不合理,因?yàn)橄嗤δ軙?huì)有多種實(shí)現(xiàn),我這是做例子,隨后會(huì)告訴大家哪種方式會(huì)更好。
        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***********
	/**
	 * 進(jìn)入表單填寫(xiě)頁(yè)面
	 */
	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  : 驗(yàn)證表單數(shù)據(jù)
	 */
	public void validateDoSubmit(){
		if(userBean.getCity()<1){
			this.addFieldError("userBean.city", "請(qǐng)選擇城市!");
			return;
		}
	}

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

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

        gettter、setter........
}
      
?
  • 表單數(shù)據(jù)填寫(xiě)頁(yè)面代碼分析
要使用struts2標(biāo)簽,必須引用struts2的taglib
      <%@ taglib prefix="s" uri="/struts-tags"%>
    
?
【表單數(shù)據(jù)填寫(xiě)頁(yè)面】
      <body>
	<h3>Debug標(biāo)簽</h3>
	<s:debug></s:debug>
	<hr/>
	<h3>表單標(biāo)簽</h3>
	<form action="<%=root%>/doSubmit.action" method="post">
		<s:fielderror cssStyle="color:red"></s:fielderror>
		<table>
			<tr>
				<td>編號(hào):</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="--請(qǐng)選擇--"></s:select></td>
			</tr>
			<tr>
				<td>愛(ài)好:</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> 標(biāo)簽:文本框標(biāo)簽,可填寫(xiě)文本內(nèi)容,同時(shí)該標(biāo)簽含有很多有用的屬性:
readonly 只讀屬性
disabled ?可用/不可用屬性,如果設(shè)置為不可用在提交表單的時(shí)候該文本框的值不會(huì)傳到后臺(tái)
cssClass 指定css的class
cssStyle ?自定義css樣式
maxlength 文本框可輸入的文字個(gè)數(shù)
tooltip 冒泡提示
上面只是一小部分屬性,另外還有各種事件屬性:

?
<s:password> 標(biāo)簽:密碼框標(biāo)簽,其附帶的屬性與textfield相似
<s:textarea> 標(biāo)簽: 定義多行的文本輸入控件 ,其核心屬性cols和rows分別指定文本域的寬度和高度
<s:date> 標(biāo)簽:時(shí)間顯示標(biāo)簽,用于顯示指定格式的時(shí)間對(duì)象,很多人不知道如何在文本框中顯示指定日期格式,大家可以參考通過(guò)<s:textfield>+<s:date>的形式:
      <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> 標(biāo)簽:?jiǎn)芜x按鈕,該控件依然采用key/value的形式處理數(shù)據(jù),即key值傳到后臺(tái),value值顯示給用戶,結(jié)合上面的例子,我們知道性別男的key=0,value="男",性別女的key=1,value="女",這就是為什么在后臺(tái)將性別以SexBean這種javabean的形式來(lái)存儲(chǔ)。開(kāi)發(fā)用struts2的<s:radio>標(biāo)簽展示單選按鈕完全是傻瓜式的操作:設(shè)置需要顯示的數(shù)據(jù)集合(collection或array),設(shè)置key和value,如下面的代碼:
      <s:radio name="userBean.sex" list="#request.lstSexBean" listKey="sexId" listValue="sexValue"></s:radio>
    
? 注意list就是從后臺(tái)獲取的集合數(shù)據(jù),listKey的值最終會(huì)賦給name="userBean.sex",listValue用于顯示給用戶。
從后臺(tái)向頁(yè)面?zhèn)鱨ist數(shù)據(jù)有多種方式,第一種方法是通過(guò)request.setAttribut的形式:
      request.setAttribute("lstSexBean", tagsService.getSexs());
    
? 第二種更加好些,這也是個(gè)人推薦的:首先在action中定義一個(gè)集合formbean,設(shè)置formbean的get方法,然后重寫(xiě)get方法,返回集合數(shù)據(jù):
      private List<SexBean> lstSexBean;
	public List<SexBean> getLstSexBean(){
		return tagsService.getSexs();
	}
    
? 其實(shí)<s:radio>最后還是轉(zhuǎn)換成html的radio標(biāo)簽顯示內(nèi)容,我們可以看看通過(guò)<s:radio>轉(zhuǎn)換后的代碼:
      <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> 標(biāo)簽:下拉列表,該標(biāo)簽的使用方法跟<s:radio>標(biāo)簽完全類似,另外可以通過(guò)headerKey和headerValue屬性設(shè)置下拉列表默認(rèn)值和顯示的內(nèi)容
<s:select>轉(zhuǎn)換成普通html后的代碼:
      <select name="userBean.city" id="userBean_city">
    <option value="0"
    selected="selected"
    >--請(qǐng)選擇--</option>
    <option value="1">北京</option>
    <option value="2">上海</option>
    <option value="3">廣州</option>
    <option value="4">成都</option>
    <option value="5">深圳</option>
</select>
    
? <s:checkboxlist> 標(biāo)簽:復(fù)選標(biāo)簽,該標(biāo)簽的使用方法跟<s:radio>標(biāo)簽完全類似
<s:checkboxlist>轉(zhuǎn)換成普通html后的代碼:
      <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">運(yùn)動(dòng)</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> 標(biāo)簽:隱藏標(biāo)簽,可以設(shè)置變量值,但是不在頁(yè)面顯示
<s:submit> 標(biāo)簽:表單提交按鈕
<s:reset> 標(biāo)簽:表單重置按鈕
<s:debug> 標(biāo)簽:struts2獨(dú)有的調(diào)試標(biāo)簽,在開(kāi)發(fā)中使用,可以在頁(yè)面看到值棧中的所有信息,方便調(diào)試。

  • 提交后顯示的頁(yè)面
點(diǎn)擊提交按鈕后,經(jīng)過(guò)后臺(tái)處理,數(shù)據(jù)傳到另一個(gè)jsp顯示:
        <body>
	<table>
		<tr>
			<td>編號(hào):</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>愛(ài)好:</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}"/>]條愛(ài)好:<s:property value="%{#attr.hobby.hobbyValue}"/><br/>
				</s:iterator>
			</s:if>
			</td>
		</tr>
	</table>
</body>
      
? <s:property> 標(biāo)簽:用于顯示變量值的標(biāo)簽,沒(méi)有什么可說(shuō)的
<s:if><s:elseif><s:else> 標(biāo)簽:這三個(gè)標(biāo)簽結(jié)合使用就能實(shí)現(xiàn)java的if...elseif...else的邏輯操作,標(biāo)簽中的test屬性用于分之條件判斷。
<s:iterator> 標(biāo)簽:迭代標(biāo)簽,這個(gè)標(biāo)簽的功能類似于java的for循環(huán)操作,value屬性裝的是集合對(duì)象,var屬性是集合中的某一對(duì)象,status表示迭代的次數(shù),begin和end表示循環(huán)開(kāi)始位置和結(jié)束位置。最后看上面例子的代碼:
        <s:iterator value="#request.lstHobby" var="hobby" status="index" begin="0" end="#request.lstHobby.length-1">

        
        
        第[<s:property value="%{#attr.index.index+1}"/>]條愛(ài)好:<s:property value="%{#attr.hobby.hobbyValue}"/><br/>
</s:iterator>
      
?
  • OGNL簡(jiǎn)介
OGNL是一個(gè)功能強(qiáng)大的EL,通過(guò)它簡(jiǎn)單一致的表達(dá)式語(yǔ)法,可以存取對(duì)象的任意屬性,調(diào)用對(duì)象的方法,遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類型轉(zhuǎn)化等功能,它使用相同的表達(dá)式去存取對(duì)象的屬性。

之所以命名為OGNL,就是因?yàn)樗幚韺?duì)象很給力,struts能夠?qū)?duì)象層層解析,把各個(gè)對(duì)象的關(guān)系以圖的樣式展示出來(lái)。比如userBean.userId,之所以能找到這個(gè)對(duì)象,就是因?yàn)镺GNL會(huì)先找 userBean 對(duì)象,然后再找 userBean 對(duì)象里的 userId屬性 。假設(shè)U serBean 這個(gè)類還包含了名為Role的javabean的實(shí)例,Role里面包含字段roleName,我們要找到roleName就可以直接寫(xiě)<s:property value="user.role.roleName">,OGNL通過(guò)對(duì)象逐級(jí)導(dǎo)航找到子對(duì)象。

struts2常用標(biāo)簽詳解


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲精品中文字幕乱码一区二区 | 美女被爆羞羞视频网站视频 | 四虎永久成人免费 | 欧美在线一区二区三区 | 中文字暮文字暮 | 日日噜噜夜夜狠狠久久丁香 | 亚洲特级片 | 成人亚州| 免费看欧美一级a毛片 | 视频在线一区二区 | 特级毛片免费播放 | 国产成人一区二区三区在线播放 | 四虎免费影院在线播放 | 国产无套免费网站 | 亚洲一区免费视频 | 国产色视频一区 | 毛片在线不卡 | 成人在线午夜 | 国产精品久久二区三区色裕 | 日韩毛片免费 | 亚洲日本va| 国产久视频观看 | 日韩精品高清自在线 | 一级毛片一级毛片a毛片欧美 | 国产精品福利一区二区久久 | 99久久综合狠狠综合久久aⅴ | 日不卡在线| 中文字幕一区日韩在线视频 | 国产99re在线观看只有精品 | 午夜在线视频一区二区三区 | 亚洲成人中文 | 免费区欧美一级毛片精品 | 老妇色 | 夜夜爽天天操 | 久久久久久极精品久久久 | 天天拍夜夜添久久精品中文 | 日本强不卡在线观看 | 在线视频不卡国产在线视频不卡 | 狠狠噜噜 | 亚洲欧洲一区二区三区在线 | 美国毛片一级视频在线aa |