我正在构建一个包含一些全局变量的小型webapp(一些是应用程序范围的,一些是会话范围的)。有多个JSP,servlet和HTML文件,所有这些都需要访问。
myObject
初始化此类变量?我需要使用类定义中的相应构造函数。根据答案here,我不应该/不能在JSP页面中使用<%! %>
。是否可以使用JSTL的<c:set >
?request.getSession().getAttribute("myObjectName")
。但是因为这总是返回Object
,所以在我使用myObject
的方法之前,我必须每次都抛出它。是否有可能以更简单的方式做到这一点?答案 0 :(得分:1)
您可以使用以下任一格式的JavaBeans组件:
<jsp:useBean id="beanName" class="fully_qualified_classname" scope="scope"/>
或
<jsp:useBean id="beanName"
class="fully_qualified_classname" scope="scope">
<jsp:setProperty .../>
</jsp:useBean>
并使用c:set
设置bean的属性。
使用JavaServer Pages Standard Tag Library或Expression Language来调用bean的任何方法。
最好将业务逻辑移到Servlet中,并从JSP中调用它,就像它一样简单。不要在jsp中执行除UI之外的任何计算。
答案 1 :(得分:1)
如果我正确理解,有不同的问题:
${bean.property
}访问它们。方法更难调用(再次参见参考答案),但如果使用servlet,JSP应该只是视图,在调用JSP中的方法之前应该三思而后行。如何从servlet访问变量:我只知道一种方法scope.getAttribute(“name”),其范围在Request,Session,ServletContext中,返回一个需要在使用前进行转换的Object ...但您始终可以使用私有方法或静态实用程序方法来隐藏详细信息,例如:
public class MyUtil {
public MyObject getMyObject(ServletRequest request) {
return (MyObject) request.getAttribute("my_object");
}
}
稍后在您的serlvets或过滤器中,您只需致电MyUtil.getMyObject(request)
ServletContextListener
中初始化。对于特殊用例,您还可以使用HttpSessionListener
将bean放在Servlet之外的会话上下文中。编辑:关于序列化的一点
请求范围的bean不需要是可序列化的。对于Session或ServletContext范围的bean,答案更为微妙:如果您希望应用程序是 distributable (即部署在服务器集群上),则Session或ServletContext中的所有属性都应该是Serializable。没有什么可以强迫你这样做,如果你没有,你将没有错误,但是允许一个容器序列化一个会话,并且所有非Serializable属性都被丢弃(带有Tomcat警告)。即使在非分布式环境中,我注意到Tomcat在停止和取消部署Web应用程序时序列化会话,并在下次部署时恢复它们。
所以我的建议是:所有Session或ServletContext范围的bean 应该是可序列化的(我写 <) / p>