BBS论坛-主贴添加与查询

在这里插入图片描述## 获取主贴提交参数
mrbbs=>myresource=>com.mrkj.ygl.controller=>MainPageController.java

package com.mrkj.ygl.controller;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.mrkj.ygl.service.MainPageService;

/*
 * 
 * 接收参数,处理参数,存入数据库
 * 
 * 
 * */

//@Controller注解声明该类为Spring控制类,继而通过@requestMapping注解声明的路径映射
//如果不使用@Controller注解,@requestMapping注解也会失效
@Controller
public class MainPageController {

	/* 
	 @Resource,Javax.annotation.Resource,该注解并不是Spring注解,但是Spring支持该注解注入
	 
	 被rquestMapping注解声明的方法,会自动注入
	 request:该参数由Spring注入
	 content:该参数由前端传递过来,记录了富文本数据,参数名称要与传递过来的参数名要一致
	 mainTitle:该参数由前端传递过来,记录了帖子标题,参数名称要与传递过来的参数名要一致
	 * */
	
	@Resource
	MainPageService mps;

	@RequestMapping(value = "/saveUeditorContent")
	public ModelAndView saveUeditor(HttpServletRequest request, String content, String mainTitle) {
		ModelAndView mav = new ModelAndView();
		// 获取客户端IP地址作为发帖人
		String mainCreatuser = request.getRemoteAddr();
		int result = mps.saveMainContent(content, mainTitle, mainCreatuser);
		// 根据result判断是否向数据库当中插入了一条数据
		if (result == 1) {
			// 如果数据插入成功,重新刷新页面数据
			mav.setViewName("redirect:/goMainPage");
		} else {
			// 如果数据插入失败,设置视图指向错误页面
			mav.setViewName("myJSP/error");
		}

		return mav;
	}

	// 初始化论坛主页面
	@RequestMapping("/goMainPage")
	public ModelAndView goMainPage(HttpServletRequest request,
			@RequestParam(name = "page", defaultValue = "1") Integer page,
			@RequestParam(name = "row", defaultValue = "20") Integer row) {

		ModelAndView mav = new ModelAndView("myJSP/mainPage");
		
		//获取数据(page - 1) * row, row。就是0-20条数据
		List<Map<String, Object>> mainContents = mps.getMainPage((page - 1) * row, row);
		mav.addObject("main", mainContents);
		
		// 获取总共多少帖子 	my_main
		Long count = mps.getMainCount();
		
		// 获取分页方法
		String pageHtml = mps.getPage(count, page, row);
		mav.addObject("pageHtml", pageHtml);

		return mav;
	}
}

数据库查询与添加

mrbbs=>myresource=>com.mrkj.ygl.service=>MainPageService.java

package com.mrkj.ygl.service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID; 

import javax.annotation.Resource; 
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

@Service
public class MainPageService {

	//注入Spring JdbcTemplate
	@Resource
	JdbcTemplate jdbc;
	//注入时间格式化
	@Resource
	SimpleDateFormat sdf;
	/**
	 * 
	 * @param content 帖子内容
	 * @param mainTitle 帖子标题
	 * @param mainCreatuser 发帖人,这里我们使用用户IP作为发帖
	 * @return
	 */
	
	//添加主贴
	public int saveMainContent(String content,String mainTitle,String mainCreatuser){
		//定义sql语句,这里的sql使用的是防注入模式,VALUES的值使用的是?占位符
		String sql_save_mymain = "INSERT INTO my_main "
		+ "(main_id,main_title,main_content,"
		+ "main_creatime,main_creatuser,main_commend)"
		+ " VALUES (?,?,?,?,?,?)";
		
		String sql_save_myinfo = "INSERT INTO my_info "
				+ "(main_id,info_reply,info_see,"
				+ "info_lastuser,info_lastime) "
				+ "VALUES (?,0,0,?,?)";

		/*
		 * UUID 的目的是让分布式系统中的所有元素,
		 * 都能有唯一的辨识资讯,
		 * 而不需要透过中央控制端来做辨识资讯的指定。
		 * 如此一来,每个人都可以建立不与其它人冲突的 UUID。
		 * 在这样的情况下,就不需考虑数据库建立时的名称重复问题。
		 * 目前最广泛应用的 UUID,
		 * 即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),
		 * 而其他重要的应用,
		 * 则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。
		 * */
		
		//表id使用的是UUID
		String mainId = UUID.randomUUID().toString();
		//时间格式化,格式要与数据库中的datatime相对应yyyy-MM-dd hh:mm:ss
		sdf.applyPattern("yyyy-MM-dd hh:mm:ss");
		//获取当前时间作为创建时间
		String mainCreatime = sdf.format(new Date());
		//精华帖标记,0普通帖,1精华帖
		Integer mainCommend = 0;
		
		//初始化myinfo表数据,注意my_info表的id为自增长所以这里并没有设置info_id的值
		jdbc.update(sql_save_myinfo, mainId,mainCreatuser,mainCreatime);

		
		//执行update语句,第一个参数sql语句,后面可以写任意多的参数
		return jdbc.update(sql_save_mymain,mainId,mainTitle,content,mainCreatime,mainCreatuser,mainCommend);
	
	}
	
	
	//根据每页想要显示多少条数据进行 limit
	public List<Map<String, Object> >  getMainPage(int row,int offset){
		//分页查找my_main左连接(left join)my_info约定好每页最多显示40条帖子
		String sql_select_mymain = "SELECT main.*,info.info_id,info.info_reply,info.info_see,"
			+ "info.info_lastuser,info.info_lastime FROM mrbbs.my_main as main "
			+ "left join my_info as info on main.main_id = info.main_id "
			+ "order by main.main_commend,main.main_creatime desc limit ?,?";
		//一定要认真仔细的查看空格,代码4、5行结尾有一个空格
		return jdbc.queryForList(sql_select_mymain,row,offset);
	}
	
	//查看总页数
	public Long getMainCount(){
	//是用count关键字,查询总条数
	String sql_select_mymain = "select count(main_id) as count from my_main";
	//执行SQL语句,返回总条数
	return (Long)jdbc.queryForMap(sql_select_mymain).get("count");
}
	

	public String getPage (Long count,Integer currentPage,Integer offset){
		//数据
		Long currentLong = Long.parseLong(currentPage+"");
		Long countPage = 0L;
		//这里计算总页数
		if(count%offset!=0){
			countPage = count/offset+1; 
		}else{
			countPage = count/offset;
		}
		//使用StringBuffer拼接字符串
		StringBuffer sb = new StringBuffer();
		//前一页判断,判断当前页数大于1则存在前一页,否则不存在前一页
		if (currentPage> 1){
			sb.append("<span class=\"page\"> <a href=\"?page="+(currentPage-1));
			sb.append("\"> «</a> </span> ");
		}else{
			sb.append("<span class=\"page\"> <a href=\"?page=1");
			sb.append("\"> «</a> </span> ");
		}
		sb.append("<span class=\"page\" style=\"width: 50px !important;\"> ");
		sb.append("<a href=\"?page=1");
		sb.append("\"> start</a> ");
		sb.append("</span> ");
		
		//中间页数导航,中间最多显示5页,这里的计算有些复杂,判断了三次
		//第一次判断总页数减去当前页数加1大于等于5,证明向后存在5页
		//假设我们当前页数为2,那么我们中间导航显示为2、3、4、5、6
		if ((countPage-currentLong+1) >=5){
			for (Long i = currentLong ; i<currentPage+5;i++){
				sb.append("<span class=\"page\"> ");
				sb.append("<a href=\"?page="+i);
				sb.append("\"> "+i+"</a> ");
				sb.append("</span> ");
			}
		//第二次判断,基于上一次的判断不成立,那么证明当前页数向后不足5页
		//这时候判断总页数减4,判断中间导航是否能够支撑5页,假设总页数为10
		//当前页数为7,7向后不足5页,那么判断总页数是否够支撑5页,用总页数-4
		//如果够5页,那么得出一个结论是当前页数向后不够5页,总页数大于或等于5页
		//当前页数包含在最后5页,那么中间导航显示的就是6、7、8、9、10
		}else if (countPage-4 >  0){
			for (long i = countPage-4 ; i<= countPage;i++){
				sb.append("<span class=\"page\"> ");
				sb.append("<a href=\"?page="+i);
				sb.append("\"> "+i+"</a> ");
				sb.append("</span> ");
			}
		//经过上面两轮的判断,可以直接得出结论,总页数不足支撑5页
		//那么从1开始到总页数结束
		}else{
			for (long i = 1 ; i<= countPage;i++){
				sb.append("<span class=\"page\"> ");
				sb.append("<a href=\"?page="+i);
				sb.append("\"> "+i+"</a> ");
				sb.append("</span> ");
			}
		}
		//判断最后一页,最后一页等于总页数,这里只要判断是否存在1页,不存在最后一页设为1
		sb.append("<span class=\"page\" style=\"width: 40px !important;\"> ");
		sb.append("<a href=\"?page="+(countPage==0?1:countPage));
		sb.append("\"> end</a> ");
		sb.append("</span> ");
		//判断是否存在下一页,当前页数小于总页数,那么存在最后一页
		if (currentLong<countPage){
			sb.append("<span class=\"page\"> ");
			sb.append("<a href=\"?page="+currentLong+1);
			sb.append("\"> »</a> ");
			sb.append("</span> ");
		}else{
			sb.append("<span class=\"page\"> ");
			sb.append("<a href=\"?page="+currentLong);
			sb.append("\"> »</a> ");
			sb.append("</span> ");
		}
		//输出总页数
		sb.append("<span> ");
		sb.append("共"+countPage+"页");
		sb.append("</span> ");
		
		return sb.toString();
	}


}


富文本与分页

mrbbs=>WebContent=>WEB-INF=>view=>myJSP=>mainPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>

<!-- 
展示帖子页面
 -->


<html>
<head>
<%@include file="/../../../jspHead.jsp" %>
	<!--  分页样式  -->
 	<style type="text/css"> 
	.page{
		display:inline-block;			/*  内联对象  */
		border: 1px solid ;			/*  1像素边框  */
		font-size: 20px;				/*  文字大小20像素  */
		width: 30px;					/*  宽度30像素  */
		height: 30px;				/*  高度30像素  */
		background-color: #1faeff;	/*  设置背景色  */
		text-align: center;			/*  居中对齐  */
	}
	a,a:hover{ text-decoration:none; color:#333}
 	</style>

</head>
<body>
	<table class="table table-striped"> 
		<tr> 
			<th width="70%"> <strong> 标题:</strong> </th> 
			<th width="10%"> <strong> 作者</strong> </th> 
			<th width="10%"> <strong> 回复/查看</strong> </th> 
			<th width="10%"> <strong> 最后发表</strong> </th> 
		</tr> 
		<!--  choose标签相当于Java代码当中switch case语句 --> 
		<c:choose> 
			<%--  when标签相当于Java当中switch case语句当中的case,属性test设置条件 --%>
			<c:when test="${not empty main }"> 
				<!--  forEach相当于Java代码当中的循环  -->
				<!--  属性items为要迭代元素  -->
				<!--  属性item为迭代出来的元素  -->
				<!--  属性varStatus为迭代状态  -->
				<c:forEach items="${main }" var="item" varStatus="vs"> 
					<tr> 
						<td>
 						<!--  该a标签指向具体帖子连接,点击打开  -->
						<a href="<%=basePath%>secondPageContent?mainId=${item.main_id}"> 
				         <img src="<%=basePath %>image/pin_1.gif"
                            id="${item.main_id}img" /> 
						[日月精华]&nbsp;&nbsp; 
						<!--  获取标题  -->
 						${item.main_title }
						</a> 
						</td> 
						<td> 
						<!--  获取发帖人  -->
						${item.main_creatuser }
						</td> 
						<td> 
						<!--  获取回复人数与查看人数  -->
						${item.info_reply }/${item.info_see }
						</td> 
						<td> 
						<!--  获取最后发帖人  -->
						${item.info_lastuser }
						</td> 
					</tr> 
				</c:forEach> 
			</c:when> 
		</c:choose> 
	</table> 

<!-- *****************************分页************************************* -->
	
	<div class="row"> 
		<div class="col-xs-7"> 
	
		</div> 
		<div class="col-xs-5 text-nowrap"> 
			<!--  获取分页  -->
			${pageHtml }
		</div> 
	</div> 


<!-- **************************添加新帖表单与富文本编辑器******************************** -->
	<form action="<%=basePath %>saveUeditorContent" method="post">
		
	    <!-- 加载编辑器的容器 -->
		<!--  label标签为input表单定义标注  -->
		<label for="biaoti"> 帖子标题:</label> 
		<!--  input标签用于收集用户信息  -->
		<input type="text" name="mainTitle" placeholder="最大长度80个汉字" style="width: 360px;" > 
		<!--  button标签放置一个按钮,type属性设置为submit用于提交表单  -->
	     <button type="submit" class="btn btn-primary btn-xs text-right"> 
	     	发表帖子
	     </button> 
	     
	      <!--  富文本编辑器  --> 
	        <div style="padding: 0px;margin: 0px;width: 100%;height: 100%;" >
		        <script id="container" name="content" type="text/plain"></script>
	        </div>
	        <button type="submit">保存</button>
	        
    </form>
    
    <!-- 配置文件 -->
    <script type="text/javascript" src="<%=basePath %>uedit/js/ueditor.config.js"></script>
    <!-- 编辑器源码文件 -->
    <script type="text/javascript" src="<%=basePath %>uedit/js/ueditor.all.js"></script>
    <!-- 实例化编辑器 -->
    <script type="text/javascript">
   		 var editor = UE.getEditor('container');
    </script>
    <!-- end富文本 -->
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值