我的网络应用程序的所有页面上都有<s:form>
。
<s:form action="search" method="post">
<s:textfield name="query" placeholder="Enter movie title..." cssClass="searchbox" />
<s:submit type="image" src="images/btn_search.gif" />
</s:form>
目前,当index.jsp
类的validate()
方法结果为SearchAction
时,它会重定向到input
。
<action name="search" class="com.mypackage.action.SearchAction">
<result>/search-result.jsp</result>
<result name="input">/index.jsp</result>
</action>
SearchAction:
public class SearchAction extends ActionSupport implements RequestAware, Message {
private static final long serialVersionUID = 1L;
private Map<String, Object> request;
private String query;
@Override
public String execute() throws Exception {
// business logic
request.put("searchResults", searchResults);
return SUCCESS;
}
@Override
public void validate() {
if(getQuery().length() == 0) {
addFieldError("query", BLANK_SEARCH);
}
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
}
输出:
它有效,但每次参数无效(即空白)时,用户返回index.jsp
似乎不自然。
我的目标是在请输入... 消息出现时让用户保持当前页面。
问题:
login.jsp
?)<result name="input">/currentpage</result>
?如果我的问题不清楚,请随时发表评论。
答案 0 :(得分:2)
您可以使用以下代码获取当前页面名称:
String actionName = ServletActionContext.getRequest().getHeader("Referer");
在Struts.xml中,使用动态结果,例如:
<result name="input" type="redirect">${url}</result>
在操作中,对url使用getter方法。默认情况下,将url的值设置为“index.jsp”。如果要更改它,请为url设置适当的值。像login.jsp等。
答案 1 :(得分:1)
您可以通过servlet请求获取当前页面。创建用于拦截当前页面的拦截器
public class CurrentPageInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
Map<String, Object> session = actionInvocation.getInvocationContext().getSession();
String queryString = request.getQueryString();
String savedUrl = request.getRequestURI()+(queryString==null?"":("?"+queryString));
String currentPage = (String) session.get("savedUrl");
if(currentPage == null) currentPage = savedUrl;
session.put("currentPage", currentPage);
session.put("savedUrl", savedUrl);
return actionInvocation.invoke();
}
}
在父包中注册拦截器
<interceptors>
<interceptor name="currentPage" class="com.company.interceptor.CurrentPageInterceptor"/>
<interceptor-stack name="curentPageStack">
<interceptor-ref name="currentPage"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="curentPageStack"/>
添加结果以返回动态参数
@Results({
@Result(name = "input", type = "redirect", location = "${currentPage}"),
@Result(location= "/search-result.jsp")
})
public class SearchAction extends ActionSupport implements RequestAware, SessionAware, Message {
private String currentPage;
//getter
@Override
public String execute() throws Exception {
if (hasErrors()){
currentPage = (String) session.get("currentPage");
return "input";
}
// business logic
request.put("searchResults", searchResults);
return SUCCESS;
}
...
}
答案 2 :(得分:1)
这只是为了展示我如何使用 Jigar 方法解决方案,我将其标记为已接受的答案。
<强> struts.xml
强>
<action name="search" class="com.mypackage.action.SearchAction">
<result>/search-result.jsp</result>
<result name="input">${url}</result>
</action>
我删除了type="redirect"
,因为fielderror消息消失了。我相信这是Apache docs中记录的预期行为:
重定向结果
响应被告知将浏览器重定向到指定位置 (来自客户的新请求)。这样做的结果意味着 动作(动作实例,动作错误,字段错误等) 刚刚执行的内容丢失了,不再可用。
资料来源:http://struts.apache.org/release/2.1.x/docs/redirect-result.html
<强> SearchAction:强>
public class SearchAction extends ActionSupport implements RequestAware, Message {
private String url;
public String getUrl() {
return url;
}
@Override
public String execute() throws Exception {
// business logic
request.put("searchResults", searchResults);
return SUCCESS;
}
@Override
public void validate() {
url = ServletActionContext.getRequest().getHeader("referer")
.replace("http://localhost:8080/mysite/", ""); // get resource name only
if(!url.contains(".jsp")) {
url = "index.jsp"; // default page
}
if(searchWord.length() == 0) {
addFieldError("searchWord", BLANK_SEARCH);
}
}
}
<强>输出:强>
现在错误地保留在当前页面上。