本文隶属于分类

互联网

广告推荐

技术交流学习或者有任何问题欢迎加群

编程技术交流群 : 154514123 爱上编程      Java技术交流群 : 6128790  Java

  上一节把博客首页给搭建好了,但是都是一些静态数据。这一节开始,将首页里的静态数据换掉,动态的从数据库中取。这一节主要来获取博主信息和友情链接的数据,为什么要先搞这两部分的内容呢?因为它们有个特点,数据基本上是不会改变的,那么也就是说我没有必要每次请求的时候都去数据库中获取,这会影响到系统的性能。
  类似的问题,我在写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

技术交流学习或者有任何问题欢迎加群

编程技术交流群 : 154514123 爱上编程      Java技术交流群 : 6128790  Java

广告推荐

讨论区