5 回答
这是一个相当老的问题,但我有一个答案,因为我已经实现了static-mustache 库来提供基于 mustache 语法的类型安全模板引擎。
它在编译时检查语法错误和类型错误(如缺少属性)。它需要零构建配置,因为它是标准注释处理器。
模板仍然是纯胡子模板,所有类型信息都是从用于呈现的普通 Java 类中提取的。
首先,JSP 在 Java Enterprise Edition 中的版本为 2.1;换句话说,它比大多数语言更现代。
现在,如果想获得高科技,那么在编译时使用 java.lang.instrument 检查所有 bean 的类型怎么样?扫描您的映射和(您选择的任何语言)模板并逐一检查字段名称 = 某某类型。 http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html
这是个有趣的问题。我假设从数据库存储和检索的数据需要静态类型检查,因为任何不是的数据都将在运行时而不是编译时生成。SQL(和大多数其他关系数据库)提供语言编写者所说的静态类型检查,对存储的数据进行精细控制,因此似乎需要一个 Web 框架来确保存储的数据类型之间的严格映射以及如何检索它进入框架。
我有一些使用 Hibernate 和 Spring Framework 的经验,Spring Web MVC 用于呈现模板并将数据存储在 MySQL 数据库中。
hibernate 的实体定义可能类似于以下内容:(有很多变体)
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name = "layoutItem", schema = "ivb")
public abstract class LayoutItem implements Serializable, DisplayItemInf {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="LayoutSize")
private LayoutSize size;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="LayoutPosition")
private LayoutPosition position;
@Column(name = "display")
private int display;
@Column(name = "styleItem")
private String styleItem;
private String CSSclass = "";
public void addClass(String CSSclass) {
this.CSSclass = CSSclass+" ";
}
...other getter and setter definitions...
}
所有字段都被赋予静态数据类型,然后休眠将这些映射到 MySql 表中字段的相应类型。使用 Spring 的优点是它们提供了一个名为The Spring Tool Suite的 Eclipse 版本,每次保存文件时,都会重新编译相关类并重新部署到本地运行的服务器上。如果在到数据库的实体映射中出现任何问题,这将引发类型错误。Hibernate 提供了许多控制类型的注解,并且与 SQL 提供的注解一样细化。
在框架内创建了几个不同的层,数据访问层位于底部,业务逻辑和网站表示位于较高层。这种创建框架的更分层的方法意味着在执行业务逻辑之前将数据严格键入到堆的底部,然后传递到类型更松散的 MVC 部分以呈现到模板(例如 JSP)并显示为一个网页。
我想这种方法是否适合您的情况需要仔细评估。恕我直言,与 Django(也有实体,尽管没有严格映射)或 Ruby On Rails(这里没有经验 :) 相比,Spring 是一个相当重的解决方案。可能还有其他方法可以将 Hibernate 用于静态类型和 JSP 用于模板,尽管使用 STS 的好处肯定是 Spring 的一个加分项。Lift使用严格类型化的 Scala 语言,也运行在 JVM 上,它不像 Spring 那样重,所以部署起来可能会更快。
如果你想在 JVM 之外冒险,你可以使用带有 Razor 视图的 Asp.Net MVC,你可以要求的所有编译时间检查,以及强类型视图。作为奖励,您将获得出色的智能感知和重构能力。