分享

在web.xml中使用资源注射(@Resource) (Tomcat7此路不通,Tomcat6大多可以)

 喜气蜘蛛 2014-03-01

资源注射是从JavaEE 5.0开始出现,实现了Tomcat在启动时自动将web.xml中的配置信息“注射”到Servlet中。资源注射是通过Annotation完成,Annotation是一种特殊的接口,以"@"为标志,用法如下:

  1. @Resource (name="messageNameInWebXml")  
  2. private String message;  

有时为了简洁,上面的两行代码可以缩写为一行:

  1. private @Resource(name="messageNameInWebXml") String message;  
加入@Resource注释后,Tomcat会在Servlet运行时将变量message的值注入,这个值设置在web.xml中名为messageNameInWebXml的参数中。

下面用实例来说明:

  1. package com.hello.servlet;  
  2.   
  3. import java.io.*;  
  4. import javax.annotation.Resource;  
  5. import javax.servlet.*;  
  6. import javax.servlet.http.*;  
  7.   
  8. public class InjectionServlet extends HttpServlet{  
  9.     private @Resource(name="hello") String hello;  
  10.     private @Resource(name="i") int i;  
  11.       
  12.     @Resource(name="persons")  
  13.     private String persons;  
  14.   
  15.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{  
  16.       response.setCharacterEncoding("UTF-8");  
  17.       request.setCharacterEncoding("UTF-8");  
  18.   
  19.       response.setContentType("text/html");  
  20.       PrintWriter out = response.getWriter();  
  21.       out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional //EN\">");  
  22.       out.println("<HTML>");  
  23.       out.println("<HEAD><TITLE>资源注入</TITLE></HEAD>");  
  24.       out.println("<style>body{font-size:12px;}</style>");  
  25.         
  26.       out.println("<b>注入的字符串</b>: <br/>   - " + hello +"<br />");  
  27.       out.println("<b>注入的整数</b>: <br/>   - " + i +"<br />");  
  28.       out.println("<b>注入的字符串数组</b>: <br/>");  
  29.       for(String person : persons.split(",")){  
  30.           out.println("  - " + person +"<br />");  
  31.       }  
  32.         
  33.       out.println("<BODY>");  
  34.       out.println("</BODY>");  
  35.       out.println("</HTML>");  
  36.       out.flush();  
  37.       out.close();  
  38.     }   
  39. }  

下一步,在web.xml中使用标签<env-entry>来配置资源。<env-entry>仅能配置java.lang包下标准类型的变量,如String, Integer, Double等。配置后的代码如下:

  1. <servlet>  
  2.     <servlet-name>InjectionServlet</servlet-name>  
  3.     <servlet-class>com.hello.servlet.InjectionServlet</servlet-class>  
  4. </servlet>  
  5.   
  6. <servlet-mapping>  
  7.     <servlet-name>InjectionServlet</servlet-name>  
  8.     <url-pattern>/servlet/InjectionServlet</url-pattern>  
  9. </servlet-mapping>  
  10.   
  11. <!-- 下面是资源配置 -->  
  12. <env-entry>  
  13.     <env-entry-name>hello</env-entry-name>  
  14.     <env-entry-type>java.lang.String</env-entry-type>  
  15.     <env-entry-value>Hello, Welcome to the JavaEE Resource Injection</env-entry-value>  
  16. </env-entry>  
  17.   
  18. <env-entry>  
  19.     <env-entry-name>i</env-entry-name>  
  20.     <env-entry-type>java.lang.Integer</env-entry-type>  
  21.     <env-entry-value>14</env-entry-value>  
  22. </env-entry>  
  23.   
  24. <env-entry>  
  25.     <env-entry-name>persons</env-entry-name>  
  26.     <env-entry-type>java.lang.String</env-entry-type>  
  27.     <env-entry-value>Helloween, Cobain, Roses, WLJ, </env-entry-value>  
  28. </env-entry>  

资源注射的原理:JNDI

        InjectionServlet实例中使用<env-entry>配置了名为hello, i, persons的JNDI资源,然后使用@Resource将指定名称的JNDI资源注射到InjectionServlet里。如果不使用@Resource,直接通过JNDI也可以获取这三个参数,代码如下:

  1. Context ctx = new InitialContext();  
  2. String message = (String)ctx.lookup("message");  
  3. Integer i = (Integer)ctx.lookup("i");  
  4. String persons = (String)ctx.lookup("persons"); 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多