Filter
过滤器:用来过滤网站的数据
- 处理中文乱码
- 登录验证
//实现Filter接口
package com.wu.demo;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharaterEncodingFilter初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
System.out.println("CharacterEncodingFilter执行前");
//让请求继续走 如果不写 程序到这里就停止(被拦截)
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("CharacterEncodingFilter执行后");
}
//销毁
@Override
public void destroy() {
System.out.println("CharaterEncodingFilter销毁");
}
}
//在web.xml中注册filter
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.wu.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/servlet/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<filter>
<filter-name>Filter</filter-name>
<filter-class>com.wu.demo.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<!--只要是/servlet的任何请求 都会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
</web-app>
监听器
- 实现监听器的接口
package com.wu.demo;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class Listener implements HttpSessionListener {
//创建session监听
//一旦创建session就会触发事件
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
ServletContext servletContext = session.getServletContext();
System.out.println(session.getId());
Integer onlineCount = (Integer) servletContext.getAttribute("onlineCount");
if(onlineCount==null){
onlineCount = new Integer(1);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count +1);
}
servletContext.setAttribute("onlineCount",onlineCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
Integer onlineCount = (Integer) servletContext.getAttribute("onlineCount");
if(onlineCount == null){
onlineCount = new Integer(0);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count-1);
}
servletContext.setAttribute("onlineCount",onlineCount);
}
}
//JSP代码
<h1>当前有<span style="color: #ea1616"><%=this.getServletConfig().getServletContext().getAttribute("onlineCount")%></span>人在线</h1>
- 注册监听器
<!--注册监听器-->
<listener>
<listener-class>com.wu.demo.Listener</listener-class>
</listener>
过滤器和监听器应用
- 用户登录后才能进入主页 用户注销后就不能进入主页
用户登录后 向Session中放入用户的数据
进入主页的时候要判断用户是否已经登录
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object user_session = req.getSession().getAttribute(Constant.USER_SESSION);
System.out.println("logout运行");
if(user_session != null){
req.getSession().removeAttribute(Constant.USER_SESSION);
this.getServletContext().getRequestDispatcher("/login.jsp").forward(req,resp);
}else {
resp.sendRedirect("/Filter_war/login.jsp");
}
}
public class SysFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("系统过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
Object user_session = request.getSession().getAttribute(Constant.USER_SESSION);
if(user_session==null){
response.sendRedirect("/Filter_war/error.jsp");
}
filterChain.doFilter(request,response);
}
@Override
public void destroy() {
System.out.println("系统过滤器销毁");
}
}
JDBC
导入数据依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
JDBC固定步骤
- 加载驱动
- 连接数据库 Connection代表数据库
- 向数据库发送SQL的对象Statement:CRUD
- 编写SQL
- 执行SQL
- 关闭连接
import java.sql.*;
public class JdbcTest {
public static void main(String[] args) throws Exception {
//配置信息
String url ="jdbc:mysql://localhost:3307/jdbc?useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
//1 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2 连接数据库 Connection代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//向数据库发送SQL的对象statement : CRUD
// Statement statement = connection.createStatement();
//编写sql
//String sql = " select * from people";
String sql = "insert into people values(?,?,?,?)";
//执行sql
//ResultSet rs = statement.executeQuery(sql);
/* while (rs.next()){
System.out.println("id:" +rs.getInt("id") );
System.out.println("name:"+ rs.getString("name"));
System.out.println("age:"+ rs.getInt("age"));
System.out.println("address:" + rs.getString("address"));
}
rs.close();
statement.close();
connection.close();*/
//预编译SQL
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,2);
preparedStatement.setString(2,"lisi");
preparedStatement.setInt(3,30);
preparedStatement.setString(4,"haikou");
int i = preparedStatement.executeUpdate();
if( i >0 ){
System.out.println("插入成功");
}
preparedStatement.close();
connection.close();
}
}
项目搭建
- 搭建一个maven web项目
- 配置Tomcat
- 测试项目是否能够运行
- 导入项目中会遇到的jar包
jsp Servlet mysql驱动 jstl standard
- 创建项目包结构
pojo dao service servlet filter util
- 编写实体类
ORM映射: 表 - 类 映射
- 编写基础公共类
1.数据库配置文件(db.properties)
driver = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:3307?useUnicode=true&characterEncoding=utf-8 username = root password = 123456
2.读取properties
static { Properties properties = new Properties(); InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties"); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); }
3.编写数据库公共类
//获取数据库链接 public static Connection getConnection(){ Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (SQLException throwables) { throwables.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return connection; } //编写查询公共方法 方法重载 public static ResultSet execute(Connection connection,String sql,Object[] param,ResultSet resultSet,PreparedStatement preparedStatement) throws SQLException { preparedStatement = connection.prepareStatement(sql); for (int i = 1; i <= param.length ; i++) { preparedStatement.setObject(1,param[i-1]); } resultSet = preparedStatement.executeQuery(); return resultSet; } //编写增删公共方法 public static int execute(Connection connection,String sql,Object[] param,PreparedStatement preparedStatement) throws SQLException { preparedStatement = connection.prepareStatement(sql); for (int i = 1; i <= param.length ; i++) { preparedStatement.setObject(1,param[i-1]); } int updateRows = preparedStatement.executeUpdate(); return updateRows; } //释放资源 public static boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet){ boolean flag = true; if( connection != null){ try { connection.close(); //GC 回收 connection = null; } catch (SQLException throwables) { flag = false; throwables.printStackTrace(); } } if(preparedStatement != null){ try { preparedStatement.close(); preparedStatement = null; } catch (SQLException throwables) { flag = false; throwables.printStackTrace(); } } if(resultSet != null){ try { resultSet.close(); resultSet = null; } catch (SQLException throwables) { flag = false; throwables.printStackTrace(); } } return flag; }
4.编写字符编码过滤器
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); filterChain.doFilter(servletRequest, servletResponse); }
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.wu.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 导入静态资源
- image css js …
登录功能实现
- 编写前端页面
- 设置首页
<welcome-file-list>
<welcome-file>/login.jsp</welcome-file>
</welcome-file-list>
</web-app>
- 编写dao层登录用户的接口
public User getLoginUser(Connection connection, String userCode) throws SQLException;
- 编写dao接口的实现类
public class UserDaoImpl implements UserDao {
public User getLoginUser(Connection connection, String userCode) throws SQLException {
PreparedStatement pstm = null;
ResultSet rs = null;
User user = null;
if(connection != null){
String sql =" select * from smbms_user where userCode = ?";
Object[] params= {userCode};
rs = BaseDao.execute(connection, pstm, rs, sql, params);
if(rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setAddress(rs.getString("address"));
user.setBirthday(rs.getDate("birthday"));
user.setCreatedBy(rs.getInt("createdBy"));
user.setCreationDate(rs.getTimestamp("creationDate"));
user.setGender(rs.getInt("gender"));
user.setModifyBy(rs.getInt("modifyBy"));
user.setModifyDate(rs.getTimestamp("modifyDate"));
user.setPhone(rs.getString("phone"));
user.setUserCode(rs.getString("userCode"));
user.setUserName(rs.getString("userName"));
user.setUserPassword(rs.getString("userPassword"));
user.setUserRole(rs.getInt("userRole"));
}
//连接可能存在事务 所以不用关闭
BaseDao.closeResource(null,pstm,rs);
}
return user;
}
}
- 业务层接口
public interface UserService {
//用户登录
public User login(String userCode, String password);
}
- 业务层实现类
public class UserServiceImpl implements UserService{
//业务层都会调用dao层 所以要引入Dao层
private UserDao userDao;
public UserServiceImpl() {
userDao = new UserDaoImpl();
}
public User login(String userCode, String password) {
Connection connection = null;
User user = null;
try {
connection = BaseDao.getConnection();
//通过业务层调用对应的具体数据库操作
user = userDao.getLoginUser(connection, userCode);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
BaseDao.closeResource(connection,null,null);
}
return user;
}
}
- 编写servlet,处理请求
public class LoginServlet extends HttpServlet {
//Servlet:控制层 调用业务层代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("LoginServlet--starting");
//获取用户名和密码
String userCode = req.getParameter("userCode");
String userPassword = req.getParameter("userPassword");
//和数据库中账户和密码对比 调用业务层
UserServiceImpl userService = new UserServiceImpl();
User user = userService.login(userCode, userPassword); //登录人已查出
if(user != null){
//查有此人 将用户信息放入Session中
req.getSession().setAttribute(Constant.USER_SESSION,user);
//跳转到主页
resp.sendRedirect("jsp/frame.jsp");
}else {
//查无此人
req.setAttribute("error","错误或者密码错误");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
- 注册servlet
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.wu.servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
- 登录拦截优化
public class SysFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
if(req.getSession().getAttribute(USER_SESSION) != null){
filterChain.doFilter(servletRequest,servletResponse);
}else {
resp.sendRedirect(req.getContextPath() + "/error.jsp");
}
}
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.wu.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
密码修改
- 导入前端素材
- UserDao接口
- UserDao接口实现类
- UserService层
- Userservice实现类