如果我有网址:www.myurl.com/books
并希望能够通过传递<s:url>
和{{1}来对作者和年份www.myurl.com/books/Sartre/1942
进行新的Sartre
过滤}作为动作类的参数,它将使书籍页面呈现适当的结果。如何在Struts2中执行此操作?
我有后端逻辑,所以如果:
会很棒1942
使用。www.myurl.com/books
即使在get请求加载了页面之后,也在地址栏中
(不是www.myurl.com/books/Sartre/1942
,即)。答案 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。