欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 第一次走进web开发-------------------在线考试与在线阅卷

程序员文章站 2022-05-07 18:19:08
在线考试与在线阅卷hhh,是不是一听就很low,好吧( ╯□╰ ),你说的没错,它真的很low,不过这也算是我学习道路上第一个稍完整的系统啊,哈哈哈…这次让我对B/S结构下浏览器的请求,服务器响应的工作模式有了进一步的认识,同时将之前所学知识进行串联。才学玩SSM框架的我回首这个项目真的脑瓜子疼,特别是我的controller和dao,突然间,进一步认识到Spring的IoC与AOP思想的重要性(虽然真的难啃,不过俺是相信的自己的,figthing!!!!)介绍:这个系统使用Servlet,j...

在线考试与在线阅卷

hhh,是不是一听就很low,好吧( ╯□╰ ),你说的没错,它真的很low,不过这也算是我学习道路上第一个稍完整的系统啊,哈哈哈…这次让我对B/S结构下浏览器的请求,服务器响应的工作模式有了进一步的认识,同时将之前所学知识进行串联。
才学玩SSM框架的我回首这个项目真的脑瓜子疼,特别是我的controller和dao,突然间,进一步认识到Spring的IoC与AOP思想的重要性(虽然真的难啃,不过俺是相信的自己的,figthing!!!!)

荐
                                                        第一次走进web开发-------------------在线考试与在线阅卷

介绍:
这个系统使用ServletjspjdbcJavaScript(从服务端向浏览器过渡)
这个系统使用的Http服务器是tomcat,使用的数据库服务器是MySQL
主要功能
这个系统大体由【学员信息管理】,【试题信息管理】,【在线考试管理】三个模块组成;实现用户登录、用户增删、试题增删改、试题在线打分等功能。
其他功能
使用过滤器防止用户恶意登录行为,增加项目安全性
使用监听器模拟了数据库连接池功能,节省Connection创建与销毁时间,提高执行速度增加QPS
荐
                                                        第一次走进web开发-------------------在线考试与在线阅卷
准备工作

  1. 创建用户信息表 Users.frm
CREATE TABLE Users(
	userId int primary key auto_increment, #用户编号
    userName varchar(50),                  #用户名称
    password varchar(50),                  #用户密码
    sex          char(1),                  #用户性别 '男' 或则 '女'
    email    varchar(50)                   #用户邮箱
    )
  1. 在src下 com.cq.entity.Users 实体类
  2. 在src下 com.cq.entity.JdbcUtil 工具类
  3. 在web下WEB-INF下创建lib文件夹 存放mysql提供JDBC实现jar包
    荐
                                                        第一次走进web开发-------------------在线考试与在线阅卷

filter

package com.cq.filter;

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

public class OneFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpSession session = null;
        HttpServletResponse response = (HttpServletResponse)servletResponse;

        // 1.调用请求对象读取请求包中请求行中URI,了解用户访问的资源文件是谁
        String uri = request.getRequestURI(); // [/网站名/资源文件名     /myWeb/login.html or /myWeb/login or ...]
        // 2.如果本次请求资源文件与登录相关【login.html 或者  LoginServlet】此时应该无条件发行
        if (uri.indexOf("login") != -1 || "/myWeb/".equals(uri)){
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }
        // 3.如果本次请求访问的是其他资源文件,需要得到用户在服务端HttpSession
        session = request.getSession(false);

        if (session != null){
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }
        // 4.做拒绝请求
        request.getRequestDispatcher("/login_error.html").forward(servletRequest,servletResponse);
    }
}

Listener

package com.cq.Listener;

import com.cq.util.JdbcUtil;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class OneListener implements ServletContextListener {

    // 在Tomcat启动时,预先创建20个Connection,在userDao.add方法执行时
    // 将事先重建好connection交给add方法
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        JdbcUtil util = new JdbcUtil();
        Map map = new HashMap();
        for (int i = 1;i <= 20;i++){
            Connection con = util.createCon();
            System.out.println("在Http服务器启动是,创建Connection " + con);
            map.put(con,true);
        }
        // 为了Http服务器运行期间,一直都可以使用20个Connection,将connection保存
        // 到全局作用域对象对象
        ServletContext application = sce.getServletContext();
        application.setAttribute("key1",map);
    }// map别销毁
    // 在Http服务器关闭时刻,将全局作用域对象20个Connection
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext application = sce.getServletContext();
        Map map = (Map)application.getAttribute("key1");
        Iterator it = map.keySet().iterator();
        while (it.hasNext()){
            Connection con = (Connection) it.next();
            if (con != null){
                System.out.println("兄弟们,我" + con + "溜了");
            }
        }
    }
}

util工具类

package com.cq.util;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.sql.*;
import java.util.Iterator;
import java.util.Map;

/**
 *  将JDBC规范下相关对象【创建】与【销毁】功能分装到方法
 *
 *  一、JDBC步骤:
 *      1、注册数据库提供的Driver接口实现类
 *      2、创建一个连接通道交给Connection接口的实例对象【JDBC4Connection】管理
 *      3、创建一个交通工具交给PreparedStatement接口的实例对象【JDBC4PreparedStatement】管理
 *      4、由交通工具在Java工程与数据库服务器之间进行传输,推送SQL命令并带回执行结果
 *      5、交易结束后,销毁相关资源【Connection,PreparedStatement,ResultSet】
 */
public class JdbcUtil {

    Connection con = null; // 类文件属性,可以在类文件中所有的方法中使用
    PreparedStatement ps = null; // 类文件属性,可以在类文件中所有的方法中使用

    //-----------------------通过全局作用域对象得到Connection--------------start
    public Connection createCon(HttpServletRequest request){

        // 1.通过请求对象,得到全局作用域对象
        ServletContext application = request.getServletContext();
        // 2.从全局作用域对象得到map
        Map map = (Map) application.getAttribute("key1");
        // 3.从map得到一个处于空闲状态Connection(拖鞋)
        Iterator it = map.keySet().iterator();
        while (it.hasNext()){
            con = (Connection)it.next();
            boolean flag = (boolean)map.get(con);
            if (flag == true){
                map.put(con,false);
                break;
            }
        }
        return con;
    }
    public PreparedStatement createStatement(String sql,HttpServletRequest request){
        Connection con = createCon(request);
        try {
            ps = con.prepareStatement(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ps;
    }
    // 封装PreparedStatement对象与Connection对象销毁袭细节
    public void close(HttpServletRequest request){
        if (ps!=null){
            try {
                ps.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        ServletContext application = request.getServletContext();
        Map map = (Map) application.getAttribute("key1");
        map.put(con,true);

    }
    //-----------------------通过全局作用域对象得到Connection--------------start

    //静态语句块 static{}
    //当前类文件第一杯加载到JVM时,JVM将会自动调用当前类文件静态语句块
    static {
        // 1、注册数据库提供的Driver接口实现类
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("Driver接口实现类被注册了");
    }

    // 封装Connection对象创建细节
    public Connection createCon(){
        try {
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/cqnb?serverTimezone=UTC&characterEncoding=utf-8","root","0320");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Connection对象创建失败。。。。。。。");
        }
        return con;
    }

    // 封装PreparedStatement对象创建细节
    public PreparedStatement createStatement(String sql){
        Connection con = createCon();
        try {
            ps = con.prepareStatement(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ps;
    }

    // 封装PreparedStatement对象与Connection对象销毁袭细节
    public void close(){
        if (ps!=null){
            try {
                ps.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        if (con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    // 封装PreparedStatement对象与Connection对象与ResultSet对象销毁细节
    public void close(ResultSet rs){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        close();
    }

}

本文地址:https://blog.csdn.net/weixin_46718393/article/details/107166914