荐 第一次走进web开发-------------------在线考试与在线阅卷
程序员文章站
2024-01-25 08:50:40
在线考试与在线阅卷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!!!!)
介绍:
这个系统使用Servlet,jsp,jdbc,JavaScript(从服务端向浏览器过渡)
这个系统使用的Http服务器是tomcat,使用的数据库服务器是MySQL
主要功能
这个系统大体由【学员信息管理】,【试题信息管理】,【在线考试管理】三个模块组成;实现用户登录、用户增删、试题增删改、试题在线打分等功能。
其他功能
使用过滤器防止用户恶意登录行为,增加项目安全性
使用监听器模拟了数据库连接池功能,节省Connection创建与销毁时间,提高执行速度增加QPS
准备工作
- 创建用户信息表 Users.frm
CREATE TABLE Users(
userId int primary key auto_increment, #用户编号
userName varchar(50), #用户名称
password varchar(50), #用户密码
sex char(1), #用户性别 '男' 或则 '女'
email varchar(50) #用户邮箱
)
- 在src下 com.cq.entity.Users 实体类
- 在src下 com.cq.entity.JdbcUtil 工具类
- 在web下WEB-INF下创建lib文件夹 存放mysql提供JDBC实现jar包
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
下一篇: 抽象类为什么不能创建对象?