如何为webapp创建和使用自定义类的变量?

时间:2014-08-23 11:07:22

标签: java servlets

我正在构建一个包含一些全局变量的小型webapp(一些是应用程序范围的,一些是会话范围的)。有多个JSP,servlet和HTML文件,所有这些都需要访问。

  1. 如何从班级myObject初始化此类变量?我需要使用类定义中的相应构造函数。根据答案here,我不应该/不能在JSP页面中使用<%! %>。是否可以使用JSTL的<c:set >
  2. 在servlet中使用全局变量的一种可能方法是使用request.getSession().getAttribute("myObjectName")。但是因为这总是返回Object,所以在我使用myObject的方法之前,我必须每次都抛出它。是否有可能以更简单的方式做到这一点?

2 个答案:

答案 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 LibraryExpression Language来调用bean的任何方法。

最好将业务逻辑移到Servlet中,并从JSP中调用它,就像它一样简单。不要在jsp中执行除UI之外的任何计算。

答案 1 :(得分:1)

如果我正确理解,有不同的问题:

  • 如何从JSP访问变量:user3218114已经完成了对此部分的回答,但是如果您在JSP之外创建变量,则只需使用${bean.property}访问它们。方法更难调用(再次参见参考答案),但如果使用servlet,JSP应该只是视图,在调用JSP中的方法之前应该三思而后行。
  • 如何从其他bean访问变量:如果使用真正的Java EE容器(不是Tomcat ...)或Spring,可以使用Dependancy Injection,不幸的是,使用它的方式会略有不同。但这本身就是一个问题,即使要考虑任何严肃的发展,我也不会进一步发展这个问题。
  • 如何从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)

  • 如何初始化那些作用域变量:请求和会话作用域变量通常在servlet或过滤器中创建,并且可以直接或通过上面的实用程序方法简单地作为属性放在其作用域中。应用程序级别bean(ServletContext范围)通常在任何请求之外创建,应该在ServletContextListener中初始化。对于特殊用例,您还可以使用HttpSessionListener将bean放在Servlet之外的会话上下文中。

编辑:关于序列化的一点

请求范围的bean不需要是可序列化的。对于Session或ServletContext范围的bean,答案更为微妙:如果您希望应用程序是 distributable (即部署在服务器集群上),则Session或ServletContext中的所有属性都应该是Serializable。没有什么可以强迫你这样做,如果你没有,你将没有错误,但是允许一个容器序列化一个会话,并且所有非Serializable属性都被丢弃(带有Tomcat警告)。即使在非分布式环境中,我注意到Tomcat在停止和取消部署Web应用程序时序列化会话,并在下次部署时恢复它们。

所以我的建议是:所有Session或ServletContext范围的bean 应该是可序列化的(我写 <) / p>