資源注射是從JavaEE 5.0開始出現,實現了Tomcat在啟動時自動將web.xml中的配置信息“注射”到Servlet中。資源注射是通過Annotation完成,Annotation是一種特殊的接口,以"@"為標志,用法如下:
- @Resource (name="messageNameInWebXml")
- private String message;
有時為了簡潔,上面的兩行代碼可以縮寫為一行:
- private @Resource(name="messageNameInWebXml") String message;
加入@Resource注釋后,Tomcat會在Servlet運行時將變量message的值注入,這個值設置在web.xml中名為messageNameInWebXml的參數中。
下面用實例來說明:
- package com.hello.servlet;
-
- import java.io.*;
- import javax.annotation.Resource;
- import javax.servlet.*;
- import javax.servlet.http.*;
-
- public class InjectionServlet extends HttpServlet{
- private @Resource(name="hello") String hello;
- private @Resource(name="i") int i;
-
- @Resource(name="persons")
- private String persons;
-
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
- response.setCharacterEncoding("UTF-8");
- request.setCharacterEncoding("UTF-8");
-
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional //EN\">");
- out.println("<HTML>");
- out.println("<HEAD><TITLE>資源注入</TITLE></HEAD>");
- out.println("<style>body{font-size:12px;}</style>");
-
- out.println("<b>注入的字符串</b>: <br/> - " + hello +"<br />");
- out.println("<b>注入的整數</b>: <br/> - " + i +"<br />");
- out.println("<b>注入的字符串數組</b>: <br/>");
- for(String person : persons.split(",")){
- out.println(" - " + person +"<br />");
- }
-
- out.println("<BODY>");
- out.println("</BODY>");
- out.println("</HTML>");
- out.flush();
- out.close();
- }
- }
下一步,在web.xml中使用標簽<env-entry>來配置資源。<env-entry>僅能配置java.lang包下標準類型的變量,如String, Integer, Double等。配置后的代碼如下:
- <servlet>
- <servlet-name>InjectionServlet</servlet-name>
- <servlet-class>com.hello.servlet.InjectionServlet</servlet-class>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>InjectionServlet</servlet-name>
- <url-pattern>/servlet/InjectionServlet</url-pattern>
- </servlet-mapping>
-
- <!-- 下面是資源配置 -->
- <env-entry>
- <env-entry-name>hello</env-entry-name>
- <env-entry-type>java.lang.String</env-entry-type>
- <env-entry-value>Hello, Welcome to the JavaEE Resource Injection</env-entry-value>
- </env-entry>
-
- <env-entry>
- <env-entry-name>i</env-entry-name>
- <env-entry-type>java.lang.Integer</env-entry-type>
- <env-entry-value>14</env-entry-value>
- </env-entry>
-
- <env-entry>
- <env-entry-name>persons</env-entry-name>
- <env-entry-type>java.lang.String</env-entry-type>
- <env-entry-value>Helloween, Cobain, Roses, WLJ, </env-entry-value>
- </env-entry>
資源注射的原理:JNDI
InjectionServlet實例中使用<env-entry>配置了名為hello, i, persons的JNDI資源,然后使用@Resource將指定名稱的JNDI資源注射到InjectionServlet里。如果不使用@Resource,直接通過JNDI也可以獲取這三個參數,代碼如下:
- Context ctx = new InitialContext();
- String message = (String)ctx.lookup("message");
- Integer i = (Integer)ctx.lookup("i");
- String persons = (String)ctx.lookup("persons");
|