我创建了一个简单的登录页面。如果用户输入正确的用户名和密码,该页面将被重定向到成功页面,否则它将被重定向到索引页面。在登录页面中,我给出了向Servlet提交表单的操作。一旦servlet验证了输入,它将被分派到相应的jsp页面。我的问题是在派发后,动作名称仍在URL中。这样对吗?
package com.123.www; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class Login extends HttpServlet { private static final long serialVersionUID = 1L; public Login() { super(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); //PrintWriter out = response.getWriter(); String userName = request.getParameter("username"); String passWord = request.getParameter("password"); RequestDispatcher view = null ; if((userName=="")&&(passWord=="")) { view = request.getRequestDispatcher("index.jsp"); } else { HttpSession session = request.getSession(true); session.setAttribute("name",userName); view = request.getRequestDispatcher("success.jsp"); } view.forward(request, response); } }
调度发生在服务器端,而不是客户端。前向基本上告诉servlet容器使用哪个视图来呈现结果。它的位置确实没有出现在客户端的浏览器地址栏中。仅当您使用重定向而不是时,才会发生这种情况response.sendRedirect()。重定向基本上告诉Web浏览器在给定位置上触发新的GET请求。因此,浏览器地址栏将更改为新的URL。
response.sendRedirect()
只需将视图(JSP文件)隐藏在/WEB-INF文件夹中,以使最终用户不再可以直接访问它,并重复使用相同的servlet通过来显示登录表单,doGet()并继续通过来处理登录表单提交doPost()。如果未实现,doGet()则它将显示HTTP状态405-此URL不支持HTTP方法GET。
/WEB-INF
doGet()
doPost()
@WebServlet("/login") public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Just show form. request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Process form submit. // ... if (success) { response.sendRedirect("home"); } else { request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); } } }
这样,您可以通过http://example.com/context/login获取登录页面并提交到相同的URL。
您可以在前端控制器模式的帮助下,通过单个servlet对所有其他URL进行相同的操作。仅需一点工作,这也是MVC框架存在的原因:)