如何在jsp页面中显示消息

问题描述 投票:0回答:2

我是jsp的初学者,我需要在简单计算之前和之后显示一条消息。在Eclipse中,我将index.html作为主页,将testrun.html用于运行servlet,将servlet TEST.java进行计算并显示消息,并创建了testmsg.jsp在参数$ message中显示消息。当我尝试运行项目时,testmsg.jsp没有显示任何消息,并且我也收到错误消息。我试图遵循问题1824409,但没有成功。谁能帮助我了解为什么thetestmsg.jsp无法正常工作并出现错误?

谢谢

错误

Show the waiting message


Computing


Show the end message
apr 28, 2020 12:14:04 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [com.prevendis.controller.TEST] in context with path [/MktPortal] threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:323)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
    at com.prevendis.controller.TEST.doGet(TEST.java:47)
    at com.prevendis.controller.TEST.doPost(TEST.java:42)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:821)

apr 28, 2020 12:30:17 PM org.apache.catalina.core.StandardContext reload
INFORMAZIONI: Reloading Context with name [/MktPortal] has started
apr 28, 2020 12:30:19 PM org.apache.jasper.servlet.TldScanner scanJars
INFORMAZIONI: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
apr 28, 2020 12:30:19 PM org.apache.catalina.core.StandardContext reload
INFORMAZIONI: Reloading Context with name [/MktPortal] is completed

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Test</title>
</head>
<body>
    <h1>
        <p align="center">TEST</p>
    </h1>
    <a href="./testrun.html"> Run the test</a>
</body>
</html>

testrun.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>test</title>
</head>
<body>
    <h1>
        <p align="center">TEST</p>
    </h1>
    Press OK button to run the test
    <br>
    <br>
    <form method="POST" action="Test.do">
        <input type="submit" value="Ok" id="button-1" />
    </form>
</body>
</html>

TEST.java

package com.prevendis.controller;

import java.io.IOException;

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



/**
 * Servlet implementation class PreVenDisElab
 */
@WebServlet(description = "Computing TEST", urlPatterns = { "/Test.do" })
public class TEST extends HttpServlet {

    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public TEST() {
        super();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Show the waiting message");
        doGet(request, response,"Start computing");

        System.out.println("\n\nComputing\n\n");
        int result = 1+1;

        System.out.println("Show the end message");
        doGet(request, response,"End computing");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response, String msg) throws ServletException, IOException {
        Object data = msg;
        request.setAttribute("message", data);
        request.getRequestDispatcher("/WEB-INF/testmsg.jsp").forward(request, response);
    }
}


testmsg.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Test</title>
</head>
<body>
    <h1><center>Test</center></h1>

    <p>
    <h2> ${message}</h2>
    <br>
    </p>

</body>
</html>

java html jsp runtime-error message
2个回答
0
投票

您的RequestDispatcher无效,更改为

request.getRequestDispatcher("testmsg.jsp").forward(request, response);

0
投票

您的代码在doPost方法中两次发送doGet(request, response,"Start computing");doGet(request, response,"End computing");。因此,Servlet将首次发送响应,即:request.getRequestDispatcher("/WEB-INF/testmsg.jsp")..,当您首次调用doGet()方法时,当再次调用此方法时,它将引发错误Cannot forward after response has been committed。相反,为什么不在doGet方法中像下面这样:

    Object data = msg;
    if(msg.equals("End computing")){
    request.setAttribute("message", data);
    request.getRequestDispatcher("/WEB-INF/testmsg.jsp").forward(request, response);
    }
© www.soinside.com 2019 - 2024. All rights reserved.