【问题标题】:Tomcat use of static variablesTomcat使用静态变量
【发布时间】:2013-09-29 09:32:59
【问题描述】:

是否可以在我的项目中使用静态变量来存储所有 Servlet(它们在一个 .war 文件中)和不同请求的数据? (不是属于不同会话的数据)

【问题讨论】:

    标签: java tomcat tomcat7


    【解决方案1】:

    所有 Servlet 的数据

    您可以为此使用ServletContext

    定义一组 servlet 用来与其 servlet 容器通信的方法,例如,获取文件的 MIME 类型、分派请求或写入日志文件。

    每个 Java 虚拟机的每个“Web 应用程序”都有一个上下文。 (“Web 应用程序”是安装在服务器 URL 命名空间的特定子集(例如 /catalog)下的 servlet 和内容的集合,并且可能通过 .war 文件安装。)

    例如:在web.xml

     <context-param>
        <param-name>param</param-name>
        <param-value>Myname is web xml</param-value>
      </context-param>
    

    在你的 servlet 中

        public class ParameterServlet extends HttpServlet {
    
    ---
    
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        ServletContext context = getServletContext();
        name= context.getInitParameter("param");
      }
    

    A complete example here.

    对于对象

    设置

    getServletContext().setAttribute("myObj", obj);
    

    得到

    MyObj attribute = (MyObj)getServletContext().getAttribute("myObj");
    

    您可以通过servlets 访问这些对象。

    【讨论】:

    • 但我实际上不能在那里存储对象吗?
    • 这些对象必须是可序列化的吗?
    • 不。我不读那样的东西。不需要是serializable。 :)
    【解决方案2】:

    是的,你可以这样做。

    但是,最好使用&lt;context-param&gt; tagweb.xml 中定义这些常量。

    Servlet 然后可以通过调用检索使用&lt;context-param&gt; tag 定义的常量:

     context.getInitParameter()
    

    web.xml 中的名称-值对示例:

      <context-param>
        <param-name>name</param-name>
        <param-value>Joe</param-value>
      </context-param>
      <context-param>
        <param-name>password</param-name>
        <param-value>password</param-value>
      </context-param>
    

    【讨论】:

      【解决方案3】:

      在 web.xml 中你可以定义

      <context-param>
          <description>My variable</description>
          <param-name>variable.name</param-name>
          <param-value>value</param-value>
      </context-param>
      

      然后从 Servlet 代码中访问它:

      String variable = getServletContext().getInitParameter("variable.name");
      

      【讨论】:

        【解决方案4】:

        是的,您可以,所有 servlet 线程都可以访问静态变量。但是关于使用静态变量,您应该根据要存储的数据的生命周期和要存储的数据量等因素做出正确的决定。

        而且由于它是在 servlet 上下文中使用的,因此请确保它是线程安全的。

        【讨论】:

        • 它是只读数据,可以随时从数据库中重新加载。所以应该不是问题吧?
        猜你喜欢
        • 2013-11-06
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2019-04-03
        • 2021-10-28
        • 1970-01-01
        • 2013-04-01
        相关资源
        最近更新 更多