当我使用 requestDispatcher.forward 函数时,为什么我的代码没有打印出正确的结果?

Why is my code not printing proper result when I am using requestDispatcher.forward function?

我正在尝试学习 requestDispatcher.forward 函数。所以我写了一个 Html 代码,然后当我们单击 HTML 页面上的提交按钮时,它会转到 webservlet1。在那里我使用转发功能转到 webservlet2。

请看下面的代码

web.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Login Page</title>
<style type="text/css">
div{
    top:10px;
    left:100px;
    width:250px;
    height:120px;
    border: 2px solid green;
    border-color:green;
    background-color:yellow;
    
    }
</style>
<script type="text/javascript">
function loginValidation(){
    var FirstName=document.LoginForm.fname.value;
    var LastName=document.LoginForm.lname.value;
    if(FirstName=="" || LastName=""){
        alert("Field cannot be empty");
        return false;
    }
}
</script>
</head>
<body>
<div>
<form name="LoginForm" action="welcomeservlet1" onsubmit="return loginValidation()" method="post">
<table>
<tr><td>First Name</td><td><input type="text" name="fname"/></td></tr>
<tr><td>Last Name</td><td><input type="text" name="lname"/></td></tr>
<tr><td colspan="2" align="center"><input type="submit" value="login"/></td></tr>
</table>
</form>
</div>
</body>
</html>

welcomeservlet1

代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            PrintWriter out=response.getWriter();
            String fname=request.getParameter("fname");
            String lname=request.getParameter("lname");
            String FullName=fname+" "+lname;
            FullName=FullName.toUpperCase();
            out.println("<h1><font color=green> Welcome "+FullName+"</font></h1>\n");
            request.setAttribute("Fullname",FullName);
            RequestDispatcher requestdispatcher=request.getRequestDispatcher("welcomeservlet2");
            requestdispatcher.forward(request, response);
            out.println("<br>Thank you");
        }
    
    }

WelcomeServlet2

代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            String Name=request.getAttribute("Fullname").toString();
            PrintWriter out=response.getWriter();
            out.println("Your full name is "+Name+"\n");
            out.println("<br>The name length is "+Name.length());
        }

代码的输出是

你的全名是Muskan AGARWAL 名字长度为12

为什么代码不打印我在 welcomeservlet1 代码中输入的内容?它没有打印“Welcome Muskan Agarwal”。为什么不打印?

根据 servlet 规范,只有在没有向客户端提交输出时才应调用 forward。如果您在输出已经提交给客户端时尝试 forward,则会抛出 IllegalStateException

为什么没脸IllegalStateException

您没有遇到此异常,因为尚未在您的代码中提交输出。如果你把response.flushBuffer();放在requestdispatcher.forward(request, response);之前,你就会遇到这个异常。

最后...为什么“欢迎...”没有打印出来?

这是因为任何未提交的输出在 forward 之前被简单地丢弃了。