Java servlet间通信

Java servlet间通信,java,servlets,Java,Servlets,我有两个servlet:LoginServlet和MailServlet。LoginServlet使用jdbc查询mysql表以获取字符串(电子邮件)。我想要的是将这个字符串转发到MailServlet,MailServlet将向LoginServlet发送的电子邮件ID发送一封电子邮件 我的问题是如何从LoginServlet调用变量电子邮件并将其发送到MailServlet?我想创建一个MailServlet实例,如下所示: MailServlet=新的MailServlet() 然后使用s

我有两个servlet:LoginServlet和MailServlet。LoginServlet使用jdbc查询mysql表以获取字符串(电子邮件)。我想要的是将这个字符串转发到MailServlet,MailServlet将向LoginServlet发送的电子邮件ID发送一封电子邮件

我的问题是如何从LoginServlet调用变量电子邮件并将其发送到MailServlet?我想创建一个MailServlet实例,如下所示:

MailServlet=新的MailServlet()

然后使用servlet对象调用MailServlet中的函数doGet()。
但是我觉得这里面有一些错误,因为这不是调用servlet的正确方法。那么如何调用变量并将其传递给MailServlet?

servlet的目的是响应HTTP请求。您应该做的是重构代码,以便将所需的逻辑与其他servlet分离,并且可以独立地重用它。例如,您可能会得到一个Mailman类和一个使用Mailman完成其工作的MailServlet。从另一个servlet调用servlet是没有意义的

如果您需要在点击第一个页面后转到其他页面,请使用重定向:

编辑:

例如,假设您有一个servlet,如:

public class MailServlet extends HttpServlet {
    public  void doPost(HttpServletRequest request,HttpServletResponse response)
                                  throws ServletException, IOException {
        PrintWriter out=response.getWriter();
        response.setContentType("text/html");

        Message message =new MimeMessage(session1);

        message.setFrom(new InternetAddress("someone@something.com"));
        message.setRecipients(...);
        message.doSomeOtherStuff();
        Transport.send(message);

        out.println("mail has been sent");
    }
}
相反,可以这样做:

public class MailServlet extends HttpServlet {
    public  void doPost(HttpServletRequest request,HttpServletResponse response)
                                  throws ServletException, IOException {
        PrintWriter out=response.getWriter();
        response.setContentType("text/html");

        new Mailer().sendMessage("someone@something.com", ...);

        out.println("mail has been sent");
    }
}

public class Mailer {
    public void sendMessage(String from, ...) {
        Message message =new MimeMessage(session1);
        message.setFrom(new InternetAddress("someone@something.com"));
        message.setRecipients(...);
        message.doSomeOtherStuff();
        Transport.send(message);
    }
}

我想这可能就是您最初想要的:一个请求调度器。来自Sun示例文档:

public class Dispatcher extends HttpServlet {
   public void doGet(HttpServletRequest request, 
         HttpServletResponse response) {
      request.setAttribute("selectedScreen",
         request.getServletPath());
      RequestDispatcher dispatcher =
         request.getRequestDispatcher("/template.jsp");
      if (dispatcher != null)
         dispatcher.forward(request, response);
   }
   public void doPost(HttpServletRequest request, 
            HttpServletResponse response) {
      request.setAttribute("selectedScreen",
         request.getServletPath());
      RequestDispatcher dispatcher =
         request.getRequestDispatcher("/template.jsp");
      if (dispatcher != null)
         dispatcher.forward(request, response);
   }
}
这似乎是为同一容器中的不同servlet、JSP或其他资源指定一个新URL,以生成响应,而不是当前servlet

从这里的教程:

您可以使用

因此,代码如下所示:

LoginServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
    response.setContentType("text/html");
    PrintWriter pw = response.getWriter();
            String emailID = "abc@abc.com"; //Write code to retrieve email id from MySql and store in emailID variable
    request.setAttribute("emaiID", emailID);
    RequestDispatcher rd = request.getRequestDispatcher("MailServlet");
    rd.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
    response.setContentType("text/html");
    PrintWriter pw = response.getWriter();
    String value = (String) request.getAttribute("emaiID");
    pw.println("The value of email id is: " + value);
}
MailServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
    response.setContentType("text/html");
    PrintWriter pw = response.getWriter();
            String emailID = "abc@abc.com"; //Write code to retrieve email id from MySql and store in emailID variable
    request.setAttribute("emaiID", emailID);
    RequestDispatcher rd = request.getRequestDispatcher("MailServlet");
    rd.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
    response.setContentType("text/html");
    PrintWriter pw = response.getWriter();
    String value = (String) request.getAttribute("emaiID");
    pw.println("The value of email id is: " + value);
}

如果你不清楚这个答案,请告诉我。

你的观点很好,但我宁愿以
LoginServlet
Mailer
结束。整个
MailServlet
是不必要的。我的项目涉及applet作为前端,servlet作为后端。由于MailServlet需要电子邮件ID,LoginServlet提供了它。因此需要进行servlet间的通信。我同意-您可能不需要MailServlet。您应该有一个LoginServlet,然后是一个servlet,用于用户登录时将要访问的页面。邮件可以由另一个servlet在后台完成。您想要MailServlet的唯一原因是,用户必须转到特定屏幕来配置其邮件首选项,或者设置要发送的邮件。有一个基于servlet的体系结构是有意义的,但这并不意味着每个操作都需要自己的servlet。@mithun:只有当您想控制/预处理/后处理HTTP请求时,servlet才有用。在基本的扁平化JSP/Servlet设置中,每个JSP页面应该只考虑一个Servlet。您有一个登录JSP。所以你需要一个登录服务。您没有邮件JSP。因此,您不需要MailServlet。让它成为一个普通的Java类。例如,
Mail-Mail=新邮件(发件人、收件人、主题、邮件);Mailer-Mailer=新的Mailer();发送(邮件)左右。在任何情况下,如果您真的需要从一个servlet转到另一个servlet,重定向是实现这一点的方法。这似乎超出了我的理解,因为我对servlet不太熟悉。不管怎样,你的第一个答案解决了这个问题。这并不是我所期望的答案,但它还是成功了。