Java简单博客系统(二)静态页面动态化显示数据表内容

(一)准备工作

建立java Web项目基础的四个package

将JSP相关库和MySQL数据驱动包放到相应的目录

下面列出com.java.util中的三个类的代码,在项目中经常用到,基本是参照java1234.com小锋老师的项目代码稍作写出来的。

public class DbUtil {
    //定义获取数据库连接的方法
    private String dburl="jdbc:mysql://127.0.0.1:3306/db_blog?useSSL=false&serverTimezone=GMT";
    private String username="root";
    private String password="root";
    private String driver="com.mysql.cj.jdbc.Driver";   //mysql-connector-java-8.0.12.jar包需要放在WEB/INF/lib下
    public Connection getConnection() throws Exception{
        Class.forName(driver);
        Connection conn=DriverManager.getConnection(dburl,username,password);
        return  conn;
    }
    //定义断开连接的方法
    public void closeConnection(Connection conn) throws SQLException{
        if(conn!=null){
            conn.close();
        }
    }
    
}
public class StringUtil {
    public static boolean isEmpty(String str){
        if(str==null||str.equals("")){
            return true;
        }else{
            return false;
        }
        
    }
    public static boolean isNotEmpty(String str){
        if(str!=null&&!str.equals("")){
            return true;
        }else{
            return false;
        }
        
    }
}
public class DateUtil {

    public static String Date2String(Date date,String format){
        String result="";
        SimpleDateFormat sdf=new SimpleDateFormat(format);
        if(date!=null){
            result=sdf.format(date);
        }
        return result;
    }//日期转换成字符串
    
    
    public static Date String2Date(String str,String format) throws Exception{
        if(StringUtil.isEmpty(str)){
            return null;
        }
        SimpleDateFormat sdf=new SimpleDateFormat(format);
        return sdf.parse(str);
    }//字符串转换成日期
    
    
}

(二)实现思路——玩的是SQL游戏,以blog博客信息的展示为例;

1.Blog.java类

私有域基本和数据表字段对应,在加上get和set方法。数据设计参看之前的博客:

https://www.cnblogs.com/sanyun/p/9944249.html

public class Blog {
    private int blogId;
    private int userId;
    private String userName;
    private String title;
    private String content;
    private String blogType;
    private Date createTime;
    private int views=0;
    private int likes=0;
    private int comments=0;
    /**
     * @return the userName
     */
    public String getUserName() {
        return userName;
    }
    /**
     * @param userName the userName to set
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }
    /*
     *下面省略了很多get,set方法,以上的私有域都应该有get,set方法*/
       
}

2.BlogDao类

因为首页以各种现实现实博客内容,以时间排序的,4小时内的,10天内的,所以DAO方法最好以SQL语句作为入参之一。

在这个类中,按照传进来的SQL查询数据库,遍历返回的结果集,结果集中每条记录信息保存在一个Blog对象中(这就是前面Blog.java私有域和数据表字段一致的原因),将所有查询出的结果初始化出一堆Blog对象,放入List中返回。

public class BlogDao {
    public List<Blog> queryBlog(Connection conn,String sql) throws Exception{
        ArrayList<Blog> blogList=new ArrayList<>();
        PreparedStatement stat=conn.prepareStatement(sql);
        ResultSet rs=stat.executeQuery();
        while(rs.next()){
            Blog blog=new Blog();
            blog.setBlogId(rs.getInt("blogId"));  //根据列名获取列数据
            blog.setBlogType(rs.getString("blogType"));
            blog.setContent(rs.getString("content"));
            blog.setLikes(rs.getInt("likes"));
            blog.setTitle(rs.getString("title"));
            blog.setUserId(rs.getInt("userId"));
            blog.setUserName(rs.getString("userName"));  
            blog.setViews(rs.getInt("views"));
            blog.setCreateTime(DateUtil.String2Date(rs.getString("createTime"),"yyyy-MM-dd HH:mm:ss"));  //将数据库日期类型转换成java日期类型
            blogList.add(blog);
        }
        return blogList;
        
    }
}

3.HomeServlet类

从前面静态页面的设计可以知道:

(1)链接面板:

查询48小时内阅读量最多的前10条博客标题:

SELECT * FROM blog WHERE createTime BETWEEN SUBDATE(LOCALTIME(),2)  AND LOCALTIME() ORDER BY views DESC LIMIT 0,10;

查询2天内评论数最多的前10条博客标题:

SELECT * FROM blog WHERE createTime BETWEEN SUBDATE(LOCALTIME(),10)  AND LOCALTIME() ORDER BY likes DESC LIMIT 0,10;

查询积分数最多的前20名博客姓名:

SELECT * FROM USER ORDER BY points DESC LIMIT 0,20;

(2)页面主体

按时间顺序逆序查询出博客:

SELECT * FROM blog ORDER BY createTime DESC;

 因此,在Servlet的doPost(HttpServletRequest request, HttpServletResponse response)方法中,主要做的工作是:

(1)查询数据库获得博客列表,不同的SQL语句博客列表不一样。
(2)重点是:将查询出来的信息列表作为请求的参数,以便被主页(home.jsp)获取。
(3)forward跳转到主页home.jsp:request.getRequestDispatcher("home.jsp").forward(request, response);

步骤(1),(2)代码如下

private void showNavContent(HttpServletRequest request, HttpServletResponse response) {
        // TODO Auto-generated method stub
            //左边面板显示的列表信息
            Connection conn=null;            
            try {
                conn=dbutil.getConnection();
                String sql="SELECT * FROM blog WHERE createTime BETWEEN SUBDATE(LOCALTIME(),2)  AND LOCALTIME() ORDER BY views DESC LIMIT 0,10; ";
                List<Blog> viewsMoreblogList=blogDao.queryBlog(conn,sql);
                request.setAttribute("viewsMoreblogList", viewsMoreblogList);
                
                sql="SELECT * FROM blog WHERE createTime BETWEEN SUBDATE(LOCALTIME(),10)  AND LOCALTIME() ORDER BY likes DESC LIMIT 0,10; ";
                List<Blog> likesMoreblogList=blogDao.queryBlog(conn,sql);
                request.setAttribute("likesMoreblogList", likesMoreblogList);
                
                sql="SELECT * FROM USER ORDER BY points DESC LIMIT 0,20;";
                List<User> userList=userDao.queryUser(conn,sql);
                request.setAttribute("userList", userList);            
                
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        
    }
    private void showBlogsByTime(HttpServletRequest request,HttpServletResponse response){
        Connection conn=null;
        try {
            conn=dbutil.getConnection();
            String sql="SELECT * FROM blog ORDER BY createTime DESC;";  //mySQL不支持top语法
            List<Blog> latestBlogList=blogDao.queryBlog(conn, sql);
            for(Blog blog:latestBlogList){
                int num=commentDao.getCommentNumByBlogId(conn,blog.getBlogId());
                blog.setComments(num);
                //评论数
            }
            request.setAttribute("blogList", latestBlogList);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
                
    }
 
 

4.主页home.jsp显示数据表内容

(1)导入JSP标签库

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

(2)获取请求属性中的内容,主要使用JSP的c:forEach标签将博客列表信息显示出来

例如链接面板显示的“48小时阅读排行榜””

静态

     <div class="data_list">
         <div class="list_header">48小时阅读排行榜</div>
         <div class="list">
             <ul>
                 <li><a href="#">程序员,你焦虑吗?</a></li>
                 <li><a href="#">国内开源社区巨作AspectCore-Framework入门</a></li>
                 ...
             </ul>
         </div>
     </div

动态

<div class="data_list">
         <div class="list_header"><a  href="Home?action=showByViews">48小时阅读排行榜</a></div>
         <div class="list">
             <ul>
                 <c:forEach var="vblog" items="${viewsMoreblogList}">
                     <li><a href="#">${fn:substring(vblog.title,0,20)}</a></li>
                 </c:forEach>
             </ul>
         </div>
     </div>

又比如,博客列表动态化之后如下所示:

<div class="blogContent">
        <c:forEach var="blog" items="${blogList}">
            <div class="blogItem">
            <div class="digg">
                <div class="diggit"> 
                    <span class="diggnum">&nbsp;&nbsp;&nbsp;${blog.likes}</span>   <!-- 推荐数 -->
                </div>
                <div class="clear"></div>   <!-- 中间隔开的空白 -->
                <div class="digg_tip"><span class="glyphicon glyphicon-thumbs-up" aria-hidden="true"></span>&nbsp;推荐</div>
                <div class="digg_text" id="message"></div>
             </div>
              <div class="item_body">
                  <div class="title"><a href="#">${blog.title}</a></div>
                  <div class="abstract"><p>${fn:substring(blog.content,0,200)}...<p></span></div>
                  <div class="footer"><a>${blog.userName}</a>&nbsp;&nbsp;<fmt:formatDate value="${blog.createTime}" type="date" pattern="yyyy-MM-dd HH:mm:ss"/>&nbsp;&nbsp;<span class="glyphicon glyphicon-comment" aria-hidden="true"></span>&nbsp;评论(${blog.comments})&nbsp;&nbsp;<span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>&nbsp;阅读(${blog.views})</div>  
                  <!-- 注意格式化串一定要正确 -->                
               </div>
              </div>
        </c:forEach>
      </div>

上面有很些细节的地方

截断博客内容显示200字:${fn:substring(blog.content,0,200)}

日期格式化:<fmt:formatDate value="${blog.createTime}" type="date" pattern="yyyy-MM-dd HH:mm:ss"/>

到这里,整个主页功能就基本实现了。

猜你喜欢

转载自www.cnblogs.com/sanyun/p/9949990.html