Java Web 实战 --博客(Servlet+SQLServer+JQuery实现)

一、系统设计

1.前台功能模块:
首页
浏览博文
浏览图片
浏览好友
留言板
博文评论

2.后台管理模块
管理博文
管理图片
管理好友
管理评论

二、数据库设计

文章表:dbo.tb_article
id、art_whoId、art_title、art_content、art_pubTime、art_count

评论表:dbo.tb_articleR(用来保存博客的评论内容)
id、artReview_rootId、artReview_author、artReview_content、artReview_time

文章评论表:dbo.tb_articleRB(用来保存用户多次评论的信息)
id、artReview_rootId、artReview_author、artReview_content、artReview_time

好友表:dbo.tb_friend
id、firend_whoId、user_id

图片表:dbo.tb_photo
id、photo_whoId、photo_src、photo_info、photo_uptime

留言表:dbo.tb_word
id、word_whoId、word_content、word_author、word_time

三、开发准备

1.在Ecliepse中创建Web服务器:
创建新服务器–apache–tomcat server

2.创建项目
dynamic web project
Java Resources --src 【放置java文件的目录】
build – WebContent --css/images/js/META-INF【JSP、HTML、CSS等文件都放在WebContent目录下】
build – WebContent --WEB-INF --lib 【放置jar包的目录】

3.创建JSP文件
build – WebContent --new – JSP File
WebContent节点下将会自动添加一个名为index.jsp的节点

4.创建项目目录结构
Java Resources --src --建立5个包
com.dao【数据库业务处理类】
com.filter【数据过滤类】
com.servlet【表单提交类】
com.toolsBean【工具类】
com.valueBean【数据模型类】

5.运行项目
Project Explorer选择项目名称节点,run as – Run on Server
默认Eclipse内置显示器
也可复制URL地址,eg:http://localhost:8080/blogs

四、博客首页模块设计

在WebContent节点下的文件夹中进行操作
最后运行http://localhost:8080/blogs/index.jsp

1.设计首页页面

页面资源文件css、js、images
jsp文件:index.jsp

2.实现精选博文功能

  1. 引入数据库连接类和数据过滤类等工具
  2. 创建首页对应的操作类IndexServlet
    IndexServlet类是博客首页对应的操作类,在这个类中,定义了接受用户访问博客首页的doGet()方法和doPost方法(),这两个方法可以起到连接博客和数据库的桥梁通道作用。
    IndexServlet继承HttpServlet父类,并且重写父类的doGet()和doPost()方法。前台通过GET方法可以将表单信息以明文无加密的方式传递到后台,而通过POST方法发送的请求可以对一些需要加密的信息进行传递,比如用户密码等

IndexServlet.java代码如下:

package com.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.dao.ArticleDao;
import com.dao.UserDao;
import com.toolsBean.Change;
import com.valueBean.UserSingle;
//调用doGet方法,获取前台通过get方法传递过来的参数
@SuppressWarnings("serial")
//关于SuppressWarnings的用法详见此篇 https://thinkingcao.blog.csdn.net/article/details/71170595
public class IndexServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		doPost(request,response);      //执行doPost方法
	}
	@SuppressWarnings("unchecked")
	protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		request.setAttribute("mainPage",getInitParameter("defaultPage")); // Request.setAttribute()方法:设置request对象的属性。“mainPage”为属性名称,其属性值getInitParameter它用来获取Servlet的配置文件的初始化参数的信息,也就是我们自己的web应用程序根目录下的WEB-INF目录下的web.xml文件中的初始化参数信息。
		String forward="";			//初始化字符串forward
		HttpSession session=request.getSession();		//获取系统session
		int userid=Change.strToInt(request.getParameter("master"));		//获取当前用户id
		UserSingle logoner=(UserSingle)session.getAttribute("logoner");	
		if(null!=logoner){			//根据获取的session值进行逻辑判断
			session.setAttribute("logoner",logoner);		//将longer赋值给session变量longer
			if(userid==logoner.getId()){			//根据uerid进行逻辑判断
				request.setAttribute("isSelf","1");		//当前浏览用户不等于博主id,则返回1
			}else{
				request.setAttribute("isSelf","0");		当前浏览用户等于博主id,则返回0
			}
		}
		try{
			// 获取最新的文章前10条
			List newArticlelist = new ArrayList();		//创建list实例newAriticlelist
			ArticleDao articleDao = new ArticleDao();		//创建数据库业务处理类articleDao
			newArticlelist = articleDao.getNewArticle();	//调用数据库,获取文章数据
			request.setAttribute("newArticlelist", newArticlelist);
			
			// 获取右侧栏位置上的点击率排行前10名的博客 
			UserDao userDao = new UserDao();
			List toplist = userDao.getTopList();
			session.setAttribute("toplist", toplist);
			
			forward = getInitParameter("index");		//获取index的值
			
		}catch(Exception e){
			forward=this.getServletContext().getInitParameter("messagePage");
			System.out.println("'获取首页信息错误!");		//打印出错误信息
			e.printStackTrace();
		}
		//获取响应指令
		RequestDispatcher rd=request.getRequestDispatcher(forward);
		rd.forward(request,response);			//指定返回的路径以及响应信息
	}
}

3.创建博文管理的数据库处理类ArticleDao

  • ArticleDao继承SuperDao父类,在getMostArticle()方法中,首先创建用于数据库查询的SQL语句,接下来创建数据库的连接类mydb,通过mydb的doPstm()方法,执行数据库从查询,最后将结果复制到newArticleList数组集合中,并将这些数据返回给页面

ArticleDao.java

package com.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.toolsBean.Change;
import com.toolsBean.DB;
import com.valueBean.ArticleSingle;
public class ArticleDao extends SuperDao{
	/**
	 * @throws SQLException 
	 * @功能: 获取精选博文(10条记录)
	 */
	public List getMostArticle() throws SQLException{
	//创建数据库的SQL语句
		String sql="select top 10 t1.id,t1.art_whoId,t1.art_title,t1.art_content,t1.art_count,convert(varchar, t1.art_pubTime, 111),t2.user_name from tb_article t1,tb_user t2 where t1.art_whoId=t2.id  order by art_count desc";
		List newArticleList=null;		//创建List实例ArticleList
		DB mydb=new DB();				//创建数据库连接实例mydb
		mydb.doPstm(sql,null);			//执行数据库查询
		ResultSet rs=mydb.getRs();		//将结果集保存在rs内
		if(rs!=null){					//根据结果集进行判断
			newArticleList=new ArrayList();		//将newArticleList定义为数组
			while(rs.next()){			//根据rs结果集进行循环
				ArticleSingle single=new ArticleSingle();	//创建ArticleSinge实例
				single.setId(rs.getInt(1));		//取出博文记录的id
				single.setArtWhoId(rs.getInt(2));	//取出博文记录的用户id
				single.setArtTitle(rs.getString(3));	//取出博文记录的标题
				single.setArtContent(rs.getString(4));	//取出博文记录的内容
				single.setArtCount(rs.getInt(5));		//取出博文记录的阅读数
				single.setArtPubTime(rs.getString(6));	//取出博文记录的发布时间
				single.setUserName(rs.getString(7));	//取出博文记录的用户名
				System.out.println(rs.getString(6));
				newArticleList.add(single);			//将单条记录加到数据组中
			}
		}
		return newArticleList;			//将数据集合返回到前台界面
	}
}

4.配置页面路由web.xml文件

页面路由采用的是java的servlet技术,通过在web.xml文件配置页面的路径,也就是通过servlet的类路径,可以访问不同的页面路径。这样的好处,就是可以访问不同的页面路径。可以非常灵活的配置页面模块和业务逻辑。JSP文件专注在页面展示,Java类则专门处理后台的业务逻辑

	<!-- 进入首页控制 -->
	<servlet>
		<servlet-name>index</servlet-name>
		<!-- 负责首页业务逻辑处理的java类 -->
		<servlet-class>com.servlet.IndexServlet</servlet-class>
		<init-param>
			<!--根据处理的返回值,返回指定的首页页面-->
			<param-name>index</param-name>
			<param-value>index.jsp</param-value>
		</init-param>
	</servlet>
	<!-- 用户进入系统访问的路径 -->
	<servlet-mapping>
		<servlet-name>index</servlet-name>
		<url-pattern>/index</url-pattern>
	</servlet-mapping>

5.实现“精选博文”功能在index.jsp中的展示

通过<c:set>标签,将后台存储博文记录的数组集合mostArticlelist显示到页面,并且存储到变量类型var的mostArticlelist中,然后使用<c:if>标签,根据mostArticlelist的值是否为空判断页面显示的逻辑。当mostArticlelist为空,则不进行页面的显示,否者使用<c:forEach>标签进行博文字段内容的循环显示输出
index.jsp

<!-- 将mostArticlelist显示到页面中 -->
		<c:set var="mostArticlelist" value="${requestScope.mostArticlelist}" />
		<!-- 当mostArticlelist不为空时,进行页面的显示 -->
		<div class="bloglist left">
			<c:if test="${!empty mostArticlelist}">
				<c:forEach var="article" items="${mostArticlelist}">
					<h3>
						<a
							href="goBlogContent?id=${article.id}&master=${article.artWhoId}">${article.artTitle}</a>
					</h3>
					<ul>
					<!-- 取出博客内容 -->
						<p id="cssClip">
							${article.artContent}
						</p>
						<a
							href="goBlogContent?id=${article.id}&master=${article.artWhoId}"
							target="_blank" class="readmore">阅读全文&gt;&gt;</a>
					</ul>
					<p class="dateview">
					<!-- 取出博客发布时间和作者 -->
						<span>${article.artPubTime}</span><span>作者:${article.userName}</span>
					</p>
				</c:forEach>
			</c:if>

在Project Explorer中选择blogs节点,再run as – Run on Server运行程序
http://localhost:8080/blogs/index (注意是index,不是index.jsp)

6.实现“最新博文”功能

1.在IndexServlet.java中添加“最新博文”代码

try{
			// 获取最新的文章前10条
			List newArticlelist = new ArrayList();			//调用list对象
			ArticleDao articleDao = new ArticleDao();		//调用articleDao方法,获取结果
			newArticlelist = articleDao.getNewArticle();	//将结果显示到页面
			request.setAttribute("newArticlelist", newArticlelist);
			forward = getInitParameter("index");		

2.在ArticleDao.java中添加“最新博文”的数据库处理方法

getNewArticle()

/**
	 * @throws SQLException 
	 * @功能: 获取最新博文(10条记录)
	 */
	public List getNewArticle() throws SQLException{
		String sql="select top 10 id,art_whoId,art_title,art_content,art_count from tb_article order by art_pubTime desc";
		List newArticleList=null;		//创建newArticleList实例
		DB mydb=new DB();				//创建数据库连接类mydb
		mydb.doPstm(sql,null);			//执行数据库查询
		ResultSet rs=mydb.getRs();		//将查询结果存储在rs结果集内
		if(rs!=null){					//根据rs的值进行逻辑判断
			newArticleList=new ArrayList();	//将newArticle赋值为数组类型
			while(rs.next()){			//将结果集循环
				ArticleSingle single=new ArticleSingle();	//创建ArticleSingle实例
				single.setId(rs.getInt(1));		//获取博文的id
				single.setArtWhoId(rs.getInt(2));	//获取博文的用户id
				single.setArtTitle(rs.getString(3));	//获取博文的标题
				single.setArtContent(rs.getString(4));	//获取博文的内容
				single.setArtCount(rs.getInt(5));		//获取博文的阅读数
				newArticleList.add(single);				//将博文的内容添加到newArticle中
			}
		}
		return newArticleList;						//将结果集返回给页面
	}

3.在index.jsp中添加“最新博文”的页面显示代码

<aside class="right">
		<div class="news">
			<h3>
				<p>
					最新
					<span>文章</span>
				</p>
			</h3>
<!-- 将后台的数据集合newArticlelist赋值到前台页面 -->
			<c:set var="newArticlelist" value="${requestScope.newArticlelist}" />
			<ul class="rank">
			<!-- 根据newArticlelist进行逻辑判断 -->
				<c:if test="${!empty newArticlelist}">
				<!-- 根据newArticlelist进行循环 -->
					<c:forEach var="article" items="${newArticlelist}">
					<!-- 获取博文的相关信息 -->
						<li>
							<a
								href="goBlogContent?id=${article.id}&master=${article.artWhoId}"
								title="${article.artTitle}" target="_blank">${article.artTitle}</a>
						</li>
					</c:forEach>
				</c:if>
			</ul>

7.实现“博客排行榜”功能

原理:通过对各个博主的所有文章阅读数进行统计排名
1.在IndexServlet.java中添加“博客排行榜”代码

	UserDao userDao = new UserDao();		//创建userDao实例
	List toplist = userDao.getTopList();	//调用getTopList()方法,获取博客排行榜记录
	session.setAttribute("toplist", toplist);	//将数据结果集赋值到session变量toplist

2.创建UserDao.java文件,添加getTopList()方法

package com.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.toolsBean.Change;
import com.toolsBean.DB;
import com.valueBean.UserSingle;

public class UserDao {
	public List getTopList() throws SQLException{
	//创建数据库查询的SQL语句
		String sql="select top 10 id,user_name,user_hitNum,user_ico from tb_user order by user_hitNum desc";
		List topList=null;		//创建list实例topList
		DB mydb=new DB();		//创建数据库连接类mydb
		mydb.doPstm(sql,null);	//执行数据库查询
		ResultSet rs=mydb.getRs();	//将结果集返回给rs实例
		if(rs!=null){		//根据rs进行逻辑判断
			topList=new ArrayList();	//将topList赋值给数组
			while(rs.next()){		//将rs解析循环
				UserSingle single=new UserSingle();	//创建用户实例类
				single.setId(rs.getInt(1));	//获取用户Id
				single.setUserName(rs.getString(2));	//获取用户名
				single.setUserHitNum(rs.getInt(3));		//获取用户单击数
				single.setUserIco(rs.getString(4));		//获取用户logo
				topList.add(single);			//将用户数据添加到topList中
			}
		}
		return topList;		//返回topList供前台页面使用
	}

3.在index.jsp中添加“博客排行榜”的页面显示代码

			<h3 class="ph">
				<p>
					博客
					<span>排行</span>
				</p>
			</h3>
<!-- 后台数据toplist赋值到页面变量var中的toplist -->
			<c:set var="toplist" value="${sessionScope.toplist}" />
			<ul class="paih">
			<!-- 根据toplist的取值进行逻辑判断 -->
				<c:if test="${!empty toplist}">
				<!-- 循环显示出toplist的字段记录 -->
					<c:forEach var="topUser" items="${toplist}">
						<ul>
						<!-- 获取用户的相关字段数据以及阅读字段数据 -->
							<li>
								<a style="color: #5EA51B"
									href="goBlogIndex?master=${topUser.id}">${topUser.userName}</a>
								<span style="float: right">${topUser.userHitNum}次阅读</span>
							</li>
						</ul>
					</c:forEach>
				</c:if>
			</ul>

五、登陆注册

1.登陆注册模块概述

在用户登陆界面加入了验证码功能,使用了算数验证码,即要求输入给定算式的结果才允许登陆

2.实现“算术验证码”的功能

1.编辑index.jsp,实现登陆页面效果

  • 首先需要将事先设计好的loginHtml.js赋值到Eclipse的js节点中

  • 然后返回到index.jsp中,添加代码。由于本章采用的是Ajax形式提交表单,所以登陆界面的实现方法也需要JavaScript特效组件共同实现。这里采用的是开源JavaScript弹出组件jBox。通过jBox,可以非常灵活的配置弹出登陆窗口的大小、颜色、按钮样式等。引入美工设计好的登陆界面后,就可以调用jBox的open()方法,打开HTML页面了,具体代码如下:
    index.jsp

<script type ="text/javascript" src="js/loginHtml.js" charset="UTF-8"></script>
<script>
// 验证用户是否登录
$(function() {
	var loginFlag = $('#logoner').html();
});
function loginIndex() {		//定义方法名loginIndex
//引入美工制作的登陆页面 var html = loginHtml;
	var html = '<div id="respond"><form  method="post" id="commentform">'
			+ '<div class="comment-login">请登录</div>'
			+ '<div class="comment-login">'
			+ '<ul>'
			+ '<li class="form-inline">'
			+ '<label>账号:</label>'
			+ '<input type="text" name="user" id="user" value="" tabindex="1" aria-required="true">'
			+ '</li>'
			+ '<li class="form-inline">'
			+ '<label>密码:</label>'
			+ '<input type="password" name="ps" id="ps" value="" tabindex="2" aria-required="true">'
			+ '</li>'
			+ '</ul>'
			+ '</div>'
			+ '<div class="comment-login"><input name="submit" type="button" id="save" οnclick="loginIn()"  class="submitButton" tabindex="5" value="登录"></div>'
			+ '</form></div>';
	var content = {
		state1 : {
			content : html,			//显示登陆页面
			buttons : {
				'取消' : 0		//取消操作
			},
			buttonsFocus : 0,		//默认显示单击状态
			submit : function(v, h, f) {
				if (v == 0) {		//根据单击动作提交按钮
					return true; 	// 若单机登录,则执行提交操作
		}
		return false;
	}
		}
	};
	$.jBox.open(content, '登录', 650, 550);		//设置窗口大小
}
</script>

2.实现登陆验证码的功能
首先利用Math.random()随机函数生成两个随机数,并赋值给变量i和j,然后将i和j加起来赋值给变量k,同时将k赋值给页面的id上为hiddencode的<div>标签,最后将算数验证码的页面样式通过id为showspan的<div>标签显示出来,具体代码如下:
index.jsp

var i =parseInt(10*Math.random());		//生成随机数赋值给i
var j =parseInt(10*Math.random());		//生成随机数赋值给i
var k=i+j;				//变量k为i与j之和
$("#hiddencode").val(k);	//设置验证码的正确答案
$("#showspan").html(""+i+"+"+j+"=?");	//设置验证码的样式

通过编写getverifycodeChange()方法,实现算数验证码的功能。首先生成两个随机数赋值给变量i和j,然后将i与j的和保存在页面的隐藏标签(id等于hiddencode的<div> 标签)内,再将输入值与真实值k比较判定代码是否正确

<script tpye ="text/javascript" language="javbascript">
function getverifycodeChange(){
var i =parseInt(10*Math.random());		//生成随机数赋值给i
var j =parseInt(10*Math.random());		//生成随机数赋值给i
var k=i+j;				//变量k为i与j之和
$("#hiddencode").val(k);	//设置验证码的正确答案
$("#showspan").html(""+i+"+"+j+"=?");	//设置验证码的样式
$("#verifycode").focus		//单机验证码时,鼠标聚焦
}
</script>

3.实现Ajax提交表单数据的功能

六、博客文章模块的设计

1.博客文章模块概述

2.设计博客文章页面

3.实现“获取博主头像”的功能

4.实现“统计文章与评论总数”的功能

5.实现“获取文章列表”的功能

七、小结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值