我的网络应用程序的所有页面上都有一个
<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>
搜索操作:
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>
?您可以使用以下代码获取当前页面名称:
String actionName = ServletActionContext.getRequest().getHeader("Referer");
在 Struts.xml 中,使用动态结果,例如:
<result name="input" type="redirect">${url}</result>
在action中,对url使用getter方法。默认情况下将 url 的值设置为“index.jsp”。如果要更改它,请为 url 设置适当的值。比如login.jsp等
您可以通过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;
}
...
}
这只是为了展示我如何使用 Jigar's 方法来解决该问题,我将其标记为已接受的答案。
struts.xml
:
<action name="search" class="com.mypackage.action.SearchAction">
<result>/search-result.jsp</result>
<result name="input">${url}</result>
</action>
我删除了
type="redirect"
,因为字段错误消息消失了。我相信这是 Apache 文档中记录的预期行为:
重定向结果
响应被告知将浏览器重定向到指定位置 (来自客户的新请求)。这样做的后果意味着 操作(操作实例、操作错误、字段错误等) 刚刚执行的文件丢失并且不再可用。
资料来源:http://struts.apache.org/release/2.1.x/docs/redirect-result.html
搜索操作:
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);
}
}
}
输出:
现在出现错误时停留在当前页面。