Servlet中的初始化參數、上下文參數、以及@Resource資源注入


  配置初始化參數、上下文參數、以及使用@Resource注解進行資源注入,目的是為了降低代碼的耦合度。當項目需求進行變更的時候,不需要反復更改源代碼,只需更改web.xml文件即可。

一:Servlet的初始化參數和上下文參數

  配置以及使用:

 web.xml: 

  <!-- 配置上下文參數,所有的Servlet中都可以使用 -->
  <context-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
  </context-param>
  
  <!-- 初始化參數Servlet -->
  <servlet>
      <servlet-name>InitParamServlet</servlet-name>
      <servlet-class>cn.woo.servlet.InitParamServlet</servlet-class>
      <!-- 配置初始化參數(用戶名/密碼),僅InitParamServlet中可用 -->
      <init-param>
          <param-name>woo</param-name>
          <param-value>123</param-value>
      </init-param>
      <init-param>
          <param-name>unknown</param-name>
          <param-value>456</param-value>
      </init-param>
      <init-param>
          <param-name>ljl</param-name>
          <param-value>789</param-value>
      </init-param>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>InitParamServlet</servlet-name>
      <url-pattern>/servlet/InitParamServlet</url-pattern>
  </servlet-mapping> 

InitParamServlet.java:

public class InitParamServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 獲取上下文參數,設置請求和響應的編碼格式
        ServletContext servletContext = getServletContext();
        String encoding = servletContext.getInitParameter("encoding");
        req.setCharacterEncoding(encoding);
        resp.setCharacterEncoding(encoding);

        // 獲取用戶名密碼
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        // 判斷用戶名和密碼是否正確,只有正確的用戶才能訪問,私密文件
        ServletConfig servletConfig = getServletConfig();
        // 獲取所有初始化參數的名稱
        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();

        while (initParameterNames.hasMoreElements()) {
            // 獲取每一個初始化參數名
            String name = initParameterNames.nextElement();
            // 獲取參數名稱對應的value
            String pwd = servletConfig.getInitParameter(name);

            if (name.equals(username) && pwd.equals(password)) {
                // 有訪問權限的人[轉發]
                req.getRequestDispatcher("/WEB-INF/notice.html").forward(req, resp);
                return;
            } 
        }
        // 重新返回登錄界面 [轉發到index.html]
        req.getRequestDispatcher("/index.html").forward(req, resp);
    }
}

二:使用@Resource注解,進行資源注入

  該注解不需要Servlet主動去讀取資源,Tomcat啟動的時候會把web.xml文件中配置的信息主動"注入"到Servlet里,該過程是自動完成的。

  *:該注解是從JavaEE 5 規范、Tomcat 6.x 開始支持的功能。

  配置以及使用:

  web.xml (env-entry只能配置java.lang包中標准類型的變量 如:String Integer Double等)

  <!-- 注入的String類型的名稱 -->
  <env-entry>
      <env-entry-name>name</env-entry-name>
      <env-entry-type>java.lang.String</env-entry-type>
      <env-entry-value>woo</env-entry-value>
  </env-entry>
  
  <!-- 注入的Integer類型的年齡 -->
  <env-entry>
      <env-entry-name>age</env-entry-name>
      <env-entry-type>java.lang.Integer</env-entry-type>
      <env-entry-value>23</env-entry-value>
  </env-entry>
  
  <!-- 注入的Double類型的身高 -->
  <env-entry>
      <env-entry-name>height</env-entry-name>
      <env-entry-type>java.lang.Double</env-entry-type>
      <env-entry-value>178.5</env-entry-value>
  </env-entry>
  
   <!-- 注入字符串數組 -->
  <env-entry>
      <env-entry-name>language</env-entry-name>
      <env-entry-type>java.lang.String</env-entry-type>
      <env-entry-value>漢語,英語,韓語</env-entry-value>
  </env-entry>

ResourcesServlet.java

public class ResourcesServlet extends HttpServlet{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    /**
     * 注入用戶名(name屬性名稱要和web.xml文件中的env-entry-name名稱一致,類型也要一致)
     */
    @Resource(name="name")
    private String name;
    
    /**
     * 注入年齡
     */
    @Resource(name="age")
    private Integer age;
    
    /**
     * 注入身高
     */
    @Resource(name="height")
    private Double height;
    
    /**
     * 注入語言數組信息
     */
    @Resource(name="language")
    private String language;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //輸出注入的資源信息
        System.out.println(name);
        System.out.println(age);
        System.out.println(height);
        for (String string : language.split(",")) {
            System.out.println(string);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM