【问题标题】:How to create dynamic path attribute value in Spring JSP JSTL如何在 Spring JSP JSTL 中创建动态路径属性值
【发布时间】:2013-12-24 01:43:21
【问题描述】:

为了更好地理解我的问题,请查看下面的 JSP 代码。

<c:forEach var="technologyLocation" items="${model.technologyLocationList}" varStatus="loop">
    <form:input path="technologyLocationList[${loop.index}].location"/>         
</c:forEach>

在我的 spring pojo 代码中,Technology 和 TechnologyLocation 之间的关系是 OneToMany。 上面的代码将呈现输入元素的数量等于数据库中可用的位置数据的数量,并且输入元素的路径属性值正确。

我的问题是:

如果数据库中没有可用的 TecnologyLocation 记录,我不知道如何呈现表单输入元素。因为在这种情况下,需要使用正确的路径属性值渲染空输入元素。这样用户就可以输入新的位置以在数据库中持久化。

如果数据库中存在记录,则除了可用的位置输入元素外,还显示一个空输入元素,以便用户可以更新现有的并保存新的。

请建议我如何使用有效的路径属性值来实现这一点!

我正在使用 spring 和 hibernate 来使用注释来持久化数据。

提前致谢!

请看下面的相关部分代码!

Technology.java

public class Technology{
.
.
  private List<TechnologyLocation> technologyLocationList = new ArrayList<TechnologyLocation>(0);
.
.
@OneToMany(fetch = FetchType.LAZY, mappedBy = "technology")
public List<TechnologyLocation> getTechnologyLocationList() {
    return technologyLocationList;
}

public void setTechnologyLocationList(List<TechnologyLocation> technologyLocationList) {
    this.technologyLocationList = technologyLocationList;
}
}

TechnologyLocation.java

public class TechnologyLocation{
.
@NotNull
private Technology technology;

public TechnologyLocation(Technology technology) {
    this.technology = technology;
}

@ManyToOne
@JoinColumn(name="technology_id")
public Technology getTechnology()
{
    return technology;
}

public void setTechnology( Technology technology )
{
    this.technology = technology;
}

@Column(name="technology_location")
public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}
}

TechnologyController.java

public class TechnologyController{
// Problem in getting better way to get new technology location from JSP. I don't want like request.getPrameter(paramname). I want to use power of hibernate with spring, something like form  input element with path attribute for accepting new entry for location from jsp
}

Technology.jsp

<div>
     <span>Location</span>
     <c:forEach var="technologyLocation" items="${model.technologyLocationList}" varStatus="loop">
          <form:input path="technologyLocationList[${loop.index}].location"/>
   </c:forEach>
   <!--Confusion: If list size is zero, I need to show empty form input element for entering new location-->
   <form:input path="some thing should be like technologyLocationList?.location so that we can use power of hibernate"/>
</div>

【问题讨论】:

    标签: hibernate jsp spring-mvc annotations jstl


    【解决方案1】:

    我不确定我是否明白你的意思,但我会试一试。

    一种方法是在控制器中为您选择的 TechnologyLocation 预先添加一个 null 元素的 technologyLocationList。 之后,${model.technologyLocationList} 将永远不会为空,另外您可以使用&lt;c:if&gt; 为 JSP 中的 null-Element 提供适当的处理,例如用于添加自定义位置的另一个输入字段。

    如果您发布您的控制器和 pojo 代码,我可以改进我的答案。

    编辑:改进 1(由于您的控制器丢失,我不得不猜测您的代码的某些部分)

    尝试在您的 Controller 方法中添加以下内容以发布模型:

    Technology technology = // your method to load it from Database
    TechnologyLocation nullLocation = new TechnologyLocation(technology);
    List<TechnologyLocation> technologyLocations = technology.getTechnologyLocationList();
    if (technologyLocationList.isEmpty()) {
        technologyLocationList.add(nullLocation);
    }
    model.addAttribute("technology", technology);
    

    在您的 JSP 中:

    <form:form commandName="technology">
        <c:foreach items="${technology.technologyLocationList}" var="technologyLocation">
            <form:input path="technologyLocation.location"/>
        </c:foreach> 
    </form:form>
    

    这样,如果您的 TechnologyLocations 数据库为空,则网页上的 Technology 对象包含一个新的非持久位置,可以在其位置字符串的情况下对其进行编辑,并且应该在您提交表单时持久保存.

    【讨论】:

    • 嗨 Jeyp,感谢您提供帮助!正如您所问的,我将在我的帖子中发布我的源代码!
    • 我对我的答案进行了改进。
    • 这可能比我为解决问题所做的更好!您能告诉我在 JSP 中我需要做哪些更改吗?
    【解决方案2】:

    我找到了解决自己问题的方法。我在 pojo 中添加了一个字符串类型的新属性 newTechnologyLocation,使其瞬态以避免与 db 相关的异常,例如列不存在等。我使用属性 newTechnologyLocation 作为新条目的路径属性值,如下所示。

    <form:input path="newTechnologyLocation"/> 
    

    并在控制器中获取值并将其作为新记录保存在数据库中,如下所示:

    technologyInstance.getNewTechnologyLocation()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多