Struts2知识点小结StrutsTagLibrary对于一个MVC框架而言,重点是实现二个部分:控制器部分和视图部分。Struts2框架同样如此:控制器部分由Action(以及隐藏的系列拦截器)来提供支持,而视图部分则通过大量标签来提供支持。Struts2标签库使用OGNL表达式作为基础,且默认支持OGNL,JSTL,Groovy和Velcity表达式。且把所有标签都定义在URI为/struts-tags命名空间下,但我们依然可以依据功能将其分为三类:1.UI标签;a.表单标签;b.非表单标签;树、Tab页等;2.非UI标签;a.流程控制:条件、循环;b.数据访问:输出ValueStack中的值;3.AJAX标签;ObjectGraphNavigationLanguage,缩写为OGNL,是类似于EL的脚本语言,一.控制标签Struts2中的非UI标签包括控制标签和数据标签,其中控制标签可以完成输出流程控制,例如条件、循环等操作,也可完成对集合的合并、排序等操作,它有如下九个:1)if:选择输出;2)elseIf/elseif:与if标签结合使用;3)else:与if标签结合使用4)append:将多个集合拼接成一个新的集合;5)generator:将一个字符串解析成一个集合;6)iterator:将集合迭代输出;7)merge:将多个集合拼接成一个新集合,与append拼接方式不同;8)sort:对集合进行排序;9)subset:截取集合部分元素,形成新的子集;1.iterator标签对集合进行迭代,包括List,Set和数组,Map..value:可选,被迭代的集合,通常使用OGNL表达式指定,如无,则使用ValueStack栈顶集合;.id:可选,指向集合中元素;.status:可选,指向迭代时IteratorStatus实例,通过该实例可判断当前迭代元素的属性;每次迭代都有一个IteratorStatus实例,该实例包含以下方法:a.intgetCount():返回当前迭代了几个元素b.intgetIndex():返回当前迭代元素的索引c.booleanisEven():当前索引是否为偶数d.booleanisFirst():当前迭代元素是否是第一个元素e.booleanisLast():当前迭代元素是否是最后一个元素f.booleanisOdd():当前索引是否为奇数2.if标签根据一个Boolean表达式的值,来决定是否计算,输出标签体等内容。3.append标签将多个集合对象拼接起来,组成一个新的集合。其中id属性确定拼接生成的新集合的名字。append可接受多个s:param..../子标签,每个子标签指定一个集合,append将s:param..../指定的多个集合拼接成一个集合;4.generator标签将指定字符串按指定分隔符分隔成多个子串,临时生成的多个子串可以使用iterator标签来迭代输出。a.count:指定生成集合中元素总数;b.separator:指定解析字符串的分隔符;c.val:指定被解析的字符串;d.converter:可选,指定一个负责将集合中每个字符串转换成对象;e.id:指定访问集合的名称,如指定,则集合放在pageContext属性中;5.merage标签功能和append类似,但是新集合中各元素顺序不同:append为:1)第一个集合第一个元素;2)第一个集合第二个元素;3)第一个集合第三个元素;4)第二个集合第一个元素;5)第二个集合第二个元素;6)第二个集合第三个元素;7)第三个集合第一个元素;8)第三个集合第二个元素;9)第三个集合第三个元素;merage为:1)第一个集合第一个元素;2)第二个集合第一个元素;3)第三个集合第一个元素;4)第一个集合第二个元素;5)第二个集合第二个元素;6)第三个集合第二个元素;7)第一个集合第三个元素;8)第二个集合第三个元素;9)第三个集合第三个元素;6.subset标签取得集合的子集:.count:指定子集合元素个数;.source:指定源集合,如不指定,则默认取得ValueStack栈顶的集合;.start:指定从源集合中第几个元素开始截取,默契为第一个(值为0);.decider:指定由开发者是否选中该元素;7.sort标签对于指定的集合进行排序;必须提供自己的排序规则,即提供实现java.util.Comparator接口的实现类;.comparator:指定进行排序的Comparator实例;.source:指定被排序的集合,如不指定,则针对ValueStack栈顶的集合;二.数据标签提供各种数据访问相关的功能,包含显示一个Action中属性以及生成国际化输出等功能;1.property标签提供一种快速、方便地方式从ValueStack或ActionContext中获取值并显示;.value:指定输要输出的属性值,如没有指定,则默认输出ValueStack栈顶的值;.default:如输出属性值为null,则显示default属性的值;.escape:是否escapeHTML代码,默认值为true;将转化为<2.set标签将一个已有的值复制给新变量,然后放到指定的范围内.name:必填,新变量名字.scope:可选属性,指定新变量放置的范围,可以接受application,session,request,page或action五个值,默认为Action中;.value:可选,赋给变量的值,没指定,则为ValueStack栈顶的值;.id:可选,该元素的引用ID3.push标签将某个值放到valueStack中,从而更加方便访问;4.bean标签创建JavaBean实例;.name:必须,要实例化的JavaBean的完整类名;.var:可选,可通过该属性值在标签外访问已实例化的JavaBean;5.Date标签格式化输出日期以及计算指定日期和当前时刻间的时差;.format:可选,指定日期显示格式;.nice:可选,是否输出指定日期和当前时刻间的时差,默认值为false;.name:必填,日期值;.id:可选,引用该元素的id值;如果既指定nice=true,又指定format属性,则会输出指定日期和当前时刻间的时差,即format属性失效;如没有指定format属性,也没指定nice=true,则系统会到资源文件中寻找key为struts.date.format的消息作为格式,否则采用默认的DateFormat.MEDIUM格式输出。6.action标签直接在JSP页面中直接调用Action.id:该Action的引用ID;.name:必须:调用哪个Action;.namespace:可选,调用Action所属的namespace;.executeResult:可选,是否将Action处理结果页面包含到本页面,默认值为false;.ignoreContextParams:可选,该页面中请求参数是否需传入调用的Action,默认值为false,传入。7.debug标签用于辅助调试,它在页面上生成一个超级链接,通过该链接可以查看到ValueStack和StackContext中所有的值信息;8.include标签将一个JSP或servlet包含到本页面中:.value:必填,指定包含的资源;.id:可选,该标签的ID引用;9.url标签生成一个URL地址,可以通过为url标签指定param子元素,从而向指定URL发送请求参数。.includeParams:可选,是否包含请求参数,值为none,get或者all..scheme:设置schema属性;.value:可选,指定生成的URL值,如果无value有action就使用action指定Action作为URL地址;如果均提供,则使用value指定URL值;如均不提供,则使用当前页面作为URL地址;.action:可选,指定action;.namespace:可选,指定命名空间;.method:可选,指定使用Action的方法;.encode:可选,是否需encode请求参数;.includeContext:是否需将当前上下文包含在URL地址中;.anchor:可选,指定URL锚点;.id:指定该URL元素的引用ID10.i18n和text标签i18n用于显示指定指定语言资源文件;.name:资源文件名称;text用于获取指定资源文件中指定key对应的值;.name:资源文件key值;.id:引用的标识;三.Form标签1.checkbox标签s:setname=aBooleanvalue=false/brs:checkboxlabel=checkboxtestname=checkboxField1value=#aBooleanfieldValue=true/s:setname=aBooleanvalue=true/brs:checkboxlabel=checkboxtestname=checkboxField1value=#aBooleanfieldValue=true/显示结果:inputtype=checkboxname=checkboxField1value=trueid=checkboxField1/inputtype=checkboxname=checkboxField1value=truechecked=checkedid=checkboxField1/2.checkboxlist标签一次性创建多个复选框,它根据list属性指定的集合来生成多个复选框;.listKey:指定集合元素中的某个属性作为复选框的value;.listValue:指定集合元素中的某个属性作为复选框的标签;3.combobox标签生成一个单行文本框和下拉列表框的组合,但两个表单元素只对应一个请求参数,只有单行文本框里的值才包含请求参数,而下拉列表框则只是用于辅助输入,没有name属性。4.doubleselect标签生成一个级联列表框,当选择第一个下拉列表框时,第二个下拉列表框的内容会随之改变。.list:第一个下拉列表框的集合;.listKey:指定集合元素中某个属性作为第一个下拉列表框的value;.listValue:指定集合元素中某个属性作为第一个下拉列表框的标签;.doubleList:第二个下拉列表框的集合;.doublelistKey:指定集合元素中某个属性作为第二个下拉列表框的value;.doublelistValue:指定集合元素中某个属性作为第二个下拉列表框的标签;.doublename:第二个下拉列表框的name属性;doubleselect标签一定得位于form中,且form须指定action属性.四.数据传输以及类型转换1.为什么要数据传输以及数据转换?所有的MVC框架,都需要负责收集用户请求参数,并将请求参数传给应用的控制器组件。但所有的请求参数都是,也只能是字符串数据类型,但Java是强数据类型语言,因此MVC框架必须将这些字符串请求参数转换成相应的数据类型,这个工作是所有MVC框架均应提供的功能。不仅于此,在请求处理结束,在格式化显示请求处理结果的时侯,我们也需将封装了结果数据的JavaBean属性值转换为HTML页面上显示的内容。数据的传输和转换贯穿于请求处理的整个生命周期。Struts2通过内置的拦截器提供了非常强大的类型转换机制,也提供了很好的扩展性,开发者可以非常简单地开发出自己的类型转换器,完成字符串和自定义复合类型的转换(例如将字符串到Student实例间转换).如果类型转换中出现异常,开发者也无须关心异常处理逻辑。Struts2的conversionError拦截器提供了非常强大的表现层数据处理机制,并且在页面上显示异常信息。总之,Struts2的类型转换器提供了非常强大的表现层处理机制,方便了开发者的使用和操作。2.OGNL和Struts2Struts2的类型转换是基于OG