【问题标题】:Delegating EJB to a Controller class rather than having it in a Servlet directly将 EJB 委托给 Controller 类,而不是将其直接放在 Servlet 中
【发布时间】:2014-03-03 08:58:36
【问题描述】:

我试图不在我的 Servlet 中注入 EJB,目前我将它直接注入到我的 Servlet 中并且它工作正常,但我想将控制权传递给将注入 EJB 的控制器类,并且没有控制器方法或构造函数,它接受 Bean 的引用变量并使用它。我所做的一切都在 JSP 中,我尝试在我的控制器上使用 @ManagedBean 注释,但没有任何效果。我只使用 JSP 而不是 JSF,因为我不熟悉它们。我正在尝试做的事情是可以实现的吗?除了传递 bean 的引用之外,还有其他选择吗?任何光线都受到高度赞赏。谢谢你。目前我的 Servlet 中有以下内容。

 package com.ejb.web;

 import java.io.IOException;

 import javax.ejb.EJB;
 import javax.servlet.RequestDispatcher;
 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 com.ejb.customer.domain.Customer;
 import com.ejb.customer.service.CustomerLocal;
 import com.ejb.customer.util.DateUtil;

 /**
   * Servlet implementation class Servlet
 */
   @WebServlet("/customer")
   public class Dispatcher extends HttpServlet {
 private static final long serialVersionUID = 1L;

 @EJB
 CustomerLocal customerLocal;

   /**
     * @see HttpServlet#HttpServlet()
     */
      public Dispatcher() {
        super();
     }

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)    throws ServletException, IOException {


    String name = request.getParameter("name");
    String surname = request.getParameter("surname");
    String dateOfBirth = request.getParameter("dateOfBirth");

    Customer customer = new Customer();
    customer.setName(name);
    customer.setSurname(surname);
    customer.setDateOfBirth(DateUtil.convertToDate(dateOfBirth));

    System.out.println("Starting .....Adding");
    System.out.println(customerLocal);
        customerLocal.addCustomer(customer);
    System.out.println("Done .....Adding");
    request.setAttribute("customers",customerLocal.getCustomers());

    RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");

    rd.forward(request, response);

 }


}

而我想要达到的目标就是这些。

 package com.ejb.web;

 import java.io.IOException;

 import javax.ejb.EJB;
 import javax.servlet.RequestDispatcher;
 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 com.ejb.customer.domain.Customer;
 import com.ejb.customer.service.CustomerLocal;
 import com.ejb.customer.util.DateUtil;

 /**
   * Servlet implementation class Servlet
 */
   @WebServlet("/customer")
   public class Dispatcher extends HttpServlet {
 private static final long serialVersionUID = 1L;

 @Inject
 Controller controller;

   /**
     * @see HttpServlet#HttpServlet()
     */
      public Dispatcher() {
        super();
     }

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)    throws ServletException, IOException {


    String name = request.getParameter("name");
    String surname = request.getParameter("surname");
    String dateOfBirth = request.getParameter("dateOfBirth");

    Customer customer = new Customer();
    customer.setName(name);
    customer.setSurname(surname);
    customer.setDateOfBirth(DateUtil.convertToDate(dateOfBirth));

    System.out.println("Starting .....Adding");
    System.out.println(customerLocal);
        ccontroller.addCustomer(customer);
    System.out.println("Done .....Adding");
    request.setAttribute("customers",controller.getCustomers());

    RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");

    rd.forward(request, response);

 }


}

控制器类执行以下操作。

    package com.ejb.customer.util;

    import java.util.List;
    import javax.annotation.ManagedBean;
    import javax.ejb.EJB;
    import javax.enterprise.context.SessionScoped;
    import com.ejb.customer.domain.Customer;
    import com.ejb.customer.service.CustomerLocal;

     @ManagedBean
      @SessionScoped
    public class Controller {

 @EJB
 CustomerLocal customerLocal;

public void addCustomer(Customer customer) {
customerLocal.addCustomer(customer);
}

public List getCustomers() {
    return customerLocal.getCustomers();
}

    }

抱歉缩进不好

【问题讨论】:

  • 你有什么例外吗?您是否尝试过使用 CDI bean 而不是 ManagedBean?
  • 嗨 Jakub Hr,谢谢你的回复,是的,我收到一个 NPE 错误,表明控制器和 bean 没有被实例化,我没有尝试使用 CDI,我会给出一个试试
  • 这可能会更好,因为如果您不使用支持它的框架(最值得注意的是:JSF),@ManagedBean 不会做太多事情。
  • 感谢 Gimby,我不知道我必须使用框架来支持 @ManagedBean,一旦我开始做 JSF,我就会这样做,目前我想用 JSF 做所有事情,只是 JSP仅限。

标签: java jakarta-ee servlets ejb ejb-3.0


【解决方案1】:

假设此代码可以编译,那么您将引用不同的控制器类。您正在从 com.ejb.web 包中注入一个控制器,但这里的控制器来自 com.ejb.customer.util 包。您还可以摆脱 ManagedBean 引用,因为您使用的是 CDI 范围。

如果您想在 JSF 页面中使用此控制器,请使用 @Named 而不是 @ManagedBean。

【讨论】:

  • 感谢 Mamboking 的回复,在这我可以选择不使用 JSF 吗?因为我还没有开始做,所以我只是想看看我是否可以使用 JSP 来做。
  • 它与 JSP 的工作方式相同。添加一个@Named,然后您就可以在JSP 中引用您的控制器。但是,您确实应该考虑 JSF。 JSP 仅包含在较新的 java ee 中以实现向后兼容性。
猜你喜欢
  • 2018-05-07
  • 2011-10-24
  • 2017-02-05
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2011-02-02
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多