一、过滤器Filter 接口
1.导包:
<groupId>com.qf</groupId>
<artifactId>FilterAndJquery</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
- java.servlet.Filter:
- 三个重写方法(生命历程)
/* 自定义一个类,实现Filter接口重写里面三个方法
*/
@WebFilter
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init方法被调用了...");
}
//过滤任务
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//可以处理request相关的参数
System.out.println("请求被过滤器拦截...");
//过滤的业务需要在这里完成!
chain.doFilter(request,response);//放行
//设置响应相关参数
System.out.println("response来了...");
}
@Override
public void destroy() {
System.out.println("过滤器被销毁了...");
}
}
4.servlet:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("doGet方法被调用了");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
5.使用标签的方式过滤器
注解的方式:
@WebFilter
@WebFilter(urlPatterns = "/hello",
设置过滤器的初始化参数
initParams =@WebInitParam(name = "encoding",value = "utf-8")
配置过滤规则
dispatcherTypes = DispatcherType.FORWARD
dispatcherTypes = DispatcherType.REQUEST :默认 直接浏览器请求
dispatcherTypes = DispatcherType.INCLUDE :包含当前路径
)
public class MyFilter implements Filter {
String character ;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//System.out.println("init方法被调用了...");
String value = filterConfig.getInitParameter("encoding");
character = value ;
}
//过滤任务
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//可以处理request相关的参数
System.out.println("请求被过滤器拦截...");
//过滤的业务需要在这里完成!
chain.doFilter(request,response);//放行
//设置响应相关参数
System.out.println("response来了...");
}
@Override
public void destroy() {
System.out.println("过滤器被销毁了...");
}
}
二、项目更新:
目标:1). 后台管理/前台统一处理全局乱码;
2). 用户删除功能;
3). 用户分页功能。
ulist.jsp:
<body>
<%--添加响应式属性:
防止浏览器分别尺寸不断的进行变化,内容不会紊乱(自动适应屏幕分辨率)
--%>
<div class="table-responsive">
<form id="myForm" action="${pageContext.request.contextPath}/delSelected" method="post">
<table class="table table-hover table-bordered">
<tr>
<td>
<input type="checkbox" id="fistCbx" />
</td>
<th>用户id</th>
<th>用户名</th>
<th>密码</th>
<th>真实姓名</th>
<th>邮箱</th>
<th>电话</th>
<th>出生日期</th>
<th>性别</th>
<th>是否激活</th>
<th>操作</th>
</tr>
<c:forEach items="${userList}" var="u" varStatus="status">
<tr>
<td>
<input type="checkbox" name="uid" value="${u.uid}"/>
</td>
<td>${u.uid}</td>
<td>${u.username}</td>
<td>${u.password}</td>
<td>${u.name}</td>
<td>${u.email}</td>
<td>${u.telephone}</td>
<td>${u.birthday}</td>
<td>${u.sex}</td>
<td>${u.state}</td>
<td>
<%-- <input type="button" class="btn-primary" onclick="update()" value="修改"/>--%>
<%--
将超链接跳转 禁用掉javascript:void(0)
--%>
<a href="${pageContext.request.contextPath}/findUser?uid=${u.uid}" class="btn btn-primary">修改</a>
<a href="${pageContext.request.contextPath}/deleteUser?uid=${u.uid}" class="btn btn-danger">删除</a>
<%--http://localhost:8080/WEB/findUser?uid=xxx--%>
</td>
</tr>
</c:forEach>
<%-- <tr>
<td>1</td>
<td>旋风小子</td>
<td>123456</td>
<td>张三</td>
<td>zhangsan@163.com</td>
<td>13366668888</td>
<td>1990-2-27</td>
<td>男</td>
<td>0</td>
<td>FC37A67AA02E4C3886D7E0AF0886CDA3</td>
<td>
<input type="button" class="btn-primary" value="修改"/>
<input type="button" class="btn-danger" value="删除"/>
</td>
</tr>
<%--略--%>
<div style="float: right;margin-right: 30px;font-size: 30px">
<a class="btn-default" href="javascript:void(0)" id="delSelected" >删除选中</a>
</div>
<div class="page-class">
<%--boostrap的分页组件--%>
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="上一页">
<span aria-hidden="true">«</span>
</a>
</li>
<c:forEach begin="1" end="${pb.totalPage}" var="n" varStatus="status">
<li><a href="#">${n}</a></li>
</c:forEach>
<%-- <li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>--%>
<li>
<a href="#" aria-label="下一页">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
</div>
</body>
<script>
/*function delSingleUser(id){
//alert(id) ;
//获取哪些
}*/
//触发页面载入事件:让所有的body内容加载完毕
window.onload = function(){
//删除选中
//id="delSelected"
document.getElementById("delSelected").onclick = function(){
if(confirm("您确定要删除这些用户吗?")){
//定义标记
var flag = false ;
//alert("删除选中...") ;
//获取被选中的哪些条目信息的状态
var cbx = document.getElementsByName("uid") ;
//继续遍历
for(var i = 0 ; i < cbx.length ; i ++){
if(cbx[i].checked){
//选中了
//更改标记
flag = true ;
break ;
}
}
//如果flag为true,执行表单提交
if(flag){
document.getElementById("myForm").submit() ;
}
}
}
}
//全选,反选
//获取id="fistCbx"的标签对象,给设置点击事件
document.getElementById("fistCbx").onclick = function(){
// document.getElementById("fistCbx") ----this
//通过name="uid"获取所有的 input标签对象
var cbx = document.getElementsByName("uid") ;
//遍历
for(var i = 0 ; i < cbx.length ; i++){
//让每一个cbx这个对象状态和this的状态一直
cbx[i].checked = this.checked;
}
}
</script>
</html>
CharacterFilter.java:定义过滤器
/* 定义过滤器:解决全局的中文乱码(get/post)
*/
//直接配置
@WebFilter("/*")
public class CharacterFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
//过滤任务
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
//将req和resp转换成 ---HttpServletRequest和HttpServletResponse
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//获取前台的提交方式
String method = request.getMethod();
//判断
if(method.equalsIgnoreCase("post")){
//解决post中文路乱码
request.setCharacterEncoding("utf-8");
}
//响应的中文乱码
response.setContentType("text/html;charset=utf-8");
//放行
chain.doFilter(req,resp);
}
@Override
public void destroy() {
}
}
DeleteSelectedServlet.java:定义删除的servlet
import com.qf.service.AdminService;
import com.qf.service.impl.AdminServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/delSelected")
public class DeleteSelectedServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取所有的uid的值
String[] uids = request.getParameterValues("uid"); //获取所有的uid
for(String uid:uids){
// System.out.println(s);
//调用AdminService
AdminService adminService = new AdminServiceImpl() ;
adminService.delete(uid);
}
//请求转发到/ulid
request.getRequestDispatcher("/ulist").forward(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
FindUserByPageServlet.java:分页
import com.qf.entity.PageBean;
import com.qf.entity.User;
import com.qf.service.AdminService;
import com.qf.service.impl.AdminServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/findUserByPage")
public class FindUserByPageServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//接收两个参数
//当前页码
String currentPage = request.getParameter("curPage");
String pageSize = request.getParameter("pSize") ;
//判断
if(currentPage==null || currentPage==""){
currentPage = "1" ; // 赋值第一页
}
if(pageSize ==null || pageSize ==""){
pageSize = "2" ; //每页显示2条数据
}
//调用AdminService
AdminService adminService = new AdminServiceImpl() ;
PageBean<User> pb = adminService.getUserByPage(currentPage, pageSize);
System.out.println(pb);
//将PageBean对象存储在request域中
request.setAttribute("pb",pb);
//请求转发到ulist.jsp中进行数据展示
request.getRequestDispatcher("/admin/ulist.jsp").forward(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
PageBean.java:分页实体类
/* 自定义分页实体
*/
public class PageBean<T> {
private int currentPage ; //当前页码
private int totalPage ;//总页数
private int totalCount ;//总记录数
private int pageSize ; //每页显示条数
private List<T> list ;//针对哪个实体进行分页
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
//总页数
public int getTotalPage() {
return ((totalCount% pageSize)==0 ? totalCount/pageSize : totalCount/pageSize+1 ) ;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
@Override
public String toString() {
return "PageBean{" +
"currentPage=" + currentPage +
", totalPage=" + totalPage +
", totalCount=" + totalCount +
", pageSize=" + pageSize +
", list=" + list +
'}';
}
}
AdminService.java:删除业务抽象方法
import com.qf.entity.User;
import java.util.List;
/* 针对管理员操作业务接口层
*/
public interface AdminService {
//定义功能
//根据用户名查询用户
boolean isLogin(String username, String password) ;
/**
* 查询用户列表
* @return
*/
List<User> findUserList() ;
/**
* 通过用户id获取用户
* @param uid
* @return
*/
User getUser(String uid) ;
/**
* 更新用户
* @param user
*/
void update(User user) ;
//更加uid删除用户
void delete(String uid) ;
//最终需要返回给客户端:PageBean
/**
* 分页查询功能
* @param currentPage 当前页码
* @param pageSize 每页显示的条数
* @return 返回的分页实体
*/
PageBean<User> getUserByPage(String curPage,String pSize) ;
}
AdminServiceImpl.java:重写删除的用户方法
import com.qf.dao.AdminDao;
import com.qf.dao.impl.AdminDaoImpl;
import com.qf.entity.AdminUser;
import com.qf.entity.User;
import com.qf.service.AdminService;
import java.util.List;
/* 针对管理员用户业务接口实现层
*/
public class AdminServiceImpl implements AdminService {
@Override
public boolean isLogin(String username,String password) {
//调用dao层:完成数据的查询
AdminDao ad = new AdminDaoImpl() ;
AdminUser adminUser = ad.selectUserByName(username);
//逻辑判断
//获取查询到的用户的密码
if(adminUser.getAdminPassword().equals(password)){
//一致
return true ;
}
return false ;
}
/**
* 查询用户列表
* @return
*/
@Override
public List<User> findUserList() {
//调用AdminDao
AdminDao ad = new AdminDaoImpl() ;
List<User> list = ad.selectAllUser();
//可以加入逻辑:防止NullPointerException
if(list!=null){
return list ;
}
return null ;
}
/**
* 通过用户id获取用户
* @param uid 用户的uid
* @return 返回需要查询的用户
*/
@Override
public User getUser(String uid) {
//创建Dao层对象
AdminDao adminDao = new AdminDaoImpl() ;
User user = adminDao.selectUserByUid(uid);
if(user!=null){
return user ;
}
return null;
}
//更新用户
@Override
public void update(User user) {
//调用Dao
AdminDao adminDao = new AdminDaoImpl() ;
adminDao.updateCostmUser(user) ;
}
//根据用uid删除用户
@Override
public void delete(String uid) {
AdminDao adminDao = new AdminDaoImpl() ;
int count = adminDao.deleteUserByUid(uid);
System.out.println(count);
}
/**
* 分页查询用户
* @param curPage 当前页码
* @param pageSize 每页显示的条数
* @return 返回分页实体
*/
@Override
public PageBean<User> getUserByPage(String curPage, String pSize) {
//类型转换
int currentPage = Integer.parseInt(curPage);
int pageSize = Integer.parseInt(pSize);
//调用dao
AdminDao dao = new AdminDaoImpl() ;
//定义变量start:起始索引
int start = (currentPage-1)*pageSize ;
List<User> list = dao.findUserPage(start,pageSize) ;
//查询总记录数
int totalCount = dao.getUserTotalCount() ;
PageBean<User> pb = new PageBean<User>() ;
pb.setCurrentPage(currentPage);
pb.setList(list);
pb.setPageSize(pageSize);
pb.setTotalCount(totalCount);
return pb;
}
}
AdminDao.java:操作数据库的访问层的删除抽象方法
import com.qf.entity.AdminUser;
import com.qf.entity.User;
import java.util.List;
/* 针对管理员操作的数据库访问接口层
*/
public interface AdminDao {
//根据用户名查询用户
AdminUser selectUserByName(String username) ;
/*
* 查询用户列表
* */
List<User> selectAllUser() ;
//查询用户
User selectUserByUid(String uid);
//更新用户
int updateCostmUser(User user);
//删除用户根据uid
int deleteUserByUid(String uid);
/**
* 根据起始索引以及每页显示条数
* @param start 起始索引
* @param pagesize 每页显示条数
* @return 用户列表
*/
List<User> findUserPage(int start, int pagesize);
/**
* 查询总记录数
* @return
*/
int getUserTotalCount();
}
AdminDaoImpl.java:重写操作数据库的访问层的删除抽象方法
import com.qf.dao.AdminDao;
import com.qf.entity.AdminUser;
import com.qf.entity.User;
import com.qf.utils.MyJdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
/* 针对管理用户的数据库访问接口实现层
*/
public class AdminDaoImpl implements AdminDao {
/**
* 根据用户名查询用户
* @param username
* @return
*/
@Override
public AdminUser selectUserByName(String username){
//common-dbutils工具类
//创建QueryRunner对象
try {
QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
//准备sql
String sql = "select * from admin_user where adminName= ? " ;
//执行查询
AdminUser adminUser = qr.query(sql, new BeanHandler<AdminUser>(AdminUser.class), username);
System.out.println(adminUser);
return adminUser;
} catch (SQLException e) {
e.printStackTrace();
}
return null ;
}
/**
* 查询用户列表
* @return
*/
@Override
public List<User> selectAllUser() {
//创建QueryRunner
try {
QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
//准备sql
String sql = "select * from user" ; //开发中*(不要出现,全表字段)
List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
return list ;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//根据uid查询用户
@Override
public User selectUserByUid(String uid) {
try {
QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
String sql = "select * from user where uid = ?" ;
User user = qr.query(sql, new BeanHandler<User>(User.class), uid);
return user ;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//更新用户
@Override
public int updateCostmUser(User user) {
QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
String sql = "update user set username = ?,password = ?, name = ? ,sex=?,state=? where uid = ? " ;
try {
int count = qr.update(sql, user.getUsername(), user.getPassword(), user.getName(), user.getSex(), user.getState(), user.getUid());
System.out.println(count);
return count ;
} catch (SQLException e) {
e.printStackTrace();
}
return 0 ;
}
@Override
public int deleteUserByUid(String uid) {
QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
String sql = "delete from user where uid = ?" ;
try {
int count = qr.update(sql, uid);
return count ;
} catch (SQLException e) {
e.printStackTrace();
}
return 0 ;
}
/**
* 根据起始索引以及每页显示条数
* @param start 起始索引
* @param pagesize 每页显示条数
* @return 用户列表
*/
@Override
public List<User> findUserPage(int start, int pagesize) {
//创建执行对象
QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
//准备sql
String sql = "select * from user limit ?,?" ;
try {
List<User> list = qr.query(sql, new BeanListHandler<User>(User.class), start, pagesize);
return list ;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public int getUserTotalCount() {
QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
String sql = "select count(*) from user" ;
try {
;
String value = qr.query(sql, new ScalarHandler<>()).toString();
int count = new Integer(value).intValue();
return count ;
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
public static void main(String[] args) {
AdminDao dao = new AdminDaoImpl() ;
int userTotalCount = dao.getUserTotalCount();
System.out.println(userTotalCount);
}
}