期末测验 编程题 登录Demo系统


测验目标

分值(满分50分)

1 项目概述

1.1 需求分析

项目功能需求(14分)

图1 默认项目/ch16_xx/进入登录界面
图2 登录界面输入
图3 主界面及其相应的子资源
图4 登录界面输入错误
图5 主界面未登录进入登录界面
图6 主界面单击【用户注销】调用logout(servlet)转向login_xx.jsp进入登录界面
图7 登录2分钟内,浏览器地址栏输入index.jsp 直接进入主界面

设计、提交要求

2 数据库设计

数据库名: 登录Demo_wjy 数据表名: 用户表_wjy

图8 数据库实现(2分)----高亮要求提交截图

建表语句

-- 1. 用户
DROP TABLE IF EXISTS `用户表_wjy`;
CREATE TABLE `用户表_wjy` (
  `用户名` varchar(45) NOT NULL PRIMARY KEY,
  `密码` varchar(45) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `用户表_wjy` VALUES 
('管理员','123456'),
('王佳媛','2320317132');

3 项目实现

3.1 确定项目开发环境

Tomcat9.0 MySQL 8.0 JDK8

3.2 创建数据库表

见上述数据库部分

3.3 创建项目、包名、引入JAR包

图9 项目包名、文件名(2分)
包名 说明
cn.wjy.utils 工具类:数据源工具、单价计算器工具
cn.wjy.model JavaBean类
cn.wjy.dao 数据访问
cn.wjy.service 服务层
cn.wjy.servlet web servlet层
cn.wjy.filter 过滤器

jar包 在web/WEB-INF创建lib文件夹,并粘贴下列5个jar文件,

图10 jar包

项目中jar_bootstarp文件下载

web/WEB-INF/web.xml(2分)




    
        login_wjy
    

3.3 界面设计

图11 BootStrap登录界面(2分)

web/login_wjy.jsp(2分)


<%--
  Created by IntelliJ IDEA.
  User: yjq15
  Date: 2024/6/20
  Time: 下午5:06
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    
    王佳媛的登录Demo系统.登录
    
    
        body{
            width: 100%;
            height: 100%;
            overflow: hidden;
            background: url(Images/bg.png) no-repeat;
            background-size: 100% 100%;
            background-attachment: fixed;
        }
        ul a{
            width: 400px;
            background-color: rgb(103, 238, 30);
        }

        h1{
            color:white;
        }
        p{
            color:white;
        }


        <!-- 通过background-color设置点击状态的背景颜色 B2FF99 FFFF85 -->
        a:link {background-color: #67ee1e;}
        a:visited {background-color: #67ee1e;}
        a:hover {background-color: #979393;}
        a:active {background-color: #68ee20;}
    

    


王佳媛的登录Demo系统

用户名:${sessionScope.user.用户名}  | 用户注销


    首页 index.jsp
    访问test.html
    访问test.txt(GBK编码)
    访问wjy.jpg
    访问不存在的abcd.jpg
    访问sub/test2.html
    访问sub/test2.txt(GBK编码)
    访问sub/wjy2.jpg
    访问不存在的sub/abcd.jpg




图12 BootStrap首页界面(2分)

web/index.jsp(2分)


<%--
  Created by IntelliJ IDEA.
  User: yjq15
  Date: 2024/6/20
  Time: 下午4:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


  
  王佳媛的登录Demo系统
  
  
    body{
      width: 100%;
      height: 100%;
      overflow: hidden;
      background: url(Images/bg.png) no-repeat;
      background-size: 100% 100%;
      background-attachment: fixed;
    }
    form{
      width: 400px;
      margin: 200px auto;
      padding: 20px 30px;
      background-color: rgba(255, 255, 255, 0.8);
    }

    form div{
      margin-bottom:10px;
    }

    a:link, a:visited, a:hover, a:active {
      text-decoration: none;
      color: rgba(0, 0, 0, 0.5);
    }
  
  



  
    
      王佳媛的登录Demo系统.登录
    
    
      
      
    
    
      
      
    
    
      登录
    
    

    
    <% if (request.getAttribute("failMsg") != null) { %>
    <%= request.getAttribute("failMsg") %>
    <% } %>
  





3.4 配置c3p0-config.xml文件

src\c3p0-config.xml(2分)




    
        com.mysql.cj.jdbc.Driver
        jdbc:mysql://8.146.206.124:3306/登录Demo_wjy?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
        root
        wjy20240305..
    


3.5 DBUtils工具类

cn.wjy.utils.DataSourceUtils(2分)


package cn.wjy.utils;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class DataSourceUtils {
    // 读取 src/c3p0-config.xml 配置信息,生成静态final变量 ds
    private static final DataSource ds=new ComboPooledDataSource();

    // 静态方法 getDataSource() 获取数据源
    public static DataSource getDataSource(){
        return ds;
    }

    // 静态方法 getConnection() 获取数据库连接
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

3.6 model

cn/wjy/model/User_wjy.java(2分)


package cn.wjy.model;

public class User_wjy {
    private String 用户名;

    private String 密码;

    public String get用户名() {
        return 用户名;
    }

    public String get密码() {
        return 密码;
    }

    public void set用户名(String 用户名) {
        this.用户名 = 用户名;
    }

    public void set密码(String 密码) {
        this.密码 = 密码;
    }

    @Override
    public String toString() {
        return "User_wjy{" +
                "用户名='" + 用户名 + '\'' +
                ", 密码='" + 密码 + '\'' +
                '}';
    }

}

3.7 dao

cn/wjy/dao/UserDao_wjy.java(2分)


package cn.wjy.dao;

import cn.wjy.model.User_wjy;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;


import java.sql.SQLException;

public class UserDao_wjy {
    public User_wjy selectByUsernamePassword(String username, String password) throws SQLException {
        QueryRunner r = new QueryRunner(cn.wjy.utils.DataSourceUtils.getDataSource());
        String sql = "select * from 用户表_wjy where 用户名=? and 密码=?";
        return r.query(sql, new BeanHandler(User_wjy.class),username,password);
    }
}

3.8 service

cn/wjy/service/UserService_wjy.java(2分)

}
   package cn.wjy.service;

import cn.wjy.dao.UserDao_wjy;
import cn.wjy.model.User_wjy;

import java.sql.SQLException;

public class UserService_wjy {

    private UserDao_wjy uDao = new UserDao_wjy();

    public User_wjy login(String ue, String password) {
        User_wjy user = null;
        try {
            user = uDao.selectByUsernamePassword(ue, password);
        } catch (SQLException e) {
            e.printStackTrace();
            // 可能还需要将异常信息记录到日志中或者进行其他处理
        }
        return user; // 直接返回查询结果,无需重复查询
    }

3.8 servlet

cn/wjy/servlet/LoginServlet_wjy.java(4分)


   // 提示
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");

cn/wjy/servlet/LogoutServlet_wjy.java(2分)


package cn.wjy.servlet;

import cn.wjy.model.User_wjy;
import cn.wjy.service.UserService_wjy;

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("/login")
public class LoginServlet_wjy extends HttpServlet { // 继承自 HttpServlet
    private UserService_wjy uService = new UserService_wjy();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("ue"); // 最好将变量名改为 "username" 以保持一致性
        String password = request.getParameter("password");
        User_wjy user = uService.login(username, password); // 假设 login 方法会处理密码的哈希验证
        if(user == null) {
            request.setAttribute("failMsg", "用户名或者密码错误,请重新登录!");
            request.getRequestDispatcher("/index.jsp").forward(request, response);
        } else {
            request.getSession().setAttribute("user", user);
            request.getRequestDispatcher("/login_wjy.jsp").forward(request, response);
        }
    }
}

3.9 编写登录过滤器

cn.wjy.filter.LoginFilter_wjy.java(6分)

登录过滤器:登录用户可访问/* 所有资源,用户没有登录仅可访问 跳转到首页


       package cn.wjy.filter;

import cn.wjy.model.User_wjy;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*")
public class LoginFilter_wjy implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        String requestURI = req.getRequestURI();
        if (requestURI.endsWith("login_wjy.jsp") || requestURI.endsWith("login")) {
            // 如果是登录页面或登录请求,则直接放行
            chain.doFilter(req, resp);
            return;
        }

        // 判断用户是否登录
        User_wjy u = (User_wjy) req.getSession().getAttribute("user");
        if (u == null) {
            // 未登录用户,转向到登录页面
            req.getRequestDispatcher("/index.jsp").forward(req, resp);
            return;
        } else {
            // 已登录用户,允许访问
            chain.doFilter(req, resp);
        }
    }
}

返回