【问题标题】:How correctly use the Spring MVC <form:select> tag to show the value of a specific object field into a collection?如何正确使用 Spring MVC <form:select> 标签将特定对象字段的值显示到集合中?
【发布时间】:2015-09-16 10:26:45
【问题描述】:

我是 Spring MVC 的新手,我很难理解 标签的具体工作原理。

所以我有以下情况。

进入控制器我有这个方法:

@RequestMapping(value = "/consultazioneMinisteriale", method = RequestMethod.GET)
public String consultazione(Locale locale, Model model) {

    List<Twb1012Regione> listaRegioni = geograficaService.getListaRegioni();

    System.out.println("Numero regioni: " + listaRegioni.size());

    model.addAttribute("listaRegioni", listaRegioni);

    return "utenteMinisteriale/consultazione";
}

如您所见,此方法检索 Twb1012Regione 对象列表并将其放入模型对象中,以便在 consultazione.jsp 页面中可用。 p>

所以 Twb1012Regione 类是这样的模型对象:

@Entity
@Table(name="anagrafiche.TWB1012_REGIONE")
@NamedQuery(name="Twb1012Regione.findAll", query="SELECT t FROM Twb1012Regione t")
public class Twb1012Regione implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="COD_REG")
    private String codReg;

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

    .....................................
    .....................................
    OTHER FIELDS
    .....................................
    .....................................
}

codReg 字段明确标识对象,desReg 包含我想在 标记中显示为值的值。

最后这是我的 consultazione.jsp 视图的代码:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page session="false"%>
<%@  taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<!DOCTYPE html>
<html>
    <head>
        <title>Home</title>
    </head>

    <body class="azure">
        <h1>Hello World</h1>

        <!--  <div> ${listaRegioni} </div> -->


        <div>
            <label>Regioni:</label>
            <form:select path="listaRegioni" items="${listaRegioni}"/>
        </div>

    </body>
</html>

问题在于,这样做我获得了选择下拉列表,但它显示了 我所有 Twb1012Regione 对象的引用,而不是 desReg 字段的名称。

这是 HTML 渲染的输出:

<select>
    <option value="it.myCompany.myProject.anagrafiche.Twb1012Regione@5a259924">it.myCompany.myProject.anagrafiche.Twb1012Regione@5a259924</option>
    <option value="it.myCompany.myProject.anagrafiche.Twb1012Regione@4a87c8d3">it.myCompany.myProject.anagrafiche.Twb1012Regione@4a87c8d3</option>
    <option value="it.myCompany.myProject.anagrafiche.Twb1012Regione@815b53a">it.myCompany.myProject.anagrafiche.Twb1012Regione@815b53a</option>
    .................................................
    .................................................
    .................................................
</select>

为什么?我错过了什么?如何获取每个 Twb1012RegionedesReg 字段的值而不是对象的引用?

EDIT-1:

我试着改成:

<form:select path="regioni">
   <form:options items="${listaRegioni}" itemLabel="desReg" itemValue="codReg" />
</form:select>

但是现在当页面被渲染时,我在我的堆栈跟踪中获得了这个错误消息:

12:44:52,112 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/WIFIPNSD].[jsp]] (http-localhost/127.0.0.1:8080-4) JBWEB000236: Servlet.service() for servlet jsp threw exception: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'regioni' available as request attribute

为什么?怎么了?我该如何解决?

【问题讨论】:

    标签: java spring jsp spring-mvc spring-form


    【解决方案1】:
    • &lt;form:select&gt; 标记中,您必须在path 中输入bean 属性的名称将保留所选项目的ID
    • &lt;form:options&gt;:
      • items: 包含可选项目列表的 bean 属性
      • itemLabel:要在 Dropbox 中显示的描述
      • itemValue&lt;form:select&gt;路径下要保存的字段(通常是id)

    <form:select path="regioni">
        <form:options items="${listaRegioni}" itemLabel="desReg" itemValue="codReg" />
    </form:select>
    

    将向您显示一个包含所有区域描述 (desReg) 的 Dropbox,并将在 bean 属性 regioni 中保留所选项目的 codReg

    【讨论】:

    • 我尝试了您的解决方案,但现在我在堆栈跟踪中收到一条错误消息。我已经编辑了我的原始帖子,将错误放在原始帖子的末尾
    • 你有一个包含所有地区的列表,是吗?您将如何保留选定的区域?正如我在问题中发布的那样,您必须将属性 regioni 添加到您的 bean(缺少该代码)以保留选定的区域 codReg。 **不要忘记创建private regioni 并添加gettersetter 方法让spring 看到你的属性
    【解决方案2】:

    在您的控制器中,添加这行代码。让我知道:

    model.addAttribute("regioni",new Twb1012Regione());
    

    如果它不起作用,请告诉我。

    【讨论】:

      猜你喜欢
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多