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

时间:2013-11-20 12:17:01

标签: java jsp url struts2 ognl

如果我有网址:www.myurl.com/books并希望能够通过传递<s:url>和{{1}来对作者和年份www.myurl.com/books/Sartre/1942进行新的Sartre过滤}作为动作类的参数,它将使书籍页面呈现适当的结果。如何在Struts2中执行此操作?

我有后端逻辑,所以如果:

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

1 个答案:

答案 0 :(得分:4)

您需要Advanced Wildcard Mappings

来自文档:Struts2's Advanced Wildcard Mappings

  

高级通配符

     

从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()方法,read this question

处理这些参数