在SpringMVC中实现程序启动时加载数据库中内容
来源:互联网 发布:java 调用浏览器打印 编辑:程序博客网 时间:2024/05/16 17:09
因为需要在程序启动时加载相关系统参数,所以百度了很多,现在做个记录。
一、使用servlet(失败)
1、继承HttpServlet类,并在构造方法中处理
public class ViewServlet extends HttpServlet {public ViewServlet() {System.out.println("这是一个测试构造函数Servlet");}}
2、在web.xml中配置servlet的启动顺序
<servlet> <servlet-name>viewServlet</servlet-name> <servlet-class>com.util.classUtil.ViewServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet>
这里的<load-on-startup>2</load-on-startup>就是启动顺序
a、当值为0或者大于0时,表示容器在应用启动时就加载这个servlet
b、当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载
c、正数的值越小,启动该servlet的优先级越高
(在这里我不把其设置为1是应为我想要spring的DispatcherServlet先执行)
这个方法的弊端在于我没法获取application,我使用
ServletContext application = this.getServletContext();// 获取application得到的是null(如果有获取的方法,知道的大牛记得高诉我)
二、实现ServletContextListener接口(失败)
1、实现ServletContextListener接口,并在contextInitialized方法中处理
public class ViewListener implements ServletContextListener {/** * 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。 */ @Overridepublic void contextDestroyed(ServletContextEvent arg0) {System.out.println("这是Listener的结束");}/*@Autowiredprivate UserService userService;*//** * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化, * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。 */@Overridepublic void contextInitialized(ServletContextEvent sce) { System.out.println("这是Listener的开始");/* try {TBLBaseUser user= dao.findByName("张三");System.out.println("name:"+user.getUserName()+"\t psw:"+user.getPassword());} catch (Exception e) {e.printStackTrace();}*/ ServletContext application = sce.getServletContext(); application.setAttribute("test", "this is test!");}}2、在web.cml中配置listener
<listener> <listener-class>com.util.classUtil.ViewListener</listener-class> </listener>
这时候application的问题解决,但是新的问题出现了。我无法使用spring的数据层了。
将上面的/***/中注释的代码弄出来,调断点的时候发现userService根本就没有被初始化。
毕竟listener没法像servlet那样设定执行顺序,在该listener执行的时候spring的配置还没执行完呢
三、继承ServletContextAware类(成功)
1、继承spring自带的ServletContextAware类,并在setServletContext方法中处理
public class SpringViewListener implements ServletContextAware{@Autowiredprivate UserService userService;@Overridepublic void setServletContext(ServletContext sc) {TBLBaseUser user=null; try {user = userService.findByName("张三");System.out.println("name:"+user.getUserName()+"\t psw:"+user.getPassword());} catch (Exception e) {} sc.setAttribute("userName", user.getUserName()); }
2、在applicationContext.xml中配置bean
<bean class="com.util.classUtil.SpringViewListener"/>
此时application照样没问题,但是加上数据库那部分就报错了,具体错误我就不贴了,大致意思就是Autowired在这里用不了。
毕竟Autowired是应该在service或者Controller中才能使用的,所以这里我们应该吧bean按照service或者Controller的方式来配。
我这里调用的是service中的方法,那么这个bean就应该配成Controller
我之前都是按注解配的,这里也这样就可以了:
1、把之前在在applicationContext.xml中配置的删除
<bean class="com.util.classUtil.SpringViewListener"/>2、在SpringViewListener上加上@Controller
好了,到这里application和数据层的问题都解决了。有看到这篇笔记的筒子们有别的实现方法的也希望能告诉我。
- 在SpringMVC中实现程序启动时加载数据库中内容
- web服务刚启动时SpringMVC注解就加载一定的数据库数据进入内存中
- 在VC中实现程序在启动时隐藏
- VC中实现程序在启动时隐藏
- VC中实现程序在启动时隐藏
- zz VC中实现程序在启动时隐藏
- SpringMVC项目中启动自加载Listener
- hqldb数据库在java程序中以内存方式启动
- MFC 中Combo加载数据库内容
- 在程序中加载控件
- 在“运行”中启动程序
- javascript动态在<div>中加载内容
- ARM7在嵌入式应用中启动程序的实现
- ARM7在嵌入式应用中启动程序的实现
- 在C#中启动另一个程序的实现方法
- ARM7在嵌入式应用中启动程序的实现
- ARM7在嵌入式应用中启动程序的实现
- Java+SpringMVC中自实现定时加载更新数据库数据到内存的方法
- Java栈和堆的区别
- This node has namespaceId '1902198261 and clusterId 'CID-0ce44319-7032-49ec-83e5-4df0782a0d4e' but t
- HDU 3829 Cat VS Dog(二分图最大独立集)
- android的Unable to instantiate activity ComponentInfo异常
- leetcoode 2.Add Two Numbers--链表
- 在SpringMVC中实现程序启动时加载数据库中内容
- iOS 图片上画文字
- 同网段修改VIP
- solaris 5.10双机需要交换机配置port fast
- 年会的感悟,总结
- 编译ionic项目的时候提示: Please install the Android build tools version 19.1.0 or higher.
- HDU2104 hide handkerchief 贪心
- js检查某个元素在数组中的索引值
- 每天一个linux命令(20):find命令之exec