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); } } }