如何使用更新的数据库内容定期刷新 JSP?

Posted

技术标签:

【中文标题】如何使用更新的数据库内容定期刷新 JSP?【英文标题】:How to periodically refresh JSP with updated DB contents? 【发布时间】:2015-02-06 14:34:37 【问题描述】:

我正在开发一个体育博彩网站。我有一个程序可以获取体育数据并写入/更新 mysql 数据库。该程序在我的本地 PC 上继续运行,数据库也位于该 PC 上。

为了检索数据,客户端(网络浏览器)创建一个新的“bean”对象。 bean 的构造函数是用从 DB 中查询的值填充一些 HashMap。然后,JSP 遍历 bean 的 HashMaps 并显示内容。下面是代码的样子:

            <%
                Bean m = new Bean();
            %>

            <table style="width: 100%">
                <tr>
                    <th colspan="2" align="center">NBA</th>
                </tr>
            </table>



            <% //Iterates through the NBA hashmap
                Iterator itrNba = m.getNbaM().entrySet().iterator();
                for (Map.Entry<Integer, Match> entry : m.getNbaM().entrySet()) 
                    Match value = entry.getValue();
            %>



            <div class="bs-example"> // Creates a table row for every Match object in the hashmap, and outputs its values
                <table>
                    <col >
                    <col >
                    <col >

                    <tr>
                        <td align="left"><%=value.getTeam0Name()%></td>
                        <%
                            if (value.getStatus() != 0) 
                        %>
                        <td align="center"><%=value.getTeam0Score()%></td>
                        <td align="right" rowspan="2"><%=value.getQuarter()%></td>
                        <%
                             else 
                        %>

                        <td align="center"></td>
                        <td align="right" rowspan="2"><%=value.getQuarter()%></td>
                        <%
                            
                        %>

                    </tr>
                    <tr>
                        <td align="left"><%=value.getTeam1Name()%></td>
                        <%
                            if (value.getStatus() != 0) 
                        %>
                        <td align="center"><%=value.getTeam1Score()%></td>
                        <%
                            
                        %>

                </table>
            </div>
            <br>

            <%
                
            %>

但是,我还没有找到一种简单的方法来让我的刷新。我非常简单的临时解决方法是每 X 秒刷新一次整个页面,然后向下滚动到用户之前查看的位置。创建了一个新 bean,使其再次从 DB 中读取。然而,这是一种非常丑陋的方法。

是否有一种简单的方法来刷新值?我意识到我可能需要研究 jQuery 和 servlet 等,我愿意这样做。但是,我想远离 JSON、JS 和许多客户端脚本。我更喜欢坚持使用 JSP 或 servlet,它有一个 doPost 可以打印出 html 代码,但是我怎样才能定期进行这个循环呢?

谢谢。

【问题讨论】:

除非你使用js和ajax,否则没有办法只刷新页面的一部分。所以是的,你将有一些客户端脚本。 谢谢马克。使用 JS 和 ajax,示例实现会是什么样子?这一切都可以在客户端完成,还是我需要额外的服务器端逻辑? 我基本上会在 javascript 中编写整个“bean”对象部分吗?使用javascript访问DB并构造“bean”模型? 您需要服务器端逻辑来为需要替换的任何位提供内容。如果它们都同时更新,那么您可以让一个 ajax 请求一次发送所有新数据,然后使用一些 JS 将其分解并根据需要更新各个区域。 @Allen 您可以在您的服务器上使用 java 创建一个 web 服务,并通过 jquery ajax 客户端使用该 web 服务,然后就无需刷新页面,您可以使用 javascript 或 jquery 更新元素 【参考方案1】:

这是一个非常基本的 web 服务和 ajax 调用示例。您需要配置 web.xml 以使 web 服务正常工作。网上有教程,只需查找 jersey rest api 和 jquery.ajax 调用即可。

Java 代码:

@Path("/sports")
public class Sports 
    @GET
    @Produces(MediaType.APPLICATION_JSON) **//Notice it will automatically create the JSON for you**
    @Path("/getPlayer")
    public PlayerInfo getPlayerInfo(@QueryParam("player") String player) 
    PlayerInfo playerInfo = null;
    if(player == null)
    
        player = "";
    
    if(player.equalsIgnoreCase("Michael Jordan"))
    
        playerInfo = new PlayerInfo("Basketball", "Bulls", 50);
    
    else if(player.equalsIgnoreCase("Bo Jackson"))
    
        playerInfo = new PlayerInfo("Football/Baseball", "Raiders/Royals", 52);
    
    else
    
        playerInfo = new PlayerInfo("No Data.", "No Data.", -1);
    
    return playerInfo;
    

JQuery 代码:

function updatePlayer()

    var player = document.getElementById("athleteSelect").options[document.getElementById("athleteSelect").selectedIndex].innerHTML;
    $.ajax(type: "GET", url: ("http://localhost:8080/SportsWebService/sports/getPlayer?player=" + player), data:  get_param: 'value' , dataType: 'json', success: function (data) 
    document.getElementById("playerInfoDisplay").innerHTML = ("Sport: " + data.sport + "<br/> Team: " + data.team + "<br/> Age: " + data.age););

web.xml 中的球衣配置(您将需要球衣库 Jersey 1.18):

<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
<display-name>WebServices</display-name>
<servlet>
        <servlet-name>Sports Service</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <!-- Register resources and providers under my.package. -->
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.yourpackage.yourpackage</param-value>
        </init-param>

        <!-- Enable Tracing support. -->
        <init-param>
            <param-name>jersey.config.server.tracing</param-name>
            <param-value>ALL</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Sports Service</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

jquery 的 HTML 脚本标签链接:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" ></script>

【讨论】:

感谢这个例子,它相当简单易懂。这包括任何 Jersey 方法,还是纯 jQuery 和 java? 代码本身就是java,jquery java导入来自javax.ws.rs。让服务器提供 web 服务是 jersey 发挥作用的地方。我将发布 web.xml 的示例。您将需要服务器(tomcat)或其他任何东西或项目本身中包含的球衣库。您还需要客户端应用程序中的 jquery 库我将展示将脚本标记链接到 jquery 库的示例,您也可以将其放入您的应用程序中,这样您就不会进行外部链接。 感谢您每次的详细解答。期待web.xml示例! @Allen 我发布了 web.xml 和脚本标签链接。我想指出,您应该将客户端应用程序和 Web 服务应用程序托管在同一台服务器上,或者甚至将它们整合到一个应用程序中。如果您在一台服务器上托管 web 服务并在另一台服务器上使用 jquery ajax 访问,如果您不使用 jsonp 或 cors 或比您需要的更高级的东西,您将遇到跨域问题。 @Allen 请注意,此配置适用于 Jersey 1.18,因此如果您希望它与此代码一起使用,则应使用该版本。如果您获得较新或较旧的版本,配置可能会有所不同,但您只需要在线进行一些研究如何配置它...

以上是关于如何使用更新的数据库内容定期刷新 JSP?的主要内容,如果未能解决你的问题,请参考以下文章

JSP中自动刷新

ReactiveUI:如何实现定期刷新的ReactiveList

Spark Streaming:如何定期刷新缓存的 RDD?

每 5 分钟或定期刷新 Flutter Text 小部件内容

更新数据源时刷新数据网格

新网页内容使用了旧的数据库,刷新就变空白,请问如何使数据库自动更新到新网页内容的数据信息