在web项目中,首页的很多内容都需要从数据库中来获取,但是默认初始加载页面并不会加载出来数据库中的数据,这时,我们需要对数据进行 “预加载”

一 设置初始页面ResultMapping

@Controller
@RequestMapping("/")
public class BookController {@Autowiredprivate CategoryService categoryService;public String toIndex(HttpServletRequest httpServletRequest){List<Category> categorys = categoryService.listCategory();System.out.println(categorys);httpServletRequest.getSession().getServletContext().setAttribute("categorys",categorys);return "index";}
}

如果使用这种方式实现,当其他页面访问首页时,填写访问地址会非常不方便,如何改进呢?使用 window.location.href重定位

二 window.location.href

现在,访问首页数据的controller变成了这样

@Controller
@RequestMapping("home")
public class BookController {@Autowiredprivate CategoryService categoryService;@RequestMapping("index")public String toIndex(HttpServletRequest httpServletRequest){List<Category> categorys = categoryService.listCategory();System.out.println(categorys);httpServletRequest.getSession().getServletContext().setAttribute("categorys",categorys);return "index";}
}

在index.jsp中,我们编写这样一段代码

<script>
window.onload = function(){window.location.href = "${pageContext.request.contextPath}/home/index";}
</script>

如果用jquery,代码更简洁~

<script>$(function () {window.location.href = "${pageContext.request.contextPath}/home/index";})
</script>

这样设置,在页面加载之初,就会访问"${pageContext.request.contextPath}/home/index"这个路径,从而也就实现了数据的预加载

三 <jsp:forward page="后台需要接收的请求"></jsp:forward>

index.jsp作为首页,无法加载需要的页面数据,那么可以让index.jsp不作为展示数据用,用index.jsp直接跳转其他页面;

index.jsp里加<jsp:forward page="SSM后台接收的请求"></jsp:forward>,携带数据跳转到真正的首页。

四 监听器实现

在传统javaweb中,我们可以使用监听器来实现页面数据预加载

@WebListener
public class ApplicationListener implements ServletContextListener {public void contextDestroyed(ServletContextEvent sce)  { // 监听器销毁时调用该方法}public void contextInitialized(ServletContextEvent sce)  { // 监听器初始化调用该方法//1.获取application对象ServletContext application = sce.getServletContext();//2.查询公告信息存储到application对象中ReportServiceImpl reportServiceImpl = new ReportServiceImpl();List<Report> list = reportServiceImpl.listReport();application.setAttribute("reports", list);//3.查询所有的书籍信息存储到application对象中//4.查询一级分类以及二级分类信息存储到application对象中}}

如果我们在ssm中使用监听器,利用IOC的特性,代码变成了这个样子

@WebListener
public class ApplicationListener implements ServletContextListener {@Autowired private ReportService reportService;public void contextDestroyed(ServletContextEvent sce)  { // 监听器销毁时调用该方法}public void contextInitialized(ServletContextEvent sce)  { // 监听器初始化调用该方法//1.获取application对象ServletContext application = sce.getServletContext();//2.查询公告信息存储到application对象中List<Report> list = reportService.listReport();application.setAttribute("reports", list);//3.查询所有的书籍信息存储到application对象中//4.查询一级分类以及二级分类信息存储到application对象中}}

报错了!以上代码在项目启动时会抛出空指针异常!

原因是在ssm中,我们使用依赖注入的方式来操作对象,spring容器会帮助我们管理,监听器的生命周期是由servlet容器(例如tomcat)管理的,项目启动时上例中的ConfigListener是由servlet容器实例化并调用其contextInitialized方法,而servlet容器并不认得@Autowired注解,因此导致ConfigService实例注入失败。

如何解决呢?

这就需要用到spring为我们提供的WebApplicationContextUtils工具类,该工具类的作用是获取到spring容器的引用,进而获取到我们需要的bean实例。

public class PageListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 监听器初始化调用该方法//1.获取application对象System.out.println("listen调用");ServletContext application = sce.getServletContext();
//        //2.查询公告信息存储到application对象中ReportServiceImpl reportService = WebApplicationContextUtils.
getWebApplicationContext(sce.getServletContext()).getBean(ReportServiceImpl.class);List<Report> list = reportService.listReport();application.setAttribute("reports", list);//3.查询所有的书籍信息存储到application对象中//4.查询一级分类以及二级分类信息存储到application对象中}@Overridepublic void contextDestroyed(ServletContextEvent sce) {}
}

以上代码有一个前提,那就是servlet容器在实例化ConfigListener并调用其方法之前,要确保spring容器已经初始化完毕!而spring容器的初始化也是由Listener(ContextLoaderListener)完成,因此只需在web.xml中先配置初始化spring容器的Listener,然后在配置自己的Listener,配置如下

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><listener><listener-class>自己的路径</listener-class>
</listener>

ssm预先加载数据的四种方式相关推荐

  1. ajax加载vue数据,详解使用Vue.Js结合Jquery Ajax加载数据的两种方式

    整理文档,搜刮出一个使用vue.js结合jquery ajax加载数据的两种方式的代码,稍微整理精简一下做下分享. 废话不多说,直接上代码 html代码 demo {{message }} 测试jqu ...

  2. Vue动态加载组件的四种方式

    动态加载组件的四种方式: 1.使用import导入组件,可以获取到组件 var name = 'system'; var myComponent =() => import('../compon ...

  3. SharePoint 实现ajax异步加载数据的几种方式

    初到公司,由原想的asp.net开发转向了SharePoint(简称SP)开发,个人感觉与之前差别不大,今天用sp实现异步加载数据的时候遇到点问题,之前在asp.net下一步都是用 jquery.aj ...

  4. easyui datagrid加载数据的三种方式

    1.加载本地数据 var obj = {"total":2,"rows":[{id:"1",name:"一"},{id: ...

  5. Extjs formpanel加载数据的两种方式

    1.formpanel数据源和grid相同,使用Form.getForm().loadRecord(row);则数据便可自动加载在formpanel中对应的控件. 2.formpanel数据源是单独的 ...

  6. vue.js 动态加载 html,Vue加载组件、动态加载组件的几种方式

    什么是组件: 组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HT ...

  7. 用python的五种方式_Python加载数据的5种不同方式(收藏)

    数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 作为初学者,您可能只知道一种使用p andas.read_ ...

  8. python数据加载常规教程_Python加载数据的5种不同方式(收藏)

    数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 作为初学者,您可能只知道一种使用p andas.read_ ...

  9. QML for Android 加载图片资源的几种方式

    前言 前段时间用 QML 做一个简单的 android 程序,需要打开 android手机本地图片,原本是一个非常简单的功能,但是碰到一些坑着实的被坑了一把,然而在网上并没有找到相关的文档,这里做个总 ...

最新文章

  1. 求助:谁可以给我点share point 开发的资料
  2. 在vs2005中调用远程WebService(幻想曲)
  3. 【计算理论】自动机设计 ( 设计自动机 | 确定性自动机设计示例 | 确定性与非确定性 | 自动机中的不确定性 )
  4. 供SAPI中TTS功能用使的Win8.1语言包安装
  5. android 捕捉home键
  6. 如何提高PHP代码的质量?第三部分 端到端/集成测试
  7. Linux学习之二十、循环
  8. Atitit callback回调机制大总结 目录 1. 回调机制=Call back, 1 1.1. 1.为什么需要Call back 2 1.2. 模块之间的调用,调用的方式分为几种:1)同步调
  9. 对路径“bin\MySql.Data.xml”的访问被拒绝的解决方法
  10. oracle报错ORA-01843: not a valid month
  11. mysql导入的数据放在那个文件夹下_mysql数据库文件导入
  12. 无惧失败,做一只逆流而上的鱼
  13. oracle自动化巡检报告
  14. Spring aop+自定义注解统一记录用户行为日志
  15. 'wx' is not defined no-undef
  16. 记住,在看小电影前一定要检查下域名是不是 HTTPS 的
  17. 求函数最值(模拟退火算法C++实现)
  18. 根据先序和中序(中序和后序)确定二叉树
  19. 01背包问题 动态规划求解方法 动态方程的详细解释 能理解的解释(附python代码)
  20. 在vCenter中通过修改主机配置文件来更改ESXi主机的root密码

热门文章

  1. 都什么时代了还在裸爬吗,快用IP代理池吧!
  2. mysql简单的分页查询sql语句
  3. Python微信自动回复机器人
  4. jarvis guestbook2 / level6_x64
  5. 基于Kubernetes集群部署完整示例——Guestbook
  6. xlsx、xlsx-style、file-saver导表
  7. gnuplot让您的数据可视化
  8. CCBPM H5版本中组织结构集成以及与外部数据源同步介绍
  9. 四福来轮全向底盘实现画图功能
  10. android开发教程:android调用activity简单方法