我正在尝试检查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 。所以,我不明白为什么这个价值没有得到更新。请帮忙
答案 0 :(得分:0)
我正在尝试检查servletContext属性的线程安全性。
不,你不是。你没有在这里测试线程安全这样的东西。您只是按顺序测试setAttribute()
。无法保证这两段代码不会在相同的线程上执行。这是毫无意义。它有效,如果没有,你无能为力。
不要测试平台。