非Action中获取Spring DAO的技巧

需积分: 3 2 下载量 89 浏览量 更新于2024-09-20 收藏 2KB TXT 举报
"在Action之外的地方获取DAO主要是为了在非控制器层(如自定义标签、过滤器或服务组件)能够访问Spring容器中的Bean。通过ApplicationContext接口可以实现这一目标,ApplicationContext提供了对应用程序上下文的访问,使得我们可以从其中获取任何已配置的Bean。这里介绍两种在非Action中获取ApplicationContext的方法。 首先,可以使用`WebApplicationContextUtils.getWebApplicationContext(ServletContext)`方法,它需要一个ServletContext对象作为参数。ServletContext可以从HttpServletRequest的`request.getServletContext()`方法中获取。这种方式适用于在有HTTP请求上下文的场景,例如在Servlet或Filter中。 其次,`WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext)`方法与前一种类似,但它会在ApplicationContext未找到时抛出异常,确保ApplicationContext总是存在的。这通常用于那些必须依赖ApplicationContext的场景,因为如果没有找到ApplicationContext,程序将无法继续运行。 在实际应用中,我们需要在web.xml中配置`ContextLoaderServlet`来初始化Spring的ApplicationContext。配置如下: ```xml <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> ``` 这里指定了Spring的配置文件位置(/WEB-INF/applicationContext.xml),`load-on-startup`标签表示在服务器启动时加载该Servlet。 在JSP页面中,我们也可以使用类似的逻辑来获取ApplicationContext和Bean。例如,假设我们需要获取名为`CategoryService`的Bean,可以这样做: ```jsp <%@page import="org.springframework.context.ApplicationContext"%> <%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%> <%@page import="com.yourcompany.service.CategoryService"%> <% ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); CategoryService cs = (CategoryService) ctx.getBean("CategoryService"); List list = cs.getCategoryDAO().findAll(); %> ``` 在上述代码中,我们首先获取ApplicationContext,然后通过`getBean`方法得到`CategoryService`实例,并调用其方法获取数据。这种方式避免了直接在JSP中进行业务逻辑处理,保持了Model-View-Controller(MVC)架构的清晰性,同时防止用户直接访问JSP导致的安全问题。" 以上内容详细阐述了如何在Action之外的地方获取DAO,包括使用`WebApplicationContextUtils`工具类以及相关的配置和示例,以确保非控制器组件也能正确地使用Spring容器管理的Bean。