开发者

Struts2-like themes in Spring 3 MVC

I'm currently working with Spring 3 MVC, and in my JSP templates I'm noticing I have to repeat myself several times for things like labels, errors, layout divs etc. e.g.

<div class="field-row">
  <label>Email:</label>
  <form:input path="email" />
  <form:errors path="email" cssClass="error" />
</div>

In Struts 2, there are themed components that, based on a theme parameter, will generate HTML code based upon the tag used. Is there an equivalent of this in Spring 3, or some alternative plugin that can be used to achieve a similar effect?

For example, in Struts 2, you could have something like

<s:textfield key="user.email" required="true" maxlength="200" theme="someTheme" />    

and paired with the appropriate Freemarker Template e.g.

    <div class="${rowClass}">
      <#include "/${parameters.templateDir}/tgis/control-label.ftl" />  
      <#-- render the control -->
      <input type="text" name="${parameters.name?default("")?html}"
        <#if parameters.maxlength?exists>maxlength="${parameters.maxlength?html}"</#if>
         .
         .
        <#include 开发者_如何学Go"/${parameters.templateDir}/simple/common-attributes.ftl" />
      />
      <#include "/${parameters.templateDir}/tgis/control-errors.ftl" />
    </div>

HTML is automatically generated with all the labels, errors etc

    <div class="row"> 
      <label for="user.email">E-mail <span id="user.email_rlabel" class="required">*</span>
      </label>
      <input type="text" name="user.email" maxlength="200" value="xxx@yyy.com" id="editProfile_user_email" class="inputText" /> 
    </div>


Tag files will work well. The only issue I have found with using tag files is that they generate a ton of whitespace when they are rendered. So if you have a large form then it will generate a ton of extra whitespace within the html document.


There is a general solution in JSP(x). You need a jsp tagx file that describes your template, and then you could use it in your jspx.

If you want a complete example, than have a look at spring roo (1.1.1), it uses this technique heavily.

An example (I have simplified a roo example a bit, but I hope it still does the right thing: even if not, it illustrates what I mean):

tags/form/fields/textara.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" />
  <jsp:directive.attribute name="field" type="java.lang.String" required="true" />

  <spring:message code="label_${fn:toLowerCase(fn:substringAfter(id,'_'))}" var="label" />

  <div id="_${id}_id">
     <label for="_${id}_id">
       <c:out value="${label}" />        
     </label>
     <form:textarea id="_${id}" path="${field}"  />
     <form:errors cssClass="errors" id="_${id}_error_id" path="${field}" />
   </div>
   <br />

</jsp:root>

usage in create.jspx:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:c="http://java.sun.com/jsp/jstl/core"
     xmlns:field="urn:jsptagdir:/WEB-INF/tags/form/fields"
     xmlns:form="urn:jsptagdir:/WEB-INF/tags/form"
     xmlns:jsp="http://java.sun.com/JSP/Page"
     xmlns:spring="http://www.springframework.org/tags" version="2.0">
...
    <field:textarea field="street" id="c_com_test_roo_domain_Address_street"/>
...
</div>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜