Контекст сервлета не работает

Пожалуйста, я пытаюсь сохранить объект игрока в HashTable, который затем будет сохранен в ServletContext. Когда вызывается класс, предполагается, что игрок (объект) уже находится в playerList (HashTable), который хранится в контексте сервлета. Но каждый раз, когда я вызываю класс, это показывает, что player (объект) отсутствует в 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>

1 ответ

Решение

Ответ

Hashtable.contains() Проверяет, соответствует ли какой-либо ключ указанному значению в этой хеш-таблице.

Итак, в вашем сервлете на этой линии

if(!playerList.contains(playerid)) {

вы фактически сравниваете ключ (playerid) со всеми значениями (Player объекты) в вашем Hashtable. Следовательно, матч проваливается каждый раз.

Ваш ServletContext (а также его слушатель) работает нормально, так как вы получаете ваш Hashtable (playerList) при каждом вызове сервлета. Итак, для решения проблемы используйте Hashtable.containsKey() который проверяет, существует ли уже сопоставление объекта для указанного ключа.

Другие наблюдения

  • Это своего рода неправильное называть Hashtable списком. использование playerMap в качестве идентификатора, так как таблица отображает playerid кай Player объект стоимости.

  • Там нет необходимости как аннотировать слушателя (с @WebListener), а также настроить его декларативно в web.xml<listener>). Используйте только один из двух подходов.

  • В отличие от HttpSession.setMaxInactiveInterval() (который устанавливает время ожидания в секундах) <session-timeout> устанавливает интервал ожидания в минутах. Таким образом, если вы хотите изменить продолжительность сеанса по умолчанию на 3 минуты 3000 в 3,
Другие вопросы по тегам