Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring相当于在容器启动后加载主数据的servlet_Spring_Spring Mvc_Servlets - Fatal编程技术网

Spring相当于在容器启动后加载主数据的servlet

Spring相当于在容器启动后加载主数据的servlet,spring,spring-mvc,servlets,Spring,Spring Mvc,Servlets,我的webapp中有一个servlet(基于MVC模型2),它在tomcat容器加载应用程序上下文后加载所有主数据。我想用基于Spring的解决方案来取代它。请注意,它需要访问数据源。我该怎么做 web.xml 加载应用程序的所有主数据以缩短响应时间 主数据加载器 com.mywebapp.web.controllers.MasterDataLoader 10 MasterDataLoader.java 公共类MasterDataLoader扩展了HttpServlet{ 私有静态最终记录器

我的webapp中有一个servlet(基于MVC模型2),它在tomcat容器加载应用程序上下文后加载所有主数据。我想用基于Spring的解决方案来取代它。请注意,它需要访问数据源。我该怎么做

web.xml

加载应用程序的所有主数据以缩短响应时间
主数据加载器
com.mywebapp.web.controllers.MasterDataLoader
10
MasterDataLoader.java
公共类MasterDataLoader扩展了HttpServlet{
私有静态最终记录器LOG=Logger.getLogger(MasterDataLoader.class);
私有静态最终字符串DATASOURCE=“DATASOURCE”;
@凌驾
public void init(ServletConfig config)抛出ServletException{
super.init(config);
loadAll();
}       
私有void loadAll(){
日志调试(“获取应用程序的所有主数据(菜单类别、状态、货运公司、投标类型、产品交叉销售、畅销书等)……”;
ServletContext appContext=getServletContext();
setAttribute(“states”,getAllStates());
}
私有列表getAllState(){
debug(“从数据库获取所有状态…”);
列表状态ST=null;
试一试{
DataSource DataSource=(DataSource)getServletContext().getAttribute(DataSource);
statesLst=newmasterdao(数据源).getAllStates();
}catch(SQLException-ex){
LOG.error(“获取所有状态时出现异常…”);
日志错误(ex);
}
返回状态列表;
}
}

@PostConstruct
注释一个bean的方法,并用这个方法完成工作。中提供的示例正是您想要做的。

为什么不为此编写一个servletcontextlistener?为什么您要“获取主数据”,而不仅仅是使用普通DAO,可能是缓存?我以前从未使用过缓存,在Spring方面也没有太多经验,因此我希望加载所有主数据,例如所有美国州,并将其存储在applicationContext中。我当然可以在ServletContextListener的帮助下做到这一点,但仍然不清楚如何在该侦听器中获取数据源对象。
 <servlet>
        <description>Loads all master data for the application to reduce response time</description>
        <servlet-name>MasterDataLoader</servlet-name>
        <servlet-class>com.mywebapp.web.controllers.MasterDataLoader</servlet-class>
        <load-on-startup>10</load-on-startup>
    </servlet>
public class MasterDataLoader extends HttpServlet {

    private static final Logger LOG = Logger.getLogger(MasterDataLoader.class);
    private static final String DATASOURCE = "dataSource";

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        loadAll();
    }       

    private void loadAll() {
        LOG.debug("Fetching all master data (menu categories, states, freight companies, tender types, product cross sells, best sellers etc.) for the application.........");
        ServletContext appContext = getServletContext();
        appContext.setAttribute("states", getAllStates());
   }

    private List<State> getAllStates() {
        LOG.debug("Fetching all states from db...");
        List<State> statesLst = null;
        try {
            DataSource dataSource = (DataSource) getServletContext().getAttribute(DATASOURCE);
            statesLst = new MasterDao(dataSource).getAllStates();
        } catch (SQLException ex) {
            LOG.error("Exception while fetching all states...");
            LOG.error(ex);
        }
        return statesLst;
    }
}