Struts Dojo 插件的自动完成器与树标签及 Struts 配置详解
在 Web 开发中,Struts 框架提供了丰富的功能和插件来简化开发过程。其中,Struts Dojo 插件可以帮助我们构建 AJAX 组件,而 Struts 的配置文件则用于管理应用的各种设置。下面将详细介绍 Struts Dojo 插件中的自动完成器和树标签,以及 Struts 的配置文件。
1. Struts Dojo 自动完成器示例
Struts Dojo 插件提供了
<sx:autocompleter>
标签,用于实现自动完成功能。下面是几个不同的示例。
1.1 示例 1:简单自动完成器
以下是
AutoCompleter1.jsp
的代码:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<html>
<head>
<title>Auto Completer</title>
<sx:head/>
</head>
<body>
<s:form action="ShowSelection" theme="simple">
<sx:autocompleter name="carMake" list="carMakes"/>
<s:submit/>
</s:form>
</body>
</html>
你可以通过访问
http://localhost:8080/app27a/AutoCompleter1.action
来测试这个示例。当表单提交时,所选选项将作为请求参数
carMakeKey
发送。
1.2 示例 2:通过 JSON 对象填充自动完成器
AutoCompleter2.jsp
的代码如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<html>
<head>
<title>Auto Completer</title>
<sx:head/>
</head>
<body>
<s:form action="ShowSelection" theme="simple">
<sx:autocompleter name="carMake" href="CarMakesAsJSON1.action"/>
<s:submit/>
</s:form>
</body>
</html>
这里的
href
属性指定了返回 JSON 对象的服务器地址。
CarMakesAsJSON1.action
会转发到
CarMakesAsJSON1.jsp
,并返回如下格式的 JSON 对象:
[
['key-1','value-1'],
['key-2','value-2'],
...
['key-n','value-n']
]
CarMakesAsJSON1.jsp
的代码如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
[
<s:iterator value="carMakes" status="status">
['<s:property/>','<s:property/>']
<s:if test="!#status.last">,</s:if>
</s:iterator>
]
你可以通过访问
http://localhost:8080/app27a/AutoCompleter2.action
来测试这个示例。
1.3 示例 3:指定 JSON 对象属性的自动完成器
AutoCompleter3.jsp
的代码如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<html>
<head>
<title>Auto Completer</title>
<sx:head/>
</head>
<body>
<s:form action="ShowSelection" theme="simple">
<sx:autocompleter
name="carMake"
dataFieldName="make"
href="CarMakesAsJSON2.action"/>
<s:submit/>
</s:form>
</body>
</html>
这个示例与示例 2 的区别在于 JSON 对象的格式。这里的 JSON 对象包含一个
make
属性,其中包含要显示的选项列表。JSON 对象的格式如下:
{
"make" : {
'key-1':'value-1',
'key-2':'value-2',
...
'key-n':'value-n'
}
}
dataFieldName
属性用于告诉自动完成器 JSON 对象中包含选项的属性名称。
CarMakesAsJSON2.jsp
的代码如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
{
"make" : {
<s:iterator value="carMakes" status="status">
'<s:property/>':'<s:property/>'
<s:if test="!#status.last">,</s:if>
</s:iterator>
}
}
你可以通过访问
http://localhost:8080/app27a/AutoCompleter3.action
来测试这个示例。
2. Struts Dojo 树和树节点标签
<sx:tree>
标签用于渲染 Dojo 树,它可以包含
<sx:treenode>
标签,也可以动态获取子节点。以下是树标签和树节点标签的属性说明。
2.1 树标签属性
| 名称 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
| blankIconSrc | String | 空白图标的源 | |
| childCollectionProperty | String | 返回子节点集合的属性名称 | |
| collapsedNotifyTopics | String | 节点折叠时要发布的逗号分隔的主题 | |
| errorNotifyTopics | String | 请求失败后要发布的逗号分隔的主题 | |
| expandIconSrcMinus | String | 展开图标的源(减号) | |
| expandIconSrcPlus | String | 展开图标的源(加号) | |
| expandedNotifyTopics | String | 节点展开时要发布的逗号分隔的主题 | |
| gridIconSrcC | String | 子项子图标下方的图像源 | |
| gridIconSrcL | String | 最后一个子网格的图像源 | |
| gridIconSrcP | String | 父项子图标下方的图像源 | |
| gridIconSrcV | String | 垂直线的图像源 | |
| gridIconSrcX | String | 唯一根项网格的图像源 | |
| gridIconSrcY | String | 最后一个根项网格的图像源 | |
| href | String | 用于获取内容的 URL | |
| iconHeight | String | 18px | 图标的高度 |
| iconWidth | String | 19px | 图标的宽度 |
| javascriptTooltip | boolean | false | 是否使用 JavaScript 生成工具提示 |
| nodeIdProperty | 用作节点 ID 的属性名称 | ||
| nodeTitleProperty | 用作节点标题的属性名称 | ||
| openTemplate | String | 用于打开渲染 HTML 的模板 | |
| rootNode | String | 用作根的属性名称 | |
| selectedNotifyTopics | String | 节点被选中时要发布的逗号分隔的主题 | |
| showGrid | boolean | true | 是否显示网格 |
| showRootGrid | boolean | true | 显示根网格的属性 |
| toggle | String | fade | 切换属性,可能的值为 fade 或 explode |
| toggleDuration | integer | 150 | 切换持续时间(毫秒) |
2.2 树节点标签属性
| 名称 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
| javascriptTooltip | boolean | false | 是否使用 JavaScript 生成工具提示 |
| openTemplate | String | 用于打开渲染 HTML 的模板 |
2.3 示例 1:静态构建树
Tree1.jsp
的代码如下:
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<html>
<head>
<title>Tree</title>
<sx:head debug="true"/>
</head>
<body>
<sx:tree id="root" label="Root">
<sx:treenode id="F1" label="F1" />
<sx:treenode id="F2" label="F2">
<sx:treenode id="F2a" label="F2a" />
<sx:treenode id="F2b" label="F2b" />
</sx:treenode>
<sx:treenode id="F3" label="F3" />
</sx:tree>
</body>
</html>
你可以通过访问
http://localhost:8080/app27a/Tree1.action
来测试这个示例。
2.4 示例 2:动态构建树
要动态构建树,
<sx:tree>
标签至少需要以下属性:
rootNode
、
nodeTitleProperty
、
nodeIdProperty
和
childCollectionProperty
。同时,需要创建一个模型对象来支持视图。
以下是相关的 Java 类和 JSP 代码:
TreeSupport
动作类:
package app27a;
import com.opensymphony.xwork2.ActionSupport;
public class TreeSupport extends ActionSupport {
public Node getRootNode() {
return new Node("root", "ROOT");
}
}
Node
类:
package app27a;
import java.util.ArrayList;
import java.util.List;
public class Node {
private String id;
private String title;
public Node() {
}
public Node(String id, String title) {
this.id = id;
this.title = title;
}
// getters and setters not shown
public static int counter = 1;
public List getChildren() {
List<Node> children = new ArrayList();
if (counter < 5) {
Node child = new Node("node" + counter,
"Generation " + counter);
children.add(child);
counter++;
}
return children;
}
}
Tree2.jsp
的代码如下:
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<html>
<head>
<title>Tree</title>
<sx:head debug="true"/>
<script type="text/javascript">
dojo.event.topic.subscribe("nodeSelected", function(source) {
var selectedNode = source.node;
alert("You selected node " + selectedNode.title);
});
</script>
</head>
<body>
<sx:tree rootNode="rootNode"
nodeTitleProperty="title"
nodeIdProperty="id"
childCollectionProperty="children"
selectedNotifyTopics="nodeSelected"
>
</sx:tree>
</body>
</html>
你可以通过访问
http://localhost:8080/app27a/Tree2.action
来测试这个示例。当点击节点时,会弹出一个提示框显示节点的标题。
3. Struts 配置文件
Struts 应用的两个主要配置文件是
struts.xml
和
struts.properties
。
struts.xml
用于注册拦截器、结果类型,以及映射动作和动作类、结果;
struts.properties
用于指定应用的其他方面,如默认主题和应用是否处于开发模式。
3.1 struts.xml 文件
struts.xml
文件总是包含以下 DOCTYPE 元素:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
其根元素是
<struts>
,可能包含以下直接子元素:
-
package
-
include
-
bean
-
constant
以下是各个元素的详细说明。
3.2 动作元素(action)
动作元素嵌套在包元素中,表示一个动作。其属性如下:
| 属性 | 描述 |
| ---- | ---- |
| name* | 动作名称 |
| class | 与该动作关联的动作类 |
| method | 动作方法 |
| converter | 该动作的转换器 |
示例:
<action name="MyAction">
如果动作未指定动作类,将使用默认动作类的实例。如果有非默认动作类,则必须使用
class
属性指定完整类名,并使用
method
属性指定动作方法。例如:
<action name="Address_save" class="app.Address" method="save">
如果
class
属性存在但
method
属性不存在,则默认方法名为
execute
。
3.3 豆元素(bean)
用于指示 Struts 创建一个 bean 或使 bean 的静态方法可供应用使用。其属性如下:
| 属性 | 描述 |
| ---- | ---- |
| class* | 要实例化的 Java 类或其静态方法要可用的类 |
| type | Java 类实现的主要接口 |
| name | 用于引用此 bean 的唯一名称 |
| scope | bean 的作用域,允许的值为 default、singleton、request、session 和 thread |
| static | 指示是否注入静态方法 |
| optional | 指示 bean 是否可选 |
示例:
<bean name="uniqueBean" type="MyInterface" class="MyBeanClass"/>
3.4 常量元素(constant)
用于覆盖
default.properties
文件中的值。其属性如下:
| 属性 | 描述 |
| ---- | ---- |
| name
| 常量的名称 |
| value
| 常量的值 |
示例:
<constant name="struts.devMode" value="true"/>
这将把 Struts 应用设置为开发模式。
3.5 默认动作引用元素(default-action-ref)
该元素必须出现在包元素下,指定在该包中找不到匹配 URI 的动作时要调用的默认动作。例如:
<default-action-ref name="Main"/>
3.6 默认拦截器引用元素(default-interceptor-ref)
该元素必须出现在包元素下,指定在该包中未指定任何拦截器的动作要使用的默认拦截器或拦截器栈。例如:
<default-interceptor-ref name="defaultStack"/>
3.7 异常映射元素(exception-mapping)
该元素必须出现在动作元素或全局异常映射元素下,用于捕获动作类中未捕获的异常。其属性如下:
| 属性 | 描述 |
| ---- | ---- |
| name | 此映射的名称 |
| exception
| 要捕获的异常类型 |
| result
| 捕获异常时要执行的结果 |
示例:
<action name="User_save" class="...">
<exception-mapping exception="java.lang.Exception"
result="error"/>
<result name="error">/jsp/Error.jsp</result>
<result>/jsp/Thanks.jsp</result>
</action>
3.8 全局异常映射元素(global-exception-mappings)
该元素必须出现在包元素下,允许声明异常映射元素来捕获动作类中未捕获的异常。任何在全局异常映射元素下声明的异常映射必须引用全局结果元素中的结果。例如:
<global-results>
<result name="error">/jsp/Error.jsp</result>
<result name="sqlError">/jsp/SQLError.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.sql.SQLException"
result="sqlError"/>
<exception-mapping exception="java.lang.Exception"
result="error"/>
</global-exception-mappings>
3.9 全局结果元素(global-results)
该元素必须出现在包元素下,指定在动作本地找不到结果时要执行的全局结果。例如:
<global-results>
<result name="error">/jsp/Error.jsp</result>
<result name="sqlError">/jsp/SQLError.jsp</result>
</global-results>
3.10 包含元素(include)
用于将
struts.xml
文件分割成更小的文件,以便大型应用更易于管理。例如:
<struts>
<include file="module-1.xml" />
<include file="module-2.xml" />
...
<include file="module-n.xml" />
</struts>
每个
module.xml
文件都应包含相同的 DOCTYPE 元素和
<struts>
根元素。
3.11 拦截器元素(interceptor)
拦截器元素必须出现在拦截器元素下,用于为声明拦截器元素的包注册一个拦截器。其属性如下:
| 属性 | 描述 |
| ---- | ---- |
| name
| 用于引用拦截器的名称 |
| class
| 该拦截器的 Java 类 |
示例:
<interceptor name="fileUpload"
class="org.apache.struts.interceptor.FileUploadInterceptor"/>
3.12 拦截器引用元素(interceptor-ref)
用于引用已注册的拦截器,可以出现在拦截器栈元素或动作元素下。使用
name
属性引用已注册的拦截器。例如:
<package name="main" extends="struts-default">
<interceptors>
<interceptor name="alias" class="..."/>
<interceptor name="i18n" class="..."/>
<interceptor name="validation" class="..."/>
<interceptor name="logger" class="..."/>
</interceptors>
<action name="Product_save" class="...">
<interceptor-ref name="alias"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="logger"/>
<result name="input">/jsp/Product.jsp</result>
<result>/jsp/ProductDetails.jsp</result>
</action>
</package>
3.13 拦截器栈元素(interceptor-stack)
为了减轻在每个动作元素中重复引用拦截器的负担,Struts 允许创建拦截器栈来分组拦截器。例如,常见的六个拦截器顺序为
exception
、
servletConfig
、
prepare
、
checkbox
、
params
和
conversionError
,可以创建如下拦截器栈:
<interceptor-stack name="myStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
然后在动作元素中引用该拦截器栈:
<action name="MyAction" class="...">
<interceptor-ref name="myStack"/>
<result>/jsp/Result.jsp</result>
</action>
通过以上介绍,我们了解了 Struts Dojo 插件的自动完成器和树标签的使用,以及 Struts 配置文件的详细设置。这些功能和配置可以帮助我们更高效地开发 Web 应用。
Struts Dojo 插件的自动完成器与树标签及 Struts 配置详解
4. 自动完成器和树标签使用总结
在使用 Struts Dojo 插件的自动完成器和树标签时,我们可以按照以下步骤进行操作:
4.1 自动完成器使用步骤
- 确定需求 :明确是使用简单列表填充、JSON 对象填充,还是指定 JSON 对象属性填充的方式。
-
编写 JSP 页面
:根据需求选择相应的示例代码,设置好
name、list、href、dataFieldName等属性。 - 配置 JSON 数据 :如果使用 JSON 对象填充,需要编写相应的 JSP 页面来生成符合格式要求的 JSON 数据。
- 测试 :通过访问相应的 URL 来测试自动完成器的功能。
4.2 树标签使用步骤
-
静态构建树
-
编写 JSP 页面
:使用
<sx:tree>和<sx:treenode>标签构建静态树,设置好id、label等属性。 - 测试 :访问相应的 URL 查看静态树的显示效果。
-
编写 JSP 页面
:使用
-
动态构建树
-
创建模型对象
:创建
Node类和TreeSupport动作类,提供根节点和子节点的信息。 -
编写 JSP 页面
:使用
<sx:tree>标签,设置好rootNode、nodeTitleProperty、nodeIdProperty、childCollectionProperty等属性。 - 添加事件处理 :如果需要处理节点选择事件,可以添加相应的 JavaScript 代码。
- 测试 :访问相应的 URL 测试动态树的功能,点击节点查看事件处理效果。
-
创建模型对象
:创建
5. Struts 配置文件使用流程
Struts 配置文件的使用可以按照以下流程图进行:
graph TD;
A[开始] --> B[创建 struts.xml 文件]
B --> C[添加 DOCTYPE 元素]
C --> D[添加根元素 <struts>]
D --> E{选择子元素}
E --> |package| F[配置包元素]
E --> |include| G[包含其他配置文件]
E --> |bean| H[配置 bean 元素]
E --> |constant| I[配置常量元素]
F --> J{配置动作元素}
J --> |是| K[配置动作属性]
J --> |否| L[继续其他配置]
K --> M{配置异常映射元素}
M --> |是| N[配置异常映射属性]
M --> |否| L
G --> L
H --> L
I --> L
N --> L
L --> O[配置全局异常映射元素]
O --> P[配置全局结果元素]
P --> Q[配置拦截器元素]
Q --> R[配置拦截器栈元素]
R --> S[配置拦截器引用元素]
S --> T[结束]
6. 配置文件元素关系总结
Struts 配置文件中的各个元素之间存在着复杂的关系,以下是一个简单的总结:
-
包元素(package)
:是其他元素的容器,包含动作元素、默认动作引用元素、默认拦截器引用元素、全局异常映射元素和全局结果元素等。
-
动作元素(action)
:嵌套在包元素中,代表一个具体的动作,可以配置动作类、方法、转换器等属性,还可以包含异常映射元素和结果元素。
-
异常映射元素(exception-mapping)
:可以出现在动作元素或全局异常映射元素下,用于捕获和处理异常。
-
全局异常映射元素(global-exception-mappings)
:必须出现在包元素下,用于声明全局的异常映射,引用全局结果元素中的结果。
-
全局结果元素(global-results)
:必须出现在包元素下,用于指定全局的结果,供动作元素或异常映射元素引用。
-
拦截器元素(interceptor)
:出现在拦截器元素下,用于注册拦截器。
-
拦截器栈元素(interceptor-stack)
:用于分组拦截器,方便在动作元素中引用。
-
拦截器引用元素(interceptor-ref)
:可以出现在拦截器栈元素或动作元素下,用于引用已注册的拦截器。
7. 注意事项
在使用 Struts Dojo 插件和 Struts 配置文件时,需要注意以下几点:
7.1 自动完成器注意事项
- JSON 数据格式 :确保 JSON 数据的格式符合要求,否则自动完成器可能无法正常显示选项。
-
安全问题
:
href属性指定的服务器地址必须与页面的源地址相同,以确保安全。
7.2 树标签注意事项
-
模型对象的创建
:动态构建树时,要确保
Node类和TreeSupport动作类的实现正确,避免出现无限循环等问题。 - 事件处理 :添加 JavaScript 事件处理代码时,要注意代码的正确性和兼容性。
7.3 Struts 配置文件注意事项
- 元素嵌套关系 :严格按照元素的嵌套规则进行配置,避免出现配置错误。
-
属性设置
:确保各个元素的属性设置正确,特别是必填属性,如
action元素的name属性、bean元素的class属性等。
8. 总结
Struts Dojo 插件提供的自动完成器和树标签为 Web 开发带来了丰富的交互功能,而 Struts 配置文件则为应用的管理和配置提供了强大的支持。通过合理使用这些功能和配置,我们可以更高效地开发出功能丰富、易于维护的 Web 应用。在实际开发中,我们需要根据具体的需求和场景,灵活运用自动完成器和树标签的不同用法,同时正确配置 Struts 配置文件中的各个元素,确保应用的稳定性和安全性。希望本文的介绍能够帮助开发者更好地掌握和使用 Struts Dojo 插件和 Struts 配置文件。
超级会员免费看
583

被折叠的 条评论
为什么被折叠?



