1、Jar 包
UTF-8
1.7
1.7
1.18.12
4.11
5.1.47
1.2.62
javax.servlet
javax.servlet-api
3.1.0
provided
javax.servlet.jsp
jsp-api
2.2
provided
javax.servlet
jstl
1.2
org.projectlombok
lombok
${lombok.version}
provided
junit
junit
${junit.version}
test
mysql
mysql-connector-java
${mysql.version}
com.alibaba
fastjson
${fastjson.version}
javax.mail
mail
1.4
javax.activation
activation
1.1
com.sun.mail
jakarta.mail
1.6.7
commons-lang
commons-lang
2.6
添加用户
用户编码
用户名称
性别
年龄
电话
用户角色
操作
${user.userCode}
${user.userName}
${user.gender == 1 ? "女" : "男"}
${user.birthday}
${user.phone}
${role.roleName}
主要有三类数据:
1、分页参数
2、回显参数 (条件查询的条件)
3、条件分页查询的数据
public class PageSupport {
//当前页,显示页码
private int currPageNo = 1;
//页面容量
private int pageSize = 5;
//总条数(带条件查询的总条数)
private int totalCount;
//总页数(根据总条数和页面容量)
private int totalPage;
//分页条件查询的数据
private T data;
//回显 查询数据
private List callBackInfo;
//排序字段
private String orderBy = "id";
//升序 还是 降序
private String ascOrDesc = "asc";
//设置总条数的时候 计算总页数
public void setTotalCount(int totalCount) {
//当存在总条数,确定总页数
this.totalCount = totalCount;
//计算总页数
this.totalPage = this.totalCount % this.pageSize == 0 ?
this.totalCount / this.pageSize :
this.totalCount / this.pageSize + 1;
}
public int getCurrPageNo() {
return currPageNo;
}
public void setCurrPageNo(int currPageNo) {
//页码特殊处理
if(currPageNo < 1 || this.totalCount == 0 ){
currPageNo = 1;
}else if(currPageNo > this.totalPage){
currPageNo = this.getTotalPage();
}
this.currPageNo = currPageNo;
}
.......
}
分页 条件查询用户列表
// 分页 条件查询用户列表
public void userList(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("=============条件 分页 查询用户列表=====================");
//获取 条件查询 参数
String queryName = req.getParameter("queryName");
String queryUserRole = req.getParameter("queryUserRole") == null ? "0" : req.getParameter("queryUserRole");
//获取 分页 参数
//获取显示的当前页码
Integer pageNo = Integer.parseInt( req.getParameter("pageNo") == null ? "1" : req.getParameter("pageNo") );
Integer pageSize = Integer.parseInt( req.getParameter("pageSize") == null ? "5" : req.getParameter("pageSize") );
//排序条件
String orderBy = req.getParameter("orderBy") == null ? "id" : req.getParameter("orderBy");
String ascOrDesc = req.getParameter("ascOrDesc") == null ? "asc" : req.getParameter("ascOrDesc");
//根据条件查询获取用户 总数
int totalCount = userService.getUserListTotalByQueryNameAndQueryUserRole(queryName,Integer.parseInt(queryUserRole));
//创建分页对象
PageSupport> pageSupport = new PageSupport>();
//先放pageSize
pageSupport.setPageSize(pageSize);
//再放totalCount
pageSupport.setTotalCount(totalCount);
//创建回显数据
List callBackInfo = new ArrayList();
//pageSupport 中放入回显数据
//查询条件
callBackInfo.add(queryName);
callBackInfo.add(queryUserRole);
pageSupport.setCallBackInfo(callBackInfo);
//当前页码
pageSupport.setCurrPageNo(pageNo);
//页面容量
pageSupport.setPageSize(pageSize);
//排序条件
pageSupport.setOrderBy(orderBy);
//排序 方式 asc desc
pageSupport.setAscOrDesc(ascOrDesc);
//查询所有的用户详情列表
List userList = userService.getUserListByQueryNameAndQueryUserRole(queryName,Integer.parseInt(queryUserRole),pageSupport);
System.out.println("=============条件 分页 查询用户列表 参数=============");
System.out.println("查询参数==》queryName = " + queryName);
System.out.println("查询参数==》queryUserRole = " + queryUserRole);
System.out.println("排序参数==》orderBy = " + orderBy);
System.out.println("排序参数==》ascOrDesc = " + ascOrDesc);
System.out.println("分页参数==》pageNo = " + pageNo);
System.out.println("分页参数==》pageSize = " + pageSize);
System.out.println(JSON.toJSONStringWithDateFormat(userList,"yyyy-MM-dd"));
//req.setAttribute("userList",userList);
//将数据放入分页对象中
pageSupport.setData(userList);
//将分页对象放进request域中
req.setAttribute("pageSupport",pageSupport);
//查询所有的 用户角色
List roleList = roleService.findRoleList();
System.out.println("=============查询所有的用户角色===============");
System.out.println(JSON.toJSONStringWithDateFormat(roleList,"yyyy-MM-dd"));
//将roleList 放进session域中,方便其他的地方直接调用,不用再次查询
req.getSession().setAttribute("roleList",roleList);
//内部转发到用户列表页面
req.getRequestDispatcher( "/jsp/userlist.jsp").forward(req,resp);
//req.getContextPath()+"/jsp/userlist.jsp" 带项目名的时候不能这样会 拼接两次 项目名
//req.getRequestDispatcher( req.getContextPath()+"/jsp/userlist.jsp").forward(req,resp);
}
条件查询用户列表 总数
//条件查询用户列表 总数
@Override
public int selectUserListTotalByQueryNameAndQueryUserRole(String queryName, Integer QueryUserRole) {
int total = 0;
//SQl
String executeSql = "select count(1) as 'total' \n"
+ "from smbms_user where 1=1 ";
//params
List params = new ArrayList();
//拼接参数 和 sql
if(null != queryName && !"".equals(queryName)){
executeSql += " and userName like concat('%',?,'%') ";
params.add(queryName);
}
if(null != QueryUserRole && 0 != QueryUserRole){
executeSql += " and userRole = ? ";
params.add(QueryUserRole);
}
try {
//执行
executeSelect(executeSql, params.toArray());
//处理数据
while (rs.next()) {
total = rs.getInt("total");
}
}catch(Exception e){
e.printStackTrace();
}finally {
releaseResource(conn,pstmt,rs);
}
return total;
}
条件 分页 查询用户列表
1、定义 返回的参数
2、定义sql
3、动态拼接查询条件
3、动态拼接查询参数(List paramList)
4、动态拼接分页条件
5、动态拼接分页参数(List paramList)
6、执行sql
7、处理数据
其中 timestampdiff(year,birthday, now()) 计算年龄的函数,最后说明;
//条件 分页 查询用户列表
@Override
public List SelectUserListByQueryNameAndQueryUserRole(String queryName, Integer QueryUserRole, PageSupport pageSupport) {
List userList = new ArrayList();
//SQl
String executeSql = "select id,userCode,userName,userPassword,gender,birthday,timestampdiff(year,birthday, now()) as userAge ,phone,address,userRole,createdBy,creationDate,modifyBy,modifyDate\n"
+ "from smbms_user where 1=1 ";
//params
List paramList = new ArrayList();
//拼接参数 和 sql
if(null != queryName && !"".equals(queryName)){
executeSql += " and userName like concat('%',?,'%') ";
paramList.add(queryName);
}
if(null != QueryUserRole && 0 != QueryUserRole){
executeSql += " and userRole = ? ";
paramList.add(QueryUserRole);
}
//增加分页SQL语句
executeSql += " order by "+pageSupport.getOrderBy()+ " " +pageSupport.getAscOrDesc()+" limit ?,?";
paramList.add((pageSupport.getCurrPageNo() - 1) * pageSupport.getPageSize());
paramList.add(pageSupport.getPageSize());
try {
//执行
executeSelect(executeSql, paramList.toArray());
//处理数据
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setUserCode(rs.getString("userCode"));
user.setUserName(rs.getString("userName"));
user.setUserPassword(rs.getString("userPassword"));
user.setGender(rs.getInt("gender"));
user.setBirthday(rs.getDate("birthday"));
user.setUserAge(rs.getInt("userAge"));
user.setPhone(rs.getString("phone"));
user.setAddress(rs.getString("address"));
user.setUserRole(rs.getInt("userRole"));
user.setCreatedBy(rs.getInt("createdBy"));
user.setCreationDate(rs.getDate("creationDate"));
user.setModifyBy(rs.getInt("modifyBy"));
user.setModifyDate(rs.getDate("modifyDate"));
userList.add(user);
}
}catch(Exception e){
e.printStackTrace();
}finally {
releaseResource(conn,pstmt,rs);
}
return userList;
}
角色列表查询省略;
不过如果 角色列表有更改, 需要重置session域中的角色列表集合数据;
共 ${pageSupport.totalCount} 条记录
${pageSupport.currPageNo}
/
${pageSupport.totalPage} 页
首页
上一页
下一页
最后一页
每页
selected >3
selected >5
selected >10
条
根据
selected > id
selected >创建时间
selected >升序
selected >降序
查询
跳转至
页
GO
首页,上一页,下一页,尾页,及 上一页和下一页的 隐藏;
//分页跳转
//首页
$(".page-num-ul a:eq(0)").click(function(){
//获取id为pageNo的input标签,并给value属性赋值
// $("#pageNo").val(1);
//获取表单,并给表单name为pageNo的input标签赋值
document.forms[0].pageNo.value = 1;
$("#searchForm").submit();
});
// 上一页
$(".page-num-ul a:eq(1)").click(function(){
// $("#pageNo").val(parseInt($("#currPageNo").text()) - 1);
document.forms[0].pageNo.value = parseInt($("#currPageNo").text()) - 1;
$("#searchForm").submit();
});
// 下一页
$(".page-num-ul a:eq(2)").click(function(){
// $("#pageNo").val(parseInt($("#currPageNo").text()) + 1);
document.forms[0].pageNo.value = parseInt($("#currPageNo").text()) + 1;
$("#searchForm").submit();
});
// 尾页
$(".page-num-ul a:eq(3)").click(function(){
// $("#pageNo").val(parseInt($("#totalPage").text()));
document.forms[0].pageNo.value = parseInt($("#totalPage").text());
$("#searchForm").submit();
});
//上一页,下一页隐藏处理
//上一页
if($("#currPageNo").text() == "1"){
//alert($("#currPageNo").text());
$(".page-num-ul a:eq(1)").hide();
}else {
$(".page-num-ul a:eq(2)").show();
}
//下一页
if($("#currPageNo").text() == $("#totalPage").text()){
//alert($("#currPageNo").text());
$(".page-num-ul a:eq(2)").hide();
//.css("display","none");
}else {
//alert($("#currPageNo").text());
$(".page-num-ul a:eq(2)").show();
//.css("display","inline");
}
//跳到指定页数
$(".page-btn").click(function () {
var $inputPage = $("#inputPage");
if($inputPage.val() < 0 || $inputPage.val() > parseInt($("#totalPage").text())){
alert("请输入正确的页数!!!");
}else{
//修改表单中的当前页
// $("#pageNo").val($inputPage.val());
document.forms[0].pageNo.value = $inputPage.val();
$("#searchForm").submit();
}
});
select的$(“#selected”).change(function(){});
切换select选项后 触发change事件;
修改每页页面大小
//修改每页页面大小 重新查询
$("#currentPageSize").change(function(){
//获取修改后的 currentPageSize
var currentPageSize = $(this).children('option:selected').val();
//alert(currentPageSize);
//修改提交表单的pageSize
// $("#pageSize").val(currentPageSize);
document.forms[0].pageSize.value = currentPageSize;
//修改页面大小后,再主动查询一次动漫数据
//将当前页数,重置为1
// $("#pageNo").val(1);
document.forms[0].pageNo = 1;
$("#searchForm").submit();
});
修改查询条件
//修改查询条件
$("#currentOrderBy").change(function(){
//获取修改后的 currentOrderBy
var currentOrderBy = $(this).children('option:selected').val();
//修改提交表单的orderBy
// $("#orderBy").val(currentOrderBy);
document.forms[0].orderBy.value = currentOrderBy;
//修改页面大小后,再主动查询一次动漫数据
//将当前页数,重置为1
// $("#pageNo").val(1);
document.forms[0].pageNo.value = 1;
$("#searchForm").submit();
});
修改升序或降序
//升序或降序
$("#currentAscOrDesc").change(function(){
//获取修改后的 currentAscOrDesc
var currentAscOrDesc = $(this).children('option:selected').val();
//修改提交表单的orderBy
// $("#ascOrDesc").val(currentAscOrDesc);
document.forms[0].ascOrDesc.value = currentAscOrDesc;
//修改页面大小后,再主动查询一次动漫数据
//将当前页数,重置为1
// $("#pageNo").val(1);
document.forms[0].pageNo.value = 1;
$("#searchForm").submit();
});
4、查看详情
查看详情a标签
查看用户详情
5、修改用户
用户修改a标签
修改用户
用户修改页面的form表单请求
6、删除用户
7、增加用户
添加用户a标签
添加用户
用户添加页面的用户添加请求表单
8、修改用户密码
9、注意点
注意看路径映射是否有问题;(有没有少写 “/”)
报错信息:Resource interpreted as Stylesheet but transferred with MIME type text/html;
字符编码拦截器单独对css文件的解析类型进行处理
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//设置post请求字符集 encoding为设置映射路径时,设置的初始化字符编码
servletRequest.setCharacterEncoding(encoding);
HttpServletRequest request = (HttpServletRequest) servletRequest;
//静态资源放行
//获取资源名
String url=request.getRequestURI();
//如果资源名包含css样式表、js样式表就特殊处理然后放行
if(url.contains(".css")) {
servletResponse.setContentType("text/css; charset=UTF-8");
servletResponse.setCharacterEncoding(this.encoding);
System.out.println("css放行");
//放行请求
filterChain.doFilter(servletRequest,servletResponse);
}else {
//设置响应字符集
servletResponse.setContentType("text/html; charset=UTF-8");
servletResponse.setCharacterEncoding(this.encoding);
//放行请求
filterChain.doFilter(servletRequest,servletResponse);
}
}
有时候 自动导包导致 不是自己想要的包, 直接用全类名即可;
主要会再使用@WebServlet 和 @WebFilter 注解后会出现这个问题
javax.servlet.http.HttpServlet
@WebServlet(name = "userServlet",urlPatterns = "/userServlet")
public class UserServlet extends javax.servlet.http.HttpServlet{......}
javax.servlet.Filter
@WebFilter(filterName = "characterEncodingFilter",urlPatterns = "/*",initParams = {
@WebInitParam(name = "encoding",value = "utf-8")
})
//
public class CharacterEncodingFilter implements javax.servlet.Filter {......}
form表单的 action拼接路径,注意再 get提交方式时 不能拼接参数,在 post提交方式可以;
form表单提交方式 action是否可以拼接参数 get 不可以(实在要使用get就在input中隐藏,这样get和post都可以) post 可以
get提交
get提交由于 不能拼接参数,所以将method参数隐藏在表单中;
action=”${pageContext.request.contextPath }/billServlet”
......
post提交
post提交可以 直接拼接参数,也可以将method参数隐藏在表单中;
action=”${pageContext.request.contextPath }/billServlet?method=billList”
......
首先要知道 req.getContextPath() 获取到的是什么内容?
如果发布的项目路径为:/kh96_smbms
System.out.println(" req.getContextPath()==》"+req.getContextPath());
// req.getContextPath()==》 /kh96_smbms 注意它前面有 /,这个是重点
如果发布的项目名为:/
System.out.println(" req.getContextPath()==》"+req.getContextPath());
// req.getContextPath()==》 什么都没有,包括我们之前写发布名时的 / 也没有
知道 req.getContextPath() 获取的是什么我们就 恍然大悟了;
转发和重定向的路径区别:
- 重定向路径中如果有 “/”,只会获取到 站点,然后拼接上我们写的路径;
- 转发路径中如果有 “/”,会先获取到 站点 + 项目名,再拼接上我们写的路径;
所以重定向:(前提自己写的路径前有 /)
- 如果 有项目名,我们 一定要 加上 req.getContextPath(), 获取到项目名,再拼接跳转的路径;
- 如果 没有项目名,我们 加上或不加上,都可以;
转发:(前提自己写的路径前有 /)
- 如果 有项目名,我们不能 加上 req.getContextPath(),如果加上会多拼接上一个项目名,而找不到路径;
- 如果 没有项目名,我们 加上或不加上,都可以;
总结:(前提自己写的路径前有 /)
- 没有项目名, 加不加 req.getContextPath() 都可以, 不过建议加上;
- 有项目名:
- 重定向 一定要加req.getContextPath() ;
- 转发 一定不能加req.getContextPath() ;
10、sql的时间差函数
用来计算时间的差距,年龄,距上一次登录多少天等等;
只比较日期
DATEDIFF() 函数返回两个日期之间的天数。
date1 和 date2 参数是合法的日期或日期/时间表达式。 只有值的日期部分参与计算。
测试一下MySQL:
SELECT DATEDIFF('2018-05-09 08:00:00','2018-05-09') AS DiffDate;
//结果 0 ; 表示 2018-05-09 与 2018-05-09之间没有日期差。这里是不比较时分秒的。下面验证带上时分秒有没有差别。
SELECT DATEDIFF('2018-05-09 00:00:00','2018-05-09 23:59:59') AS DiffDate;
//结果 0 ;
SELECT DATEDIFF('2018-05-08 23:59:59','2018-05-09 00:00:00') AS DiffDate;
//结果 -1;
SELECT DATEDIFF('2018-05-09 00:00:00','2018-05-08 23:59:59') AS DiffDate;
//结果 1;
可以计算,年,月,日的差距;
select timestampdiff(YEAR,"2018-01-01 15:15:16","2019-08-23 15:15:16") as timestamodiff;
//结果1。相差一年。
select timestampdiff(YEAR,"2019-08-22 15:15:19","2018-12-23 15:15:16") as timestamodiff;
//结果 -1,也是相差一年。
select timestampdiff(YEAR,"2019-08-22 15:15:19","2018-08-22 15:15:16") as timestamodiff;
//结果0,相差不到一年
select timestampdiff(MONTH,"2018-08-22 15:15:16","2018-07-23 15:15:16") as timestamodiff;
// 结果 0 相差不到一个月
select timestampdiff(MONTH,"2018-08-22 15:15:16","2018-07-01 15:15:16") as timestamodiff;
// 结果 -1 相差一个月
select timestampdiff(MONTH,"2018-08-22 15:15:19","2018-09-23 15:15:16") as timestamodiff;
// 结果 1 想差一个月
select timestampdiff(DAY,"2018-08-22 15:15:16","2018-08-23 15:15:16") as timestamodiff;
// 结果 1 想差一天
select timestampdiff(DAY,"2018-08-22 15:15:19","2018-08-23 15:15:16") as timestamodiff;
// 结果 0 想差不到一天
select timestampdiff(DAY,"2018-08-23 15:15:19","2018-08-22 15:15:16") as timestamodiff;
// 结果 -1 想差一天
Original: https://www.cnblogs.com/xiaoqigui/p/16594687.html
Author: 化羽羽
Title: Javaweb09-请求跳转项目 分页条件查询 + 增删改 + 邮件登录
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620382/
转载文章受原作者版权保护。转载请注明原作者出处!