一尘不染

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

jsp

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

我具有后端逻辑,因此如果满足以下条件,那就更好了:

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

阅读 297

收藏
2020-06-08

共1个答案

一尘不染

你需要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请求了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
    }
}

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

2020-06-08