上一節把博客首頁給搭建好了,但是都是一些靜態數據。這一節開始,將首頁裏的靜態數據換掉,動態的從數據庫中取。這一節主要來獲取博主信息和友情鏈接的數據,為什麽要先搞這兩部分的內容呢?因為它們有個特點,數據基本上是不會改變的,那麽也就是說我沒有必要每次請求的時候都去數據庫中獲取,這會影響到系統的性能。
類似的問題,我在寫SSH網上商城系統的時候有提到(?傳送門),原理和那篇文章中提到的一樣,自己寫一個監聽器,在項目啟動的時候就獲取這些基本上不會改變的數據,然後放到application域中,後面每次用到就直接從application域中取,就不用每次都去查數據庫了。只不過在這篇文章中,我用另一種方法去實現。
1. 數據庫數據
首頁要獲取數據,首先要在數據庫中準備數據,先準備博主信息數據和友情鏈接數據。這裏要說明一下,後面在開發後臺頁面的時候,還可以數據庫中信息的,現在先自己手動往數據庫中添加一些數據。如下:
linkorder是用來查詢的時候排序的,我會把最重要的排在友情鏈接的最上面。
2. 動態獲取博主信息
首先完成mybatis中BloggerMapper.xml映射文件和對應的dao接口。
<resultMap type="Blogger" id="BloggerResult"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="profile" column="profile"/> <result property="nickname" column="nickname"/> <result property="sign" column="sign"/> <result property="imagename" column="imagename"/> </resultMap> <select id="getBloggerData" resultMap="BloggerResult"> SELECT * FROM t_blogger WHERE id=1 </select>
因為是個人博客,就一個博主,所以這裏不需要占位符了,直接取id=1的數據即可。對應的dao如下
public interface BloggerDao { //省去不相關代碼 //獲取博主信息 public Blogger getBloggerData(); }
順便寫好service的實現
@Service("bloggerService") public class BloggerServiceImpl implements BloggerService { @Resource private BloggerDao bloggerDao; //省去無關代碼 //獲取博主信息 public Blogger getBloggerData() { return bloggerDao.getBloggerData(); } }
現在獲取數據庫數據的操作都弄好了,接下來就是重點了,我們要在項目啟動的時候,在監聽器中獲取用戶信息,然後放到application域中,由於監聽器是tomcat實例化的,並不是spring實例化的,所以我們不能在監聽器中想通過註入的方式註入進來spring的applicationContext,在之前的那個項目裏,我分析了三種方法獲取,最後使用一個工具類獲取的,在這裏我通過另一種方式,實現ApplicationContextAware接口,這樣也可以獲取是spring的applicationContext。自定義監聽器如下:
@Component public class InitBloggerData implements ServletContextListener, ApplicationContextAware { private static ApplicationContext applicationContext; //必須為靜態的 public void contextInitialized(ServletContextEvent sce) { system.out.println(applicationContext); //先獲取servlet上下文,即application域 ServletContext application = sce.getServletContext(); //根據spring的上下文獲取bloggerService這個bean BloggerService bloggerService = (BloggerService) applicationContext.getBean("bloggerService"); //獲取博主信息 Blogger blogger = bloggerService.getBloggerData(); //由於密碼也獲取到了,比較敏感,我們也不需要這個,所以把密碼清空掉 blogger.setPassword(null); //將博主信息存入application域中 application.setAttribute("blogger", blogger); } public void contextDestroyed(ServletContextEvent sce) { // TODO Auto-generated method stub } //實現ApplicationContextAware必須要實現的方法,在這個方法中可以獲取applicationContext對象 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { InitBloggerData.applicationContext = applicationContext; } }
通過這種方法也可以順利獲取applicationContext,然後再根據bean的名字獲取service,然後就可以調用dao獲取博主信息了,最後將博主信息存到application域中,在首頁的jsp頁面動態取出,如下:
3. 動態獲取友情鏈接
這裏我本來是這麽個思路做的:在t_link表中設置一個外鍵關聯t_blogger表,然後在我獲取博主信息的時候關聯查詢,將友情鏈接表中的信息也查出來,然後使用mybatis中一對多映射來寫resultMap,同時在博主的實體類中添加一個存儲Link實體類的List。這樣在理論上就我只要一個映射文件,一個方法,就可以查出跟博主有關的所有信息,因為其他表都是跟博主相關的,都可以設置一個外鍵。
這種方法是可行的,我測試過,完全沒問題。但是這種情況可能只會出現在這個個人博客中吧,因為比較特殊。不過這種方式也有不好的地方,就是感覺數據全冗到一起了。如果我只想獲取友情鏈接信息或者別的信息,完全可以不用獲取博主信息等等,出自諸多因素考慮,最後還是決定分開寫,不使用外鍵這種方式。因為分開寫也不復雜,而且不同的模塊不會冗到一起。所以還是順著上面的那個流程,來獲取一下友情鏈接的信息。
LinkMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="ssm.blog.dao.LinkDao"> <resultMap type="Link" id="LinkResult"> <id property="id" column="id"/> <result property="linkname" column="linkname"/> <result property="linkurl" column="linkurl"/> <result property="linkorder" column="linkorder"/> </resultMap> <select id="getLinkData" resultMap="LinkResult"> SELECT * FROM t_link ORDER BY linkorder </select> </mapper>
//LinkDao.Java public interface LinkDao { //獲取友情鏈接 public List<Link> getLinkData(); }
//LinkService實現類 @Service("linkService") public class LinkServiceImpl implements LinkService { @Resource private LinkDao linkDao; public List<Link> getLinkData() { return linkDao.getLinkData(); } }
然後在監聽器中添加獲取友情鏈接的代碼
//同上,獲取友情鏈接信息 LinkService linkService = (LinkService) applicationContext.getBean("linkService"); List<Link> linkList = linkService.getLinkData(); application.setAttribute("linkList", linkList);
這樣就搞定了,然後在前臺就不用向靜態數據那樣寫那麽多了,直接用forEach標簽來做。
4. 配置文件中添加監聽器
最後還有一個重要的步驟,就是在web.xml中添加自定義的監聽器,就像添加spring監聽器那樣。
<!-- 添加獲取博主信息的監聽器 --> <listener> <listener-class>ssm.blog.listener.InitBloggerData</listener-class> </listener>
到這裏基本上就完成了,主要是監聽器這一塊,其他地方都比較常規。慢慢寫吧,明天繼續碼代碼。
【註】本項目我已敲完,源碼已經上傳github,博客上會更新完整進度,歡迎大家關註我的博客~
github地址:https://github.com/eson15/Blog。歡迎大家star我的工程,follow一下也是極好的~
—–樂於分享,共同進步!
—–我的博客主頁:http://blog.csdn.net/eson_15
Tags: 數據庫數據 password property profile 網上商城
文章來源: