1

Я хочу добавить 3 кнопки в форму стоек. Мой код:Multi action in struts form

@Action("/admin/product/insert") 
public String insert() throws Exception { 
    if(upload.hasFile()){ 
     model.setImage(upload.getFileFileName()); 
     upload.saveTo("../images/customers/"); 
    } 
    else{ 
     model.setImage("product.png"); 
    } 
    XHibernate.save(model); 
    return "new"; 
} 

@Action("/admin/product/update") 
public String update() throws Exception { 
    if(upload.hasFile()){ 
     model.setImage(upload.getFileFileName()); 
     upload.saveTo("../images/customers/"); 
    } 
    System.out.println("update"); 
    XHibernate.update(model); 
    return "input"; 
} 

@Action("/admin/product/delete") 
public String delete() throws Exception { 
    XHibernate.delete(model); 
    return "new"; 
} 

В JSP:

<s:form enctype="multipart/form-data" theme="simple" role="form"> 

    <div class="form-group col-md-4"> 
     <label for="id">Product Id</label> 
     <s:textfield id="productId" name="id" cssClass="form-control" /> 
    </div> 

    <div class="form-group col-md-4"> 
     <label for="name">Product Name</label> 
     <s:textfield name="name" cssClass="form-control" /> 
    </div> 

    <div class="form-group col-md-4"> 
     <label for="unitPrice">Unit Price</label> 
     <s:textfield name="unitPrice" cssClass="form-control" /> 
    </div> 

    <div class="form-group col-md-4"> 
     <label for="unitBrief">Unit Description</label> 
     <s:textfield name="unitBrief" cssClass="form-control" /> 
    </div> 

    <div class="form-group col-md-4"> 
     <label for="discount">Discount</label> 
     <s:textfield name="discount" cssClass="form-control" /> 
    </div> 

    <div class="form-group col-md-4"> 
     <label for="quantity">Quantity</label> 
     <s:textfield name="quantity" cssClass="form-control" /> 
    </div> 

    <div class="form-group col-md-4"> 
     <label for="productDate">Product Date</label> 
     <s:textfield name="productDate" cssClass="form-control" /> 
    </div> 

    <div class="form-group col-md-4"> 
     <label for="supplier.id">Supplier</label> 
     <s:select name="supplier.id" list="suppliers" listKey="id" 
      listValue="name" cssClass="form-control" /> 
    </div> 

    <div class="form-group col-md-4"> 
     <label for="category.id">Category</label> 
     <s:select name="category.id" list="categories" listKey="id" 
      listValue="name" cssClass="form-control" /> 
    </div> 

    <div class="form-group col-md-4"> 
     <label>Features</label> 
     <div> 
      <label><s:checkbox name="available" /> Available</label> <label><s:checkbox 
        name="special" /> Special</label> <label><s:checkbox 
        name="latest" /> latest</label> 
     </div> 
    </div> 

    <div class="form-group col-md-4"> 
     <label for="image">Image</label> <input id="image" type="file" 
      name="upload.file"> 
     <s:hidden name="image" /> 
    </div> 

    <div class="form-group col-md-12"> 
     <label for="description">Description</label> 
     <s:textarea id="index_description" name="description" rows="30" 
      cssClass="form-control" /> 
    </div> 

    <div class="col-md-12"> 
     <s:submit value="Thêm mới" action="admin/product/insert" 
      cssClass="btn btn-default" /> 
     <s:submit value="Cập nhật" action="admin/product/update" 
      cssClass="btn btn-default" /> 
     <s:submit value="Xóa" action="admin/product/delete" cssClass="btn btn-default" /> 
     <a href="product/index" class="btn btn-default">Nhập lại</a> 
    </div> 
</s:form> 

Проблема заключается в том, что не может назвать точно действие.

У меня всегда была ошибка: «Для пространства имен/admin/product и action name admin/product/update нет действия».

Должен ли я разделить его на 3 формы? ИЛИ Есть ли способ иметь 3 кнопки для 3-х действий в 1 форме, например, мой код? Любая помощь будет большой.

обновил протоколирование, когда позволяют DEVMODE:

ognl.MethodFailedException: Method "setDiscount" failed for object [email protected] [java.lang.NoSuchMethodException: setDiscount([Ljava.lang.String;)] 
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:823) 
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:964) 
at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:75) 
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:131) 
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:28) 
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1656) 
at com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor.setProperty(CompoundRootAccessor.java:50) 
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1656) 
at ognl.ASTProperty.setValueBody(ASTProperty.java:101) 
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177) 
at ognl.SimpleNode.setValue(SimpleNode.java:246) 
at ognl.Ognl.setValue(Ognl.java:476) 
at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:192) 
at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:155) 
at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:143) 
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters(ParametersInterceptor.java:273) 
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:187) 
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) 
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:306) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) 
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) 
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) 
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468) 
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Unknown Source) 
+0

старайтесь иметь разные имена в каждой кнопке отправки. – user23123412

+0

Я попытался, но он все еще не работает –

+0

если у вас есть одна кнопка отправки, она работает? – user23123412

ответ

0

Чтобы исправить текущую проблему, вы должны добавить

<constant name="struts.enable.SlashesInActionNames" value="true"/> 

в struts.xml, что является ложным по умолчанию, и будет принимать все части перед последней косой чертой в качестве пространства имен вместо имени действия. КСТАТИ это имеет побочные эффекты:

Action Names With Slashes

If your action names have slashes in them (for example,
<action name="admin/home" class="tutorial.Admin"/>) you need to specifically allow slashes in your action names via a constant in the struts.xml file by specifying

<constant name="struts.enable.SlashesInActionNames" value="true"/> .

See JIRA Issue WW-1383 for discussion as there are side effects to setting this property to true.

Чтобы исправить эту проблему правильный путь, что вам нужно сделать правильное использование пространств имен:

Действие

@Namespace("/admin/product") 
public class YourAction extends ActionSupport 

    @Action("insert") 
    public String insert() throws Exception { 
     /* .... */ 
    } 

    @Action("update") 
    public String update() throws Exception { 
     /* .... */ 
    } 

    @Action("delete") 
    public String delete() throws Exception { 
     /* .... */ 
    } 

JSP

<s:submit value="Thêm mới" action="insert" cssClass="btn btn-default" /> 
<s:submit value="Cập nhật" action="update" cssClass="btn btn-default" /> 
<s:submit value="Xóa"  action="delete" cssClass="btn btn-default" /> 

Вы также должны реорганизовать структуру пакета для действий и JSP, чтобы следовать структуре пространства имен.

PS: не забудьте установить включен префикс действия, как описано в this answer, если вы используете Struts2 версию выше, чем 2.3.15.2:

<constant name="struts.mapper.action.prefix.enabled" value="true"/> 

EDIT

Если namespace действия, которые вы используете для показа вашего JSP, не те же действия, что и cal привел (в данном случае, /admin/product), необходимо указать его в <s:form> тег:

<s:form namespace = "/admin/product" 
      enctype = "multipart/form-data" 
      theme = "simple" 
      role = "form"> 

и (если вы используете Struts2 версию выше, чем 2.3.15.2), установите следующее свойство в распорок. XML:

<constant name="struts.mapper.action.prefix.crossNamespaces" value="true"/> 

, потому что она по умолчанию отключена due to security reason.

+0

Вы пробовали, это сработало? –

+0

извините, я занят в течение дня, я попробую ваше предложение и ответю вам как можно скорее. спасибо за вашу поддержку –

+0

Странно. Я следил за вашим предложением, 3 кнопки работали, но когда я нажимаю insert, форма не вызывает вставку (только изменение формы для вставки действия), затем я нажимаю update (действие вставки отображается в URL-адресе), затем я нажимаю delete (обновление действие отображается в URL-адресе). Похоже, что действие было предотвращено чем-то и собралось там. Но только изменение URL, код в контроллере не срабатывает. –

 Смежные вопросы

  • Нет связанных вопросов^_^