1

스트럿 폼에 3 개의 버튼을 추가하고 싶습니다. 내 코드는 다음과 같습니다 JSP에서스트럿츠 형태의 멀티 액션

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

:

<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/제품 및 작업 이름 admin/product/update에 매핑 된 작업이 없습니다."라는 오류가 항상 나타납니다.

3 가지 형식으로 나누어야합니까? 또는 내 코드처럼 3 개의 동작에 3 개의 버튼이있는 방법이 있습니까? 어떤 도움이라도 좋을 것입니다. 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

현재 문제를 해결하려면, 당신은 struts.xml에서

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

을 추가해야합니다, 그것은 기본적으로 거짓이며, 소요됩니다 액션 이름 대신 네임 스페이스로 마지막 슬래시 앞에있는 모든 부분. BTW이 부작용이 있습니다

액션

@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

:

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.

문제 올바른 방법를 해결하기를, 당신은 네임 스페이스의 올바른 사용을해야

<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" /> 

네임 스페이스 구조를 따르도록 Actions 및 JSP의 패키지 구조도 리팩터링해야합니다.

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

편집

경우] :

PS : 당신이 Struts2 버전보다 높은 2.3.15.2를 사용하는 경우 this answer에 설명 된대로 행동 접두사가 사용 설정 기억 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 버튼이 작동하지만 삽입을 클릭하면 양식이 삽입을 호출하지 않습니다 (삽입 동작으로 만 양식 변경) 다음을 클릭합니다 (삽입 동작을 URL에 표시)를 클릭 한 다음 삭제를 클릭합니다. 액션을 URL에 표시). 행동이 뭔가에 의해 막히고 거기에 쌓여있는 것처럼 보입니다. 그러나 URL 만 변경되고 컨트롤러의 코드는 실행되지 않습니다. –