Получение дополнительной информации об объекте при нажатии на текст в html с использованием MVC - PullRequest
0 голосов
/ 14 мая 2018

Итак, я создаю небольшое веб-приложение для получения информации об играх, я создал панель поиска, которая запрашивает поиск в API, а затем я получаю первые 10 игр с наиболее похожим названием для поиска. Но я показываю только заголовок.

Это пример поиска

У игр много атрибутов, одним из которых является идентификатор, и он позволяет мне получать всю информацию об игре с помощью контроллера.

Сейчас приложение работает так:
1: Вы ищете название игры
2. Контроллер дает мне список идентификаторов, и с помощью идентификаторов я получаю остальную информацию об играх, но я показываю только названия.

Теперь, что я хочу сделать:
3.Когда вы нажимаете на заголовок, вы используете контроллер и по его идентификатору запрашиваете (опять же, я не уверен, что смогу использовать объекты предыдущих игр) всю информацию из этой игры и показывает ее.

Контроллеры работают нормально, но у меня проблемы с HTML.

Это контроллер для поиска:

...
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   

    String query = request.getParameter("searchQuery");
    RequestDispatcher rd = null;  

    log.log(Level.FINE, "Searching for games that contain " + query);
    GameResource game = new GameResource();
    GameSearch[] gameResults = null;
    gameResults = game.getGameSearch(query);

    //System.out.println(Arrays.toString(gameResults));
    List<Game> listaBusqueda = new ArrayList<Game>();

    if (gameResults.length!=0){
        rd = request.getRequestDispatcher("/success.jsp");
        for (GameSearch g : gameResults) {
            listaBusqueda.add(game.getGame(g.getId().toString()));
        }
        request.setAttribute("games", listaBusqueda);
    } else {
        log.log(Level.SEVERE, "Game object: " + gameResults);
        rd = request.getRequestDispatcher("/error.jsp");
    }
    rd.forward(request, response);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}
...

Это контроллеры, которые дают мне игру, используя ID

...
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String gameId = request.getParameter("id");
    GameResource resource = new GameResource();
    RequestDispatcher rd = null;
    log.log(Level.FINE, "Retrieving game");

    Game game = resource.getGame(gameId);

    if(game!=null) {
        rd = request.getRequestDispatcher("/success.jsp");
        request.setAttribute("Game", game);
        request.setAttribute("Item", "gameID");
    } else {
        log.log(Level.SEVERE, "Cannot retrieve game: ");
        rd = request.getRequestDispatcher("/error.jsp");
        rd.forward(request, response);
    }
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
  }

}

Оба они работают, в последнем объекты созданы правильно и ID получен.

Теперь это html для success.jsp, и вот в чем проблема:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Search results</title>
</head>
<body>


<fieldset id="IGDB">
    <legend>
        IGDB search for
        <c:out value="${param.searchQuery}" />
    </legend>

    <c:forEach items="${requestScope.games}" var="game">
        <article name="gameArticle" id="gameArticle"></article>
        <a href="GameIdController?id=${game.id}"><c:out value="${game.name}" 
/></a>

        <br />
    </c:forEach>
</fieldset>

<c:if test="${requestScope.Item=='gameID' }">
<c:forEach items="${requestScope.Game}" var="game">
        <article name="gameArticle" id="gameArticle"></article>
        <c:out value="${game.name}" />

        <br />
    </c:forEach>
    $game = ${requestScope.Game}
    <c:out value="${game.name}"/>

</c:if>

<article name = "gameByIDArticle" id = "gameByIDArticle">

</article>

</body>
</html>

Когда я нажимаю на заголовок, меня перенаправляют на пустую веб-страницу (http://localhost:8090/GameIdController?id=IdOfTheGame),as, вы можете видеть, что идентификатор включен в URL, но он полностью пустой и должен снова включать заголовок, как указано в мой код.

Я также включу свой web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <servlet>
    <description></description>
    <display-name>GameSearchController</display-name>
    <servlet-name>GameSearchController</servlet-name>
    <servlet-class>aiss.controller.GameSearchController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GameSearchController</servlet-name>
    <url-pattern>/GameSearchController</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>GamePopularityController</display-name>
    <servlet-name>GamePopularityController</servlet-name>
    <servlet-class>aiss.controller.GamePopularityController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GamePopularityController</servlet-name>
    <url-pattern>/GamePopularityController</url-pattern>
  </servlet-mapping>
  <context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/api</param-value>
  </context-param>
  <servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet- 


 class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet- 
class>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>aiss.api.GameApplication</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/api/*</url-pattern>
  </servlet-mapping>
  <error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error.jsp</location>
  </error-page>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>GameIdController</display-name>
    <servlet-name>GameIdController</servlet-name>
    <servlet-class>aiss.controller.GameIdController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GameIdController</servlet-name>
    <url-pattern>/GameIdController</url-pattern>
  </servlet-mapping>
 </web-app>

1 Ответ

0 голосов
/ 15 мая 2018

Хорошо, я думаю, я понимаю, почему вы видите пустую страницу. Все работает, как и ожидалось, проблема, кажется, с этим:

if(game!=null) {
    rd = request.getRequestDispatcher("/success.jsp");
    request.setAttribute("Game", game);
    request.setAttribute("Item", "gameID");
} else {
    log.log(Level.SEVERE, "Cannot retrieve game: ");
    rd = request.getRequestDispatcher("/error.jsp");
    rd.forward(request, response);
}

Причина, по которой вы видите пустую страницу, заключается в том, что ваша игровая переменная не равна нулю. И у вас нет оператора forward в первой части этого блока if else.

if(game!=null) {
    rd = request.getRequestDispatcher("/success.jsp");
    request.setAttribute("Game", game);
    request.setAttribute("Item", "gameID");
    rd.forward(request, response); // missing this!
} else {
    log.log(Level.SEVERE, "Cannot retrieve game: ");
    rd = request.getRequestDispatcher("/error.jsp");
    rd.forward(request, response);
}

РЕДАКТИРОВАТЬ: В ответ на вашу другую проблему из комментария, я думаю, что forEach возникают проблемы из-за этого:

<c:forEach items="${requestScope.Game}" var="game">

измените это на:

<c:forEach items="${Game}" var="game">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...