2010-06-17 56 views
3

我正在研究Spring應用程序,該應用程序只需搜索符合某些條件的事物的一組數據。有兩種主要視圖:一種是讓用戶配置搜索條件的簡單形式,另一種是以表格的形式顯示結果。Spring屬性編輯器只能在表單上工作嗎?

其中一個搜索字段是一組封閉的選項(約10)。在代碼中放下來,我想把它作爲一個枚舉類來處理。 Web表單包含一個允許用戶從該組中選擇一個選項的下拉列表。我使用了一個表單:select來做到這一點,用一組描述值的字符串填充。

爲了讓演示文稿和業務邏輯分開,enum類沒有任何有關這些字符串的知識,所以我創建了一個屬性編輯器來在兩者之間進行轉換。當我加載表單時,select控件被設置爲與我給它的枚舉值相關的字符串;當表單被提交時,字符串被轉換回我的枚舉類型。這一切工作正常。

對於結果頁面(這不是表單),我只是將要顯示的數據添加到ModelMap中。目前,我必須在將我的枚舉類型添加到地圖之前將其顯式轉換爲字符串。我想要做的只是將enum添加到地圖中,讓屬性編輯器在後臺將其轉換爲我,就像它爲表單一樣。但我無法解決問題。是否有可能做到這一點?也許我錯過了一些非常明顯的東西?

回答

3

你可以使用Spring Tablib

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> 

並使用變換標記

<!--If you have a command which command name is account--> 
<!--Default command name used in Spring is called command--> 
<spring:bind path="account.balance">${status.value}</spring:bind> 

或者

<spring:bind path="account.balance"> 
    <spring:transform value="${account.balance}"/> 
</spring:bind> 

或者

<!--Suppose account.balance is a BigDecimal which has a PropertyEditor registered--> 
<spring:bind path="account.balance"> 
    <spring:transform value="${otherCommand.anotherBigDecimalProperty}"/> 
</spring:bind> 

關於值屬性

既可以一普通值到(在JSP或JSP表達式硬編碼的字符串值),或JSP EL表達式變換待評估(轉換表達的結果)。像所有Spring的JSP標籤一樣,該標籤能夠在任何JSP版本上自行分析EL表達式。

它的API

提供的變量串變換,利用BindTag 適當的自定義屬性編輯器(僅能在BindTag使用)

如果您使用的MultiActionController我的建議你使用虛擬命令類作爲波紋管

public class Command { 

    public BigDecimal bigDecimal; 
    public Date date; 
    /** 
     * Other kind of property which needs a PropertyEditor 
     */ 

    // getter's and setter's 

} 

您的MultiActionController

public class AccountController extends MultiActionController { 

    @Autowired 
    private Repository<Account, Integer> accountRepository; 

    public AccountController() { 
     /** 
      * You can externalize this WebBindingInitializer if you want 
      * 
      * Here it goes as a anonymous inner class 
      */ 
     setWebBindingInitializer(new WebBindingInitializer() { 
      public void initBinder(WebDataBinder dataBinder, WebRequest request) { 
       binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, numberFormat, true)); 
       binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true)); 
      } 
     }); 
    } 

    public ModelAndView(HttpServletRequest request, HttpServletResponse response) throws Exception { 
     return new ModelAndView() 
        .addAllObjects(
         createBinder(request, new Command()) 
         .getBindingResult().getModel()) 
        .addObject(accountRepository.findById(Integer.valueOf(request.getParameter("accountId")))); 
    } 

} 

你的JSP

<c:if test="{not empty account}"> 
    <!--If you need a BigDecimal PropertyEditor--> 
    <spring:bind path="command.bigDecimal"> 
     <spring:transform value="${account.balance}"/> 
    </spring:bind> 
    <!--If you need a Date PropertyEditor--> 
    <spring:bind path="command.date"> 
     <spring:transform value="${account.joinedDate}"/> 
    </spring:bind> 
</c:if> 

它是有用的內部當你的目標的命令不提供屬性編輯這就需要在另一個命令中使用。

+0

謝謝 - 這讓我走上了正軌:) – jrb 2010-06-22 13:39:27

相關問題