}
}
//河北省的市:
City c10=new City(10,\石家庄\); City c11=new City(11,\晋州市\); City c12=new City(12,\鹿泉市\); List p4City=new ArrayList(); p4City.add(c10); p4City.add(c11); p4City.add(c12);
//四川省的市:
City c13=new City(13,\成都\); City c14=new City(14,\南充\); City c15=new City(15,\绵阳\); List p5City=new ArrayList(); p5City.add(c13); p5City.add(c14); p5City.add(c15);
//云南省的市:
City c16=new City(16,\昆明市\); City c17=new City(17,\安宁市\); City c18=new City(18,\曲靖市\); List p6City=new ArrayList(); p6City.add(c16); p6City.add(c17); p6City.add(c18);
citys.put(p1,p1City ); citys.put(p2,p2City ); citys.put(p3,p3City ); citys.put(p4,p4City ); citys.put(p5,p5City ); citys.put(p6,p6City );
简要分析:此实例有些繁琐,主要思想:我们的place对象主要为一级列表服务,只要理解了前面的下拉列表,这里不难理解一级列表。而二级列表中我们使用#ts.citys[top]取出的一个List对象,这样也正是下拉列表所要求的对象类型(List,Map),而top是非常关键的,它明确指出我们取出的是栈顶的对象,这样就能根据一级列表的值来动态生成这个List对象。 5.其它表单标签
41
leftTitle=\选择喜欢做的事:\ list=\听歌','看电影','编程','玩游戏','chat'}\ name=\ headerKey=\ headerValue=\喜欢做的事\ emptyOption=\ rightTitle=\选择讨厌做的事:\ doubleList=\跳舞','唱歌','打篮球','旅游','shopping'}\ doubleName=\ doubleHeaderKey=\ doubleHeaderValue=\不喜欢的事\ doubleEmptyOption=\ label=\个人兴趣说明\ leftUpLabel=\上移\ leftDownLabel=\下移\ rightUpLabel=\上移\ rightDownLabel=\下移\ addToLeftLabel=\<—添加\ addToRightLabel=\添加—>\ addAllToLeftLabel=\<—添加(All)\ addAllToRightLabel=\添加(All)—>\ selectAllLabel=\全选\ /> list=\ moveDownLabel=\下移一位\ moveUpLabel=\上移一位\ selectAllLabel=\全部选中\ label=\您常用编程语言排名\ /> 有了前面的标签学习,这些标签很容易理解,只需结合显示效果和查看源码来加深它们的理解。但是特别要注意的是 补充:使用struts2生成的表单标签会在标签内嵌套一些特殊的格式,在使用了struts2生成的标签所在网页内查看源代码可以发现多了一些如这样的格式化代码。如果不想struts2增加这些多余的格式化代码,可以在struts.xml中配置如下内容: 6.其它常用标签的使用(代码参名为“补充”的文件夹下的tag.jsp) 42 (1) 此标签主要用于设置一些属性值。 Scope:指定变量被设置的范围,该属性可以接受application、session、request、page或Action。如果没有设置该属性,则默认放置在OGNL Context中,我们可以通过#号来引用。 Value:赋给变量的值,如果没有设置该属性,则将ValueStack栈顶的值赋给变量。 Id/name/var:属性的引用名称,id/name均过时,建议用var来取代他们。 (2) Default:可选属性,如果需要输出的属性值为null,则显示属性指定的值 Escape:可选属性,指定是否格式化html代码。 Value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值 Id:可选属性,指定该元素的标识 (3) Value:可选属性,指定迭代的集合,如果没有指定该属性,则使用ValueStack栈顶的集合 Id:可选属性,指定集合里元素的id(已被标记为过时) Status:可选属性,该属性指定迭代时当前迭代对象的一个实例,并把此实例放在ognl的上下文中,我们可以通过#号来引用这个实例。该实例包含如下几下方法: Int getCount:返回当前迭代了几个元素。 Int getIndex:返回当前被迭代的元素的索引 Boolean isEven:返回当前被迭代的元素的索引是否是偶数 Boolean isOdd:返回当前被迭代的元素的索引是否是奇数 Boolean isFirst:返回当前被迭代的元素是否是第一个元素 Boolean isLast:返回当前被迭代的元素是否是最后一个元素 说明:因为iterator会把每次迭代的实例放在值栈的栈顶,而 如果想用status来实现一些功能,可参下面的代码: (4)url标签 43 说明:它会根据action及namespace并附加上下文路径构建一个链接。 说明:由于url标签的value属性默认不支持ognl,所以我们要使用%{}来表示{}中的#bdUrl是一个 ognl表达式。 七、国际化 尽管国际化不是重点内容,但是也有必要了解它的使用。在struts2中国际化有三种级别:分别是针对某个Action的action级别,针对package的package级别,针对webapp的webapp级别。下面我们建立struts2i18n项目来演示国际化在struts2中的使用。 1.action级别下的国际化 步骤一、首先是建立login.jsp及LoginAction,由于它们经常使用,在此省去它们的代码。 步骤二、建立资源文件,由于LoginAction在com.asm包中,所以我们应在com.asm包下我们建立两个资源文件:一个是中文LoginAction_zh_CN.properties、一个是英文LoginAction_zh_CN.properties。注意它们的名字相对固定,前面与Action的名字相同,后面是语言和国家代码。 英文资源文件内容如下: login_page=login page login_username=userName login_password=password login_sex=sex login_male=male login_female=female login_submit=login login_reset=reset login_suc=Welcome {0} 中文资源文件,需要特别注意:我们应使用Myeclipse自带的MyEclipse properties Editer编辑器来打开此资源文件,并在properties视图下进行编辑,这样它会把中文进行编码(我们切换到source视图下可以看到经编码后的中文)。 这一步非常重要,否则会出现乱码。 步骤三,修改login.jsp中的内容: <%@ page language=\pageEncoding=\%> <%@ taglib uri=\prefix=\%> value=\label=\name=\/> 44 说明:对资源文件的引用,我们采取了两种方式:有的是通过在label中使用%{getText('资源文件中的key')}这样的形式,有的是通过key=资源文件中的key这种形式。需要注意在radio标签中list对资源文件的引用。另外需要注意: 它们的区别:前面是纯文本,后者是一个块。我们可以通过查看login.jsp的源码来证明。 步骤四、当我们直接访问login.jsp时会报错,因为在login.jsp中用到了资源文件,而资源文件又依赖于LoginAction,所以我们只能通过此Action来跳到login.jsp。但是使用包范围、全局范围的资源文件时,可以直接访问login.jsp文件实现国际化。操作步骤如下: 首先在LoginAction中增加一个方法: public String doGoLogin() { } return LOGIN; 随后再在struts.xml中配置如下内容: 接着再编写一个link.jsp页面,内容如下: /login!goLogin.action\>登录 直接访问Action中的方法 格式:doX(大写)xxx ---- ActionName!x(小写)xxx.action 注意此方法和前面二.7中相关方法的区别。 我们通过此Action跳转到login.jsp这样便能成功访问到login.jsp页面。 步骤五、在success.jsp中使用资源文件,主要内容如下: 说明:在前面的资源文件中,我们配置了login_suc=Welcome {0},其中{0}表示占位参数,这里我们使用 步骤六、测试:在ie的internet选项中改变语言实现国际化的访问。 2.配置package的资源文件 同样在建立com.asm包下建立两个资源文件(package级别的资源文件名必须以package开头):取名为:package_zh_CN.properties,它的内容为:pack=pack属性值 和package_en_US.properties,它的内容为:pack=packageAttributeValue 然后再在login.jsp页面中增加如下内容: 这样便完成了package级别的资源文件配置,最后发布测试。 3.app级别的资源文件 在src目录下建立两个资源文件,取名为myapp_en_US.properties,它的内容为: app=appAttributeValue 和myapp_zh_CN.properties,它的内容为: 45
-------------------奇数红色,偶数蓝色---------------
-----------使用url---------------
测试包资源文件