我创建了一个简单的登录页面。如果用户输入正确的用户名和密码,页面将被重定向到成功页面,否则将被重定向到索引页面。在登录页面中,我向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);
}
}
答案 0 :(得分:2)
调度发生在服务器端,而不是客户端。 forward基本上告诉servletcontainer用于呈现结果的视图。它的位置确实没有出现在客户端的浏览器地址栏中。只有当您使用重定向而不是response.sendRedirect()
时才会发生这种情况。重定向基本上告诉webbrowser在给定位置触发新的GET请求。因此,浏览器地址栏将更改为新URL。
只需隐藏/WEB-INF
文件夹中的视图(JSP文件),以便最终用户无法再直接访问它,并重用相同的servlet通过doGet()
显示登录表单继续处理通过doPost()
提交的登录表单。如果您未实施doGet()
,则会显示HTTP Status 405 - HTTP method GET is not supported by this URL。
@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获取登录页面并提交到相同的网址。
在front controller pattern的帮助下,您可以通过单个servlet对所有其他URL执行相同的操作。这只是一点点工作,这也是MVC框架存在的原因:)
答案 1 :(得分:1)
Servlets有一些叫做转发的魔法。您应该使用HTTP重定向。当您通过POST方法获得表单时,此方法非常有用。然后在您发送HTTP重定向页面地址后,当用户尝试刷新页面时,第二次用户不提交表单。
你听说过Spring Framework吗?它为构建Web应用程序提供了很好的框架。