我正在将我的。 jsp 从scriplets重写为JSTL / EL,我正面临一个问题。这可能很简单,但我是EL的新手,有点迷失。
这就是我正在做的......
在servlet / controller中:
final List<Person> l = new ArrayList<Person>();
personList.add(...);
.
.
request.setAttribute( "personList", l );
在我的。 jsp :
中<c:forEach var="person" items="${personList}">
${person.name}
</c:forEach>
但我正在复制“personList”,因为我在 setAttribute 和 forEach 中都使用它。我怎样才能摆脱这种重复?
理想情况下,我希望有一个常量,比如 public static final String ,我可以从servlet和 .jsp (使用EL,不是scriptlet)。
显然我想消除这种重复的原因是,如果我决定将 personList 重命名为人(带有's'),我目前需要改变两件事,这很容易出错。如果我有一个常数,那么我只需要有一个地方可以做出改变。
编辑有人评论说,使用常量,如果我更改了常量的名称,仍然需要更改两个地方。但是如果我能做到这一点有很大的不同:
request.setAttribute(Constants.PERSON_LIST,l);
然后决定重命名* PERSON_LIST *并输入错字,这会在编译时中断。
如果我错误输入:
request.setAttribute( "persnList", l ); // forgetting an 'o' here
如果 .jsp 使用的是“personList”而不是输入错误的“persnList”,那么在运行时这将完全编译并失败。
答案 0 :(得分:1)
这是使用遗留/基本JSP / Servlet时的结果。您自己手动执行所有前端控制器任务。
转到真正的MVC框架。例如JSF,Spring MVC,Wicket等。这些框架有一个servlet(或过滤器),它充当前端控制器,完成创建bean的所有讨厌的预处理工作,将它们放在所需的范围内等等。结束操作只使用javabeans作为模型,JSP / Facelets文件作为视图。在例如JSF中,您需要的是以下javabean(它将在JSF本身的“请求范围内”自动“设置):
@ManagedBean
@RequestScoped
public class Persons {
private List<Person> list;
@EJB
private PersonService service;
@PostConstruct
public void init() {
list = service.list();
}
public List<Person> getList() {
return list;
}
}
这个Facelet视图:
<ui:repeat value="#{persons.list}" var="person">
#{person.name}
</ui:repeat>
没有重复,当使用体面的IDE工具(例如Eclipse与JBoss Tools)时,它们都相互链接,以便您可以执行 Source&gt;重构&gt;重命名,没有痛苦。
答案 1 :(得分:0)
它真的不重复吗?它只是声明一个变量并在一个范围内访问变量。那很好。如果你编写一个程序并在一行上声明一个变量,那么稍后在程序中你访问变量然后就会遇到同样的问题......如果你改变了声明的变量名,那么必须找到并更改所有的使用。
在您的示例中,范围是请求范围。因此,如果在请求范围中更改变量名称,则必须遍历整个范围并更改对同一变量的所有引用。声明和访问发生在两个不同的文件中的事实应该不是一个大问题。这不是一个需要解决的问题,解决方案可能会导致难以阅读的代码。
答案 2 :(得分:0)
也许我错了,但我认为jsps的一个标准问题是你在页面加载之前看不到错误。即使常量修复了这个问题,你所描述的也不是重复,而是一般的EL变量的缺陷(即它们在运行时被动态查找)