在Struts 2中返回INPUT结果的当前页面

时间:2014-11-23 09:41:50

标签: java jsp dynamic struts2

我的网络应用程序的所有页面上都有<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;
    }
}

输出:

enter image description here

它有效,但每次参数无效(即空白)时,用户返回index.jsp似乎不自然。

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

问题:

  1. 如何获取当前页面,调用操作的位置?
    (例如,访问者在登录页面时使用了搜索,我该怎么做 从地址栏中获取login.jsp?)
  2. 如何将当前页面设为位置 <result name="input">/currentpage</result>
  3. 如果我的问题不清楚,请随时发表评论。

3 个答案:

答案 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);
        }
    }
}

<强>输出:

enter image description here

现在错误地保留在当前页面上。