第03章Struts2应用课堂.ppt

上传人:本田雅阁 文档编号:2503649 上传时间:2019-04-04 格式:PPT 页数:102 大小:1.48MB
返回 下载 相关 举报
第03章Struts2应用课堂.ppt_第1页
第1页 / 共102页
第03章Struts2应用课堂.ppt_第2页
第2页 / 共102页
第03章Struts2应用课堂.ppt_第3页
第3页 / 共102页
亲,该文档总共102页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第03章Struts2应用课堂.ppt》由会员分享,可在线阅读,更多相关《第03章Struts2应用课堂.ppt(102页珍藏版)》请在三一文库上搜索。

1、1,Java EE应用技术基础,济南大学信息学院 刘鹍 ,2,第3章 Struts 2应用,3.1 Struts 2概述 3.2 Struts 2基本应用及工作流程 3.3 Struts 2标签库应用 3.4 Struts 2拦截器 3.5 Struts 2国际化应用 3.6 Struts 2文件上传 3.7 Struts 2综合应用实例添加学生信息,3,3.1 Struts 2概述,3.1 Struts 2概述,3.1.1 MVC简介 MVC有以下优点: 多个视图可以对应一个模型。 模型返回的数据与显示逻辑分离。 应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性。 控制层的概念也

2、很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求,因此控制层可以说是包含了用户请求权限的概念。 MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码。,5,3.1.2 Struts 2体系结构,Struts 2的基本流程如下: Web浏览器请求一个资源。 过滤器Dispatcher查找请求,确定适当的Action。 拦截器自动对请求应用通用功能,如验证和文件上传等操作。 Action的execute方法通常用来存储和(或)重新获得信息(通过数据库)。 结果被返回到浏览器。可能是HTML、图片、PDF或其他。,6

3、,3.1.2 Struts 2体系结构,Struts 2框架的应用着重在控制上。简单的流程是:页面控制器页面。最重要的是控制器的取数据与处理后传数据的问题。Struts 2的体系结构还可以参考图3.1,更直观地展现出其流程。,图3.1 Struts 2体系结构,7,3.2 Struts 2基本应用及工作流程,8,3.2 Struts 2基本应用及工作流程,3.2.1 简单Struts 2实例开发 1. 下载Struts 2框架 MyEclipse 6没有对Struts 2的支持,所以需要用户自己下载Struts 2开发包。登录http:/struts.apache.org/下载Struts 2

4、完整版,本书使用的是Struts 2.0.14。将下载的Zip文件解压缩,它是一个典型的Web结构。打开其文件夹,里面包含以下4个文件: apps:包含基于Struts 2的示例应用,是学习Struts 2非常有用的资料。 docs:包含Struts 2的相关文档,如Struts 2快速入门、Struts 2文档、API文档等内容。 lib:包含Struts 2框架的核心类库,以及Struts 2的第三方插件类库。 src:包含Struts 2框架的全部源代码。 2. 建立一个Web项目 打开MyEclipse,建立一个Web项目,命名为“Struts 2.0”。,9,3.2.1 简单Stru

5、ts 2实例开发,3. 加载Struts 2基本类库 下面把这几个类库添加到项目中。 右击项目名,选择【Build Path】【Configure Build Path】菜单项,出现如图3.2所示的对话框。单击【Add External JARs】按钮,进入下载的Struts 2目录的lib文件夹,选中上面的5个Jar包,单击【OK】按钮完成类库的添加。,图3.2 添加Struts 2的Jar包,10,3.2.1 简单Struts 2实例开发,4. 修改web.xml文件 打开项目中的WebRoot/WEB-INF/web.xml文件,修改其代码如下:, struts 2 org.apache

6、.struts2.dispatcher.FilterDispatcher struts 2 /* ,11,3.2.1 简单Struts 2实例开发,5. 创建hello.jsp 选择【WebRoot】【new】【jsp】菜单项,在File Name中输入文件名“hello.jsp”,修改后的代码如下:, struts 2应用 请输入姓名: ,12,3.2.1 简单Struts 2实例开发,6. Action实现类 右击src文件夹,选择【new】【Package】菜单项,在name框中输入包名“org.action”,右击该包,依此类推,建立class,命名为“StrutsAction”,修改

7、后的代码如下:, public class StrutsAction extends ActionSupport private String name; public String getName() return name; public void setName(String name) this.name=name; public String execute() throws Exception if(!name.equals(“HelloWorld“) Map request=(Map)ActionContext.getContext().get(“request“); reque

8、st.put(“name“,getName(); return “success“; else return “error“; ,13,3.2.1 简单Struts 2实例开发,7. 创建并配置struts.xml文件 任何一个Struts 2程序都不能缺少struts.xml文件,它是Struts 2运行的核心。右击src文件夹,选择【new】【file】菜单项,在File name框中输入“struts.xml”,修改后的代码如下:, /welcome.jsp /hello.jsp ,14,3.2.1 简单Struts 2实例开发,8. 创建welcome.jsp 创建welcome.js

9、p,其步骤和上面创建hello.jsp类似,这里不再重复叙述。其代码如下:, struts 2应用 hello ! ,15,3.2.1 简单Struts 2实例开发,9. 部署和运行 启动Tomcat后,在浏览器中输入“http:/localhost:8080/Struts2.0/hello.jsp”,会看到如图3.3所示的界面。当在输入框中输入“张三”时,会出现如图3.4所示界面。如果输入“HelloWorld”,就会返回当前页面。,图3.3 运行界面 图3.4 运行成功界面,16,3.2.2 Struts 2工作流程及各种文件详解,1. Struts 2的工作流程 Struts 2框架中的

10、配置文件struts.xml会起映射作用,它会根据“*”来决定调用用户定义的哪个Action类。例如在项目Struts 2.0中,请求为struts.action,前面“*”的部分是“struts”,所以在struts.xml中有个Action类的name为“struts”,这表示该请求与这个Action来匹配,就会调用该Action中class属性指定的Action类。但是在Struts 2中,用户定义的Action类并不是业务控制器,而是Action代理,其并没有和Servlet API耦合。所以Struts 2框架提供了一系列的拦截器,它负责将HttpServletRequest请求中的

11、请求参数解析出来,传入到用户定义的Action类中。,17,3.2.2 Struts 2工作流程及各种文件详解,2. Struts 2中各种文件详解 (1)web.xml文件 后面的webapp标签中配置了下面这样一段: 可以看出,里面配置了一个过滤器,那么就先来介绍过滤器的使用。 Filter过滤器是Java项目开发中的一种常用技术。它是用户请求和处理程序之间的一层处理程序。它可以对用户请求和处理程序响应的内容进行处理,通常用于权限控制、编码转换等场合。, struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* ,1

12、8,3.2.2 Struts 2工作流程及各种文件详解,所有过滤器必须实现java.Serlvet.Filter接口,这个接口中含有3个过滤器类必须实现的方法: init(FilterConfig):Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。 doFilter(ServletRequest,ServletResponse,FilterChain):完成实际的过滤操作,当用户请求与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法,返回响应之前也会调用此方法。FilterChain参数用于访问过滤器链上的下一个过滤

13、器。 destroy():Servlet容器在销毁过滤器实例前调用该方法,这个方法可以释放Servlet过滤器占用的资源,过滤器类编写完成后,必须要在web.xml中进行配置,格式如下:, 过滤器名 过滤器对应类 参数名称 参数值 ,19,3.2.2 Struts 2工作流程及各种文件详解,过滤器的关联方式有3种:与一个URL关联、与一个URL目录下的所有资源关联、与一个Servlet关联。 与一个URL资源关联: 与一个URL目录下的所有资源关联: 与一个Servlet关联:, 过滤器名 xxx.jsp , 过滤器名 /* , 过滤器名 Servlet名称 ,20,3.2.2 Struts

14、2工作流程及各种文件详解,(2)struts.xml文件 struts.xml文件通常放在Web应用程序的WEB-INF/classes目录下,该目录下的struts.xml将被Struts 2框架自动加载。 struts.xml文件是一个XML文件,文件前面是XML的头文件,然后是标签,位于Struts 2配置的最外层,其他标签都是包含在它里面的。 (3)package元素 与Java中的包不同的是,Struts 2中的包可以扩展另外的包,从而“继承”原有包的所有定义,并可以添加自己包的特有配置,以及修改原有包的部分配置。从这一点上看,Struts 2中的包更像Java中的类。package

15、有以下几个常用属性: name:该属性是必选的,指定包的名字,这个名字将作为引用该包的键。 extends:该属性是可选的,允许一个包继承一个或多个先前定义的包。 abstract:该属性是可选的,将其设置为true,可以把一个包定义为抽象的。 namespace:该属性是可选的,将保存的action配置为不同的名称空间。,21,3.2.2 Struts 2工作流程及各种文件详解,例子:, /foo.jsp /bar.jsp /moo.jsp /bar.jsp ,22,3.2.2 Struts 2工作流程及各种文件详解,(4)Action元素 当一个请求匹配到某个Action名字时,框架就使用

16、这个映射来确定如何处理请求。 如果一个请求要调用Action类中的其他方法,就需要在Action配置中加以配置。例如,如果在org.action.StrutsAction中有另外一个方法为: 那么如果想要调用这个方法,就必须在Action中配置method属性,其配置方法为:, /welcome.jsp /hello.jsp ,public String find() throws Exceptionreturn SUCCESS;, /welcome.jsp /hello.jsp ,23,3.2.2 Struts 2工作流程及各种文件详解,(5)result元素 一个result代表一个可能的

17、输出。当Action类中的方法执行完成时,返回一个字符串类型的结果代码,框架根据这个结果代码选择对应的result,向用户输出。 param中的name属性有两个值: location:指定逻辑视图。 parse:是否允许在实际视图名中使用OGNL表达式,参数默认为true。 result中的name属性有如下值: success:表示请求处理成功,该值也是默认值。 error:表示请求处理失败。 none:表示请求处理完成后不跳转到任何页面。 input:表示输入时如果验证失败应该跳转到什么地方(关于验证后面会介绍)。 login:表示登录失败后跳转的目标。, 参数值 ,24,3.2.2 S

18、truts 2工作流程及各种文件详解,type(非默认类型)属性支持的结果类型有以下几种:,chain:用来处理Action链。 chart:用来整合JFreeChart的结果类型。 dispatcher:用来转向页面,通常处理JSP,该类型也为默认类型。 freemarker:处理FreeMarker模板。 httpheader:控制特殊HTTP行为的结果类型。 jasper:用于JasperReports整合的结果类型。 jsf:JSF整合的结果类型。 redirect:重定向到一个URL。 redirect-action:重定向到一个Action。 stream:向浏览器发送InputS

19、tream对象,通常用来处理文件下载,还可用于返回AJAX数据。 tiles:与Tiles整合的结果类型。 velocity:处理Velocity模板。 xslt:处理XML/XLST模板。 plaintext:显示原始文件内容,如文件源代码。,25,3.2.2 Struts 2工作流程及各种文件详解,redirect-action类型用于当一个Action处理结束后,直接将请求重定向到另一个Action。如下列配置:, /welcome.jsp /hello.jsp struts ,26,3.2.2 Struts 2工作流程及各种文件详解,(6)ActionSupport类 ActionSu

20、pport类为Action提供了一些默认实现,主要包括预定义常量、从资源文件中读取文本资源、接收验证错误信息和验证的默认实现。 下面是ActionSupport类所实现的接口: Action接口同样位于com.opensymphony.xwork2包,定义了一些常量和一个execute()方法。,public interface Action public static final String SUCCESS=“success“; public static final String NONE=“none“; public static final String ERROR=“error“;

21、 public static final String INPUT=“input“; public static final String LOGIN=“login“; public String execute() throws Exception; ,public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider,Serializable ,27,3.2.2 Struts 2工作流程及各种文件详解,由于3.2.1节的例子中继承了ActionSu

22、pport类,所以可以看出,在execute的返回值中,其代码可以改为:, public String execute() throws Exception if(!name.equals(“HelloWorld“) Map request=(Map)ActionContext.getContext().get(“request“); request.put(“name“,getName(); return SUCCESS; else return ERROR; ,public interface Action public static final String SUCCESS=“succe

23、ss“; public static final String NONE=“none“; public static final String ERROR=“error“; public static final String INPUT=“input“; public static final String LOGIN=“login“; public String execute() throws Exception; ,28,3.2.3 Struts 2数据验证及验证框架的应用,1. 数据校验 下面来看其实现,可以把3.2.1节的例子中的Action类改写成。 如果执行该方法之后,Acti

24、on类的fieldErrors中已经包含了数据校验错误信息,将把请求转发到input逻辑视图处,所以要在Action配置中加入以下代码:, /welcome.jsp /hello.jsp /hello.jsp ,29,3.2.3 Struts 2数据验证及验证框架的应用,把JSP页面改写一下(标签的具体应用会在3.3节具体讲解):, struts 2 ,30,3.2.3 Struts 2数据验证及验证框架的应用,修改之后,部署运行。不输入任何姓名直接提交,将会看到如图3.5所示的界面。,图3.5 校验结果,31,3.2.3 Struts 2数据验证及验证框架的应用,2. Struts 2验证框

25、架的应用 Struts 2提供了校验框架,只需要增加一个校验配置文件,就可以完成对数据的校验。Struts 2提供了大量的数据校验器,包括表单域校验器和非表单域校验器两种。 (1)必填字符串校验器 其校验规则定义文件如下:, true 姓名是必需的! ,32,3.2.3 Struts 2数据验证及验证框架的应用,(2)必填校验器 该校验器的名字是required,也就是属性中的type=“required“,该校验器要求指定的字段必须有值,与必填字符串校验器最大的区别就是可以有空字符串。如果把上例改为必填校验器,其代码应为:, 姓名是必需的! ,33,3.2.3 Struts 2数据验证及验证

26、框架的应用,(3)整数校验器 该校验器的名字是int,该校验器要求字段的整数值必须在指定范围内,故其有min和max参数。如果有个age输入框,要求其必须是整数,且输入值必须在18与100之间,该校验器的配置应该为:, 18 100 年龄必须在18至100之间 ,34,3.2.3 Struts 2数据验证及验证框架的应用,(4)日期校验器 该校验器的名字是date,该校验器要求字段的日期值必须在指定范围内,故其有min和max参数。其配置格式如下:, 1980-01-01 2009-12-31 日期必须在1980-01-01至2009-12-31之间 ,35,3.2.3 Struts 2数据验

27、证及验证框架的应用,(5)邮件地址校验器 该校验器的名称是email,该校验器要求字段的字符如果非空,就必须是合法的邮件地址。如下面的代码:, 必须输入有效的电子邮件地址 ,36,3.2.3 Struts 2数据验证及验证框架的应用,(6)网址校验器 该校验器的名称是url,该校验器要求字段的字符如果非空,就必须是合法的URL地址。如下面的代码:, 必须输入有效的网址 ,37,3.2.3 Struts 2数据验证及验证框架的应用,(7)字符串长度校验器 该校验器的名称是stringlength,该校验器要求字段的长度必须在指定的范围内,一般用于密码输入框。如下面的代码:, 6 20 密码长度必

28、须在6到20之间 ,38,3.2.3 Struts 2数据验证及验证框架的应用,(8)正则表达式校验器 该校验器的名称是regex,它检查被校验字段是否匹配一个正则表达式。如下面的代码:, 学号必须是6位的数字 ,39,Java EE应用技术基础,济南大学信息学院 刘鹍 ,40,回顾:Struts 2,Struts 2开发步骤及工作流程 Struts 2数据验证及验证框架,41,3.3 Struts 2标签库应用,42,3.3 Struts 2标签库应用,OGNL(.、#、$、%) 数据标签 控制标签 表单标签 非表单标签,43,3.3 Struts 2标签库应用,3.3.1 Struts 2

29、的OGNL表达式 在介绍标签库前,有必要先来学习Struts 2的OGNL表达式。 1. OGNL表达式 OGNL表达式是Struts 2框架的特点之一。 标准的OGNL会设定一个根对象(root对象)。假设使用标准OGNL表达式来求值(不是Struts 2 OGNL),如果OGNL上下文有两个对象foo对象和bar对象,同时foo对象被设置为根对象(root),则利用下面的OGNL表达式求值。,#foo.blah / 返回foo.getBlah() #bar.blah / 返回bar.getBlah() blah / 返回foo.getBlah(),因为foo为根对象,44,3.3.1 St

30、ruts 2的OGNL表达式,在Struts 2框架中,值栈(Value Stack)就是OGNL的根对象。假设值栈中存在两个对象实例Man和Animal,这两个对象实例都有一个name属性,Animal有一个species属性,Man有一个salary属性。假设Animal在值栈的顶部,Man在Animal后面,如图3.6所示。,图3.6 一个包含了Animal和Man的值栈,45,3.3.1 Struts 2的OGNL表达式,下面的代码片段能更好地理解OGNL表达式。 最后一行实例代码返回的是animal.getName()返回值,即返回了Animal的name属性,因为Animal是值栈

31、的顶部元素,OGNL将从顶部元素搜索,所以会返回Animal的name属性值。如果要获得Man的name值,则需要如下代码: Struts 2允许在值栈中使用索引,实例代码如下:,species / 调用animal.getSpecies() salary / 调用man.getSalary() name / 调用animal.getName(),因为Animal位于值栈的顶部,0.name / 调用animal.getName() 1.name / 调用man.getName(),man.name,46,3.3.1 Struts 2的OGNL表达式,Struts 2中的OGNL Contex

32、t是ActionContext,如图3.7所示。,图3.7 Struts 2的OGNL Context结构示意图,47,3.3.1 Struts 2的OGNL表达式,由于值栈是Struts 2中OGNL的根对象。如果用户需要访问值栈中的对象,则可以通过如下代码访问值栈中的属性: $foo / 获得值栈中的foo属性 如果访问其他Context中的对象,由于不是根对象,在访问时需要加#前缀。 application对象:用来访问ServletContext 如#application.userName或者#application “userName” 相当于调用Servlet的getAttrib

33、ute(“userName“)。 session对象:用来访问HttpSession, 如#session.userName或者#session“userName” 相当于调用session.getAttribute(“userName“)。 request对象:用来访问HttpServletRequest属性的Map 如#request.userName或者#request“userName” 相当于调用request.getAttribute(“userName“)。,48,3.3.1 Struts 2的OGNL表达式,如在3.2.1节中StrutsAction类中代码: 这就是先得到re

34、quest对象,然后把值放进去,在该例的success.jsp中有: 其中#request.name相当于调用了,Map request=(Map)ActionContext.getContext().get(“request“); request.put(“name“,getName();,request.getAttribute(“name”);,49,3.3.1 Struts 2的OGNL表达式,2. OGNL集合操作 使用如下代码直接生成一个List对象: 下面的代码可以直接生成一个Map对象: 对于集合类型,OGNL表达式可以使用in和not in两个元素符号。其中,in表达式用来判

35、断某个元素是否在指定的集合对象中;not in判断某个元素是否不在指定的集合对象中,代码如下所示:,#key: value1, key2: value2, ,e1, e2, e3, , ,50,3.3.1 Struts 2的OGNL表达式,除了in和not in之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有以下3个相关操作符。 ?:获得所有符合逻辑的元素。 :获得符合逻辑的第一个元素。 $:获得符合逻辑的最后一个元素。 如下面的代码: 该代码可以获得Person的所有性别为male的relatives集合。,Person .relatives.?# this.gender=mal

36、e,51,3.3.2 数据标签,数据标签属于非UI标签,主要用于提供各种数据访问相关的功能,数据标签主要包括以下几个。,property:用于输出某个值。 set:用于设置一个新变量。 param:用于设置参数,通常用于bean标签和action标签的子标签。 bean:用于创建一个JavaBean实例。 action:用于在JSP页面直接调用一个Action。 date:用于格式化输出一个日期。 debug:用于在页面上生成一个调试链接,当单击该链接时,可以看到当前值栈和Stack Context中的内容。 il8n:用于指定国际化资源文件的baseName。 include:用于在JSP页

37、面中包含其他的JSP或Servlet资源。 push:用于将某个值放入值栈的栈顶。 text:用于输出国际化(国际化内容会在后面讲解)。 url:用于生成一个URL地址。,52,3.3.2 数据标签,1. 标签 property标签的作用是输出指定值。property标签输出value属性指定的值。如果没有指定的value属性,则默认输出值栈栈顶的值。该标签有如下几个属性:,default:该属性是可选的,如果需要输出的属性值为null,则显示default属性指定的值。 escape:该属性是可选的,指定是否escape HTML代码。 value:该属性是可选的,指定需要输出的属性值,如果

38、没有指定该属性,则默认输出值栈栈顶的值。该属性也是最常用的,如前面用到的: id:该属性是可选的,指定该元素的标志。,53,3.3.2 数据标签,2. 标签 该标签有如下几个属性: 下面是一个简单例子,展示了property标签访问存储于session中的user对象的多个字段: 使用set标签使得代码易于阅读:,name:该属性是必选的,重新生成新变量的名字。 scope:该属性是可选的,指定新变量的存放范围。 id:该属性是可选的,指定该元素的引用id。,54,3. 标签 param标签主要用于为其他标签提供参数,该标签有如下几个属性:,3.3.2 数据标签,例如,要为name为fruit

39、的参数赋值: apple 或者 如果想指定fruit参数的值为apple字符串,则应该这样写: ,name:该属性是可选的,指定需要设置参数的参数名。 value:该属性是可选的,指定需要设置参数的参数值。 id:该属性是可选的,指定引用该元素的id。,55,3.3.2 数据标签,4. 标签 该标签有如下几个属性: 下面是一个简单的例子:有一个Student类,该类中有name属性,并有其getter和setter方法:,name:该属性是必选的,用来指定要实例化的JavaBean的实现类。 id:该属性是可选的,如果指定了该属性,则该JavaBean实例会被放入StackContext中,从

40、而允许直接通过id属性来访问该JavaBean实例。,public class Student private String name; public String getName() return name; public void setName(String name) this.name=name; ,56,3.3.2 数据标签,运行结果:,图3.8 bean标签实例界面,57,3.3.2 数据标签,5. 标签 使用action标签可以允许在JSP页面中直接调用Action。该标签有以下几个属性:,id:该属性是可选的,该属性将会作为该Action的引用标志id。 name:该属性是必

41、选的,指定该标签调用哪个Action。 namespace:该属性是可选的,指定该标签调用的Action所在的namespace。 executeResult:该属性是可选的,指定是否要将Action的处理结果页面包含到本页面。如果值为true,就是包含,false就是不包含,默认为false。 ignoreContextParam:该属性是可选的,指定该页面中的请求参数是否需要传入调用的Action。如果值为false,将本页面的请求参数传入被调用的Action。如为true,不将本页面的请求参数传入到被调用的Action。,58,3.3.2 数据标签,6. 标签 date标签主要用于格式化

42、输出一个日期。该标签有如下属性: nice属性为true时,一般不指定format属性。因为nice为true时,会输出当前时刻与指定日期的时差,不会输出指定日期。当没有指定format,也没有指定nice=“true“时,系统会采用默认格式输出。其用法为:,format:该属性是可选的,如果指定了该属性,将根据该属性指定的格式来格式化日期。 nice:该属性是可选的,该属性的取值只能是true或false,用于指定是否输出指定日期和当前时刻之间的时差。默认为false,即不输出时差。 name:属性是必选的,指定要格式化的日期值。 id:属性是可选的,指定引用该元素的id值。,59,3.3.

43、2 数据标签,7. 标签 include标签用于将一个JSP页面或一个Servlet包含到本页面中。该标签有如下属性: 例子:,value:该属性是必选的,指定需要被包含的JSP页面或Servlet。 id:该属性是可选的,指定该标签的id引用。,60,3.3.3 控制标签,控制标签有以下几个:,if:用于控制选择输出的标签。 elseif:用于控制选择输出的标签,必须和if标签结合使用。 else:用户控制选择输出的标签,必须和if标签结合使用。 append:用于将多个集合拼接成一个新的集合。 generator:用于将一个字符串按指定的分隔符分隔成多个字符串,临时生成的多个子字符串可以使

44、用iterator标签来迭代输出。 iterator:用于将集合迭代输出。 merge:用于将多个集合拼接成一个新的集合,但与append的拼接方式不同。 sort:用于对集合进行排序。 subset:用于截取集合的部分元素,形成新的子集合。,61,3.3.3 控制标签,1. /标签 这3个标签可以组合使用,但只有if标签可以单独使用,而elseif和else标签必须与if标签结合使用。if标签可以与多个elseif标签结合使用,但只能与一个else标签使用。其用法格式如下:, 标签体 标签体 . 标签体 ,62,3.3.3 控制标签,2. 标签 该标签主要用于对集合进行迭代,这里的集合包含L

45、ist、Set,也可以对Map类型的对象进行迭代输出。该标签的属性如下:,value:该属性是可选的,指定被迭代的集合,被迭代的集合通常都由OGNL表达式指定。如果没有指定该属性,则使用值栈栈顶的集合。 id:该属性是可选的,指定集合元素的id。 status:该属性是可选的,指定迭代时的IteratorStatus实例,通过该实例可判断当前迭代元素的属性。如果指定该属性,其实例包含如下几个方法:,int getCount():返回当前迭代了几个元素。 int getIndex():返回当前被迭代元素的索引。 boolean isEven:返回当前被迭代元素的索引元素是否是偶数。 boolea

46、n isOdd:返回当前被迭代元素的索引元素是否是奇数。 boolean isFirst:返回当前被迭代元素是否是第一个元素。 boolean isLast:返回当前被迭代元素是否是最后一个元素。,63,3.3.3 控制标签,应用举例:, 控制标签 style=“background-color:silver“ ,64,3.3.3 控制标签,通过添加Struts 2必须的Jar包,再建立上面JSP文件,修改web.xml后,就可以部署运行,运行结果如图3.9所示。,图3.9 iterator标签实例运行结果,65,3.3.3 控制标签,3. 标签 应用举例,可以把上例的JSP文件进行修改,其代

47、码为:, style=“background-color:silver“ ,66,3.3.3 控制标签,部署运行,运行结果如图3.10所示。,图3.10 append标签实例运行界面,67,3.3.3 控制标签,4标签 假设有2个集合,第一个集合包含3个元素,第二个集合包含2个元素,分别用append标签和merge标签方式进行拼接,它们产生新集合的方式有所区别。下面分别列出:,用append方式拼接,新集合元素顺序为: 第1个集合中的第1个元素 第1个集合中的第2个元素 第1个集合中的第3个元素 第2个集合中的第1个元素 第2个集合中的第2个元素 用merge方式拼接,新集合元素顺序为: 第

48、1个集合中的第1个元素 第2个集合中的第1个元素 第1个集合中的第2个元素 第2个集合中的第2个元素 第1个集合中的第3个元素,68,3.3.4 表单标签,大部分的表单标签和HTML表单元素是一一对应的关系,如下面的代码片段: 还有下面这种情况,如果有这样一个JavaBean类,类名为“User”,该类中有两个属性:一个是username;另一个是password,并分别生成它们的getter和setter方法,在JSP页面的表单中可以这样为表单元素命名:, 对应着: , 对应着: 用户名:, 对应着: 密码:,69,3.3.4 表单标签,1. 标签 2. 标签, 或者为: ,70,3.3.4

49、 表单标签,3. 标签 4. 标签, 或者为: ,71,3.3.4 表单标签,5. 标签 6. 标签 head标签主要用于生成HTML页面的head部分。在介绍标签时说过,要在head中加入该标签,主要原因是标签中有一个日历小控件,其中包含了JavaScript代码,所以要在head部分加入该标签。, 或者为: ,72,3.3.5 非表单标签,非表单标签主要用于在页面中生成一些非表单的可视化元素。这些标签不经常用到,下面大致介绍一下这些标签: a:生成超链接。 actionerror:输出Action实例的getActionMessage()方法返回的消息。 component:生成一个自定义组件。 div:生成一个div片段。 fielderror:输出表单域的类型转换错误、校验错误提示。 tablePanel:生成HTML页面的Tab页。 tre

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1