【问题标题】:Spring jsp submit form with onetomany relationSpring jsp提交具有单对多关系的表单
【发布时间】:2014-10-15 06:30:25
【问题描述】:

我有两个实体:StoryTypeStories。 StoryType 可能有很多故事。

@Entity
@Table(name = "stories")
public class Story {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "description")
    private String description;

    @Column(name = "crdate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date crDate;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "story_type_id")
    private StoryType storyType;
}

@Entity
@Table(name="story_types")
public class StoryType {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @OneToMany(fetch = FetchType.EAGER, mappedBy="storyType", cascade = CascadeType.ALL)
    private List<Story> stories;
}

我在 jsp 页面上有添加故事的表单,我应该选择故事的类型。但是当我看到提交了哪些值时,只有名称和描述,storyType - null。我怎样才能从 select 中发送对象,甚至只输入 id?

<form role="form" action="/admin/add-story" method="post" commandName="story">
    <div class="form-group">
        <label for="name">Name</label>
        <input type="text" name="name" class="form-control" id="name" autofocus="true" placeholder="Enter name" value="${story.name}">
    </div>
    <div class="form-group">
        <label for="name">Type</label>
        <select class="form-control">
            <c:forEach items="${types}" var="type">
                <option name="storyType" value="${type}">${type.name}</option>
            </c:forEach>
        </select>
    </div>
    <div class="form-group">
        <label for="description">Desscription</label>
        <input type="text" name="description" class="form-control" id="description" autofocus="true" value="${story.description}">
    </div>
    <input type="submit" class="btn btn-primary" value="Save"/>
</form>

【问题讨论】:

    标签: jsp spring-mvc


    【解决方案1】:

    在客户端中,您只能存储id 中的StoryType

    <select class="form-control">
            <c:forEach items="${types}" var="type">
                <option name="storyType" value="${type.id}">${type.name}</option>
            </c:forEach>
        </select>
    

    当发布数据到服务器时,客户端会将type.id 发布到服务器。我们创建一个 Spring Converter 来从数据库中获取一个 StoryType 对象。

    public class StoryTypeConverter implements Converter<String, StoryType >{
    
    @Autowired
    private StoryTypeService storyTypeService;
    
    public StoryType convert(String id) {
        return storyTypeService.findById(Long.valueOf(id));
       }
    }
    

    注册转换服务

    <mvc:annotation-driven conversion-service="conversionService" />
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.somepackage.StoryTypeConverter"/>
            </set>
        </property>
    </bean>
    

    之后,控制器中的对象将包含 StoryType。 我是否有另一种方法来解决这个问题。 认为它会有所帮助

    【讨论】:

    • 不幸的是,当我在调试模式下运行我的应用程序时,我发现没有调用转换器
    • 我不确定,我的项目使用弹簧转换器,一切正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2013-10-17
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多