【SSM個人博客項目實戰04】博客首頁數據的動態獲取(一)

分類:IT技術 時間:2016-10-11

  上一節把博客首頁給搭建好了,但是都是一些靜態數據。這一節開始,將首頁裏的靜態數據換掉,動態的從數據庫中取。這一節主要來獲取博主信息和友情鏈接的數據,為什麽要先搞這兩部分的內容呢?因為它們有個特點,數據基本上是不會改變的,那麽也就是說我沒有必要每次請求的時候都去數據庫中獲取,這會影響到系統的性能。
  類似的問題,我在寫SSH網上商城系統的時候有提到(?傳送門),原理和那篇文章中提到的一樣,自己寫一個監聽器,在項目啟動的時候就獲取這些基本上不會改變的數據,然後放到application域中,後面每次用到就直接從application域中取,就不用每次都去查數據庫了。只不過在這篇文章中,我用另一種方法去實現。

1. 數據庫數據

  首頁要獲取數據,首先要在數據庫中準備數據,先準備博主信息數據和友情鏈接數據。這裏要說明一下,後面在開發後臺頁面的時候,還可以數據庫中信息的,現在先自己手動往數據庫中添加一些數據。如下:
t_blogger

t_link
  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頁面動態取出,如下:
bozhu

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標簽來做。
link

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 網上商城

文章來源:


ads
ads

相關文章
ads

相關文章

ad