话说学习Struts2的标签其实早就完成了,只是学习的过程中出现了一个小意外,那就是将jsp页面的值传到Java中时却总是乱码,按照所有可行的方法都试过了,可惜,结果还是乱码、乱码、乱码。就在我走投无路时发现网上说Struts2 的有个版本有个bug,那就是中文乱码。于是我将我使用的Struts2的jar包版本换为2.2.1.1,没想到真的解决了这个问题。Apache发布了那么多Struts2的版本,偏偏让我撞见了这个有bug的版本,这运气….郁闷死我了…
好了,言归正传。Struts2的UI标签是很简单也很容易使用。你只需要在jsp页面引入<%@ taglib prefix=”s” uri=”/struts-tags”%>就可以直接使用Struts的标签了。你不用写任何html代码。当然你要是不习惯Struts2的标签样式,你可以设置“theme=simple”来取消它,然后你就可以按照自己的需要去设置样式了。
本次学习依然在前几次的项目基础上练习的,只是将Struts2的jar包换为了2.2.1.1的。
好了,请看我的这个注册表单register.jsp,代码如下:
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>注册表单</title>
<style type="text/css">
table.demo{border-collapse: collapse;}
table.demo th,td {padding: 0; border: 1px solid #000;}
</style>
</head>
<body>
<s:form action="register" theme="simple">
<table class="demo" width="400px"height="300px">
<thead>
<tr >
<th colspan="2"align="center">注册表</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: right;">姓名:</td>
<td><s:textfield name="username"></s:textfield></td>
</tr>
<tr>
<td style="text-align: right;">密码:</td>
<td><s:password name="password"></s:password></td>
</tr>
<tr>
<td style="text-align: right;">性别:</td>
<td><s:radio name="sex"list="sexList" ></s:radio></td>
</tr>
<tr>
<td style="text-align: right;">国家:</td>
<td><s:select list="countryList"listKey="id" listValue="countryName"name="country" label="国家"></s:select></td>
</tr>
<tr>
<td style="text-align: right;">自我介绍:</td>
<td><s:textarea name="about"label="自我介绍"></s:textarea></td>
</tr>
<tr>
<td style="text-align: right;">所属方向:</td>
<td><s:checkboxlist list="communityList" name="community" ></s:checkboxlist></td>
</tr>
<tr>
<td style="text-align: right;">您是否愿意接受签署协议:</td>
<td><s:checkbox name="mailingList"value="同意"></s:checkbox></td>
</tr>
<tr>
<td colspan="2"align="center"><s:submit value="提交"></s:submit></td>
</tr>
</tbody>
</table>
</s:form>
</body>
</html>
看以看出,我为了按照自己的样式控制表格,我选择取消它的样式。
更重要的是我们要理解Struts2的值栈。在Struts 2中,值栈是存储相关处理请求数据的地方 。因此,所有的form表单属性都将存储在值栈 。UI标签就是通过name属性来连接值栈。所以,name属性是必填的。
你会发现这个form表单中的radio,select,checkboxlist都有一个list属性。list可以是Collection,Map或者Iterator。Select相对来说要复杂很多,listValue是呈现在页面的值,listKey是与listValue相对应且传到后台接受的值。Checkbox返回的是一个boolean值。
关于标签就介绍这么多。现在来看看action文件,我的是RegisterAction.java,代码如下:
package com.iman.action;
import java.util.ArrayList;
import java.util.List;
import com.iman.model.Country;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport {
private Stringusername;
private Stringpassword;
private String sex;
private Stringcountry;
private String about;
private Stringcommunity;
private booleanmailingList;
private List<Country>countryList;
privateList<String> communityList;
privateList<String> sexList;
public Stringregister(){
returnSUCCESS;
}
public StringgetList(){
countryList=newArrayList<Country>();
countryList.add(newCountry(1,"中国"));
countryList.add(newCountry(2,"美国"));
countryList.add(newCountry(3,"法国"));
countryList.add(newCountry(4,"英国"));
communityList=newArrayList<String>();
communityList.add("Java");
communityList.add(".Net");
communityList.add("PHP");
sexList=newArrayList<String>();
sexList.add("男");
sexList.add("女");
return"list";
}
public StringgetUsername() {
returnusername;
}
public voidsetUsername(String username) {
this.username= username;
}
public StringgetPassword() {
returnpassword;
}
public voidsetPassword(String password) {
this.password= password;
}
public String getSex(){
return sex;
}
public voidsetSex(String sex) {
this.sex =sex;
}
public StringgetCountry() {
return country;
}
public voidsetCountry(String country) {
this.country= country;
}
public StringgetAbout() {
returnabout;
}
public voidsetAbout(String about) {
this.about =about;
}
public StringgetCommunity() {
returncommunity;
}
public void setCommunity(Stringcommunity) {
this.community= community;
}
public booleanisMailingList() {
returnmailingList;
}
public voidsetMailingList(boolean mailingList) {
this.mailingList= mailingList;
}
publicList<Country> getCountryList() {
returncountryList;
}
public voidsetCountryList(List<Country> countryList) {
this.countryList= countryList;
}
publicList<String> getCommunityList() {
returncommunityList;
}
public voidsetCommunityList(List<String> communityList) {
this.communityList= communityList;
}
publicList<String> getSexList() {
returnsexList;
}
public voidsetSexList(List<String> sexList) {
this.sexList= sexList;
}
}
其中username,password,sex,country, about, community,mailingList必须与form表单中的name属性的字段一样,否则将不能被Struts 2接收。
下面来看看struts.xml配置文件:
<action name="getList" class="com.iman.action.RegisterAction"method="getList" >
<result name="list">/register.jsp</result>
</action>
<action name="register" class="com.iman.action.RegisterAction"method="register">
<result name="success">/results/registerSuccess.jsp</result>
</action>
有两个action,其中一个action是将list传到页面,而另一个action则是将注册表单的信息传到一个接受页面,这个页面就是registerSuccess.jsp,代码如下:<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>注册成功</title>
</head>
<body>
姓名:<s:property value="username"/><br>
性别:<s:property value="sex"/><br>
国家:<s:property value="country"/><br>
自我介绍:<s:property value="about"/><br>
所属行业:<s:property value="community"/><br>
邮件列表:<s:property value="mailingList"/>
</body>
</html>
好了,开始运行这个表单了,启动服务器并部署项目,在地址栏输入:http://localhost:8000/Struts2Tutorial/getList.action(想想为什么要直接从action跳转到页面,我想我不说你也知道吧,当时我学习时可是费了好大劲儿才明白过来!从action跳转完成了数据的初始化),页面如下:
输入数值,点击提交按钮,将跳转到registerSuccess.jsp页面,效果如下:
是不是很简单啊?你只是看着简单而已,通过这个表单,我对Struts2的标签有了一个新的认识,你呢?
这是本人学习的结果,欢迎转载,欢迎交流,但转载务必给出本文章的链接地址:http://blog.csdn.net/youqishini/article/details/7060344,谢谢~
注意: <s:select name="country" label="国家" list="countryList" listKey="id" listValue="countryName" />
listValue 是在页面上显示内容(countryName),listKey是要传到后台的内容(id)