меж сервлетная связь - PullRequest
2 голосов
/ 15 мая 2010

У меня есть два сервлета: LoginServlet и MailServlet. LoginServlet запрашивает таблицу mysql, используя jdbc, чтобы получить строку (eMail). Я хочу переслать эту строку в MailServlet, который, в свою очередь, отправит электронное письмо на этот идентификатор электронной почты, отправленный LoginServlet.

Мой вопрос: как мне вызвать и отправить переменную eMail в MailServlet, из LoginServlet? Я думал о создании экземпляра MailServlet как:

MailServlet servlet = new MailServlet ();

А затем используйте объект сервлета для вызова функции doGet () в MailServlet. Но я чувствую, что в этом есть какая-то ошибка, так как это неправильный способ вызова сервлета. Так как мне вызвать и передать переменную в MailServlet?

Ответы [ 3 ]

2 голосов
/ 15 мая 2010

Цель сервлета - ответить на HTTP-запрос. Что вы должны сделать, это реорганизовать ваш код так, чтобы логика, которую вы хотите, была отделена от другого сервлета, и вы можете использовать ее независимо. Так, например, вы можете получить класс Mailman и MailServlet, который использует Mailman для своей работы. Нет смысла вызывать сервлет из другого сервлета.

Если после перехода на первую страницу вам нужно перейти на другую страницу, используйте перенаправление:

http://www.java -tips.org / Java-EE-советы / Java-сервлет / как к редирект-а-запроса с использованием-servlet.html

Edit:

Например, предположим, у вас есть такой сервлет:

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);
    }
}
1 голос
/ 09 октября 2013

Вы можете использовать метод forward () из

RequestDispatcher

Таким образом, код выглядит следующим образом:

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);
}

MailServlet.java

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);
}

Дайте мне знать, если этот ответ вам не понятен.

1 голос
/ 16 мая 2010

Я думаю, это может быть то, что вы изначально искали: диспетчер запросов. Из 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);
   }
}

Похоже, для указания нового URL-адреса для другого сервлета, JSP или другого ресурса в том же контейнере генерируется ответ вместо текущего сервлета.

Из учебника здесь: http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags6.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...