线上实习第三天回顾
今天是线上实习的第四天,继续完善ssm项目。在昨天的用户管理功能的基础上对用户列表进行进一步优化,完成用户列表的分页操作,完成了搜索功能。
源码展示
S1、项目结构展示
S2、为了完成分页功能,在bean目录下新建一个PageInfo类,用来记录页面信息。
PageInfo类源码:
package com.zhongruan.bean;
import java.util.List;
public class PageInfo<T> {
private List<T> list;
private int size;
private int totalPage;
private int totalCount;
private int currentPage;
@Override
public String toString() {
return "PageInfo{" +
"list=" + list +
", size=" + size +
", totalPage=" + totalPage +
", totalCount=" + totalCount +
", currentPage=" + currentPage +
'}';
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getCurrentPage() {
return currentPage;
}
public List<T> getList() {
return list;
}
public int getSize() {
return size;
}
public int getTotalPage() {
return totalPage;
}
public int getTotalCount() {
return totalCount;
}
public void setList(List<T> list) {
this.list = list;
}
public void setSize(int size) {
this.size = size;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
}
S3、UserController类中需要重写findAll方法
@RequestMapping("/findAll.do")
public ModelAndView findAll(@RequestParam(defaultValue = "1")int currentPage, String username,
@RequestParam(defaultValue = "0")int type, HttpSession session){
if(type==1){
session.setAttribute("searchName",username);
}else{
username=(String)session.getAttribute("searchName");
}
PageInfo<User> pageInfo = userService.findAll(currentPage,username);
ModelAndView mv = new ModelAndView();
mv.addObject("pageInfo",pageInfo);
mv.setViewName("user-list");
return mv;
}
S4、UserDao接口重写了findAll函数声明,新增了getTotalCount函数声明。
package com.zhongruan.dao;
import com.zhongruan.bean.PageInfo;
import com.zhongruan.bean.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserDao {
User findByUserName(String username);
// List<User> findAll();
void add(User user);
void deleteById(int id);
List<User> findAll(@Param("start") int start, @Param("username") String username);
User selectById(int id);
void update(User user);
int getTotalCount(@Param("username")String username);
}
S5、UserService接口重写了findAll函数的声明
package com.zhongruan.service;
import com.zhongruan.bean.PageInfo;
import com.zhongruan.bean.User;
import java.util.List;
public interface UserService {
int login(String username,String password);
// List<User> findAll();
void add(User user);
PageInfo<User> findAll(int currentPage, String username);
void deleteById(int id);
User selectUserById(int id);
void update(User user);
}
UserServiceImpl类中重写了findAll函数,因为每一页只要展示五条数据,所以需要记录所有用户数据的条数以及当前页面第一条数据的位置,记为start,记录当前页面的页数,如果小于1,强制留在第一页,如果大于总页数,点击下一页强制留在尾页。
@Override
public PageInfo<User> findAll(int currentPage, String username) {
PageInfo<User> pageInfo = new PageInfo<>();
pageInfo.setSize(5);
//tc为查询数据的总行数
int tc = userdao.getTotalCount(username);
pageInfo.setTotalCount(tc);
//tp为总页数
int tp = (int)Math.ceil(tc/5.0);
pageInfo.setTotalPage(tp);
if(currentPage<1){
pageInfo.setCurrentPage(1);
}else if(currentPage>tp){
pageInfo.setCurrentPage(tp);
}else {
pageInfo.setCurrentPage(currentPage);
}
int start = (pageInfo.getCurrentPage()-1)*5;
List<User> userList = userdao.findAll(start,username);
pageInfo.setList(userList);
return pageInfo;
}
S6、UserMapper.xml文件新增了两条SQL语句
根据传入的关键词进行模糊搜索,返回查询到的数量
<select id="getTotalCount" resultType="int" >
select count(*) from tb_user
<if test ="username!=null and username!='' ">
where username like concat("%",#{username},"%")
</if>
</select>
根据输入的关键词进行模糊,限定从start位置开始,查找出五条。
<select id="findAll" resultType="user">
select * from tb_user
<if test="username!=null and username!=''">
where username like concat("%",#{username},"%")
</if>
limit #{start},5
</select>
user-list.jsp文件也进行了修改
<div class="box-tools pull-right">
<ul class ="pagination">
<li><a href="/user/findAll.do" aria-label="Previous">首页</a></li>
<li><a href="/user/findAll.do?currentPage=${pageInfo.currentPage-1}">上一页</a></li>
<c:forEach begin="1" end="${pageInfo.totalPage}" var = "pageNum">
<li><a href="/user/findAll.do?currentPage=${pageNum}">${pageNum}</a></li>
</c:forEach>
<li><a href="/user/findAll.do?currentPage=${pageInfo.currentPage+1}">下一页</a></li>
<li><a href="/user/findAll.do?currentPage=${pageInfo.totalPage}" aria-lable="Next">尾页</a></li>
</ul>
</div>
<c:forEach items="${pageInfo.list}" var="user">
<tr>
<td><input id="ids" name="ids" type="checkbox" value="${user.id}"></td>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.password}</td>
<td class="text-center">
<a href="/user/toUpdate.do?id=${user.id}" class="btn bg-olive btn-xs">更新</a>
<a href="/user/deleteById.do?id=${user.id}" class="btn bg-olive btn-xs">删除</a>
</td>
</tr>
</c:forEach>
运行结果
①展示所有用户,当前为第一页
②展示所有用户,当前为第二页
③输入关键词a,查找所有用户名包含a的用户信息
④输入关键词1,查找所有用户名包含1的用户信息
一些知识点
模糊查询
通配符的分类:
%百分号通配符: 表示任何字符出现任意次数 (可以是0次).
_下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符.
like操作符:
LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较.
注意: 如果在使用like操作符时,后面的没有使用通用匹配符效果是和=一致的,SELECT * FROM products WHERE products.prod_name like ‘1000’;只能匹配的结果为1000,而不能匹配像JetPack 1000这样的结果.
参考资料:
mysql中模糊查询的四种用法
MyBatis系列:模糊查询的4种实现方式
正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
参考资料:
正则表达式 - 语法
正则表达式