返回 Struts 2 中输入结果的当前页面

问题描述 投票:0回答:3

我的网络应用程序的所有页面上都有一个

<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;
    }
}

输出:

enter image description here

它可以工作,但每次参数无效(即空白)时,用户返回到

index.jsp
似乎不自然。

我的目标是当出现 请输入... 消息时让用户保持在当前页面。

问题:

  1. 如何获取调用操作的当前页面?
    (例如,访问者在登录页面使用了搜索,我该如何 从地址栏获取
    login.jsp
    ?)
  2. 如何使当前页面位于
    <result name="input">/currentpage</result>
java jsp dynamic struts2 actionresult
3个回答
2
投票

您可以使用以下代码获取当前页面名称:

String actionName = ServletActionContext.getRequest().getHeader("Referer");

在 Struts.xml 中,使用动态结果,例如:

<result name="input" type="redirect">${url}</result>

在action中,对url使用getter方法。默认情况下将 url 的值设置为“index.jsp”。如果要更改它,请为 url 设置适当的值。比如login.jsp等


2
投票

您可以通过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
投票

这只是为了展示我如何使用 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);
        }
    }
}

输出:

enter image description here

现在出现错误时停留在当前页面。

© www.soinside.com 2019 - 2024. All rights reserved.