2012-04-24 142 views
1

是否可以在Spring中定义视图命令的类型?正如现在这样,我们改变我们的指挥课程是很危险的。视图(path="myDto.persons[0].name")可以使用这些类的属性,但如果命令类中的任何内容发生更改,视图将仅在运行时失败。弹簧视图安全

我们MVC堆栈的所有其他部分都经过测试,所以我们可以在需要时安全地进行重构。唯一的问题在于视图,因为路径“只是字符串”,并且我们无法以任何合理的方式搜索和替换我们使用特定命令的任何地方。

如果有某种方法可以告诉Spring命令的实际类型是什么类型,那么可以在我们对.jsp进行预编译时进行验证。编辑视图时也会完成一项额外的好处,但我想这更像是一个IDE问题。

那么,你们有没有人知道如何以及如果这是可能的?

回答

1

如果您完全重新设计JSP文件(如果我自己可以这么说的话,这是一种非常丑陋的方式),您可能会为视图添加类型安全性。

Servlets为您提供了类型安全性,因为这是Java代码。如果你重构你的类并错过了一些东西,编译器会立即告诉你你错过了它。但是,JSP取代了servlet作为视图技术,提供了更加动态/快速的开发速度(没有更多的指令打开标签,关闭它们,转义引号等等)。

正如你注意到的那样,EL表达式基本上是字符串,后来得到评估并在运行时失败,如果某些东西关闭的话。即使你是precompile the JSPs,它仍然会失败,因为EL在生成的servlet中仍然是字符串。它们要么传递给标签,要么传递给它们,或者如果使用JSP 2.x版本,那么servlet容器本身将表达式包装在评估调用中,然后将其作为值传递。

基本上是一个版本低于JSP 2,对于像标签:

<my:tag value="${bean.someProp}" /> 

你得到这样的结果:

myTagInstance.setValue("${bean.someProp}"); 
在servlet

标签本身会在运行时对字符串进行评估。

对于JSP 2你没有得到任何好转,评估仍然在运行时发生,但servlet容器借此负担远离标签,生成类似代码:

myTagInstance.setValue((SomePropTypeCastHere) ProprietaryServletContainerEvaluationUtil.evaluate("${bean.someProp}")); 

如果的内容当评估发生时,对象本身并不是预期的,你会得到奇怪的结果或错误。

在JSP中强制执行静态类型的唯一方法是将Java代码返回到JSP中(EL发明的东西可以消除)。这就是为什么我在乞讨时说过,你必须以一种丑陋的方式改变你的JSP。

If all your tags can use <rtexprvalue>true</rtexprvalue> values, you can use scriptlets to enforce type safety

的标签,如:

<my:tag value="<%=bean.getSomeProp()%>" /> 

现在被转换成这样:

myTagInstance.setValue(bean.getSomeProp()); 

如果someProp财产被重命名,删除,更改类型或什么的,编译器可以告诉你这件事。 IDE本身应该可以告诉你,你甚至不需要precompile the JSPs

如果我没有记错的话,春天标签的支持运行时表达式所以这应该工作......如果你愿意弄乱你的JSP是!

至于完成的IDE支持,你有对小脚本而不是EL。这是因为对于EL来说,这是相同的讨论,它发生在运行时。要如何知道IDE什么是在上下文(页面,请求,会话等)在执行JSP和知道,当你正在开发的JSP?