快速业务通道

注释在J2EE5.0中的完美应用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18

注释在J2EE5.0中的完美应用

时间:2011-02-28 IT168 极地圣火

随着J2EE进入5.0时代后,J2SE5.0的很多特性也被广泛应用在J2EE程序中。而J2SE5.0的注释(Annotations)特性就是其中应用最广泛的特性之一。

在以前的J2EE版本中,都是使用大量的配置文件来设置Web程序、EJB等。但这一切在J2SE5.0中得到了彻底的改善。在J2EE5.0的注释中的一些是专门针对Web和EJB程序的。如@Resource, @EJB和@WebServiceRef等。其它的一些注释,如@RunAs和@DeclareRoles则和安全相关。

虽然我们可以在不同的Web应用组件(Class类)中使用注释,但却不能在JSP中使用注释。不过我们也不用感到遗憾。虽然无法在JSP中使用注释,但Web库却支持注释。这就意味着我们可以在Servlet过滤器和标签(Tag)库或是其它使用Class的地方使用注释。下面将列举几种注释在J2EE5.0中的应用。

一、在Servlet中使用注释

首先让我们来看看如何在Servlet中使用注释。在本文的例子中,servlet使用一个本地的接口SlessLocal调用了一个企业Bean(在本例子中是一个无状态的会话Bean)。Servlet将一个message对象作为一个请求属性传入到EJB中,并定向到一个JSP页:display.jsp中。为了演示这一过程,下面是servlet的主要代码:

@DeclareRoles({"arole"})   @RunAs("myrole")   public class TestServlet extends HttpServlet {     private @EJB SlessLocal slessLocal;         public void service(       HttpServletRequest req, HttpServletResponse resp)         throws ServletException, IOException {       if (req.isUserInRole("arole")) {         String message = slessLocal.hello("World");         req.setAttribute("EJB_MESSAGE", message);       }         RequestDispatcher rd =         req.getRequestDispatcher("display.jsp");       rd.forward(req, resp);     }   }

从上面的代码可以看到,@EJB注释被用来使用适当的接口查询企业Bean,这些Bean最终将被Servlet调用。@DeclareRoles注释定义了被HttpServletRequest.isUserInRole(String role)使用的角色。isUserInRole方法确定了当前用户是否是被指定的角色。在本例中的角色中只有一个用户“arole”将使Servlet获得“message”字符串,并将其赋给HttpServletRequest属性。

@RunAs注释指定了角色"myrole"可以访问企业Bean方法SlessLocal.hello(String message)。

二、在企业Bean中使用注释

下面是上述的无状态企业Bean的主要代码:

@Stateless   @Local({SlessLocal.class})   public class SlessBean implements SlessLocal {     @RolesAllowed(value={"myrole"})     public String hello(String message) {       return "Hello, " + message + ", " + new Date();     }   }

从上面的代码我们可以注意到hello方法通过使用@RolesAllowed注释被保护了起。这个注释指定了只有用户"myrole"才能访问hello方法。

注释在J2EE5.0中的完美应用(2)

时间:2011-02-28 IT168 极地圣火

三、在JSP和标签库中使用注释

在显示业display.jsp中,调用了JSP标签库中的一个动作,并将属性EJB_MESSAGE作为一个参数传入HttpServletRequest。下面是display.jsp的部分代码:

<%@taglib prefix="di"     uri="http://java.sun.com/techtip/webann/test-taglib"%>   ...    <di:displayInfo ejbMessage="${requestScope.EJB_MESSAGE}"/>   ...

上面所使用的标签将从ejbMessage参数中读取值,并将这个值显示在HTML中。而且它会这数据源打印出登录超时。下面是标签处理类似部分代码:

public class DisplayInfoTagHandler extends SimpleTagSupport {       private @Resource(name="jdbc/__default") DataSource ds;     ...     public void doTag() throws JspException, IOException {      try {        JspWriter out = getJspContext().getOut();        int timeout = ds.getLoginTimeout();        if (ejbMessage != null && ejbMessage.length() > 0)        {          out.println(            "<li> Ejb Message: " + ejbMessage);        }        out.println(          "<li> DataSource login timeout: " + timeout);      ...     }     public void setEjbMessage(String ejbMessage) {      this.ejbMessage = ejbMessage;     }   }

上面代码中的@Resource注释在标签类中使用JNDI"jdbc/__default"来查询DataSource。这个JNDI名对应于默认的数据库。如果我们想访问数据库连接,可以在tag处理类中加入ds.getConnection()。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号