一尘不染

提交HTML表单后,servlet操作将显示在URL中而不是JSP文件中

jsp

我创建了一个简单的登录页面。如果用户输入正确的用户名和密码,该页面将被重定向到成功页面,否则它将被重定向到索引页面。在登录页面中,我给出了向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);

    }

}

阅读 302

收藏
2020-06-08

共1个答案

一尘不染

调度发生在服务器端,而不是客户端。前向基本上告诉servlet容器使用哪个视图来呈现结果。它的位置确实没有出现在客户端的浏览器地址栏中。仅当您使用重定向而不是时,才会发生这种情况response.sendRedirect()。重定向基本上告诉Web浏览器在给定位置上触发新的GET请求。因此,浏览器地址栏将更改为新的URL。

只需将视图(JSP文件)隐藏在/WEB-INF文件夹中,以使最终用户不再可以直接访问它,并重复使用相同的servlet通过来显示登录表单,doGet()并继续通过来处理登录表单提交doPost()。如果未实现,doGet()则它将显示HTTP状态405-此URL不支持HTTP方法GET。

@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框架存在的原因:)

2020-06-08