实现功能
• 开发流程
- 1次请求的执行过程
• 分步实现
- 开发社区首页,显示前10个帖子
- 开发分页组件,分页显示所有的帖子
entity
Page
设置分页相关信息
public class Page {
//当前页码
private int current=1;
//页面显示上限
private int limit=10;
/*
前两个是页面传入的信息;后两个变量是服务器自身要使用的数据
*/
//数据总数(用于计算总的页数) 服务端查出来的
private int rows;
//查询路径(复用分页链接
private String path;
public int getCurrent() {
return current;
}
public void setCurrent(int current) {
if(current>=1){
this.current = current;
}
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
if(limit>=1&&limit<=100){
this.limit = limit;
}
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
if(rows>=0){
this.rows = rows;
}
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
//额外提供条件:数据库查询需要用到的、页面显示需要用到的
//获取当前页的起始行:页码*当前页上限-上限
public int getOffset(){
//current*limit-limit
return (current-1)*limit;
}
//用来获取总的页数
public int getTotal(){
if(rows%limit==0){
return rows/limit;
}else{
return (rows/limit)+1;
}
}
//从···页到···页
public int getFrom(){
//获取起始页码:只显示当前页的前两呀页
int from=current-2;
return from<1?1:from;
}
public int getTo(){
//获取终止页码:只显示当前页的后两页
int to=current+2;
return to>getTotal()?getTotal():to;
}
}
DiscussPost
帖子相关信息
public class DiscussPost {
private int id;
private int userId;
private String title;
private String content;
private int type;
private int status;
private Date createTime;
private int commentCount;
private double score;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public int getCommentCount() {
return commentCount;
}
public void setCommentCount(int commentCount) {
this.commentCount = commentCount;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
@Override
public String toString() {
return "DiscussPost{" +
"id=" + id +
", userId=" + userId +
", title='" + title + '\'' +
", content='" + content + '\'' +
", type=" + type +
", status=" + status +
", createTime=" + createTime +
", commentCount=" + commentCount +
", score=" + score +
'}';
}
}
controller
@Controller //Controller访问路径可省略
public class HomeController implements CommunityConstant {
//Controller会调用Service,需要将Service注入
@Autowired
private DiscussPostService discussPostService;
@Autowired
//会通过discussPostService查到的userId查找具体User信息
private UserService userService;
@Autowired
private LikeService likeService;
//定义处理请求的方法
//若返回的是一个HTML,则不用加@Response注解
@RequestMapping(path = "/index",method = RequestMethod.GET)
public String getIndexPage(Model model, Page page){
//在SpringMVC中,方法参数都是由DispatcherServlet初始化的,
//还会额外把Page对象装进Model中
/*
在方法调用前,SpringMVC会自动实例化Model和Page,并将Page注入Model中
所以在thymeleaf模板中就可以直接访问Page对象中的数据
*/
page.setRows(discussPostService.findDiscussPostRows(0));//设置总行数
page.setPath("/index");//设置返回路径
//首先获取帖子信息
List<DiscussPost> list = discussPostService.findDiscussPosts(0, page.getOffset(), page.getLimit());
List<Map<String,Object>> discussPosts=new ArrayList<>();
for(DiscussPost post:list){
Map<String,Object> map=new HashMap<>();
map.put("post",post);
User user = userService.findUserById(post.getUserId());//再通过获取的帖子信息的UserID找到User完整信息
map.put("user",user);
//获取点赞数量
long likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_POST, post.getId());
map.put("likeCount",likeCount);
discussPosts.add(map);
}
model.addAttribute("discussPosts",discussPosts);
//通过
return "/index";
}
}
service
DiscusspostService
@Service
public class DiscussPostService {
@Autowired
private DiscussPostMapper discussPostMapper;
public List<DiscussPost> findDiscussPosts(int userId, int offset, int limit) {
return discussPostMapper.selectDiscussPost(userId, offset, limit);
}
public int findDiscussPostRows(int userId) {
return discussPostMapper.selectDiscussPostRows(userId);
}
}
dao
@Mapper//mybatis注解
public interface DiscussPostMapper {
//声明查询方法:分页查询,返回多条记录
List<DiscussPost> selectDiscussPost(int userId,int offset,int limit);
//查询出表里一共有多少条数据 @Param("userId"):为参数取别名
int selectDiscussPostRows(@Param("userId")int userId);
//如果需要动态的提出条件(在<if>里使用),并且需要用到这个参数,且这个方法有且只有一个条件参数,此参数必须取别名
//实现插入帖子功能
int insertDiscussPost(DiscussPost discussPost);
//查找帖子-->通过id
DiscussPost selectDiscussPostById(int id);
//增加帖子评论数量
int updateCommentCount(int id,int commentCount);
}
DiscussPost.xml
<mapper namespace="com.light.community.dao.DiscussPostMapper"><!--填写discusspost-mapper的全限定类名-->
<!--提取查询字段-->
<sql id="selectFields">
id,user_id,title,content,type,status,create_time,comment_count,score
</sql>
<!--提取插入字段-->
<sql id="insertFields">
user_id,title,content,type,status,create_time,comment_count,score
</sql>
<select id="selectDiscussPost" resultType="DiscussPost">
select <include refid="selectFields"></include>
from discuss_post
where status!=2
<if test="userId!=0">
and user_id=#{userId}
</if>
order by type desc,create_time desc
limit #{offset},#{limit}
</select>
<select id="selectDiscussPostRows" resultType="int">
select count(id)
from discuss_post
where status!=2
<if test="userId!=0">
and user_id=#{userId}
</if>
</select>
</mapper>