译文

在Java EE 5平台上Plain Old WebContainer是否仍是合适的选择?

翻译:家常咖啡 | 2009-04-08 11:28:12 | 阅读618 | 来源

J2EE 1.4特别是EJB 2.X技术不便于高效地进行开发,所以转向POJO和Web容器成为许多“企业级”项目的选择。
一些项目甚至搭建自己的架构,为的就是避免使用EJB 2.0。然而,如今开发环境和运行环境已经发生了巨大的变化。Java EE 5 和EJB 3.0 为开发尤其是部署模式带来了显著地简化。巨大的部署描述符不再需要(甚至根本不再需要XML) ,开发一个 session bean只需要一个类和一个接口。 实际上对EJB 3.0已经很难再做进一步的简化 (欢迎提出你的意见)。
有趣的是:在Java EE 5中,不含EJB 3 Session Bean 的Web应用反而相比显得复杂。我从蓝皮书 中拷贝了下面的例子,我们来看看不用EJB时,需要哪些额外的代码:

@PersistenceContext(name="foo", unitName="myPuName")
public class MyServlet extends HttpServlet {

@Resource UserTransaction utx;

  public void doGet(HttpServletRequest req,
                    HttpServletResponse resp) throws throws ServletException, IOException {

    EntityManager em = (EntityManager) ic.lookup("java:comp/env/foo");

    //get data from request
    String name = request.getParameter("item_name");
    ...
    //create new Item entity
    Item item = new Item();
    //set values of Item entity
    item.setName(name);
    ...
    utx.begin();
    em.persist(item); //persist and add new Item to database
    utx.commit();
    ...
}
当然没有人愿意在Servlet中直接使用EntityManager,而是会在比如Struts的 Action或是JSF的managed bean中使用,但是你同样必须小心地处理lookup,线程安全和事务管理,如上面例子所示。

这种情形可以通过使用Session Bean来显著地做到简化,因为容器会来处理EntityManager,并发以及事务。

servlet的代码如下所示:

public class MyServlet extends HttpServlet {

@EJB ItemMgr mgr;

public void doGet(HttpServletRequest req,
                    HttpServletResponse resp) throws throws ServletException, IOException {
...
mgr.addItem("name of item");

EJB bean的代码也非常简单:

public class ItemMgrBean{

@PersistenceContext EntityManager em;

public void addItem(String name){
    Item item = new Item();
    item.setName(name);
    em.persist(item);
}


这里的代码简单而且清晰。资源被管理并被注入到容器中。通过使用Session Bean技术,可管理性和可监控性明显提高。通过像Glassfish的 call flow 这样的工具,你可以监控整个调用过程的性能。最酷的事是,XML的配置仍是可选的。在EJB 3.1中甚至连local interfaces也是可选的。 EJB在3.1之后,不会再有简化的空间了:-)

分享:

标签:Java,GlassFish,ejb,ee,

添加评论