03、javaweb--JSP+Servlet+JavaBean实战项目

一、系统分析

1.1、需求

在员工不访问外网的情况下,进行发布消息、查看消息、回复消息和批复消息;

1.2、功能

  1. 用户进行登陆及注销;
  2. 普通员工可以发布、查看、回复消息;
  3. 管理层领导可以发布、查看、回复和批复消息;

二、系统设计

2.1、系统流程

在这里插入图片描述

2.2、技术栈

  1. MVC架构:JavaBean+JSP+Servlet;
  2. 开发工具:IDEA+Maven+SQLyog;
  3. web服务器:Tomcat9.0;

2.3、工程结构

在这里插入图片描述

三、模块实现

3.1、数据库模块

3.1.1、数据库设计

数据库db_affairmanage共有四张表:

  1. 员工表tb_employee:记录了ID、姓名、性别、生日、手机号、属地、加入时间、密码、领导标签;
  2. 消息表tb_message:记录了ID、题目、内容、发布者ID、发布时间;
  3. 回复表tb_reply:记录了ID、内容、回复者ID、回复时间、对应消息ID;
  4. 批复表tb_criticism:记录了ID、内容、批复者ID、批复时间、对应消息ID;
    关系E-R表如下:
    在这里插入图片描述

3.1.2、ORM表-类映射

编写每张表的对应java类,即Bean类,只包含了getter()和setter();
在这里插入图片描述

3.1.3、配置连接文件

设置数据连接时使用的驱动、url(指定数据库和参数)、用户和密码;
在这里插入图片描述

3.1.3、公共类设计

DBConnection: 实现基本共用的数据库连接、查询、更新等操作;它是一个静态类,包含五个静态方法:

  1. 初始化:从配置文件加载数据库信息;
public static void init(){
        Properties params = new Properties();
        String configFile = "db.properties";
        //使用类加载器加载配置文件
        InputStream is = BaseDao.class.getClassLoader().getResourceAsStream(configFile);
        try{
            params.load(is);
        }catch(IOException e){
            e.printStackTrace();
        }
        driver = params.getProperty("driver");
        url = params.getProperty("url");
        user = params.getProperty("user");
        password = params.getProperty("password");
    }
  1. 返回连接;
public static Connection getConnection(){
        Connection connection = null;
        try{
            Class.forName(driver);
            connection = DriverManager.getConnection(url,user,password);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
  1. 查询操作;
public static ResultSet execute(Connection connection, PreparedStatement pstm,ResultSet rs,String sql, Object[] params) throws Exception{
        pstm = connection.prepareStatement(sql);
        for(int i=0; i<params.length; i++){
            pstm.setObject(i+1, params[i]);
        }
        rs = pstm.executeQuery();
        return rs;
    }
  1. 更新操作;
//更新操作
    public static int execute(Connection connection, PreparedStatement pstm, String sql,Object[] params) throws Exception {
        int updateRows = 0;
        pstm = connection.prepareStatement(sql);
        for(int i=0; i<params.length; i++){
            pstm.setObject(i+1, params[i]);
        }
        updateRows = pstm.executeUpdate();
        return updateRows;
    }
  1. 关闭资源;
public static boolean closeResource(Connection connection,PreparedStatement pstm, ResultSet rs){
        boolean flag = true;
        if(rs != null){
            try{
                rs.close();
                rs  =null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        if(pstm != null){
            try{
                pstm.close();
                pstm  =null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        if(connection != null){
            try{
                connection.close();
                connection  =null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        return flag;
    }

3.2、员工识别模块

3.2.1、显示层jsp

<form action="login.do" method="post">
    <p>员工编号:<input type="text" name="employeeName" value="${param.employeeName}"/></p>
    <p>&nbsp;</p>
    <p>系统口令:<input type="password" name="password" /></p>
    <p>&nbsp;</p>
    <p><input type="submit" value="提交" />
        <input type="reset" value="重置" /></p>
</form>

3.2.2、DAO层

Dao层操纵实体类Bean的增删改查CRUD,调用数据库的公共类DBConnection,封装JDBC操作,与数据库进行交互

  1. 接口EmployeeDao:
    定义对Bean类的增删改查等方法接口;
public interface EmployeeDao {
    //增删改查CRUD
    void addEmployee(Connection connection, Employee employee);
    void deleteEmployee(Connection connection, int employeeID);
    int updateEmployee(Connection connection,Employee employee);
    List<Employee> findAllEmployee(Connection connection);
    Employee finEmployeeByID(Connection connection,int employeeID);
}
  1. 具体类EmployeeDaoImpl:
    使用数据库公共类DBConnection,实现接口中对Bean类的增删改查等方法接口,封装对Bean类的JDBC操作;
    public void addEmployee(Connection connection, Employee employee){
        //声明预处理对象
        PreparedStatement pstm = null;
        //查询语句
        String sql = "INSERT INTO tb_employee VALUES (?,?,?,?,?,?,?,?,?)";
        //设置语句属性
        Object[] params = {employee.getEmployeeID(),employee.getEmployeeName(),employee.isEmployeeSex(),employee.getEmployeeBirth(),employee.getEmployeePhone(),employee.getEmployeePlace(),employee.getJoinTime(),employee.getPassword(),employee.isLead()};
        //尝试执行
        try{
            //启动更新
            DBConnection.execute(connection,pstm,sql,params);
        }catch (Exception e) {
            e.printStackTrace();
        }
        //最终都要关闭资源
        finally {
            DBConnection.closeResource(null,pstm,null);
        }
    }
  1. 工厂类EmployeeDaoFactory:
    静态类,根据需求选择返回合适的具体实现类;
public class EmployeeDaoFactory {
    public static EmployeeDao getEmployeeDaoInstance(){
        return (EmployeeDao) new EmployeeDaoImpl();
    }
}

3.2.3、业务层service

业务层的主要工作是接收具体业务请求,调用DAO层完成与数据库的交互;特点是只处理对应业务;

  1. 接口EmployeeService:
    定义Employee相关的服务方法;
    Employee getEmployee(int employeeID);//通过ID获取员工信息
    Employee getEmployee(String employeeName,String password);//通过名字密码获取员工信息
  1. 具体类EmployeeServiceImpl:
    实现接口中的服务;
@Override
    private EmployeeDao employeeDao;

    public EmployeeServiceImpl() {
        employeeDao = EmployeeDaoFactory.getEmployeeDaoInstance();
    }

    @Override
    public Employee getEmployeeByID(int employeeID){
        Connection connection = null;
        Employee employee = null;
        //通过工厂类获取具体DAO操作Employee类
        try {
            connection = DBConnection.getConnection();
            employee = employeeDao.findEmployeeByID(connection,employeeID);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBConnection.closeResource(connection,null,null);
        }
        return employee;
    }

3.2.4、控制层servlet

控制层的主要工作是处理用户参数调用业务层建立与销毁数据库连接、转发与重定向视图等;

  1. 编写LoginServlet:
 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.处理请求参数
        String employeeName = req.getParameter("employeeName");
        String password = req.getParameter("password");
        //2.调用业务层,匹配用户
        EmployeeService employeeService = new EmployeeServiceImpl();
        Employee employee = employeeService.getEmployee(employeeName,password);
        if(employee != null){//匹配成功
            //设置session
            req.getSession().setAttribute("employee",employee);
            //重定向
            resp.sendRedirect("/jsp/index.jsp");
        }else{//匹配失败
            req.setAttribute("error","密码或用户名不对");
            //转发
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
  1. 注册Servlet:
<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.zhu2change.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login.do</url-pattern>
  </servlet-mapping>

3.2.5 过滤器Filter:

编写好Filter,并配置对哪个web资源进行拦截后,Web服务器每次在调用web资源的service方法之前(这里指执行该Servlet之前),都会先调用一下filter的doFilter方法;
过滤器是针对一次HTTP请求的,不属于具体的MVC层;

  1. 登陆过滤器LoginFilter:
    将未登陆的连接重定向错误处理页面;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //1.转换成http
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse reps = (HttpServletResponse) servletResponse;
        //2.检验是否登陆
        Employee employee = (Employee) req.getSession().getAttribute("employee");
        if(employee == null){//未登陆
            reps.sendRedirect("jsp/error.jsp");
        }else{
            //通过过滤,允许访问资源
            filterChain.doFilter(req,reps);
        }
    }
    @Override
    public void destroy() {

    }
  1. 系统过滤器SysFilter:
    设置响应和请求的编码方式;
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //转换成http
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse reps = (HttpServletResponse) servletResponse;
        //设置编码
        req.setCharacterEncoding("utf-8");
        reps.setCharacterEncoding("utf-8");
        reps.setHeader("Content-Type","text/html;charset=utf-8");
        filterChain.doFilter(req,reps);
    }
  1. 配置使用:
    对/jsp/下的所有页面使用登陆过滤器;
    系统过滤器适用所有页面;
<!--登陆过滤器-->
  <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.zhu2change.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/jsp/*</url-pattern>
  </filter-mapping>
<!-- 系统过滤器-->
  <filter>
    <filter-name>SysFilter</filter-name>
    <filter-class>com.zhu2change.filter.SysFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SysFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程详细讲解了以下内容:    1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程    2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例    3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题     4.session与cookie问题及application、cookie补充说明及四种范围对象作用域     5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别     6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据     7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)     8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析     9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)    1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)     11.分页业务逻辑层和数据访问层Service、Dao、分页表示层JspServlet     12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题     13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove     14.过滤器、过滤器通配符、过滤器链、监听器     15.session绑定解绑、钝化活化     16.以及Ajax的各种应用     17. Idea环境下的Java Web开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值