Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在servlet中使用全局变量?_Java_Jsp_Jakarta Ee_Servlets_Web Applications - Fatal编程技术网

Java 在servlet中使用全局变量?

Java 在servlet中使用全局变量?,java,jsp,jakarta-ee,servlets,web-applications,Java,Jsp,Jakarta Ee,Servlets,Web Applications,我在一个servlet类中有一个名为loginatetest的全局变量。如果两个请求同时命中,该全局变量将发生什么情况?将发生的是不可预见的事件 在servlet中使用全局变量是一种罪恶吗 如果我把loginatetest放在doPost()一侧,每次都会初始化它。是。 全局变量与所有人共享这取决于,如果您的变量是只读的,就可以了。但在大多数情况下,全局变量是邪恶的。我不能给你一个解决方案,因为我没有你的代码,但我确信有另一种方法。在你的用例中,它是超越邪恶的。所有访问servlet的线程都将共

我在一个
servlet类中有一个名为
loginatetest
全局变量。如果两个
请求同时命中,该
全局变量将发生什么情况?将发生的是不可预见的事件

在servlet中使用全局变量是一种罪恶吗

如果我把
loginatetest
放在
doPost()一侧,每次都会初始化它。

是。

全局变量与所有人共享

这取决于,如果您的变量是只读的,就可以了。但在大多数情况下,全局变量是邪恶的。我不能给你一个解决方案,因为我没有你的代码,但我确信有另一种方法。

在你的用例中,它是超越邪恶的。所有访问servlet的线程都将共享LoginAttent

  • 您的变量可由任何其他类读取/写入。你无法确保他们都能用它做明智的事情。其中一个可能会覆盖它/错误地增加它,等等

  • 每个JVM都有一个servlet实例。因此,线程可能会尝试同时访问它。因为它是全局的,并且您不提供任何同步/访问控制,所以它不会是线程安全的。另外,如果您曾经在不同JVM的集群中运行servlet,那么变量将不会在它们之间共享,并且您将拥有多个LoginAttest变量

  • 如果必须将其放在servlet中,则将其设置为静态,但不要将其公开。提供getter/setter来访问和更新它。了解线程安全编程,以便多个线程可以安全地更新和读取它


    更好的是,将其存储在servlet上下文中。这应该是存储servlet范围内数据的地方,就像这样。

    只要您知道通常只创建一个servlet实例,并且全局变量将由该servlet的所有客户端共享,即每个请求,多个用户同时在不同的线程上运行


    我猜您的全局变量
    loginatetest
    正在计算登录尝试次数,那么,只要以线程安全的方式进行,这将是计算此servlet上登录尝试次数的合理方式。这将适用于所有用户。如果您希望每个用户都尝试登录,那么您可能需要创建一个会话并使用会话上下文来存储此类信息。

    在大量并发访问中,您可能需要注意Servlet的线程安全问题……您可以尝试以下方法来避免此问题

    一,

    二, 第二种方法: 使用
    synchronized
    关键字

    三,
    避免使用全局变量

    将其存储为会话属性。否则全局变量的概念会把你搞砸。 使用会话是一个好主意,因为它 1) 如果重新启动web服务,会话数据不会丢失

    2) 在负载平衡的环境中,会话数据存储在中心位置,这意味着任何服务器都可以为请求提供服务并访问会话数据


    因此它是可访问的,但它是隐藏的。

    首先,Java中没有称为
    全局变量的术语。它们被称为类变量或实例变量

    其次,是的,如果您分配请求或会话范围的数据,那么在Servlet中使用实例变量是错误的做法,因为它将由所有线程共享


    您可以将其用于应用程序范围的值,这些值通常是从上下文参数获得的。或者如果数据从未像常量一样改变(不可变)。

    这不是不同级别的上下文的作用吗?抱歉,很长时间没有使用servlet了。只是一个想法。将它存储在会话中,任何其他地方都会被其他人共享users@fmodos您的意思是指由不同用户访问的所有请求所共享的值??而不是全局变量,也许您应该考虑一个单元格?是的,它将是共享的,使用<代码>同步< /代码> servlet是一个错误的做法。
    public class loginAttempt extends HttpServlet implements SingleThreadModel {
    ...
    }