美文网首页
SSH开发个人博客(二)

SSH开发个人博客(二)

作者: 晚上吃火锅吗 | 来源:发表于2017-02-28 15:26 被阅读0次

    上一阶段将struts映射完成,这一阶段目标是实现hibernate对blog数据库的封装,并将数据传回前端页面。
    首先建立数据库,创建article表

    CREATE TABLE `article` (
    `a_id`  int(11) NOT NULL AUTO_INCREMENT ,
    `a_title`  varchar(70) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    `a_body`  longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    `a_created_time`  datetime NOT NULL ,
    `a_last_modified_time`  datetime NOT NULL ,
    `a_status`  varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'p' ,
    `a_abstract`  varchar(54) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '1' ,
    `a_views`  int(10) UNSIGNED NOT NULL DEFAULT 1 ,
    `a_likes`  int(10) UNSIGNED NOT NULL DEFAULT 1 ,
    `a_topped`  tinyint(1) NOT NULL DEFAULT 1 ,
    `a_category_id`  int(11) NULL DEFAULT NULL ,
    PRIMARY KEY (`a_id`),
    )
    

    在web工程目录下建立bean包,创建ArticleBean.java,对应article表建立属性以及getter、setter方法。

    package bean;
    
    import java.util.Date;
    
    public class Article {
        private Integer a_id;
        private String a_title;
        private String a_body;
        private Date a_create_time;
        private Date a_last_modified_time;
        private String a_status;
        private Integer a_abstract;
        private Integer a_views;
        private Integer a_likes;
        private Integer a_topped;
        private Integer a_category_id;
        
        public Integer getA_id() {
            return a_id;
        }
        public void setA_id(Integer a_id) {
            this.a_id = a_id;
        }
        public String getA_title() {
            return a_title;
        }
        public void setA_title(String a_title) {
            this.a_title = a_title;
        }
        public String getA_body() {
            return a_body;
        }
        public void setA_body(String a_body) {
            this.a_body = a_body;
        }
        public Date getA_create_time() {
            return a_create_time;
        }
        public void setA_create_time(Date a_create_time) {
            this.a_create_time = a_create_time;
        }
        public Date getA_last_modified_time() {
            return a_last_modified_time;
        }
        public void setA_last_modified_time(Date a_last_modified_time) {
            this.a_last_modified_time = a_last_modified_time;
        }
        public String getA_status() {
            return a_status;
        }
        public void setA_status(String a_status) {
            this.a_status = a_status;
        }
        public Integer getA_abstract() {
            return a_abstract;
        }
        public void setA_abstract(Integer a_abstract) {
            this.a_abstract = a_abstract;
        }
        public Integer getA_views() {
            return a_views;
        }
        public void setA_views(Integer a_views) {
            this.a_views = a_views;
        }
        public Integer getA_likes() {
            return a_likes;
        }
        public void setA_likes(Integer a_likes) {
            this.a_likes = a_likes;
        }
        public Integer getA_topped() {
            return a_topped;
        }
        public void setA_topped(Integer a_topped) {
            this.a_topped = a_topped;
        }
        public Integer getA_category_id() {
            return a_category_id;
        }
        public void setA_category_id(Integer a_category_id) {
            this.a_category_id = a_category_id;
        }
    }
    

    ArticleBean.java对应的ArticleBean.hbm.xml配置文件如下

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2017-2-25 15:16:51 by Hibernate Tools 3.5.0.Final -->
    <hibernate-mapping>
        <class name="bean.Article" table="ARTICLE">
            <id name="a_id" type="java.lang.Integer">
                <column name="A_ID" />
                <generator class="native" />
            </id>
            <property name="a_title" type="java.lang.String">
                <column name="A_TITLE"/>
            </property>
            <property name="a_body" type="java.lang.String">
                <column name="A_BODY" length="16777216"/>
            </property>
            <property name="a_create_time" type="java.util.Date">
                <column name="A_CREATE_TIME" />
            </property>
            <property name="a_last_modified_time" type="java.util.Date">
                <column name="A_LAST_MODIFIED_TIME" />
            </property>
            <property name="a_status" type="java.lang.String">
                <column name="A_STATUS" />
            </property>
            <property name="a_abstract" type="java.lang.Integer">
                <column name="A_ABSTRACT" not-null="false"/>
            </property>
            <property name="a_views" type="java.lang.Integer">
                <column name="A_VIEWS" />
            </property>
            <property name="a_likes" type="java.lang.Integer">
                <column name="A_LIKES" />
            </property>
            <property name="a_topped" type="java.lang.Integer">
                <column name="A_TOPPED" />
            </property>
            <property name="a_category_id" type="java.lang.Integer">
                <column name="A_CATEGORY_ID" not-null="false"/>
            </property>
        </class>
    </hibernate-mapping>
    

    web工程的hibernate.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">root</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/blog</property>
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="show_sql">true</property>
            <property name="format_sql">true</property>
            <property name="hbm2ddl.auto">update</property>
            <mapping resource="bean/Article.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>
    

    其中show_sql是显示sql语句;format_sql是格式化输出sql语句,输出的sql语句就不会是一行,便于查看;hbm2ddl.auto有几个参数:

    create:表示启动的时候先drop,再create
    create-drop: 也表示创建,只不过再系统关闭前执行一下drop
    update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
    validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新

    接下来封装一个HibernateSessionFacory,这样做的好处是便于控制session,将操作代码统一封装,减少重复代码

    package myUtil;
    
    import java.util.List;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateSessionFactory {
        
        private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
        private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
        private static Configuration configuration = new Configuration();
        private static org.hibernate.SessionFactory sessionFactory;
        private static String configFile = CONFIG_FILE_LOCATION;
        
        static {
            try{
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            }catch(Exception e){
                System.err.println("%%% Error Creating SessionFactory %%%");
                e.printStackTrace();
            }
        }
        
        private HibernateSessionFactory(){      
        }
        
        //@return Session
        //@throws HibernateExcception 
        public static Session getSession() throws HibernateException{
            Session session = (Session) threadLocal.get();
            if(session == null || session.isOpen()){
                if(sessionFactory == null){
                    rebuildSessionFactory();
                }
                session = (sessionFactory != null) ? sessionFactory.openSession():null;
                threadLocal.set(session);
            }       
            return session;     
        }
    
        private static void rebuildSessionFactory() {
            try{
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            }catch(Exception e){
                System.err.println("%%% Error Creating SessionFactory %%%");
                e.printStackTrace();
            }       
        }
        
        public static void closeSession() throws HibernateException{
            Session session = (Session)threadLocal.get();
            threadLocal.set(null);
            if(session != null){
                session.close();
            }
        }
        
        public static org.hibernate.SessionFactory getSessionFactory(){
            return sessionFactory;
        }
        
        public static void setConfigFile(String configFile){
            HibernateSessionFactory.setConfigFile(configFile);
            sessionFactory = null;
        }
        
        public static Configuration getConfiguration(){
            return configuration;
        }
        
        //提供一个统一的查询方法(带分页) hql形式 from 类 where 条件=?
        public static List excuteQueryByPage(String hql, String [] parameters, int pageSize, int pageNow){
            Session session = null;
            List list = null;
            try {
                session = getSession();
                Query query = session.createQuery(hql);
                if(parameters != null && parameters.length > 0){
                    for (int i=0; i<parameters.length; i++){
                        query.setString(i, parameters[i]);
                    }
                }
                query.setFirstResult((pageNow - 1) * pageSize).setMaxResults(pageSize);
                list = query.list();
                
                
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                
            }
    
            return list;
        }
        
        //提供一个统一的查询方法hql 形式  from 类 where 条件=?
        public static List excuteQuery(String hql, String [] parameters){
            Session s = null;
            List list = null;
            try{
                s = getSession();
                Query query = s.createQuery(hql);
                //判断是否有参数要绑定
                if (parameters != null && parameters.length > 0){
                    for (int i=0; i<parameters.length; i++){
                        query.setString(i, parameters[i]);
                    }
                }
                list = query.list();
                
            } catch(Exception e){
                
            }finally {
                closeSession();
            }
            return list;
        }
    }
    

    编写ArticleService,用于操作数据库的artile表

    package service;
    
    import java.util.Iterator;
    import java.util.List;
    
    import org.hibernate.*;
    
    import bean.Article;
    import myUtil.HibernateSessionFactory;
    
    public class ArticleService {
        
        public ArticleService(){        
        }
        
        public List<Article> getArtileByPage(int pageNow, int pageSize){        
            Session session = null;
            Transaction tx = null;
            List<Article> list = null;
            try{
                session = HibernateSessionFactory.getSession();
                tx = session.beginTransaction();
                String hql = "from Article"; 
                list = session.createQuery(hql).setFirstResult((pageNow - 1) * pageSize).setMaxResults(pageSize).list();
                tx.commit();
            }catch(Exception e){
                e.printStackTrace();
                if(tx != null){
                    tx.rollback();
                }
            }finally{
                HibernateSessionFactory.closeSession();
            }       
            return list;
        }
        
        public List<Article> getArtile(){
            
            Session session = null;
            Transaction tx = null;
            List<Article> list = null;
            try{
                session = HibernateSessionFactory.getSession();
                tx = session.beginTransaction();
                String hql = "from Article"; 
                list = session.createQuery(hql).list();
                tx.commit();
            }catch(Exception e){
                e.printStackTrace();
                if(tx != null){
                    tx.rollback();
                }
            }finally{
                HibernateSessionFactory.closeSession();
            }       
            return list;
        }
    }
    

    编写blogAction,用于响应客户端对article的请求,查询article,并以json形式返回

    package action;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import bean.Article;
    import service.ArticleService;
    
    public class blogAction extends ActionSupport {
    
        private Map<Integer,Object> blogList;
    
        public Map<Integer, Object> getBlogList() {
            return blogList;
        }
    
        public String getArticle(){
            System.out.println("getArticle");
            ArticleService as = new ArticleService(); 
            List<Article> list = as.getArtileByPage(2, 3);
            blogList = new HashMap<Integer,Object>();
            int i=1;
            for (Article a:list){
                blogList.put(i++, a);           
            }
            System.out.print(blogList);
            //blogList1 = as.getArtile();
            //System.out.println(blogList);
            return "blogList";
        }
        
        @Override
        public String execute() throws Exception {
            // TODO Auto-generated method stub
            return  SUCCESS;
        }   
    }
    

    编写struts.xml,将对atricle的请求分派给blogAction

    <action name="blogList" class="action.blogAction" method="getArticle">
        <result name="blogList" type="json">
            <param name="root">blogList</param>
        </result>
    </action>
    

    前端js请求

    $(document).ready(function(){
        $.post({
            url:'blogList',
            data:'{}',
            datatype:'json',
            success:function(data){
                console.log(data);
                str = "";
                $.each(data,function(i,e){
                    str += "<div class='blog-post'>";
                    str += "<h2 class='blog-post-title'>"+e['a_title']+"</h2>";
                    str += "<p class='blog-post-date'>"+e['a_last_modified_time']+"</p>";
                    str += "<p class='blog-post-abs'>"+e['a_body']+"</p>";
                    str += "</div>";
                });
                $("#blog").append(str);         
            }
        })  
    });
    

    效果如图



    工程目录结构如下

    相关文章

      网友评论

          本文标题:SSH开发个人博客(二)

          本文链接:https://www.haomeiwen.com/subject/lzrxgttx.html