【问题标题】:Updating dynamically jsp page in browser after POST http requestPOST http请求后在浏览器中动态更新jsp页面
【发布时间】:2017-08-15 03:01:11
【问题描述】:

我有以下项目:一个用java编写的后端;我的 Main 类在日志文件上创建一个侦听器,在修改日志时检索一些信息,并创建一个名为“Candidate”的对象,并通过 POST 方法将其一些属性发送到 Servlet。直到这里一切正常,我从 Servlet 获得了 200 响应代码。

然后,我在 index.jsp 文件中创建了一个前端(带有引导程序,看起来不错),它由一个静态部分(背景、消息、徽标等)和一个动态部分组成,我想要每次修改日志文件时更新。可以在下面找到 index.jsp 的简化版本,其中 firstName 是 post 请求应到达的数据示例:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<!-- If IE use the latest rendering engine -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">

<!-- Set the page to the width of the device and set the zoon level -->
<meta name="viewport" content="width = device-width, initial-scale = 1">

<title>User Page</title>

<style>
 @import url('bootstrap/css/bootstrap.css');      
</style>
<script type=”text/javascript” src=”bootstrap/js/bootstrap.min.js”></script>
</head>
<body style="background-image:url(images/xxxx.jpg); background-size:cover; " >


<% String firstName = (String) request.getParameter("firstName"); %>

<div class="container">
<div class="page-header">
<h1 style="color:white">Hello 

<%if(firstName != null){%>

    <%=firstName %>
<%}%>
Welcome to this new page.</h1>

</div>
<img src="images/xx.png" style="width:35%;height:35%; padding-left: 10%; padding-top:10%"/>
</div>
</body>
</html>

我的最终目标是用户只看到 index.jsp 页面,每次修改日志时,该页面都会使用来自“新候选者”的数据更新其部分内容。

为了运行我的应用程序,我有几个运行实例。我运行 Main 类,除此之外,我在服务器上运行 index.jsp 和 MyServlet。这是运行它的正确方法吗?

因为当我这样做时,然后我修改日志,主类控制台打印所有内容,显示 POST 请求已发送(我已尝试将请求发送到 Servlet 或直接发送到 jsp 文件)但是我的 index.jsp 没有收到任何请求(或者至少它没有在 eclipse 中打开的浏览器中显示),即使在刷新页面之后也是如此。

但是,当我在浏览器中手动修改 url 以添加带有 ?firstName=XXXX 的 url 查询参数并刷新时,该消息会包含在 index.jsp 页面中。如何确保通过我的后端发送的 POST 请求会动态修改我的 index.jsp 页面?

最后一点:当日志文件被修改时,控制台会打印 System.out.println 以及下面在 doGet 方法中看到的相应名字,所以我假设一切正常。

这里是 Servlet 代码:

package com.xyz.xxxxx;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class MyServlet
 */
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //response.setIntHeader("Refresh", 5);

        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        String firstName = request.getParameter("firstName");
        System.out.println("testing get: first name : " + firstName);   

        // forward request to jsp page 
        request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request,response);

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

        doGet(request,response);
    }


}

文件组织为here

感谢您的帮助!

【问题讨论】:

  • 你熟悉什么框架,或者有一些技巧?没有原始 jsp 就很难 ajaxify 项目
  • 无。但是我可以知道你是否能够准确地指出我可以使用什么框架以及为什么:-)
  • 我用Wicket几年了,不过这跟JSP相差甚远,说实话跟JSP没什么关系。很少有兼容JSP的,或者在他的表现层使用JSP
  • 1.) 您能否确认 GET 请求工作正常?您提供什么作为到达 GET 端点的路径? 2.) 你究竟是如何测试 POST 的?这是否需要更改状态,即如果有人要使用新名称 POST 到端点,则 GET 应该提供更改后的值?

标签: java jsp servlets http-post


【解决方案1】:

我将在这里大步向前,并假设您希望从您的 POST 中坚持 firstName 的价值观

这将需要您对代码进行相当多的调整,但如果这是一个课堂项目,我也不想只提供一个实现。

根据您提供的代码 sn-p:看起来您正在尝试实现以下目标:

  1. GET -> 使用帖子提供的名称显示 index.html
  2. POST -> 更改给定会话的名称。

因此,您应该使用您在 ServletClass 中定义的任何内容访问该页面。

一旦你了解HttpSession,你应该会得到你想要的效果

【讨论】:

  • 感谢 shinjw 的回答。抱歉不清楚:我不希望保留 firstName 的值,即每次修改日志时,我都希望显示新名称。当我试图让事情正常运行时,我使用了 session,但实际上它并没有帮助。
  • 我注意到您的最后 3 个问题都围绕同一个问题。什么会触发日志被修改?
  • 您当前编写的是一个 GET 和一个 POST,它们将以相同的方式解决。这意味着任何带有 ?firstName=XYZ 的 GET 请求都会提示一个新的日志事件。这也意味着任何带有 firstName=XYZ 的 POST 都会做同样的事情
  • 你是对的 ;) 日志将由外部程序触发。
  • Ps:暑假,做个人项目,不是课堂项目;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2016-10-23
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多