java - 使用 MVC 在 html 中单击文本时获取有关对象的更多信息

标签 java html servlets model-view-controller

所以我正在制作一个小型网络应用程序来获取有关游戏的信息,我制作了一个 searchBar 请求对 API 进行搜索,然后我获得了与搜索标题最相似的前 10 个游戏。但我只显示标题。

This is an example of a search

游戏有很多属性,其中之一是 ID,它允许我使用 Controller 获取游戏的所有信息。

现在应用程序是这样工作的:
1:你搜索一个游戏的名字
2. Controller 为我提供了一个 ID 列表,通过这些 ID,我获得了有关游戏的其余信息,但我只显示了标题。

现在,我想做的是:
3.当你点击一个标题时,你使用一个 Controller ,并从它请求的ID(同样,我不确定我是否可以使用以前的游戏对象)来自该游戏的所有信息并显示它。

Controller 工作正常,但我在 HTML 方面遇到问题。

这是搜索的 Controller :

...
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 给我游戏的 Controller

...
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。

现在,这是 success.jsp 的 html,这就是问题所在:

<%@ 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 您可以看到 id 包含在 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>

最佳答案

好的,我想我明白为什么您看到的是空白页。一切都按预期工作,问题似乎在于此:

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);
}

您看到空白页的原因是您的游戏变量不为空。而且您在 if else block 的第一部分中没有前向语句。

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">

关于java - 使用 MVC 在 html 中单击文本时获取有关对象的更多信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50336975/

相关文章:

java - HttpURLConnection getInputStream : timeout always after 180 seconds

java - spring oauth2自定义登录错误

java - Android studio中的java文件错误

java - 使用 Servlet 读取 Jar 内的 list 文件

javascript - load() - 不加载

java - 基元数组列表的 Mockito 匹配器

html - 当链接文本跨越多行时,最小化 <a> 链接行之间的空间

javascript - 无法滚动到第一个错误消息字段

html - 与媒体查询交换 div 位置

jsf - 在任何 Servlet 相关类中按名称获取 JSF 托管 bean