【问题标题】:Servlet context is not workingServlet 上下文不工作
【发布时间】:2013-05-07 20:31:17
【问题描述】:

请我尝试将播放器对象存储在 HashTable 中,然后将其存储在 ServletContext 中。当类被调用时,它应该检查播放器(对象)是否已经在存储在 Servlet 上下文中的 playerList(HashTable)中。但是每次我调用该类时,它都会显示 player(object) 不在 playerList (HashTable) 中,因此它会创建一个新的 Player 对象。我试过包括

this.getServletContext().setAttribute("playerList",playerList);
this.getServletConfig().getServletContext().setAttribute("playerList",playerList);

但它仍然无法正常工作。

public class InitGameServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException, JSONException {
        response.setContentType("text/plain;charset=UTF-8");
        PrintWriter out = response.getWriter();

        try {
            ServletContext context = getServletContext();
            Hashtable playerList = (Hashtable)context.getAttribute("playerList");
            String playerid=request.getParameter("id");
            HttpSession session=request.getSession(true);
            Player player=null;

            if(!playerList.contains(playerid)) {
                player=new Player(playerid,50);
                playerList.put(playerid, player);                           
                System.out.println("This player wasnt there before so i have put it");
            }
            else {
                player=(Player)playerList.get(playerid);
                System.out.println("This player was there so i have retreived it");
            }
        }
    }
}

@WebListener
public class InitializeGameContext implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        Hashtable<String, Game> gameList = new Hashtable();
        context.setAttribute("gameList", gameList);
        context.log("The game list has beeen loaded...............");
        Hashtable<String, Player> playerList = new Hashtable();
        context.setAttribute("playerList", playerList);
        context.log("The playerList list has beeen loaded..................");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }

}

在我的 web.xml 中有

<listener>
    <listener-class>web.InitializeGameContext</listener-class>
</listener>

编辑:我完整的 web.xml

<servlet>
    <servlet-name>InitGameServlet</servlet-name>
    <servlet-class>com.whot.servlet.InitGameServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>InitGameServlet</servlet-name>
    <url-pattern>/InitGameServlet</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        3000
    </session-timeout>
</session-config>
<listener>
    <listener-class>web.InitializeGameContext</listener-class>
</listener>

【问题讨论】:

  • 一切似乎都还好。发布 web.xml 的其余部分。顺便说一句,您为什么要通过注释配置两次侦听器,然后在 web.xml 中也配置一次?
  • 我已将其包含在我的原始帖子中

标签: java servlets servletconfig servletcontextlistener


【解决方案1】:

回答

Hashtable.contains() 测试某些键是否映射到此哈希表中指定的

所以,在你的 Servlet 中这一行

if(!playerList.contains(playerid)) {

您实际上是在将 key(playerid)与所有 valuesPlayer 对象)进行比较) 在您的哈希表中。因此,每次比赛都失败了。

您的ServletContext(以及它的侦听器)工作正常,因为您在每次 Servlet 调用时都正确接收了您的 Hashtable (playerList)。因此,解决问题使用Hashtable.containsKey() 来测试指定键的对象映射是否已经存在。

其他意见

  • 将哈希表称为列表有点用词不当。使用playerMap 作为标识符,因为该表将playerid kay 映射到Player 值对象。

  • 无需同时注释侦听器(使用@WebListener)以及在web.xml(使用&lt;listener&gt;)中以声明方式配置它。仅使用两种方法中的一种。

  • HttpSession.setMaxInactiveInterval()(以秒为单位设置超时)不同,&lt;session-timeout&gt; 以分钟为单位设置超时间隔。因此,如果您想要 3 分钟的默认会话长度,请将 3000 更改为 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2013-01-22
    • 2014-07-05
    • 2018-02-11
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多