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 ServletContext属性:线程安全测试不工作_Java_Jsp_Servlets - Fatal编程技术网

Java ServletContext属性:线程安全测试不工作

Java ServletContext属性:线程安全测试不工作,java,jsp,servlets,Java,Jsp,Servlets,我试图检查servletContext属性的线程安全性。我知道ServletContext属性在整个Web应用程序中都是可用的,任何人都可以访问和修改,因此我尝试测试负面as场景(即,上下文属性由某人设置,由他人更新),但它不起作用 添加实际代码的代码段 Servlet A public class TestContextAttributeThreadSafety extends HttpServlet { protected void processRequest(HttpServletRe

我试图检查servletContext属性的线程安全性。我知道ServletContext属性在整个Web应用程序中都是可用的,任何人都可以访问和修改,因此我尝试测试负面as场景(即,上下文属性由某人设置,由他人更新),但它不起作用

添加实际代码的代码段

Servlet A

 public class TestContextAttributeThreadSafety extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {        
    //synchronized(getServletContext()){
    getServletContext().setAttribute("safety", "SetByThreadA");
    //}
    RequestDispatcher view = request.getRequestDispatcher("threadSafetyJsp.jsp");
    view.forward(request, response);
}
Servlet B

public class TestContextAttributeThreadSafetyB extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {        
    //synchronized(getServletContext()){
    getServletContext().setAttribute("safety", "SetByThreadB");
    //}
    RequestDispatcher view = request.getRequestDispatcher("threadSafetyJsp.jsp");
    view.forward(request, response);
}
Index.html

  <form name =" testThreadSafetyA" method ="GET" action="./TestContextAttr">
        <br><br>
        <h3> Test Context Attribute Thread Safety A</h3>
        <input type="SUBMIT" value ="submit">
    </form>

    <form name =" testThreadSafetyB" method ="GET" action="./TestContextAttrB">
        <br><br>
        <h3> Test Context Attribute Thread Safety B</h3>
        <input type="SUBMIT" value ="submit">
    </form>
</body>



测试上下文属性线程安全性A

测试上下文属性线程安全性B

weB.XML

 <servlet>
    <servlet-name>/TestContextAttribute</servlet-name>
    <servlet-class>com.incredible.controller.TestContextAttributeThreadSafety</servlet-class>
</servlet>
<servlet>
    <servlet-name>TestContextAttributeB</servlet-name>
    <servlet-class>com.incredible.controller.TestContextAttributeThreadSafetyB</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>/TestContextAttribute</servlet-name>
    <url-pattern>/TestContextAttr</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>TestContextAttributeB</servlet-name>
    <url-pattern>/TestContextAttrB</url-pattern>
</servlet-mapping>

/TestContextAttribute
com.cn.controller.TestContextAttributeThreadSafety
TestContextAttributeB
com.cn.controller.TestContextAttributeThreadSafetyB
/TestContextAttribute
/TestContextAttr
TestContextAttributeB
/TestContextAttrB
threadSafetyJsp.jsp

    <!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Thread Safety Test : </h1>     

 <%out.print(getServletContext().getAttribute("safety"));%>
     </body>
</html>

JSP页面
螺纹安全测试:
现在我在两个不同的浏览器中运行这个应用程序。在一个浏览器中,我单击第一个提交按钮以获得输出SetByThreadA,在另一个浏览器中,我单击第二个提交按钮,该按钮提供输出SetByThreadB

现在,单击第二个提交按钮后,ServletContext属性安全性由ThreadB更新。所以,我回到ThreadA输出的第一个浏览器(即SetByThreadA),然后单击页面刷新按钮。由于它将再次加载jSP页面,这将获取ServletContext属性安全性的值,因此我希望第一个浏览器上的ServletContext的更新值,即SetByThreadB。但是,它仍然显示出挫折READA。所以,我不明白为什么这个值没有得到更新。请帮忙

我试图检查servletContext属性的线程安全性

不,你不是。你没有在这里测试线程安全之类的东西。您只需按顺序测试
setAttribute()
。无法保证这两段代码不会在同一个线程上执行。这是毫无意义的。它是有效的,如果它不起作用,你就无能为力


不要测试平台。

我们怎么能?你没有发布任何代码。我已经添加了我正在做的全部描述。和主要代码点。这还不够吗?另外,代码在另一个上machine@JBNizet,我已经添加了代码片段,请立即回答。刷新页面将向./TestContextAttr发送相同的GET请求,从而调用TestContextAttributeThreadSafety servlet,该servlet将再次将servlet上下文属性设置为“SetByThreadA”,然后转发到JSP,将显示其新值:“SetByThreadA”。您需要将请求发送到第三个servlet(或直接发送到JSP),该servlet只显示上下文属性,并且在显示它之前不进行设置。@jbnize,我可以通过将请求传递给第一个ServletA/ServletB-->result.JSP-->ThreadSafetyResult.JSP来获得预期结果,在这里我得到了servletContext属性,当我第二次刷新页面时,它更新了结果。现在,为了使用“synchronized”块解决这个问题,我将setAttribute()放在该块中并再次测试,但它没有解决问题。你能建议一些方法来测试整个行为吗?想法是检查同步块的需要。由于此属性可以从应用程序中的任何位置和任何servlet/线程读取,因此任何人都可以对其进行更新。所以,如果你有任何解决方案,我可以用它来产生这个场景,然后我可以用同步块来解决它,请告诉我这个问题可以解析地回答。你不需要测试它。保存上下文属性的映射是否线程安全?Servlet规范提供了答案。你这样做完全是错误的。如果您首先参考了规范,您已经得到了答案。我正在学习servlet,正如我所了解的,这些属性不是线程安全的,如果我设置了属性,其他servlet或请求或任何有权访问servlet上下文的人都可以更新这些属性。因此,建议的解决方案是在更新属性时使用“synchronized”块,这将防止这种情况发生。所以,我想测试这个场景,以确保存在问题,并将属性放入snychronized块中。这就是我正在努力解决的问题,如何创建问题,然后使用synchronized block解决它:)它不会阻止它的发生。这会拖延时间。如果更新属性,它将得到更新。这就是它的目的。获取更新。这里的某个地方有一个严重的误会。在任何情况下,你都不是在测试你认为你在测试的东西。真正的问题是为什么要使用Servlet上下文属性,并试图使它们成为线程安全的。他们不是。不可能。它们是应用范围的。也许您应该使用请求范围的属性。