【问题标题】:Ajax form submit button using jQuery in Struts 2在 Struts 2 中使用 jQuery 的 Ajax 表单提交按钮
【发布时间】:2013-06-30 21:11:44
【问题描述】:

我有带有提交按钮的表单,当单击按钮时,它会前进到下一页并从后端获取所有数据。但是根据新的要求,页面需要保持不变,但后端流程应该相同。所以我用 Ajax 调用按钮来获取后端数据。但它没有按预期工作。请检查以下代码。

<s:form action="product!list" id="searchForm" method="Post" onSubmit="FormSubmitHandler()">
<s:submit action="product" method="list" value="search" />  
</s:form>

我试图运行的页面。

<s:form action="product!list" id="searchForm" method="Post" onSubmit="FormSubmitHandler()">
    <s:submit id="search" />
    </s:form>

jQuery 代码:

$("#search").click(function(){
    jQuery.ajax({
     url : '<s:url action="product" method="list" />',
    success : function(data){alert(data)}
    
    });
    return false;
    });

控制台错误:

2013-07-01 09:18:02,318 DEBUG apache.struts2.codebehind.CodebehindUnknownHandler - Trying to locate unknown action template with extension .jsp in directory /
2013-07-01 09:18:02,318 DEBUG apache.struts2.codebehind.CodebehindUnknownHandler - Trying to locate unknown action template with extension .vm in directory /
2013-07-01 09:18:02,318 DEBUG apache.struts2.codebehind.CodebehindUnknownHandler - Trying to locate unknown action template with extension .ftl in directory /
2013-07-01 09:18:02,334 WARN            org.apache.struts2.dispatcher.Dispatcher - Could not find action or result
There is no Action mapped for action name pricing. - [unknown location]
        at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
        at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:70)
        at org.apache.struts2.rest.RestActionProxyFactory.createActionProxy(RestActionProxyFactory.java:51)
        at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:500)
        at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
        at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:74)
        at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
        at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:74)
        at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:74)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3288)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3254)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
        at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
        at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2163)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2089)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2074)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1513)
        at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

动作类:

@Results({@Result(name=pricing.action.PartAction.INPUT,type=ServletDispatcherResult.class,value="/product-search.jsp", params={"location", "/product-search.jsp"}),
@Result(name="success",type=JSONResult.class,value="",params={"root","findList"})

})

@Validation()
public class PartAction extends BaseAction implements Preparable, ServletResponseAware {

public String list(){
    try {
    buildHeaders();

} catch (Exception e) {
    log.error(e);
    super.addActionMessage("No prices were found that match your search criteria.  Please select different options and try again.");
    return SEARCH;
  }
  return LIST;
  }

BaseAction 实现了:

@ParentPackage(value="pricing")
public abstract class BaseAction extends ActionSupport implements ServletRequestAware, SessionAware {
 protected static final String LIST = "list"; 
public String execute() throws Exception {
     
    return SUCCESS;
  }

上面的代码没有调用action类中的list()方法。

【问题讨论】:

  • 有人知道这个问题吗?
  • 几点说明:网址看起来不对。相反,它应该像 '/product/save' 除了在你的 jQuery 代码中添加一个错误处理程序。这样做你就会知道发生了什么。
  • 我不太明白你在问什么:/ 请花 5 分钟来改进你问题的英文部分(代码看起来不错)。
  • 我认为这不是执行此要求的正确方法。你能检查一下struts ajax标签和/或struts2-jquery插件吗?

标签: java jquery jsp struts2 struts2-jquery


【解决方案1】:

试试这个脚本

<script type="text/JavaScript">
  $("#searchForm").submit(function(event) {
    event.preventDefault();
    var $form = $(this);
    var url = $form.attr('action');
    $.post(url).done(function(data) {
      alert(data);
    });
  });
</script>

并改变形式像

<s:url var="formUrl" action="product" method="list" />
<s:form action="%{#formUrl}" id="searchForm" method="POST">
  <s:submit/>
</s:form>

编辑:

其他代码不可能是这样的错误,上面的代码没有使用。在提交按钮后的上述代码中,product 操作被调用。然后你应该在课堂上添加@Action(name="product")

@Action(name="product")
@Results({
 @Result(name=INPUT,type=ServletDispatcherResult.class, value="/product-search.jsp"),
 @Result(name=SUCCESS,type=JSONResult.class,value="",params={"root","findList"})
})
@Validation()
public class PartAction extends BaseAction { //removed interfaces that aren't implemented

  private List<Object> findList = new List<Object>(); //you could use any type instead of Object

  public List<Object> getFindList(){ //this is needed to JSON result
    return findList;
  }

  public String list(){
    try {
      buildHeaders();    
    } catch (Exception e) {
      log.error(e);
      addActionMessage("No prices were found that match your search criteria.  Please select different options and try again."); //super is not needed use protected modifire
      return INPUT; //the result should be above
    }
    return SUCCESS; //the result should be above
  }
}

【讨论】:

  • 表单中需要使用什么类型的按钮?像 因为你提到了 form.attr('action')。
  • 没关系,任何一个。表单是它上面的另一个标签。
  • 它没有触发该方法...您的注释:带有代码隐藏插件的 Struts。
  • 我正在尝试在页面加载时自动单击按钮。
  • 当点击按钮时,它给我错误“org.apache.struts2.dispatcher.Dispatcher - 找不到动作或结果”。由于这个代码隐藏插件,所以动作必须是产品!列表..希望这就是原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多