1、关于tiles的使用:
这里首先从一个连接说起: http://127.0.0.1:8081/struts2-showcase/tiles/index.action,这里重点分析index.action
[color=blue][b]在struts的action的配置文件中:struts-tiles.xml[/b][/color]
[quote]<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="tiles" extends="tiles-default" namespace="/tiles">
<default-action-ref name="index"/>
<action name="index">
<result type="tiles">showcase.index</result>
<result name="success" type="tiles">showcase.index</result>
</action>
</struts>[/quote]
[b][color=blue]在tiles.xml中:[/color][/b]
[quote]<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://struts.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name="showcase.index" template="/tiles/layout.jsp">
<put-attribute name="title" value="Tiles Showcase"/>
<put-attribute name="header" value="/tiles/header.jsp"/>
<put-attribute name="body" value="/tiles/body.jsp"/>
</definition>
</tiles-definitions>[/quote]
[color=blue][b]在web.xml中:[/b][/color]
[quote]<listener>
<listener-class>
org.apache.struts2.tiles.StrutsTilesListener
</listener-class>
</listener>[/quote]
需要的资源:(把这些资源放置到/WEB-INF/lib下面)
tiles-api-2.0.4.jar, tiles-core-2.0.4.jar, tiles-jsp-2.0.4.jar,struts2-tiles-plugin-2.0.11.2.jar
[color=blue][b]tld标签的使用:[/b][/color]
在页面中增加:<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
这个资源在文件tiles-jsp-2.0.4.jar中有描述;
现在的一个问题就是因为如果使用tiles的话,页面的结果类型就是<result type="tiles">不知道这种情况下其是如何和redirect-action等像区别对待的
[color=blue]
[b]在实际的使用中遇到的问题:[/b][/color]
如果我们有一个连接是如下的形式:
<result type="redirect-action">
<param name="actionName">edit</param>
<param name="additinalInfo">${dataInfo.name}</param>
</result>
则使用tiles时进行如下的配置是失败的,
<definition name="sample.form.save" extends="sample.form.tiles">
<put-attribute name="body" value="edit.action?additinalInfo=${dataInfo.name}"/>
</definition>
这个问题的主要出处在于我们错误的定义了<put-attribute,因为在layout.jsp中我们使用的是<tiles:insertAttribute name="body"/>
而标签insertAttribute在文档中明确是指明:
Inserts the value of an attribute into the page. This tag can be flexibly used to insert the value of an attribute into a page. As in other usages in Tiles, every attribute can be determined to have a "type", either set explicitly when it was defined, or "computed". If the type is not explicit, then if the attribute value is a valid definition, it will be inserted as such. Otherwise, if it begins with a "/" character, it will be treated as a "template". Finally, if it has not otherwise been assigned a type, it will be treated as a String and included without any special handling.
Example : <tiles:insertAttribute name="body">
通过上面的提示信息调整后如下:
但新的问题又出现了,提示信息错误为:
The requested resource (/form/tiles/edit.action) is not available,这特提示信息似乎告诉我们tiles把 /form/tiles/edit.action作为了一个文件而不是一个action来对待的
在这种情况下我们看到页面的body部分显示的是字符串"edit.action?additinalInfo=${dataInfo.name} ",那这是为什么呢……,又该怎么来进行这种形式的信息配置呢?
在这里最后使用了一种变通的方式来进行信息的配置,如下:
<action name="edit" class="com.chsi.sample.action.SampleEAction">
<result type="tiles">sample.form.edit</result>
<interceptor-ref name="params" />
<interceptor-ref name="basicStack"/>
</action>
<action name="save" class="com.chsi.sample.action.SampleEAction" method="save">
<interceptor-ref name="token"/>
<interceptor-ref name="defaultStack" />
<result name="input" type="tiles">sample.form.input</result>
<!-- old value dispatcher -->
<result name="invalid.token" type="tiles">sample.form.error</result>
<!--old value redirect-action-->
<result type="chain">edit</result>
</action>
[color=blue]这里使用了type为chain类型来解决使用tiles时资源为action的情形[/color]
------------------------------------
关于tiles-plugin的一些相关的信息:
在struts2-tiles-plugin-2.0.11.2.jar文件中我们可以发现如下的信息,这个正是我们在struts-tiles.xml中<package name="tiles" extends="tiles-default"的依据
<struts>
<package name="tiles-default" extends="struts-default">
<result-types>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
</result-types>
</package>
</struts>
从这里我们可以看到tiles这种result类型的实现文件
类TilesResult实现类型是ServletDispatcherResult(Package: org.apache.struts2.dispatcher)
-----------------------------------
关于几个有用的标签:
<tiles:insertAttribute >
<tiles:insertAttribute name="body"/>
-----------------------------------
当然我们也可以在页面中使用EL正则表达式信息:
<tiles:importAttribute name="title" scope="request"/>
我们可以通过如下的形式来得到对应的数据信息: ${title}
这里首先从一个连接说起: http://127.0.0.1:8081/struts2-showcase/tiles/index.action,这里重点分析index.action
[color=blue][b]在struts的action的配置文件中:struts-tiles.xml[/b][/color]
[quote]<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="tiles" extends="tiles-default" namespace="/tiles">
<default-action-ref name="index"/>
<action name="index">
<result type="tiles">showcase.index</result>
<result name="success" type="tiles">showcase.index</result>
</action>
</struts>[/quote]
[b][color=blue]在tiles.xml中:[/color][/b]
[quote]<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://struts.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name="showcase.index" template="/tiles/layout.jsp">
<put-attribute name="title" value="Tiles Showcase"/>
<put-attribute name="header" value="/tiles/header.jsp"/>
<put-attribute name="body" value="/tiles/body.jsp"/>
</definition>
</tiles-definitions>[/quote]
[color=blue][b]在web.xml中:[/b][/color]
[quote]<listener>
<listener-class>
org.apache.struts2.tiles.StrutsTilesListener
</listener-class>
</listener>[/quote]
需要的资源:(把这些资源放置到/WEB-INF/lib下面)
tiles-api-2.0.4.jar, tiles-core-2.0.4.jar, tiles-jsp-2.0.4.jar,struts2-tiles-plugin-2.0.11.2.jar
[color=blue][b]tld标签的使用:[/b][/color]
在页面中增加:<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
这个资源在文件tiles-jsp-2.0.4.jar中有描述;
现在的一个问题就是因为如果使用tiles的话,页面的结果类型就是<result type="tiles">不知道这种情况下其是如何和redirect-action等像区别对待的
[color=blue]
[b]在实际的使用中遇到的问题:[/b][/color]
如果我们有一个连接是如下的形式:
<result type="redirect-action">
<param name="actionName">edit</param>
<param name="additinalInfo">${dataInfo.name}</param>
</result>
则使用tiles时进行如下的配置是失败的,
<definition name="sample.form.save" extends="sample.form.tiles">
<put-attribute name="body" value="edit.action?additinalInfo=${dataInfo.name}"/>
</definition>
这个问题的主要出处在于我们错误的定义了<put-attribute,因为在layout.jsp中我们使用的是<tiles:insertAttribute name="body"/>
而标签insertAttribute在文档中明确是指明:
Inserts the value of an attribute into the page. This tag can be flexibly used to insert the value of an attribute into a page. As in other usages in Tiles, every attribute can be determined to have a "type", either set explicitly when it was defined, or "computed". If the type is not explicit, then if the attribute value is a valid definition, it will be inserted as such. Otherwise, if it begins with a "/" character, it will be treated as a "template". Finally, if it has not otherwise been assigned a type, it will be treated as a String and included without any special handling.
Example : <tiles:insertAttribute name="body">
通过上面的提示信息调整后如下:
但新的问题又出现了,提示信息错误为:
The requested resource (/form/tiles/edit.action) is not available,这特提示信息似乎告诉我们tiles把 /form/tiles/edit.action作为了一个文件而不是一个action来对待的
在这种情况下我们看到页面的body部分显示的是字符串"edit.action?additinalInfo=${dataInfo.name} ",那这是为什么呢……,又该怎么来进行这种形式的信息配置呢?
在这里最后使用了一种变通的方式来进行信息的配置,如下:
<action name="edit" class="com.chsi.sample.action.SampleEAction">
<result type="tiles">sample.form.edit</result>
<interceptor-ref name="params" />
<interceptor-ref name="basicStack"/>
</action>
<action name="save" class="com.chsi.sample.action.SampleEAction" method="save">
<interceptor-ref name="token"/>
<interceptor-ref name="defaultStack" />
<result name="input" type="tiles">sample.form.input</result>
<!-- old value dispatcher -->
<result name="invalid.token" type="tiles">sample.form.error</result>
<!--old value redirect-action-->
<result type="chain">edit</result>
</action>
[color=blue]这里使用了type为chain类型来解决使用tiles时资源为action的情形[/color]
------------------------------------
关于tiles-plugin的一些相关的信息:
在struts2-tiles-plugin-2.0.11.2.jar文件中我们可以发现如下的信息,这个正是我们在struts-tiles.xml中<package name="tiles" extends="tiles-default"的依据
<struts>
<package name="tiles-default" extends="struts-default">
<result-types>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
</result-types>
</package>
</struts>
从这里我们可以看到tiles这种result类型的实现文件
类TilesResult实现类型是ServletDispatcherResult(Package: org.apache.struts2.dispatcher)
-----------------------------------
关于几个有用的标签:
<tiles:insertAttribute >
<tiles:insertAttribute name="body"/>
-----------------------------------
当然我们也可以在页面中使用EL正则表达式信息:
<tiles:importAttribute name="title" scope="request"/>
我们可以通过如下的形式来得到对应的数据信息: ${title}