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

1 java url jsp struts2 ognl

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

我已经准备好了后端逻辑,所以如果:

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

And*_*ios 5

你需要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" />
Run Code Online (Sandbox Code Playgroud)

正则表达式可以有两种形式,最简单的一种是 {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>
Run Code Online (Sandbox Code Playgroud)

/fiction/content/Frankenstein在本例中,如果请求url ,则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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要在方法中使用这些参数prepare()请阅读此问题