2016-05-04 47 views
0

這是我的視圖代碼。用於從控制器傳遞的值填充下拉組件。下拉的選定值不傳遞給控制器​​使用thymeleaf + spring mvc

<form class="form-horizontal" th:action="@{/product2}" method="post"> 
    <select th:field="*{product3}" th:remove="all-but-first"> 
      <option th:each="productItem : ${productItems}" 
        th:value="${productItem.productId}" th:text="${productItem.description}">Product 1</option> 
      <option value="">Product 2</option> 
      <option value="">Product 3</option> 
    </select> 

    <button type="submit" value="Submit" title="Submit"></button> 
</form> 

這是我的控制器,其負責填充爲下拉值和當在下拉提交表格打印選擇的值。

@Controller 
public class IndexController { 
@RequestMapping("/") 
public ModelAndView index() { 
    ModelAndView model = new ModelAndView("index");    
    Product wildFire = new Product(); 
    wildFire.setProductId("WF-458");   
    wildFire.setDescription("WildFire"); 
    Product weapon = new Product(); 
    weapon.setProductId("WE-81"); 
    weapon.setDescription("Weapon"); 
    List<Product> productItems = new ArrayList<Product>(); 
    productItems.add(weapon); 
    productItems.add(wildFire); 
    model.addObject("productItems", productItems); 
    model.addObject("product3", new Product()); 
    return model; 
} 

@RequestMapping(value="/product2", method=RequestMethod.POST) 
public String showProduct(@ModelAttribute(value="product3") Product product, ModelMap map) {   
    System.out.println(product.getDescription()); 
    return "products"; 
} 
} 

這是產品的數據類。僅供參考

public class Product { 

private String productId; 
private String description; 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public String getProductId() { 
    return productId; 
} 

public void setProductId(String productId) { 
    this.productId = productId; 
} 

@Override 
public String toString() { 
    return "Product [id=" + id + ", version=" + version + ", productId=" + productId + ", description=" 
      + description + ", imageUrl=" + imageUrl + ", price=" + price + "]"; 
} 

}

問題:一旦提交此形式,而不是在控制器側獲得選定的值(產品下拉),來自各種源想出該組件通過使用語法與對象結合個:字段= 「* {對象}」。請幫我解決這個問題。

回答

1

在您的表單中,您需要設置th:object,否則您無法通過這種方式訪問​​發佈的值。你也必須創建表單的後臺bean。事情是這樣的:

private class ProductForm implements Serializable { 
    ... 
    private Product product3; 
    ...  
} 

你的形式將有ProductFormth:object。需要注意的是Spring不明白你傳遞給product3什麼樣的對象,所以你也必須provide a converter for it

<form th:object="${productForm}" class="form-horizontal" th:action="@{/product2}" method="post"> 
<select th:field="*{product3}" th:remove="all-but-first"> 
     <option th:each="productItem : ${productItems}" 
       th:value="${productItem.productId}" th:text="${productItem.description}">Product 1</option> 
     <option value="">Product 2</option> 
     <option value="">Product 3</option> 
</select> 

控制器代碼:

@Controller 
public class IndexController { 
@RequestMapping("/") 
public ModelAndView index() { 
ModelAndView model = new ModelAndView("index");    
Product wildFire = new Product(); 
wildFire.setProductId("WF-458");   
wildFire.setDescription("WildFire"); 
Product weapon = new Product(); 
weapon.setProductId("WE-81"); 
weapon.setDescription("Weapon"); 
List<Product> productItems = new ArrayList<Product>(); 
productItems.add(weapon); 
productItems.add(wildFire); 
model.addObject("productItems", productItems); 
model.addObject("product3", new ProductForm()); 
return model; 
} 

@RequestMapping(value="/product2", method=RequestMethod.POST) 
public String showProduct(@Valid @ModelAttribute(value="productForm") ProductForm productForm, BindingResult bindingResult, ModelMap map) {   
return "products"; 
} 
} 
+0

由於一噸:-),它實際上幫助我和工作,豎起大拇指,僅供參考 - 對於從字符串到MyType(本例中爲產品)的轉換,我使用了由Ayman Al-Absi在http://stackoverflow.com/questions/25234357/select-tag中建議的解決方案-with-對象thymele AF-和彈簧MVC。 – iknownothing

相關問題