filter过滤器
为什么要用filter过滤器
所有的页面和servlet请求时都要进行是否登录的判断,没有登录跳转回登录界面
在页面请求和响应时统一设置编码格式
所有的页面和servle请求时都要进行是否登录的判断,没有登录跳转回登录界面
可以借助jsp中的三大组件中的filter过滤器来完成
过滤器的实现原理
过滤器的使用
(1)创建一个类实现filter接口
EncodingFilter.java
package com.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter(urlPatterns = {"/*"})
public class EncodingFilter implements Filter{
}
(2)实现接口中的方法init初始化 doFilter主要方法体 destroy销毁方法
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
//向下还原
HttpServletRequest hreq = (HttpServletRequest)req;
HttpServletResponse hresp = (HttpServletResponse)resp;
//设置编码字符集
hreq.setCharacterEncoding("UTF-8");
hresp.setCharacterEncoding("UTF-8");
hresp.setContentType("text/html");
//创建session对象用于判断session是否存在
HttpSession session = hreq.getSession();
//获取当前浏览器中访问的地址 web项目名/页面名
String requestURI = hreq.getRequestURI();
//获取当前应用和当前访问全路径 web项目名
String contextPath = hreq.getContextPath();
//获取当前访问页面或servlet名
String page = requestURI.substring(contextPath.length());
//判断是否是登录界面或者是否是登录的servlet tomcat设置不一样可以把/给去了
//contains方法比较字符串是否一样
if(page.contains("/Login.jsp")||page.contains("loginServlet")){
//chain方法
chain.doFilter(hreq, hresp);//过滤完成后, 继续向下一个过滤器或者servlet执行
}else{
//判断session是否为空 不为空代表有用户登录
if (session.getAttribute("ename")!=null){
//chain方法
chain.doFilter(hreq, hresp);//过滤完成后, 继续向下一个过滤器或者servlet执行
}else{
//如果判断没有session跳转到登陆页面
hresp.sendRedirect("Login.jsp");
}
}
}
public void init(FilterConfig arg0) throws ServletException {
}
(3)需要进行过滤器的配置
// 默认filter名字跟类名一样 /*过滤所有方法
@WebFilter(urlPatterns = {"/*"})
首先记录一下普通数据库连接和连接池的区别以及连接池的好处
普通数据库连接:
数据库连接,连接时会消耗时间(100多毫秒),数据启动后使用过后,用户没有进行操作,数据会被闲置,连接会释放,如果再使用需要耗费时间进行连接
连接池:在连接池内部可以有多个数据库连接,当建立连接后,如果后续用户不使用连接,此连接会放置在连接池中,如果用户再次访问该数据库,直接从连接池中获取该数据库,不需要在访问数据库服务器。这样减少了对数据库服务器的请求,访问效率提高
进行之前先导包
c3p0-0.9.2.1.jar
commons-dbutils-1.7.jar
mchange-commons-java-0.2.3.4.jar
mysql-connector-java-5.1.15-bin.jar
自行上网百度 或者私聊我
1.设置c3p0数据池连接信息 同理可用jdbc.properties
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
<default-config>
<!--default-config 表示默认配置-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!--//数据库名-->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/Test?useSSL=true</property>
<!--//数据库账号-->
<property name="user">root</property>
<!--//数据库密码-->
<property name="password">123456</property>
<!--//初始化池的大小-->
<property name="initialPoolSize">1</property>
<!--//最小连接池数-->
<property name="minPoolSize">2</property>
<!--//池增量-->
<property name="acquireIncrement">3</property>
<!--//最大连接池数量-->
<property name="maxPoolSize">10</property>
</default-config>
</c3p0-config>
2.使用c3p0连接池 创建连接池对象ComboPooledDataSource 获取数据源 关流
DbUtils.java
package com.util;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class DbUtils {
//创建连接池对象
private static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
//获取数据库连接
public static Connection getConn() throws SQLException {
return comboPooledDataSource.getConnection();
}
//获取数据源
public static DataSource getDataSources(){
return comboPooledDataSource;
}
//关流
public static void close(){
if(comboPooledDataSource!=null) {
comboPooledDataSource.close();
}
}
}
3.使用c390连接池 增删改 单查询 多查询
创建queryRunner对象传入数据源进行c3p0操作
//创建queryRunner对象进行操作
QueryRunner qr = new QueryRunner(DbUtils.getDataSources());
单条数据查询
public Emp getEmpById(int eid) throws SQLException {
String sql="select * from emp where eid=?";
Object [] obj={eid};
return qr.query(sql,new BeanHandler<Emp>(Emp.class),obj);
}
多条数据查询
public List<Dept> getAllDept() throws SQLException {
String sql="select * from dept";
Object [] obj={};
return qr.query(sql, new BeanListHandler<Dept>(Dept.class),obj);
}
修改
@Override
public int editByid(Emp emp) throws SQLException {
String sql="update emp set ename=?,eage=?,email=?,did=? where eid=?";
Object [] obj={emp.getEname(),emp.getEage(),emp.getEmail(),emp.getDid(),emp.getEid()};
return qr.execute(sql,obj);
}
单查,多查和增删改区别:
query查询 返回是对象或者list集合
单查传参sql BeanHandler obj问号赋值
多查sql BeanListHandler obj问号赋值
excute增删改 返回值是int
excute(sql,obj传值)
c3p0连接数据库方法扩展
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。//重点
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。//重点
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List