JavaWeb学习06 项目构建

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固定步骤
  1. 加载驱动
  2. 连接数据库 Connection代表数据库
  3. 向数据库发送SQL的对象Statement:CRUD
  4. 编写SQL
  5. 执行SQL
  6. 关闭连接
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();
    }
}

项目搭建
  1. 搭建一个maven web项目
  2. 配置Tomcat
  3. 测试项目是否能够运行
  4. 导入项目中会遇到的jar包

jsp Servlet mysql驱动 jstl standard

  1. 创建项目包结构

pojo dao service servlet filter util

  1. 编写实体类

ORM映射: 表 - 类 映射

  1. 编写基础公共类

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>
  1. 导入静态资源
  • image css js …
登录功能实现
  1. 编写前端页面
  2. 设置首页
    <welcome-file-list>
        <welcome-file>/login.jsp</welcome-file>
    </welcome-file-list>
</web-app>
  1. 编写dao层登录用户的接口
public User getLoginUser(Connection connection, String userCode) throws SQLException;
  1. 编写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;
    }
}
  1. 业务层接口
public interface UserService {
    //用户登录
    public User login(String userCode, String password);
}
  1. 业务层实现类
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;
    }


}
  1. 编写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);
        }

    }
  1. 注册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>
  1. 登录拦截优化
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>
密码修改
  1. 导入前端素材
  2. UserDao接口
  3. UserDao接口实现类
  4. UserService层
  5. Userservice实现类
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值