Servlet 页面不会使用 Servlet 重定向到第二个页面
Servelt Page doesn't Redirect to second Page using Servlet
我是servlet的初学者jsp。如果登录成功页面与用户名一起重定向到第二个 servlet,我将创建一个简单的登录表单。但它不起作用,它显示错误 java.lang.IllegalArgumentException:第二个路径不以“/”字符开头
到目前为止我尝试了什么,我附在下面。
表格
<div class="row">
<form method="POST" action="login">
<div class="form-group">
<label>Username</label>
<input type="text" id="uname" name="uname" placeholder="uname" class="form-control">
</div>
<div class="form-group">
<label>Password</label>
<input type="password" id="pword" name="pword" placeholder="pword" class="form-control">
</div>
<div class="form-group">
<input type="submit" value="submit" class="btn btn-success">
</div>
</form>
</div>
登录 Servlet 页面
@WebServlet("/login")
public class login extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String uname = request.getParameter("uname");
String pass = request.getParameter("pword");
if(uname.equals("John") && pass.equals("123"))
{
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(true);
session.putValue("username", uname);
ServletContext context=getServletContext();
RequestDispatcher rd=context.getRequestDispatcher("second");
rd.forward(request, response);
}
}
第二个 Servlet 页面
@WebServlet("/second")
public class second extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(true);
String uname = (String)session.getValue("uname");
out.println("User Name is " + uname);
}
此异常表明,路径不以“/”开头。
试试下面的方法。
RequestDispatcher rd=context.getRequestDispatcher(request.getContextPath() +"/second");
redirect
和 forward
之间有一些很大的不同。 This 文章将帮助您更好地理解您的问题。
文章中的一些注意事项:
前进
1) 请求和响应对象在转发后将保持相同的对象。请求范围对象将仍然可用(这就是为什么如果您尝试添加“/”您会得到 405 状态 - 它会尝试将您转发到“/second”servlet 但唯一的请求被覆盖是 GET
)
重定向
1) 请求被重定向到不同的资源
2) 创建了一个新请求
因此,我建议您使用 HttpServletResponse
class.
中的 sendRedirect()
方法,而不是使用 rd.forward
response.sendRedirect(request.getContextPath() + "/second");
AND 获取会话用户名属性的正确方法是:
String uname = (String) session.getValue("username");
否则它将尝试查看 uname 键,这是 not 集。 uname
只是一个映射到 username 键的值(session.putValue("username",uname);
我是servlet的初学者jsp。如果登录成功页面与用户名一起重定向到第二个 servlet,我将创建一个简单的登录表单。但它不起作用,它显示错误 java.lang.IllegalArgumentException:第二个路径不以“/”字符开头 到目前为止我尝试了什么,我附在下面。
表格
<div class="row">
<form method="POST" action="login">
<div class="form-group">
<label>Username</label>
<input type="text" id="uname" name="uname" placeholder="uname" class="form-control">
</div>
<div class="form-group">
<label>Password</label>
<input type="password" id="pword" name="pword" placeholder="pword" class="form-control">
</div>
<div class="form-group">
<input type="submit" value="submit" class="btn btn-success">
</div>
</form>
</div>
登录 Servlet 页面
@WebServlet("/login")
public class login extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String uname = request.getParameter("uname");
String pass = request.getParameter("pword");
if(uname.equals("John") && pass.equals("123"))
{
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(true);
session.putValue("username", uname);
ServletContext context=getServletContext();
RequestDispatcher rd=context.getRequestDispatcher("second");
rd.forward(request, response);
}
}
第二个 Servlet 页面
@WebServlet("/second")
public class second extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(true);
String uname = (String)session.getValue("uname");
out.println("User Name is " + uname);
}
此异常表明,路径不以“/”开头。 试试下面的方法。
RequestDispatcher rd=context.getRequestDispatcher(request.getContextPath() +"/second");
redirect
和 forward
之间有一些很大的不同。 This 文章将帮助您更好地理解您的问题。
文章中的一些注意事项:
前进
1) 请求和响应对象在转发后将保持相同的对象。请求范围对象将仍然可用(这就是为什么如果您尝试添加“/”您会得到 405 状态 - 它会尝试将您转发到“/second”servlet 但唯一的请求被覆盖是 GET
)
重定向
1) 请求被重定向到不同的资源
2) 创建了一个新请求
因此,我建议您使用 HttpServletResponse
class.
sendRedirect()
方法,而不是使用 rd.forward
response.sendRedirect(request.getContextPath() + "/second");
AND 获取会话用户名属性的正确方法是:
String uname = (String) session.getValue("username");
否则它将尝试查看 uname 键,这是 not 集。 uname
只是一个映射到 username 键的值(session.putValue("username",uname);