29、Struts Dojo 插件的自动完成器与树标签及 Struts 配置详解

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 自动完成器使用步骤
  1. 确定需求 :明确是使用简单列表填充、JSON 对象填充,还是指定 JSON 对象属性填充的方式。
  2. 编写 JSP 页面 :根据需求选择相应的示例代码,设置好 name list href dataFieldName 等属性。
  3. 配置 JSON 数据 :如果使用 JSON 对象填充,需要编写相应的 JSP 页面来生成符合格式要求的 JSON 数据。
  4. 测试 :通过访问相应的 URL 来测试自动完成器的功能。
4.2 树标签使用步骤
  1. 静态构建树
    • 编写 JSP 页面 :使用 <sx:tree> <sx:treenode> 标签构建静态树,设置好 id label 等属性。
    • 测试 :访问相应的 URL 查看静态树的显示效果。
  2. 动态构建树
    • 创建模型对象 :创建 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 配置文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值