【问题标题】:Manipulate Spring MVC model fields for JSP output为 JSP 输出操作 Spring MVC 模型字段
【发布时间】:2012-02-15 21:10:47
【问题描述】:

我有一个这样定义的模型...

public class Product{
  private long timestamp;
  // get/set follows...
}

时间戳字段适用于数据库,因为我通过 JPA 保存数据。但是,在 JSP 输出中,我不想将时间戳显示得太长,我想将其显示为自定义字符串。我想在自定义方法中定义 long/String 转换。

我可以将时间戳字段转换为 DateTime 或其他内容,但这是一个普遍的问题 - 如何在不修改模型本身的情况下处理模型数据,因为它只是为了视图?我查看了Spring Conversion 和 Formatter SPI,但这似乎不适合这里(Formatter 主要用于用户输入,Conversion 适用于整个模型,我只想操作模型的一个字段)。

我已经想过为视图创建一个新对象,从数据库模型中传递所有数据并在那里进行操作,但必须有更好的解决方案......

编辑

一些附加代码...这是我的控制器:

@RequestMapping(method=RequestMethod.GET, value="/")
public ModelAndView getAllProducts() {
    List<Product> products = daoReader.findAllProducts();

    ModelAndView mv = new ModelAndView("myproductview");
    mv.addObject("products", products);

    return mv;

这是 JSP(简化版):

<c:forEach items="${products}" var="currentproduct">
        <tr>
            <td>${currentproduct.timestamp}</td>
            <td>${currentproduct.name}</td>
        </tr>
</c:forEach>

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    Spring 视图通常使用 getter 和 setter 来访问模型的数据。最好的解决方案是提供一个 getter 来格式化日期或将 long 对象转换为 Date 对象或其他一些必需的格式。然后,您可以从视图中访问此 getter 方法。

    编辑

    public class Product{
      private long timestamp;
    
      public Date getDate() {
            return new Date(timestamp);
      }
    }
    

    和从视图

    <c:forEach items="${products}" var="currentproduct">
            <tr>
                <td>${currentproduct.date}</td>
                <td>${currentproduct.name}</td>
            </tr>
    </c:forEach>
    

    【讨论】:

    • 上面的答案是你的意思吗?或者你知道不使用自定义 JSP 标签的任何解决方案吗?
    • 我给出的这个解决方案没有使用自定义 JSP 标签,它可以工作。
    • 你能给我指出一些工作示例/教程吗?非常感谢!
    • 嗯,这确实简单得多,而且工作正常 - 谢谢!但是,这意味着向模型添加功能,这是我想避免的,因为我无法估计这是否可能是一个问题/效率低下。因此,Ralph 的第一个答案也很好,因为它使模型保持不变。谢谢!
    • @Jan Petzold:这是我的第一个答案。
    【解决方案2】:

    添加一个返回格式化字符串的“特殊”getter 怎么样?

    或者一个 JSP 标记,其格式如下: jsp:

     <td><my:formatLongTimestamIntoSomethingUsefull
            value="${currentproduct.timestamp}"/></td>
    

    【讨论】:

    • 感谢您的回复,请参阅我上面的编辑。问题是我将模型放在一个列表 中,我想在表格中显示它。所以在表格中,大约有 20 个属性(=fields)要显示在不同的单元格中,而只有一个属性需要格式化。如果我为“timestamp”属性实现自己的getter,我将失去在循环中运行它的可能性,对吧?
    • 不,添加这个 getter:String getFormatedTimeStanp() {return new Date(this.timestamp);...} 然后使用 ${currentproduct.fromatedtimestamp}`
    • 谢谢。在viralpatel 和this question 的额外帮助下,这很奏效。对我来说仍然感觉有点复杂,但也许那只是因为我来自 PHP 世界:)
    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2018-02-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多