我理解如何在JSP / Servlet应用程序中使用EL访问Session属性:
<p> Hello <c:out value="${sessionScope.userName}"/> </p>
但是,我想知道是否有办法隐藏JSP页面EL访问的Session变量?如果我在servlet中设置了一个会话变量,例如:
UserDAO user = new UserDAO();
user.setUserName("XYZ");
request.getSession().setAttribute("user", user);
有没有办法阻止在JSP上访问UserDAO Java Object的字段,其代码如下:
<p> Hello <c:out value="${user.userName}"/> </p>
谢谢。
答案 0 :(得分:4)
没有。至少,并非没有编写自定义EL解析器,这不是一件容易的事。
最好的办法是将它包装在一个不会通过Javabean getter方法公开值的对象中。 E.g。
public class UserWrapper implements Serializable {
private User user;
public UserWrapper(User user) {
this.user = user;
}
public User get() {
return user;
}
}
将其存储在会话中,如下所示。
session.setAttribute("user", new UserWrapper(user));
从会话中获取它,如下所示。
User user = ((UserWrapper) session.getAttribute("user")).get();
此方法在EL中无法访问。至少,在2.2之前的EL版本中你可以只做#{user.get()}
。
替代方法是使包装类的getter方法受包保护,以便它只能由同一个包和/或子类中的类访问(EL即要求它是公共的)。
protected User get() {
return user;
}
甚至可以使整个包装类成为私有或包受保护的内部类。