当我使用 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
之前被简单地丢弃了。
我正在尝试学习 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
之前被简单地丢弃了。