struts2框架介绍(JAVAEE框架技术教程之第3章)
struts2框架介绍(JAVAEE框架技术教程之第3章)3.1 Struts2标签库概述在javaWeb阶段,JSP标签库能够简化JSP的开发,避免JSP中嵌入大量Java脚本,同样的,常见的Web层框架也提供了自己特有的标签库,包括Struts2,它提供的标签库功能非常丰富,大大简化了开发,本章将详细讲解Struts2的标签库。· 熟练掌握表单标签· 了解其他标签· 掌握OGNL表达式语言
第3章 struts2标签库
本章学习目标
· 熟练掌握控制标签
· 熟练掌握数据标签
· 熟练掌握表单标签
· 了解其他标签
· 掌握OGNL表达式语言
在javaWeb阶段,JSP标签库能够简化JSP的开发,避免JSP中嵌入大量Java脚本,同样的,常见的Web层框架也提供了自己特有的标签库,包括Struts2,它提供的标签库功能非常丰富,大大简化了开发,本章将详细讲解Struts2的标签库。
3.1 Struts2标签库概述
3.1.1 Struts2标签的分类
Struts2提供的标签库功能很强大,使用很简单,不依赖任何表现层技术,不仅可以在JSP页面中使用,也可以在其他页面中使用,例如FreeMarker等。
Struts2框架的标签库可以分为以下三类。
1.UI标签
UI标签主要用于生成HTML元素的标签,里面包含表单标签和非表单标签,其中表单标签主要用于生成HTML页面的form元素,以及普通表单元素的标签。非表单标签主要用于生成页面上的tree、tab页等。
2.非UI标签
非UI标签主要用于数据访问,逻辑控制,里面包含数据访问标签和流程控制标签,其中数据访问标签主要包含用于输出值栈中的值,完成国际化等功能。流程控制标签主要用于实现分支、循环等流程的控制。
3.Ajax标签
Ajax标签用的比较少,这里不做深入讨论,如果读者有兴趣,可以自己查阅相关资料。
3.1.2 Struts2标签库的导入
在第一章中下载的struts-2.5.10.1-all.zip的lib目录下,有一个struts2-core-2.5.10.1.jar文件,该文件中包含了标签的处理类和描述文件,解压此文件,在META-INF目录下可以找到struts-tags.tld文件,该文件就是Struts2的标签库描述文件。
在JSP中使用标签库时,必须使用taglib指令引入标签库,具体示例如下。
<%@taglib prefix="s" uri="/struts-tags"%>
如上示例中,prefix="s"指定了使用此标签库时的前缀,uri="/struts-tags"指定了标签库描述文件的路径,如果项目采用的Servlet规范版本是2.3或以下,还需要在web.xml中增加对标签库的定义,具体示例如下。
<taglib>
<taglib-uri>
/struts-tags
</taglib-uri>
<taglib-location>
/WEB-INF/lib/struts2-core-2.5.10.1.jar
</taglib-location>
</taglib>
介绍完标签库的导入,接下来将详细讲解每一类标签的使用。
3.2 流程控制标签
流程控制标签主要用于流程的控制,例如分支、循环等操作,除此之外,还可以完成对集合的合并、排序等操作,接下来具体介绍流程控制标签。
3.2.1 if标签
if标签与java的语法一样,做为条件判断来使用,标签内有一个test属性接收布尔类型参数,以此来判断输出的内容,接下来通过一个案例来演示if标签的使用,如例3-1所示。
例3-1 if.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <h1>
14 <s:if test="true">正确</s:if>
15 <s:if test="false">错误</s:if>
16 </h1>
17 </center>
18 </body>
19 </html>
例3-1的代码编写完成后,运行项目,在浏览器访问项目下的if.jsp,运行效果如图3.1所示。
图3.1 if.jsp
图3.1中,if.jsp页面显示"正确",因为例3-1中,s:if标签的test属性判断是否为true,为true就输出标签体,为false则隐藏标签体。
3.2.2 generator标签
generator标签是一个字符串解析器,用于将一个字符串解析成一个集合,接下来通过一个案例来演示generator标签的使用,如例3-2所示。
例3-2 generator.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:generator val="'Java C# C '" separator=" ">
14 <s:iterator>
15 <s:property />
16 </s:iterator>
17 </s:generator>
18 </center>
19 </body>
20 </html>
例3-2的代码编写完成后,运行项目,在浏览器访问项目下的if.jsp,运行效果如图3.2所示。
图3.2 generator.jsp
图3.2中,generator.jsp页面显示"Java C# C ",在例3-2中,利用generator标签,将字符串解析,根据逗号进行分割,解析完成后,通过iterator标签遍历解析完成后的集合,通过property标签显示集合内容。
3.2.3 iterator标签
iterator标签是一个迭代器,用于将集合迭代输出,接下来通过一个案例来演示iterator标签的使用,如例3-3所示。
例3-3 iterator.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:iterator value="{'1' '2' '3' '4' '5'}">
14 <s:property />
15 </s:iterator>
16 </center>
17 </body>
18 </html>
例3-3的代码编写完成后,运行项目,在浏览器访问项目下的iterator.jsp,运行效果如图3.3所示。
图3.3 iterator.jsp
图3.3中,iterator.jsp页面显示"1 2 3 4 5",在例3-3中,在iterator标签中用value属性声明要遍历的集合,然后通过property标签显示集合内容。
3.2.4 subset标签
subset标签用于截取集合的部分元素,形成新的子集合,接下来通过一个案例来演示subset标签的使用,如例3-4所示。
例3-4 subset.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <table border="1" width="200">
14 <s:subset source="{'Java' 'C#' 'C ' 'PHP' 'Python'}"
15 start="1" count="3">
16 <s:iterator>
17 <td><s:property /></td>
18 </s:iterator>
19 </s:subset>
20 </table>
21 </center>
22 </body>
23 </html>
例3-4的代码编写完成后,运行项目,在浏览器访问项目下的subset.jsp,运行效果如图3.4所示。
图3.4 subset.jsp
图3.4中,subset.jsp页面显示"C# C PHP",在例3-4中,在subset标签中用source属性指定源集合,用start属性指定从索引为1的元素开始取,这里索引从0开始,也就是从第二个元素开始取,最后用count指定子集中元素的个数为3,所以取得了三个元素,形成新的子集,然后通过iterator标签和property标签进行遍历显示。
3.3 数据访问标签
数据访问标签主要用于各种数据访问相关的功能以及Action的调用等,接下来具体介绍数据访问标签。
3.3.1 action标签
action标签用于在jsp页面中直接调用Action,接下来通过一个案例来演示action标签的使用,首先编写后台代码,如例3-5所示。
例3-5 MyAction.java
1 import com.opensymphony.xwork2.ActionSupport;
2 public class MyAction extends ActionSupport {
3 private static final long serialVersionUID = 1L;
4 public void myMethod() {
5 System.out.println("myMethod方法被调用了!");
6 }
7 }
接着在struts.xml文件中编写映射关系,如例3-6所示。
例3-6 struts.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE struts PUBLIC
3 "-//Apache Software Foundation//DTD Struts
4 Configuration 2.5//EN"
5 "http://struts.apache.org/dtds/struts-2.5.dtd">
6 <struts>
7 <constant name="struts.enable.DynamicMethodInvocation"
8 value="false" />
9 <constant name="struts.devMode" value="true" />
10 <package name="default" namespace="/"
11 extends="struts-default">
12 <action name="myAction"
13 class="com.qianfeng.struts.action.MyAction"
14 method="myMethod">
15 </action>
16 </package>
17 </struts>
最后编写action.jsp页面,如例3-7所示。
例3-7 action.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:action name="myAction" namespace="/"
14 executeResult="false">
15 </s:action>
16 </center>
17 </body>
18 </html>
代码编写完成后,运行项目,在浏览器访问项目下的action.jsp,控制台会打印出"myMethod方法被调用了!"运行效果如图3.5所示。
图3.5 控制台
在例3-5中,编写了一个Action实现类,自定义了一个myMethod方法,方法内在控制台输出"myMethod方法被调用了!",例3-6中在struts.xml配置文件中,定义name为myAction的实现类,例3-7中在页面直接使用action标签访问name为myAction的Action。
3.3.2 bean标签
bean标签用于创建一个JavaBean的实例,可以通过bean标签的子标签param给JavaBean传入参数,接下来通过一个案例来演示bean标签的使用,首先新建一个JavaBean的类,这里将类建在com.qianfeng.struts.entity包下,如例3-8所示。
例3-8 Student.java
1 package com.qianfeng.struts.entity;
2 public class Student {
3 private String name;
4 private int age;
5 public String getName() {
6 return name;
7 }
8 public void setName(String name) {
9 this.name = name;
10 }
11 public int getAge() {
12 return age;
13 }
14 public void setAge(int age) {
15 this.age = age;
16 }
17 @Override
18 public String toString() {
19 return "Student [name=" name " age=" age "]";
20 }
21 }
接下来编写bean.jsp页面,如例3-9所示。
例3-9 bean.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:bean name="com.qianfeng.struts.entity.Student" var="s">
14 <s:param name="name" value="'lily'" />
15 <s:param name="age" value="21" />
16 </s:bean>
17 Person实例的name为:<s:property value="#s.name" />
18 <br>
19 Person实例的age为:<s:property value="#s.age" />
20 </center>
21 </body>
22 </html>
代码编写完成后,运行项目,在浏览器访问项目下的bean.jsp,运行效果如图3.6所示。
图3.6 bean.jsp
在例3-8中,创建了一个Student实体类,在例3-9中,直接使用bean标签的name属性指定要创建的实体类是在com.qianfeng.struts.entity包下的Student,var属性指定别名为s,在子标签param中,分别指定了实体类的name和age属性值,创建完成后,通过property标签取到了创建好的实例的值,这里实际上是将类的实例放到了值栈的栈顶,关于值栈会在后面详细讲解。
3.3.3 date标签
date标签用于日期的相关操作,例如日期格式化,接下来通过一个案例来演示date标签的使用,如例3-10所示。
例3-10 date.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <%
13 java.util.Date now = new java.util.Date();
14 pageContext.setAttribute("now" now);
15 %>
16 <center>
17 <s:date name="#attr.now" format="yyyy/MM/dd" />
18 </center>
19 </body>
20 </html>
例3-10的代码编写完成后,运行项目,在浏览器访问项目下的date.jsp,运行效果如图3.7所示。
图3.7 date.jsp
图3.7中,bean.jsp页面显示了格式化后的当前时间,在例3-10中,通过java脚本创建了一个Date对象now,赋值为当前时间,将now设置到了page域中,指定date标签的name属性为now,用format属性指定了日期的格式。
3.4 表单标签
表单标签对应着HTML中的表单元素,Struts2表单标签提供了很多简单易用的属性,大大提高开发效率,开发时,这些表单属性实际上对应着Action中的属性值,Struts2框架会将提交的表单信息直接赋给对应的Action属性,接下来具体介绍表单标签。
3.4.1 form标签
form标签用于定义form表单,接下来通过一个案例来演示form标签的使用,如例3-11所示。
例3-11 form.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:form action="login">
14 用户名:<input type="text" name="username" />
15 <br />
16 密   码:<input type="password" name="password" />
17 <br />
18 <input type="submit" value="提交" />
19 </s:form>
20 </center>
21 </body>
22 </html>
例3-11的代码编写完成后,运行项目,在浏览器访问项目下的form.jsp,运行效果如图3.8所示。
图3.8
图3.9 form.jsp
图3.8中,form.jsp页面了一个登陆的表单,在例3-11中,在form标签中写了三个input标签,定义表单中的内容,有用户名、密码和提交。
3.4.2 textfield标签
textfield标签用于定义普通文本输入框,接下来通过一个案例来演示textfield标签的使用,如例3-12所示。
例3-12 textfield.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:form action="login">
14 <s:textfield name="username" label="用户名" />
15 </s:form>
16 </center>
17 </body>
18 </html>
例3-12的代码编写完成后,运行项目,在浏览器访问项目下的textfield.jsp,运行效果如图3.9所示。
图3.10 textfield.jsp
图3.9中,textfield.jsp页面显示用户名输入框,例3-12中,首先定义表单,然后在textfield标签中用name属性指定文本框的名字,用label属性指定文本框前的描述文字。
3.4.3 password标签
password标签用于定义一个密码框,接下来通过一个案例来演示password标签的使用,如例3-13所示。
例3-13 password.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:form action="login">
14 <s:password name="password" label="密码" />
15 </s:form>
16 </center>
17 </body>
18 </html>
例3-8的代码编写完成后,运行项目,在浏览器访问项目下的password.jsp,运行效果如图3.10所示。
图3.11 password.jsp
图3.10中,password.jsp页面显示了一个密码文本框,输入的密码隐式显示,在例3-13中,首先定义表单,然后在password标签中用name属性指定文本框的名字,用label属性指定文本框前的描述文字。
3.4.4 radio标签
radio标签用于定义单选框,接下来通过一个案例来演示radio标签的使用,如例3-14所示。
例3-14 radio.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:form action="login">
14 <s:radio list="#{1:'男' 0:'女'}" name="sex" value="1"
15 label="性别" />
16 </s:form>
17 </center>
18 </body>
19 </html>
例3-14的代码编写完成后,运行项目,在浏览器访问项目下的radio.jsp,运行效果如图3.11所示。
图3.12 radio.jsp
图3.11中,radio.jsp页面显示了一个单选项,默认选择"男",在例3-14中,首先定义表单,然后在radio标签中用list属性指定单选项的内容,用value属性指定默认值为1,也就是默认选择"男",用name属性指定单选框的名字,用label属性指定文本框前的描述文字。
3.4.5 checkboxlist标签
checkboxlist标签用于定义多选框,接下来通过一个案例来演示checkboxlist标签的使用,如例3-15所示。
例3-15 checkboxlist.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:form action="login">
14 <s:checkboxlist list="#{1:'足球' 2:'篮球' 3:'羽毛球'}"
15 name="love" label="爱好" />
16 </s:form>
17 </center>
18 </body>
19 </html>
例3-15的代码编写完成后,运行项目,在浏览器访问项目下的checkboxlist.jsp,运行效果如图3.12所示。
图3.13 checkboxlist.jsp
图3.12中,checkboxlist.jsp页面显示了一个多选框,在例3-15中,首先定义表单,然后在checkboxlist标签中用list属性指定多选框的内容,用name属性指定多选框的名字,用label属性指定文本框前的描述文字。
3.4.6 select标签
select标签用于定义下拉选项,接下来通过一个案例来演示select标签的使用,如例3-16所示。
例3-16 select.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:form action="login">
14 <s:select name="aa" list="{}" label="喜欢的歌手" headerKey="-1"
15 headerValue="--歌手--">
16 <s:optgroup list="#{1:'刘德华' 2:'成龙' 3:'周华健'}"
17 label="男歌手" />
18 <s:optgroup list="#{1:'那英' 2:'刘若英' 3:'王心凌'}"
19 label="女歌手" />
20 </s:select>
21 </s:form>
22 </center>
23 </body>
24 </html>
例3-16的代码编写完成后,运行项目,在浏览器访问项目下的select.jsp,运行效果如图3.13所示。
图3.14 select.jsp
图3.13中,select.jsp页面显示了一个下拉选项,在例3-16中,首先定义表单,然后在select标签中用headerValue属性指定下拉选项第一项的值,用optgroup子标签指定下拉项中的分类选项,用label属性指定文本框前的描述文字。
3.4.7 textarea标签
textarea标签用于定义文本域,接下来通过一个案例来演示textarea标签的使用,如例3-17所示。
例3-17 textarea.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:form action="login">
14 <s:textarea name="area" label="备注" />
15 </s:form>
16 </center>
17 </body>
18 </html>
例3-17的代码编写完成后,运行项目,在浏览器访问项目下的textarea.jsp,运行效果如图3.14所示。
图3.15 textarea.jsp
图3.14中,textarea.jsp页面显示了一个文本域,在例3-17中,首先定义表单,然后在textarea标签中用name属性指定文本域的名字,用label属性指定文本框前的描述文字。
3.4.8 submit标签
submit标签用于定义表单提交按钮,接下来通过一个案例来演示submit标签的使用,如例3-18所示。
例3-18 submit.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:form action="login">
14 <s:textfield name="username" label="用户名" />
15 <s:password name="password" value="" label="密码" />
16 <s:radio list="#{1:'男' 0:'女'}" name="sex" value="1"
17 label="性别" />
18 <s:checkboxlist list="#{1:'足球' 2:'篮球' 3:'羽毛球'}"
19 name="love" label="爱好" />
20 <s:select name="aa" list="{}" label="喜欢的歌手"
21 headerKey="-1" headerValue="--歌手--">
22 <s:optgroup list="#{1:'刘德华' 2:'成龙' 3:'周华健'}"
23 label="男歌手" />
24 <s:optgroup list="#{1:'那英' 2:'刘若英' 3:'王心凌'}"
25 label="女歌手" />
26 </s:select>
27 <s:textarea name="area" label="备注" />
28 <s:submit value="注册" action="xxx" />
29 </s:form>
30 </center>
31 </body>
32 </html>
例3-18的代码编写完成后,运行项目,在浏览器访问项目下的submit.jsp,运行效果如图3.15所示。
图3.16 submit.jsp
图3.15中,submit.jsp页面显示了一个表单,表单最下边有一个提交按钮,可以提交整个表单到一个action,在例3-18中,首先定义表单,表单中定义了各种需要填写的项,最后用submit标签定义了一个提交按钮用于提交表单。
3.5 其他标签
讲解完大部分标签后,还需要了解一些其他标签,以便提高开发效率。
3.5.1 a标签
a标签用于定义超链接,接下来通过一个案例来演示a标签的使用,首先编写后台代码,如例3-19所示。
例3-19 TestAction.java
1 import com.opensymphony.xwork2.ActionSupport;
2 public class TestAction extends ActionSupport {
3 private static final long serialVersionUID = 1L;
4 public String execute() {
5 return SUCCESS;
6 }
7 }
接着在struts.xml文件中编写映射关系,如例3-20所示。
例3-20 struts.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE struts PUBLIC
3 "-//Apache Software Foundation//DTD Struts
4 Configuration 2.5//EN"
5 "http://struts.apache.org/dtds/struts-2.5.dtd">
6 <struts>
7 <constant name="struts.enable.DynamicMethodInvocation"
8 value="false" />
9 <constant name="struts.devMode" value="true" />
10 <package name="default" namespace="/"
11 extends="struts-default">
12 <action name="testAction"
13 class="com.qianfeng.struts.action.TestAction"
14 method="execute">
15 <result name="success">/target.jsp</result>
16 </action>
17 </package>
18 </struts>
接着编写前台页面a.jsp页面,如例3-21所示。
例3-21 a.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <h1>
14 <s:a href="testAction.action">
15 跳转到target页面
16 </s:a>
17 </h1>
18 </center>
19 </body>
20 </html>
最后编写target.jsp页面,如例3-22所示。
例3-22 target.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <h1>
14 <h1>target页面</h1>
15 </h1>
16 </center>
17 </body>
18 </html>
代码编写完成后,运行项目,在浏览器访问项目下的a.jsp,运行效果如图3.16所示。
图3.17 a.jsp
点击"跳转到target"页面,运行效果如图3.17所示。
图3.18 target.jsp
在例3-21中,用a标签发送了testAction.action的请求,struts.xml会根据请求,自动找到实现类,实现类中返回了success字符串,根据返回值,跳转到了target.jsp页面。
3.5.2 actionerror、actionmessage、fielderror标签
actionerror标签用于输出错误信息到客户端,输出的内容通过getActionErrors()方法获得,actionmessage标签用于输出提示信息到客户端,输出的内容通过getActionMessages()方法获得,fielderror标签用于输出fieldErrors属性保存的字段错误,fieldErrors是一个Map类型的属性,接下来通过一个案例来演示这三个标签的使用,首先编写后台代码,如例3-23所示。
例3-23 error.java
1 import com.opensymphony.xwork2.ActionSupport;
2 public class ErrorAction extends ActionSupport {
3 private static final long serialVersionUID = 1L;
4 public String execute() {
5 addActionError("第一个error");
6 addActionError("第二个error");
7 addActionMessage("第一个message");
8 addActionMessage("第二个message");
9 addFieldError("f1" "第一个fieldError");
10 addFieldError("f2" "第二个fieldError");
11 return SUCCESS;
12 }
13 }
接着在struts.xml文件中编写映射关系,如例3-24所示。
例3-24 struts.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE struts PUBLIC
3 "-//Apache Software Foundation//DTD Struts
4 Configuration 2.5//EN"
5 "http://struts.apache.org/dtds/struts-2.5.dtd">
6 <struts>
7 <constant name="struts.enable.DynamicMethodInvocation"
8 value="false" />
9 <constant name="struts.devMode" value="true" />
10 <package name="default" namespace="/"
11 extends="struts-default">
12 <action name="errorAction"
13 class="com.qianfeng.struts.action.ErrorAction"
14 method="execute">
15 <result name="success">/error.jsp</result>
16 </action>
17 </package>
18 </struts>
接着编写前台页面src.jsp页面,如例3-25所示。
例3-25 src.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <h1>
14 <s:a href="errorAction.action">
15 跳转到error.jsp页面
16 </s:a>
17 </h1>
18 </center>
19 </body>
20 </html>
最后编写error.jsp页面,如例3-26所示。
例3-26 error.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib prefix="s" uri="/struts-tags"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
5 "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <center>
13 <s:actionerror />
14 <s:actionmessage />
15 <s:fielderror />
16 </center>
17 </body>
18 </html>
代码编写完成后,运行项目,在浏览器访问项目下的src.jsp,运行效果如图3.18所示。
图3.19 src.jsp
点击"跳转到error.jsp页面",页面直接跳转到error.jsp,运行效果如图3.19所示。
图3.1 src.jsp
代码运行后,error.jsp页面显示了Action中设置的值,此处只需了解这三个标签的使用,需要人为地在Action中加入对应的信息时直接套用即可。
3.6 OGNL表达式语言
3.6.1 OGNL和值栈
3.6.2 OGNL常用符号
3.6.3 OGNL集合操作
3.7 本章小结
本章介绍了Struts2标签库中的标签,主要包括流程控制标签、数据访问标签、表单标签和一些非表单标签,最后介绍了OGNL与值栈的相关知识,这里需要读者结合实践去理解,本章的内容不需要去背,反复练习自然能熟练掌握。
3.8 习题
1.填空题
(1) 标签主要用于生成HTML元素的标签,里面包含表单标签和非表单标签。
(2) 标签主要用于流程的控制,例如分支、循环等操作。
(3) 标签主要用于各种数据访问相关的功能以及Action的调用等。
(4) form标签用于定义 。
(5) 标签用于输出错误信息到客户端。
2.选择题
(1)下列不是Struts2标签类别的是( )。
A.UI标签B.Ajax标签
C.jQuery标签D.非UI标签
(2)下列不属于流程控制标签的是( )。
A.treeB.iterator
C.ifD.subset
(3)下列不属于数据访问标签的是( )。
A.actionB.date
C.beanD.reset
(4)下列不属于表单标签的是( )。
A.radioB.select
C.propertyD.textarea
(5)下列不能在页面显示后台自定义信息的是( )。
A.fielderrorB.file
C.actionmessageD.actionerror
3.思考题
(1) 请简述Struts2标签库的分类。
(2) 请简述Struts2标签库如何导入。
(3) 请简述流程控制标签有哪些。
(4) 请简述数据访问标签有哪些。
(5) 请简述表单标签有哪些。