如何绑定 spring 表单中的子类对象作为 modelAttribute 提交
How to bind subclass object in spring form submit as modelAttribute
我有
Class Shape {
//Implementation
}
Class Round extends Shape{
//Implementation
}
控制器
我有
@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 的实例。它仅给出形状实例。如何做到这一点
你不能这样做。因为那是两个不同的请求生命周期。
@Requestmapping(value="/view/form")
public ModelAndView getForm(){
ModelAndView mav=new ModelAndView();
mav.addObject("shape",new Round());
}
当上面的请求执行时,即使你在mav
中添加了Round
对象,它也被转换为html响应并发送回客户端。
因此,当您提交表单时下一个请求出现时,这是一个完全独立的请求,spring 无法确定为先前请求添加了哪种对象类型。
@RequestMapping(value="/submit", method = RequestMethod.POST)
public ModelAndView submitForm(@ModelAttribute("shape") Shape shape){
if(shape instanceof Round){ //**Not giving positive result**
}
}
但您可以尝试探索 @SessionAttributes,使用它您可能能够跨不同的请求维护相同的对象
这永远行不通
<form:form action="/submit" commandName="shape" method="post">
您正在从表单中提交 shape
,并期待 shape
在控制器方法中
public ModelAndView submitForm(@ModelAttribute("shape") Shape shape)
它永远不会给你一个 Round
对象。
只需从表单提交一个 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;
}
}
可以指定需要绑定的子类。您必须在表单中添加一个附加参数(隐藏输入),以指定需要绑定的类型。此字段必须与本案例形状中的模型属性同名。然后,您需要实现一个转换器,将此字符串参数值转换为您需要绑定到的实际实例
以下是您需要实施的更改
1) 在你的 jsp 中添加你的
中的隐藏输入
<form:form action="/submit" commandName="shape" method="post">
<input type="hidden" name="shape" value="round"/>
//other form tags
</form:form>
2)实现一个转换器以将字符串转换为形状
public class StringToShapeConverter implements Converter<String,Shape>{
public Shape convert(String source){
if("round".equalsIgnoreCase(source)){
return new Round();
}
//other shapes
}
}
3) 然后注册您的转换器,以便 Spring MVC 知道它。如果您使用 Java 配置,则需要扩展 WebMvcConfigurerAdapter 并覆盖 addFormatters 方法
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter{
@Override
public void addFormatters(FormatterRegistry registry){
registry.addConverter(new StringToShapeConverter());
}
}
如果您使用 xml 配置,您可以使用 mvc:annotation-driven 元素指定要使用的转换服务。然后使用 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>
我有
Class Shape {
//Implementation
}
Class Round extends Shape{
//Implementation
}
控制器 我有
@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 的实例。它仅给出形状实例。如何做到这一点
你不能这样做。因为那是两个不同的请求生命周期。
@Requestmapping(value="/view/form")
public ModelAndView getForm(){
ModelAndView mav=new ModelAndView();
mav.addObject("shape",new Round());
}
当上面的请求执行时,即使你在mav
中添加了Round
对象,它也被转换为html响应并发送回客户端。
因此,当您提交表单时下一个请求出现时,这是一个完全独立的请求,spring 无法确定为先前请求添加了哪种对象类型。
@RequestMapping(value="/submit", method = RequestMethod.POST)
public ModelAndView submitForm(@ModelAttribute("shape") Shape shape){
if(shape instanceof Round){ //**Not giving positive result**
}
}
但您可以尝试探索 @SessionAttributes,使用它您可能能够跨不同的请求维护相同的对象
这永远行不通
<form:form action="/submit" commandName="shape" method="post">
您正在从表单中提交 shape
,并期待 shape
在控制器方法中
public ModelAndView submitForm(@ModelAttribute("shape") Shape shape)
它永远不会给你一个 Round
对象。
只需从表单提交一个 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;
}
}
可以指定需要绑定的子类。您必须在表单中添加一个附加参数(隐藏输入),以指定需要绑定的类型。此字段必须与本案例形状中的模型属性同名。然后,您需要实现一个转换器,将此字符串参数值转换为您需要绑定到的实际实例
以下是您需要实施的更改
1) 在你的 jsp 中添加你的
中的隐藏输入<form:form action="/submit" commandName="shape" method="post">
<input type="hidden" name="shape" value="round"/>
//other form tags
</form:form>
2)实现一个转换器以将字符串转换为形状
public class StringToShapeConverter implements Converter<String,Shape>{
public Shape convert(String source){
if("round".equalsIgnoreCase(source)){
return new Round();
}
//other shapes
}
}
3) 然后注册您的转换器,以便 Spring MVC 知道它。如果您使用 Java 配置,则需要扩展 WebMvcConfigurerAdapter 并覆盖 addFormatters 方法
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter{
@Override
public void addFormatters(FormatterRegistry registry){
registry.addConverter(new StringToShapeConverter());
}
}
如果您使用 xml 配置,您可以使用 mvc:annotation-driven 元素指定要使用的转换服务。然后使用 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>