## 获取主贴提交参数
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" />
[日月精华]
<!-- 获取标题 -->
${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>