使用 OGNL 在 Struts 2 中创建具有 2 个操作参数的动态 URL



如果我有一个 url: www.myurl.com/books并希望能够创建新的<s:url>过滤作者和年份:www.myurl.com/books/Sartre/1942,方法是将Sartre1942作为参数传递给操作类,这将呈现具有适当结果的书籍页面。如何在 Struts2 中执行此操作?

我有后端逻辑,所以

如果:
  1. 我可以重用与永久链接相同的 jsp 和操作类 www.myurl.com/books用途。
  2. 显示动态呈现的 URL www.myurl.com/books/Sartre/1942在地址栏中,即使在 GET 请求加载页面后(不是www.myurl.com/books,就是这样(。

你需要Advanced Wildcard Mappings .

来自文档:Struts2 的高级通配符映射:

高级通配符

从2.1.9+可以在操作中定义正则表达式 名字。要使用这种形式的通配符,以下常量必须 设置:

<constant name="struts.enable.SlashesInActionNames" value="true"/> 
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex" />

正则表达式可以有两种形式,最简单的一种是 {FIELD_NAME} ,在这种情况下,FIELD_NAME字段在 操作将使用匹配的文本填充,例如:

<package name="books" extends="struts-default" namespace="/">
    <action name="/{type}/content/{title}" class="example.BookAction">
        <result>/books/content.jsp</result>
    </action> 
</package>

在此示例中,如果网址/fiction/content/Frankenstein 请求,BookAction 的字段"type"将设置为"fiction",并且 字段"title"将设置为"Frankenstein"。

如果使用 Struts2-Convention-Plugin,您的示例将是:

@Action(value="/books/{author}/{year}")
public class Books extends ActionSupport {
    private String  author; 
    private Integer year;
    /* ...GETTERS AND SETTERS HERE... */
    public String execute(){            
        /* ...LOAD DATA HERE... */
        if (noDataFound)
            return NONE;
        return SUCCESS
    }
}
如果需要在方法

中使用这些参数prepare()请阅读此问题。

最新更新