ServletContext属性:线程安全测试不起作用

时间:2015-06-10 05:55:41

标签: java jsp servlets

我正在尝试检查servletContext属性的线程安全性。我知道ServletContext属性在整个Web-App中都可用,并且可以被任何人访问和修改,所以我试图将负面测试作为场景(即上下文属性由某人设置并由其他人更新)但它不起作用。

添加实际代码的代码片段。

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>

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>

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>

现在我在两个不同的浏览器中运行这个应用程序。从一个浏览器,我点击第一个提交按钮以获得输出 SetByThreadA ,并从其他浏览器,我点击第二个提交按钮,它给出输出 SetByThreadB

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

1 个答案:

答案 0 :(得分:0)

  

我正在尝试检查servletContext属性的线程安全性。

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

不要测试平台。