2016-06-02 12 views
6

I HaveLàm thế nào để ràng buộc đối tượng phân lớp trong hình thức mùa xuân nộp như modelAttribute

Class Shape { 
     //Implementation 
} 
Class Round extends Shape{ 
     //Implementation 
} 

khiển I Have

@Requestmapping(value="/view/form") 
public ModelAndView getForm(){ 
ModelAndView mav=new ModelAndView(); 
mav.addObject("shape",new Round()); 
} 


@RequestMapping(value="/submit", method = RequestMethod.POST)  
public ModelAndView submitForm(@ModelAttribute("shape") Shape shape){ 
     if(shape instanceof Round){ //**Not giving positive result** 

     } 
    } 

trong JSP

<form:form action="/submit" commandName="shape" method="post"> 

//form tags 

</form:form> 

khi tôi gửi biểu mẫu với vòng vật. Ở bên điều khiển ModelAttribute không đưa ra instance của Round. ví dụ của nó về hình dạng chỉ. Cách thực hiện điều này

+0

Loại tĩnh là Hình dạng bất kể bạn làm gì. Điều này không liên quan gì đến Spring; đây là vấn đề với nhập tĩnh/động. Bạn có thể đúc hoặc tạo một nhà máy/nhà xây dựng ảo. – duffymo

+0

tại sao bạn không thể gửi một 'Vòng tròn' từ biểu mẫu – Priyamal

+0

@Priyamal có nhiều hình dạng và hình dạng giống nhau cho mỗi hình dạng. – ssm

Trả lời

1

Bạn không thể thực hiện việc này. Bởi vì đó là hai vòng đời yêu cầu khác nhau.

@Requestmapping(value="/view/form") 
public ModelAndView getForm(){ 
ModelAndView mav=new ModelAndView(); 
mav.addObject("shape",new Round()); 
} 

Khi ở trên yêu cầu thực hiện, ngay cả khi bạn thêm Round đối tượng trong mav, nó đã được chuyển đổi thành phản ứng html và gửi trả lại cho khách hàng.

Vì vậy, khi yêu cầu đến sau khi bạn gửi biểu mẫu, đó là yêu cầu hoàn toàn riêng biệt và mùa xuân không có cách nào để xác định loại đối tượng nào đã được thêm vào cho yêu cầu trước đó.

@RequestMapping(value="/submit", method = RequestMethod.POST)  
public ModelAndView submitForm(@ModelAttribute("shape") Shape shape){ 
     if(shape instanceof Round){ //**Not giving positive result** 

     } 
    } 

Nhưng bạn có thể thử khám phá @SessionAttributes, sử dụng này, bạn có thể có thể để duy trì cùng một đối tượng trên yêu cầu khác nhau

3

này sẽ không bao giờ làm việc

<form:form action="/submit" commandName="shape" method="post"> 

bạn đang gửi một shape từ hình thành và mong đợi một shape trong phương pháp điều khiển

public ModelAndView submitForm(@ModelAttribute("shape") Shape shape) 

sẽ không bao giờ cung cấp cho bạn đối tượng Round.

chỉ cần gửi đối tượng Vòng từ biểu mẫu và sử dụng.

<form:form action="/submit" commandName="round" method="post"> 
public ModelAndView submitForm(@ModelAttribute("round") Round round) 

chỉnh sửa: -

có một loại hiddenInput theo hình thức đó sẽ cho controller loại Shape nó được đi qua, bạn có thể thay đổi giá trị của thẻ ẩn động theo yêu cầu người dùng.

<input type="hidden" name="type" value="round"> 

nhận được giá trị của các loại bên trong contoller và sử dụng nó để cast đối tượng Shape

 public ModelAndView submitForm(
    @ModelAttribute("shape") Shape shape, 
    @RequestParam("type") String type) 
    { 
    if(type.equals("round")){ 
     //if type is a round you can cast the shape to a round 
     Round round = (Round)shape; 
     } 
    } 
0

thể của nó để xác định các lớp mà bạn cần phải liên kết với. Bạn phải thêm một tham số bổ sung (đầu vào bị ẩn) trong biểu mẫu của bạn để chỉ định loại cần được ràng buộc. Trường này phải có cùng tên với thuộc tính mô hình trong trường hợp này.Sau đó bạn cần phải thực hiện một chuyển đổi có thể chuyển đổi chuỗi này giá trị tham số để các ví dụ thực tế mà bạn cần phải liên kết với

Sau đây là những thay đổi mà bạn cần phải thực hiện

1) Trong jsp của bạn thêm đầu vào ẩn bên trong của bạn

<form:form action="/submit" commandName="shape" method="post"> 
    <input type="hidden" name="shape" value="round"/> 
//other form tags 
</form:form> 

2) Thực hiện một chuyển đổi để chuyển đổi từ string để một Shape

public class StringToShapeConverter implements Converter<String,Shape>{ 

    public Shape convert(String source){ 
     if("round".equalsIgnoreCase(source)){ 
      return new Round(); 
     } 
     //other shapes 
    } 
} 

3) Sau đó đăng ký chuyển đổi của bạn để Spring MVC biết về nó. Nếu bạn đang sử dụng Java cấu hình bạn cần phải mở rộng WebMvcConfigurerAdapter và ghi đè lên addFormatters phương pháp

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter{ 

    @Override 
    public void addFormatters(FormatterRegistry registry){ 
     registry.addConverter(new StringToShapeConverter()); 
    } 
} 

Nếu bạn đang sử dụng cấu hình xml bạn có thể sử dụng MVC: yếu tố chú thích hướng để xác định việc chuyển đổi dịch vụ để sử dụng. Sau đó, đăng ký công cụ chuyển đổi của bạn bằng cách sử dụng FormattingConversionSErviceFactoryBean

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

    <mvc:annotation-driven conversion-service="conversionService"/> 

    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
     <property name="converters"> 
      <set> 
       <bean class="some.package.StringToShapeConverter"/> 
      </set> 
     </property> 
    </bean> 
</beans> 
Các vấn đề liên quan