2012-10-22 104 views
0

Hy everyone!Spring Roo文件上傳

我試圖用Spring roo實現文件上傳。文件路徑將被保存在數據庫中,並且該文件將被保存在文件系統中。 根據在彈簧dveloper板發現信息,我修改了input.tagx和create.tagx文件(信息:https://jira.springsource.org/browse/ROO-442)。 input.tagx:

<jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core"    xmlns:fn="http://java.sun.com/jsp/jstl/functions"  xmlns:spring="http://www.springframework.org/tags" xmlns:form="http://www.springframework.org/tags/form" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> 
<jsp:output omit-xml-declaration="yes" /> 

<jsp:directive.attribute name="id" type="java.lang.String" required="true" rtexprvalue="true" description="The identifier for this tag (do not change!)" /> 
<jsp:directive.attribute name="field" type="java.lang.String" required="true" rtexprvalue="true" description="The field exposed from the form backing object" /> 
<jsp:directive.attribute name="label" type="java.lang.String" required="false" rtexprvalue="true" description="The label used for this field, will default to a message bundle if not supplied" /> 
<jsp:directive.attribute name="labelCode" type="java.lang.String" required="false" rtexprvalue="true" description="Key for label message bundle if label is not supplied" /> 
<jsp:directive.attribute name="required" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Indicates if this field is required (default false)" /> 
<jsp:directive.attribute name="disabled" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Specify if this field should be enabled" /> 
<jsp:directive.attribute name="validationRegex" type="java.lang.String" required="false" rtexprvalue="true" description="Specify regular expression to be used for the validation of the input contents" /> 
<jsp:directive.attribute name="validationMessageCode" type="java.lang.String" required="false" rtexprvalue="true" description="Specify the message (message property code) to be displayed if the regular expression validation fails" /> 
<jsp:directive.attribute name="validationMessage" type="java.lang.String" required="false" rtexprvalue="true" description="Specify the message to be displayed if the regular expression validation fails" /> 

<c:if test="${empty render or render}" 
    <c:when test="${disableFormBinding}"> 
    <input id="_${field}_id" name="${field}" type="${type}"/> 
    </c:when> 
    <c:otherwise> 
<!-- currently (spring 3.0.3), form:input doesn't support type attribute --> 
<!-- <form:input id="_${field}_id" path="${field}" disabled="${disabled}"/> --> 
<input id="_${field}_id" name="${field}" type="${type}"/> 
<br/> 
<form:errors cssClass="errors" id="_${field}_error_id" path="${field}"/> 
</c:otherwise>  
    <c:if test="${empty disabled}"> 
     <c:set value="false" var="disabled" /> 
    </c:if> 

<c:if test="${empty label}"> 
    <c:if test="${empty labelCode}"> 
    <c:set var="labelCode" value="${fn:substringAfter(id,'_')}" /> 
    </c:if> 


    <spring:message code="label_${fn:toLowerCase(labelCode)}" var="label" htmlEscape="false" /> 
    </c:if> 

    <c:if test="${empty validationMessage}"> 
     <c:choose> 
     <c:when test="${empty validationMessageCode}"> 
      <spring:message arguments="${fn:escapeXml(label)}" code="field_invalid" var="field_invalid" htmlEscape="false" /> 
     </c:when> 
     <c:otherwise> 
      <spring:message arguments="${fn:escapeXml(label)}" code="${validationMessageCode}" var="field_invalid" htmlEscape="false" /> 
     </c:otherwise> 
     </c:choose> 
    </c:if> 

    <c:if test="${empty required}"> 
     <c:set value="false" var="required" /> 
    </c:if> 

    <c:set var="sec_field"> 
     <spring:escapeBody javaScriptEscape="true" >${field}</spring:escapeBody> 
    </c:set> 

    <div id="_${fn:escapeXml(id)}_id"> 
     <label for="_${sec_field}_id"> 
     <c:out value="${fn:escapeXml(label)}" /> 
     : 
     </label> 
     <c:choose> 
     <c:when test="${disableFormBinding}"> 
      <input id="_${sec_field}_id" name="${sec_field}" type="${fn:escapeXml(type)}" /> 
     </c:when> 
     <c:otherwise> 
      <c:choose> 
      <c:when test="${type eq 'password'}"> 
       <form:password id="_${sec_field}_id" path="${sec_field}" disabled="${disabled}" /> 
      </c:when> 
      <c:otherwise> 
       <form:input id="_${sec_field}_id" path="${sec_field}" disabled="${disabled}" /> 
      </c:otherwise> 
      </c:choose> 
      <br /> 
      <form:errors cssClass="errors" id="_${sec_field}_error_id" path="${sec_field}" /> 
     </c:otherwise> 
     </c:choose> 
     <c:choose> 
     <c:when test="${required}"> 
      <spring:message code="field_required" var="field_required" htmlEscape="false" /> 
      <spring:message argumentSeparator="," arguments="${label},(${field_required})" code="field_simple_validation" var="field_validation" htmlEscape="false" /> 
     </c:when> 
     <c:otherwise> 
      <spring:message argumentSeparator="," arguments="${label}, " code="field_simple_validation" var="field_validation" htmlEscape="false" /> 
     </c:otherwise> 
     </c:choose> 
     <c:set var="sec_field_validation"> 
     <spring:escapeBody javaScriptEscape="true">${field_validation}</spring:escapeBody> 
     </c:set> 
     <c:set var="sec_field_invalid"> 
     <spring:escapeBody javaScriptEscape="true" htmlEscape="true">${field_invalid}</spring:escapeBody> 
     </c:set> 
     <c:set var="sec_field_required"> 
     <spring:escapeBody javaScriptEscape="true">${field_required}</spring:escapeBody> 
     </c:set> 
     <c:set var="sec_validation_regex" value="" /> 
     <c:if test="${!empty validationRegex}"> 
     <c:set var="sec_validation_regex" value="regExp : '${validationRegex}', " /> 
     </c:if> 
     <script type="text/javascript"> 
     Spring.addDecoration(new Spring.ElementDecoration({elementId : '_${sec_field}_id', widgetType : 'dijit.form.ValidationTextBox', widgetAttrs : {promptMessage: '${sec_field_validation}', invalidMessage: '${sec_field_invalid}', required : ${required}, ${sec_validation_regex} missingMessage : '${sec_field_required}' }})); 
     </script> 
    </div> 
    <br /> 
    </c:if> 
</jsp:root> 

create.tagx:

<jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" xmlns:form="http://www.springframework.org/tags/form" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:spring="http://www.springframework.org/tags" version="2.0"> 
    <jsp:output omit-xml-declaration="yes"/> 

    <jsp:directive.attribute name="id" type="java.lang.String" required="true" rtexprvalue="true" description="The identifier for this tag (do not change!)"/> 
    <jsp:directive.attribute name="modelAttribute" type="java.lang.String" required="true" rtexprvalue="true" description="The name of the model attribute for form binding"/> 
    <jsp:directive.attribute name="path" type="java.lang.String" required="true" rtexprvalue="true" description="Specify the relative URL path (wit leading /)" /> 
    <jsp:directive.attribute name="compositePkField" type="java.lang.String" required="false" rtexprvalue="true" description="The field name of the composite primary key (only used if a composite PK is present in the form backing object)" /> 
    <jsp:directive.attribute name="multipart" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Indicate if this is a multipart form (default: false)" /> 
    <jsp:directive.attribute name="label" type="java.lang.String" required="false" rtexprvalue="true" description="The label used for this object, will default to a message bundle if not supplied"/> 
    <jsp:directive.attribute name="render" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Indicate if the contents of this tag and all enclosed tags should be rendered (default 'true')" /> 
    <jsp:directive.attribute name="openPane" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Control if the title pane is opened or closed by default (default: true)"/> 
    <jsp:directive.attribute name="z" type="java.lang.String" required="false" description="Used for checking if element has been modified (to recalculate simply provide empty string value)"/> 
    <jsp:directive.attribute name="enctype" type="java.lang.String" required="false" description="Used to set the enctype, e.g. multipart/form-data for file upload support. "/> 
    <c:if test="${empty render or render}"> 
    <c:if test="${empty label}"> 
     <spring:message code="label_${fn:toLowerCase(fn:substringAfter(id,'_'))}" var="label" htmlEscape="false" /> 
    </c:if> 

    <!--<c:set var="enctype" value="application/x-www-form-urlencoded"/> --> 
    <form:form action="${form_url}" method="POST" modelAttribute="${modelAttribute}" enctype="${enctype}"> 
    </form:form> 
    <c:if test="${multipart}"> 
     <c:set var="enctype" value="multipart/form-data"/> 
    </c:if> 
    <spring:message arguments="${label}" code="entity_create" var="title_msg" htmlEscape="false" /> 
    <util:panel id="${id}" title="${title_msg}" openPane="${openPane}"> 
     <spring:url value="${path}" var="form_url"/> 
     <c:set var="jsCall" value=""/> 
     <c:if test="${not empty compositePkField}"> 
     <c:set var="jsCall" value="encodePk()" /> 
     </c:if> 
     <form:form action="${form_url}" method="POST" modelAttribute="${modelAttribute}" enctype="${enctype}" onsubmit="${jsCall}"> 
     <form:errors cssClass="errors" delimiter="&lt;p/&gt;"/> 
     <c:if test="${not empty compositePkField}"> 
      <form:hidden id="_${fn:escapeXml(compositePkField)}_id" path="${fn:escapeXml(compositePkField)}" /> 
      <script type="text/javascript"> 
      <![CDATA[ 
      dojo.require("dojox.encoding.base64"); 
      function encodePk() { 
       var obj = new Object(); 
       dojo.query("input[name^=\"${compositePkField}.\"]").forEach(function(node, index, nodelist){ 
       obj[node.name.substring('${compositePkField}'.length + 1)] = node.value; 
       }); 
       var json = dojo.toJson(obj); 
       var tokArr = []; 
       for (var i = 0; i < json.length; i++) { 
       tokArr.push(json.charCodeAt(i)); 
       } 
       var encoded = dojox.encoding.base64.encode(tokArr); 
       dojo.byId('_${fn:escapeXml(compositePkField)}_id').value = encoded; 
      } 
      ]]> 
      </script> 
     </c:if> 
     <jsp:doBody /> 
     <div class="submit" id="${fn:escapeXml(id)}_submit"> 
      <spring:message code="button_save" var="save_button" htmlEscape="false" /> 
      <script type="text/javascript">Spring.addDecoration(new Spring.ValidateAllDecoration({elementId:'proceed', event:'onclick'}));</script> 
      <input id="proceed" type="submit" value="${fn:escapeXml(save_button)}"/> 
     </div> 
     </form:form> 
    </util:panel> 
    </c:if> 
</jsp:root> 

我的問題是我得到的休耕錯誤:

javax.servlet.jsp.JspTagException: Illegal use of &lt;when&gt;-style tag without &lt;choose&gt; as its direct parent 
    at org.apache.taglibs.standard.tag.common.core.WhenTagSupport.doStartTag(WhenTagSupport.java:95) 
    at org.apache.jsp.tag.web.form.fields.input_tagx._jspx_meth_c_005fwhen_005f0(input_tagx.java:519) 
    at org.apache.jsp.tag.web.form.fields.input_tagx.doTag(input_tagx.java:325) 
    at org.apache.jsp.WEB_002dINF.views.pphotoes.create_jspx._jspx_meth_field_005finput_005f0(create_jspx.java:172) 
    at org.apache.jsp.WEB_002dINF.views.pphotoes.create_jspx.access$2(create_jspx.java:157) 

我到底做錯了什麼? (我的控制器和實體文件很好,我認爲,如果需要我可以發佈)

Thx任何幫助。 歡呼聲。

回答

1

由於錯誤消息明確指出,您需要在<c:when>標記之前有一個<c:choose>作爲直接父標記 - 可能位於input.tagx文件的以下前幾行中。此外,<c:if>標籤未正確關閉。

<c:if test="${empty render or render}" 
    <c:when test="${disableFormBinding}"> 

乾杯。

+1

謝謝。它是一個非常明顯的答案,但幫助我專注於調試工作。我結束了一個標記而不是 TheOneWhoPrograms