【问题标题】:Calling a servlet from Java code从 Java 代码调用 servlet
【发布时间】:2014-05-02 21:08:21
【问题描述】:

我目前正在尝试使用 jsp 和 servlets 完成登录系统。我的注册和登录验证工作正常。

我希望在登录后链接到欢迎页面以显示用户个人资料信息。 出于测试目的,我有一个 response.sendRedirect(welcome.jsp),它在登录 servlet 成功登录后重定向。

现在,为了在这个欢迎页面上显示配置文件信息,我将使用一个 servlet 从数据库中收集信息并使用打印机将其呈现给浏览器。 如何从 loginservlet 成功调用此 servlet 以运行 doPost() 方法? 还是有更好的方法?

感谢您的宝贵时间。

(为简单起见,我只是想先显示一个基本网页,以确保它正常工作,一旦开始,我对数据库方面的事情不会有任何问题)

登录服务器:

package logon;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public LoginServlet() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    try
    {
        System.out.println("In the Login Servlet");
        User user = new User();
        user.setEmail(request.getParameter("email"));
        user.setPassword(request.getParameter("password"));
        LoginDAO.login(user);
        if(user.isValid())
        {
            HttpSession session = request.getSession(true);
            session.setAttribute("currentSessionUser",user);
            session.setAttribute("currentSessionUserEmail", user.getEmail());
            response.sendRedirect("WelcomeServlet");

        }else
            response.sendRedirect("LoginFailure.html");
    } catch (Throwable exc)
    {
        System.out.println(exc);
    }

}

}

欢迎伺服器:

package logon;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/WelcomeServlet")
public class WelcomeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public WelcomeServlet() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out=response.getWriter();
    out.print("<html>"+"<head>"+"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">");
    out.print("<title>Welcome</title>");
    out.print("</head>"+"<body>");
    out.print("Welcome to the welcome page!!!");
    out.print("</body>"+"</html>");

}
}

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    您不能使用 POST 进行重定向,只能使用 GET。由于您只是在 WelcomeServlet 中显示 HTML,因此将代码从 doPost 移动到 doGet,或者让一个调用另一个,这只会让它们都做同样的事情。

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
     {
       doPost(request, response);
     }
    

    另外,使用 JSP 比在 servlet 中使用out.print 一堆 HTML 更好。请参阅info page for servlets

    另外,显然您的欢迎页面需要从会话中读取属性currentSessionUser 并确保它不是null 以查看用户是否真正登录。否则,如果用户知道欢迎页面的地址,他们就可以像现在一样绕过您的登录检查。

    【讨论】:

      【解决方案2】:

      您的问题是您当前实现了 Servlet 以响应错误的 HTTP 动词。

      您会注意到 servlet 具有 doPostdoGet 方法。正如您可能期望的那样,这些映射到 HTTP GET 和 HTTP POST 请求。您当前的问题源于您已经在 WelcomeServlet 中实现了 doPost 方法,因此期待 POST 请求,而实际上它会提供 GET 请求。

      粗略地说,您可以将 GET 请求视为读取操作,将 POST 请求视为写入操作。因此,当您提交表单以保存一些数据时,通常会处理一个 POST 请求。您基本上要求将数据写入数据库或会话。当您加载网页时,这通常作为 GET 请求处理。您只是要求读取数据。

      再次简化,但重定向通常是 GET 请求。因此,您的 Servlet 将需要实现 doGet() 方法以在重定向后响应浏览器的 GET 请求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 2011-01-09
        • 2011-03-16
        • 2012-07-05
        • 1970-01-01
        相关资源
        最近更新 更多