jsp - 提交 HTML 表单后,servlet 操作出现在 URL 而不是 JSP 文件中

标签 jsp url servlets requestdispatcher

我创建了一个简单的登录页面。如果用户输入正确的用户名和密码,页面将被重定向到成功页面,否则它将被重定向到索引页面。在登录页面中,我向 servlet 提供了表单提交操作。一旦 servlet 验证输入,它将分派(dispatch)到相应的 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 容器使用哪个 View 来呈现结果。它的位置确实没有出现在客户端的浏览器地址栏中。仅当您通过 response.sendRedirect() 使用重定向时才会发生这种情况。重定向基本上告诉网络浏览器在给定位置触发新的 GET 请求。由此,浏览器地址栏将更改为新的 URL。

只需将 View (JSP 文件)隐藏在 /WEB-INF 文件夹中,以便最终用户无法再直接访问它,并重用相同的 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 获取登录页面并提交到相同的 URL。

借助 front controller pattern,您可以通过单个 servlet 对所有其他 URL 执行相同的操作。这只是一点工作,这也是 MVC 框架存在的原因:)

另请参阅:

关于jsp - 提交 HTML 表单后,servlet 操作出现在 URL 而不是 JSP 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916511/

相关文章:

java - 如何将文件上传到 Struts 2 中操作类中设置的 bean

java - JSP 没有为 HTML 表单 POST 显示正确的 UTF-8 内容

magento - 如何在magento中编辑标签url?

tomcat - OpenShift:上传文件到服务器

java - 在java主机上写文件

java - HTTP 状态 500 - servlet jersey-serlvet 的 Servlet.init() 抛出异常?

javascript - 如何将 javascript 变量传递给 servlet

java - jsp中如何替换字符串

url - 过滤输入 URL 的最佳方法是什么?

node.js - 在 expressjs 中更改 res.redirect 上的 url