1. 程式人生 > >運用spring監聽器 對頁面資料進行初始化

運用spring監聽器 對頁面資料進行初始化

最近在做一個個人部落格的demo,部落格首頁需要很多的資訊,比如博主的資訊,部落格類別的資訊,按照時間對部落格進行分組等資訊.這些資訊一般情況下都是靜態的,除非進入後臺對這些資訊進行修改.

今天在搜尋資料時搜尋到了一種方法,可以運用在頁面初始化資訊上.

就是利用 spring監聽器,在啟動spring時進入方法,然後對資料庫進行搜尋查詢,得到想要的資料後,將其放在application當中,也就是JSP九大內建物件中生命週期最長範圍最大的內個.

程式碼如下:

首先要配置監聽器方法:

package com.blog.service.common.Impl;

import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import com.blog.entity.Blog;
import com.blog.entity.BlogType;
import com.blog.entity.Blogger;
import com.blog.entity.Link;
import com.blog.service.background.Impl.*;

/**
 * title:InitComponent.java
 * description:初始化元件 把博主資訊 根據部落格類別分類資訊 根據日期歸檔分類資訊 
 * 		                   存放到application中,用以提供頁面請求效能
 */
@Component
public class InitComponent implements ServletContextListener,ApplicationContextAware{
	
	

	private static final Logger log=LoggerFactory.getLogger(InitComponent.class);
	
	//其實這個就是spring的IOC容器-spring上下文應用程式
	private static ApplicationContext applicationContext;
	
	@SuppressWarnings("static-access")
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext=applicationContext;
	}

	public void contextInitialized(ServletContextEvent servletContextEvent) {
		//application:整個javaWeb應用的頁面作用域:生命週期是整個應用 ,可以往此物件中繫結一些經常需要訪問的物件供某些經常訪問的頁面如首頁使用
		ServletContext application=servletContextEvent.getServletContext();
		
		//Spring IOC容器中獲取各個bean
		BloggerService bloggerService=(BloggerService) applicationContext.getBean("bloggerService");
		Blogger blogger=bloggerService.getBlogger(); // 查詢博主資訊
		blogger.setPassword(null);
		application.setAttribute("blogger", blogger);
		
		BlogTypeService blogTypeService=(BlogTypeService) applicationContext.getBean("blogTypeService");
		List<BlogType> blogTypeCountList=blogTypeService.countList(); // 查詢部落格類別以及部落格的數量
		application.setAttribute("blogTypeCountList", blogTypeCountList);
		
		BlogService blogService=(BlogService) applicationContext.getBean("blogService");
		List<Blog> blogCountList=blogService.countList(); // 根據日期分組查詢部落格
		application.setAttribute("blogCountList", blogCountList);
		
		LinkService linkService=(LinkService) applicationContext.getBean("linkService");
		List<Link> linkList=linkService.getAllLink(); // 查詢所有的友情連結資訊
		application.setAttribute("linkList", linkList);
		
		String ctx=application.getRealPath("/");
		
		log.debug("根路徑:{} ",ctx);
		application.setAttribute("ctx", ctx);
	}

	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		
	}


}

注意一點,在這裡無法運用@Autowired自動注入來獲取service層,只能通過getBean的方式來獲取.

getBean中的引數是在配置@Service層時的引數,

例如:

寫完這個監聽器發放後,還要去配置web.xml,也就是說要告訴spring,這裡有一個我們自己的監聽器要去執行.

<!-- spring自身監聽的配置,必須放在自定義的前面 -->  
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  




  	<!-- 監聽器:初始化元件 用於將一些頁面需要經常訪問的資訊 存放到JavaWeb整個應用,生命週期為:從應用一啟動到結束 ->起到類似快取的作用 -->
	<listener>
		<listener-class>com.blog.service.common.Impl.InitComponent</listener-class>
	</listener>

配置完畢後,就可以啟動了,可以斷點除錯,在監聽器中打斷點.啟動專案,就會進入斷點,我們可以檢視.

前臺利用JSTL表示式就可獲取到存在application中的資料..