2016-06-02 1 views
6

I HaveКак привязать объект подкласса в весенней форме представить, как modelAttribute

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

контроллера 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** 

     } 
    } 

в Jsp

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

//form tags 

</form:form> 

, когда я отправить форму с раундом объект. На стороне контроллера ModelAttribute не дает экземпляр Round. его дающий экземпляр только формы. Как это сделать

+0

Статический тип - это форма, независимо от того, что вы делаете. Это не имеет ничего общего с Весной; это проблема со статической/динамической типизацией. Вы можете создать или создать фабричный/виртуальный конструктор. – duffymo

+0

Почему вы не можете отправить «Круглый» из формы – Priyamal

+0

@Priyamal больше формы и той же формы для каждой фигуры. – ssm

ответ

1

Вы не можете этого сделать. Потому что это два разных жизненных цикла запроса.

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

Когда выше запрос выполняется, даже если вы добавили Round объект в mav, он был преобразован в HTML ответ и отправляется обратно клиенту.

Итак, когда нижеприведенный запрос приходит после отправки формы, это совершенно отдельный запрос, и весна не имеет способа определить, какой тип объекта был добавлен для предыдущего запроса.

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

     } 
    } 

Но вы можете попробовать исследовать @SessionAttributes, используя это, вы можете быть в состоянии поддерживать тот же объект в различных запросов

3

это никогда не будет работать

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

вы подаете shape из формы и ожидания shape в методе контроллера

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

, который никогда не даст вам объект Round.

просто отправьте круглый объект из формы и используйте это.

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

отредактировано: -

имеет hiddenInput типа в форме, которая будет сказать controller тип Shape он проходит, вы можете изменить значение скрытого тега динамически по запросу пользователя.

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

получить значение типа внутри contoller и использовать его для cast на 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

Его можно указать подкласс, что вам нужно, чтобы связываться с. Вы должны добавить дополнительный параметр (скрытый ввод) в свою форму, в котором указывается тип, к которому необходимо привязать. Это поле должно иметь то же имя, что и атрибут модели в этом случае.Затем необходимо реализовать преобразователь, который преобразует значение этого параметра строкового фактического экземпляра, который нужно связать с

Ниже перечислены изменения, которые необходимо реализовать

1) В вашей JSP добавить скрытый ввод внутри вашего

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

2) Реализовать конвертер для преобразования из строки в Shape

public class StringToShapeConverter implements Converter<String,Shape>{ 

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

3) Затем зарегистрировать ваш конвертер так, чтобы Весна MVC знает об этом. Если вы используете Java конфигурации вам необходимо расширяет WebMvcConfigurerAdapter и переопределить метод addFormatters

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter{ 

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

Если вы используете конфигурации XML вы можете использовать MVC: аннотацию управляемый элемент, чтобы указать преобразование-сервис для использования. Затем зарегистрируйте конвертер с помощью 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> 
Смежные вопросы