基于JSP+Servlet+数据库+Tomcat的火车信息管理系统

本项目采用Servlet+JSP+Mysql+Tomcat搭建了一个火车信息管理系统。系统包括角色登录验证、火车信息的增删查改功能,通过Filter实现字符编码过滤和登录权限控制。核心类如MoreFunction.java整合所有业务逻辑,TrainService.java和UserService.java提供服务,Page.java用于分页,而BaseDao.java和TrainDao.java负责数据库交互。
摘要由CSDN通过智能技术生成

本项目使用Servlet+JSP+Mysql+Tomcat数据库

本系统在Myeclipse中的结构图:
在这里插入图片描述

在这里插入图片描述

先创建Web Project(web项目)

在src文件夹下建立dao包,该包下定义两个类:

在这里插入图片描述

BaseDao.java类,本类用来定义一些通用的方法,在该项目中定义了有获取数据库连接方法getConnection(),释放资源方法close(),增删改方法update(String sql,Object[] params),查询方法query(String sql,Object[] params)。

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class BaseDao {
	final static String URL = "jdbc:mysql://127.0.0.1:3306/train";//数据库地址
	final static String USERNAME = "root";	//数据库账号
	final static String PASSWORD = "lfl";	//数据库密码
	final static String DRIVER = "com.mysql.jdbc.Driver";
	protected ResultSet rs = null;
	protected PreparedStatement pstmt = null;
	protected Connection connection = null;
		//提取重复方法,获取数据库连接
	public Connection getConnection(){
		try {
			//1.加载驱动
			Class.forName(DRIVER);
			//2.通过DriverManager驱动管理器获取Connection数据库连接
			connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return connection;
	}
		
		
	public void close(){
		//5.释放资源
		try{
			if(null != rs){
				rs.close();
			}
		}catch(SQLException e){
			e.printStackTrace();
		}try{
			if(null != pstmt){
				pstmt.close();
			}
		}catch(SQLException e){
			e.printStackTrace();
		}try {
			if(null != connection){
				connection.close();
			}
		}catch(SQLException e){
			e.printStackTrace();
		}	
	}
	
	
		
		// 增删改 delete from news_detail where id=? and title=?
	public void update(String sql,Object[] params){
		try {
			//获取数据库连接
			connection = getConnection();
			//prepareStatement方法只用于预编译了sql语句,并未执行
			pstmt = connection.prepareStatement(sql);
			//将参数给占位符赋值
			//将参数给占位符赋值
			if(null != params){
				for (int i = 0; i < params.length; i++) {
					pstmt.setObject(i+1, params[i]);
				}
			}
			//4.执行sql语句
			pstmt.executeUpdate();	
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//更新方法可以在此公共方法中释放资源,因为执行完毕后不需要操作结果集,不需要数据库连接了
			//5.释放资源
			close();
		}
	}


		// 查询
		public ResultSet query(String sql,Object[] params){
			try {
				//获取数据库连接
				connection = getConnection();
				//3.创建prepareStatement对象
				//?表示占位符,用于在执行sql语句之前动态传参
				//prepareStatement方法只用于预编译了sql语句,并未执行
				pstmt = connection.prepareStatement(sql);
				//将参数给占位符赋值
				if(null != params){
					for (int i = 0; i < params.length; i++) {
						pstmt.setObject(i+1, params[i]);
					}
				}
				//4.执行sql语句
				rs = pstmt.executeQuery();
			} catch (Exception e) {
				e.printStackTrace();
			}
			return rs;
		}
}

创建TrainDao:

本接口定义了一些方法

package dao;

import java.util.List;

import entity.Train;

public interface TrainDao {
	//查询单个车次信息
	public Train getById(String train_no);
	//查询全部车次信息
	public List<Train> getAll();
	
	//删除单个车次信息
	public void delById(String train_no);
	

	
	//增加车次信息
	public void addTrain(Train train);
	
	//修改车次信息
	public void updateTrain(String train_no,String type);

}

在dao包下定义一个包impl,本包用来实现TrainDao接口
在这里插入图片描述

package dao.impl;


import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import util.Page;

import dao.BaseDao;

import dao.TrainDao;

import entity.Train;

public class ImplTrainDao  implements TrainDao{

	BaseDao bs = new BaseDao();
	
	//分页查询总条数
	public int getTotalCount(){
		int count = 0;
		try {
			String sql = " select count(1) totalcount from train_info ";
			Object[] params = new Object[]{};
			//结果集只会存在一条记录
			ResultSet rs = bs.query(sql, params);
			if(rs.next()){
				count = rs.getInt("totalcount");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//5.释放资源
			bs.close();
		}
		return count;
	}
	
	
	//获取page对象
	public Page<Train> getPage(Integer pageNo, Integer pageSize){
		ImplTrainDao sd = new ImplTrainDao();
		Page<Train> pg = new Page<Train>();
		pg.setPageNo(pageNo);
		pg.setPageSize(pageSize);
		pg.setTotalCount(sd.getTotalCount());
		pg.setList(sd.getTrains(pageNo, pageSize));
		System.out.println("pg:"+pg);
		return pg;
	}
	
	/**
	 * 分页查询列表数据
	 * @param pageNo	当前页码
	 * @param pageSize	每页条数
	 * @return
	 */
	public List<Train> getTrains(Integer pageNo, Integer pageSize){
		List<Train> trains = new ArrayList<Train>();
		try {
			//定义SQL语句
			String sql = " SELECT train_no,start_station,arrival_station,start_time,arrival_time,type,runtime,mile FROM train_info limit ?,? ";
			//定义参数
			Object[] params = new Object[]{(pageNo-1)*pageSize,pageSize};
			//调用查询方法
			ResultSet rs = bs.query(sql, params);
			//遍历结果集rs
			while(rs.next()){
				//取出每条数据字段的值
				String train_no = rs.getString("train_no");
				String start_station = rs.getString("start_station");
				String arrival_station = rs.getString("arrival_station");
				String start_time = rs.getString("start_time");
				String arrival_time = rs.getString("arrival_time");
				String type = rs.getString("type");
				String runtime = rs.getString("runtime");
				Double mile = rs.getDouble("mile");
				
				//将字段值封装到Train对象中
				Train t = new Train(train_no, start_station, arrival_station, start_time, arrival_time, type, runtime, mile);
				//将对象添加到集合中
				trains.add(t);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			//5.释放资源
			bs.close();
		}
		return trains;
	}
		
	//查询所有车次信息
	public List<Train> getAll() {
		List<Train> trains = new ArrayList<Train>();
		try {
			String sql = "SELECT train_no,start_station,arrival_station,start_time,arrival_time,type,runtime,mile FROM train_info";
			//定义参数
			Object[] params = new Object[]{};
			//调用查询方法
			ResultSet rs = bs.query(sql, params);
			//遍历结果集rs
			while(rs.next()){
				String train_no = rs.getString("train_no");
				String start_station = rs.getString("start_station");
				String arrival_station = rs.getString("arrival_station");
				String start_time = rs.getString("start_time");
				String arrival_time = rs.getString("arrival_time");
				String type = rs.getString("type");
				String runtime = rs.getString("runtime");
				Double mile = rs.getDouble("mile");
				
				Train train = new Train(train_no, start_station, arrival_station, start_time, arrival_time, type, runtime, mile);
				trains.add(train);
				
			}
		}catch (SQLException e) {
			e.printStackTrace();
		}finally{
	//			5)关闭城门(释放资源)
			bs.close();
			
		}
		return trains;

	}
	
	//查询单辆车次信息
	public Train getById(String train_no) {
		
		Train train =null;
		try {
			String sql = "SELECT train_no,start_station,arrival_station,start_time,arrival_time,type,runtime,mile FROM train_info where train_no=?";
			Object[] params = {train_no};

			ResultSet rs = bs.query(sql, params);
			while(rs.next()){
				String start_station = rs.getString("start_station");
				String arrival_station = rs.getString("arrival_station");
				String start_time = rs.getString("start_time");
				String arrival_time = rs.getString("arrival_time");
				String type = rs.getString("type");
				String runtime = rs.getString("runtime");
				Double mile = rs.getDouble("mile");
				
				train = new Train(train_no, start_station, arrival_station, start_time, arrival_time, type, runtime, mile);
				
			}
		}catch (SQLException e) {
			e.printStackTrace();
		}finally{
			bs.close();
			}
		return train;
	}
	
	//删除单辆车次信息
	public void delById(String train_no) {
		String sql = "DELETE FROM train_info WHERE train_no = ?";
		Object[] params = new Object[]{train_no};
		bs.update(sql, params);

	}


	//添加车次信息
	public void addTrain(Train train) {
		String sql = "INSERT INTO train_info(train_no,start_station,arrival_station,start_time,arrival_time,type,runtime,mile)" +
				" VALUES(?,?,?,?,?,?,?,?)";
		Object[] params = new Object[]{train.getTrain_no(),train.getStart_station(),train.getArrival_station(),
				train.getStart_time(),train.getArrival_time(),train.getType(),train.getRuntime(),train.getMile()};
		bs.update(sql, params);
		
	}
	//修改车次信息
	public void updateTrain(String train_no, String type) {
		String sql = "UPDATE train_info SET type=? WHERE train_no=?";
		Object[] params = new Object[]{type,train_no};
		bs.update(sql, params);
	}

}

在实体包entity中,创建Train实体类:
在这里插入图片描述

package entity;

public class Train {
	private String train_no;
	private String start_station;
	private String arrival_station;
	private String start_time;
	private String arrival_time;
	private String type;
	private String runtime;
	private Double mile;
	public Train(String train_no, String start_station, String arrival_station,
			String start_time, String arrival_time, String type,
			String runtime, Double mile) {
		super();
		this.train_no = train_no;
		this.start_station = start_station;
		this.arrival_station = arrival_station;
		this.start_time = start_time;
		this.arrival_time = arrival_time;
		this.type = type;
		this.runtime = runtime;
		this.mile = mile;
	}
	public String getTrain_no() {
		return train_no;
	}
	public void setTrain_no(String train_no) {
		this.train_no = train_no;
	}
	public String getStart_station() {
		return start_station;
	}
	public void setStart_station(String start_station) {
		this.start_station = start_station;
	}
	public String getArrival_station() {
		return arrival_station;
	}
	public void setArrival_station(String arrival_station) {
		this.arrival_station = arrival_station;
	}
	public String getStart_time() {
		return start_time;
	}
	public void setStart_time(String start_time) {
		this.start_time = start_time;
	}
	public String getArrival_time() {
		return arrival_time;
	}
	public void setArrival_time(String arrival_time) {
		this.arrival_time = arrival_time;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getRuntime() {
		return runtime;
	}
	public void setRuntime(String runtime) {
		this.runtime = runtime;
	}
	public Double getMile() {
		return mile;
	}
	public void setMile(Double mile) {
		this.mile = mile;
	}

}

service包下面创建两个服务类(给用户提供服务,相当于餐馆里面的服务员)
在这里插入图片描述

TrainService.java

package service;
import java.util.List;
import util.Page;
import dao.impl.ImplTrainDao;
import entity.Train;

public class TrainService {

	//调用工具类page完成数据的封装,让doList.jsp只做控制动作,而不需要进行计算等其他操作
	public Page<Train> getPage(Integer 
     目录 第一章 列车车次管理系统需求分析 2 1.1 需求分析和概述 2 1.2 系统分析 2 第二章 数据库的设计 4 2.1 E-R图 4 2.2 表的结构说明 4 第三章 前台主界面的设计 5 3.1主界面概述 5 3.2前台主界面的实现 5 3.3数据库的连接 8 3.4界面事件监听 8 附录 14 第一章 列车车次管理系统需求分析 1.1 需求分析和概述    中国地域辽阔,铁路线纵横繁多,给人们的出行带来了极大的方便,但随着火车站客流量的不断增长,越来越多的弊端暴露在人们面前,如:    火车查询效率低下    浪费乘客大量时间    浪费大量人力资源 在这样的情景下更需要良好的系统来管理列车的时间及列车所到车站。      本系统对于指定的列车车次,可以对它的出发时间、到站时间、途经车站等进行添加、修改和删除。 1.2 系统分析 本系统是针对管理员对列车车次的管理的开发的,其主要功能是:   1)增加、修改、删除一个列车车次信息。   2)按条件显示车次信息(条件有按车次、出发时间、到站时间、途经车站等)。       系统结构图如下 第二章 数据库的设计 2.1 E-R图   这一设计阶段是在系统功能结构图的基础上进行的,设计出能够满足用户需求的各种实体以及它们之间的关系,为后面的逻辑结构设计打下基础。根据以上的分析设计结果,得到列车实体。下面来介绍车次实体的E-R图。 列车实体包括:车次,出发时间,结束时间,途径车站。E-R图如图2.1.1所示。    2.2 表的结构说明   在本系统中,。train数据表中保存婴儿出生信息,该表的结构如下表 表2.2.1 train表结构 字段名 信息说明 类型 最大字符数 备注 number 列车车次 char 4 主键 starttime 出发时间 char 10 允许为空 endtime 到站时间 char 10 允许为空 via 途经车站 char 10 允许为空 第三章 前台主界面的设计 3.1主界面概述   界面是用户与程序进行交互的接口,用户可以从界面中查看程序显示给用户的信息,程序可以从界面中获取用户输入的数据。通常用户不会去关心程序的界面是如何实现的,更多的会在意界面中提供的信息、功能及界面的布局是否合理。所以在进行界面设计时,不仅要从程序开发的角度上分析,还要考虑到界面的美观及布局。   本系统前台主界面的运行效果如图4.1所示。    前台主界面效果图 3.2前台主界面的实现 为了方便的实现查询功能,在jtable里面显示数据库信息,主界面里自定义了CreateTable类。 class CreateTable{ public Vector vector = null; public AbstractTableModel tm = null; public JScrollPane scroll; public String[] title;//表格表头 public CreateTable(String[] head) { JTable table; title=(String[])head.clone(); vector = new Vector(); tm = new AbstractTableModel() { //通过重写table来定义自己的表格模式 public int getColumnCount() { return title.length; } public int getRowCount() { return vector.size(); } public Object getValueAt(int row, int column) { if (!vector.isEmpty()) { return ((Vector) vector.elementAt(row)).elementAt(column); } else { return null; } } public void setValueAt(Object value, int row, int column) { } public String getColumnName(int column) { return title[column]; } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int column) { return false; } }; table = new JTable(tm); scroll = new JScrollPane(table); } } 主界面代码如下class Train extends JFrame implements ActionListener{ public JTextField jt_num,jt_stt,jt_ent,jt_pas; public JButton jb_seh,jb_add,jb_rec,jb_del; Train(){ super("列车车次管理系统"); String[] cond={"车次","出发时间","到站时间","途径车站"}; Object[][] data=new Object[4][4]; JLabel jl_num=new JLabel("车次"); JLabel jl_stt=new JLabel("出发时间"); JLabel jl_ent=new JLabel("到站时间"); JLabel jl_pas=new JLabel("途经车站"); jt_num=new JTextField(6); jt_stt=new JTextField(10); jt_ent=new JTextField(10); jt_pas=new JTextField(20); jb_seh=new JButton("查询"); jb_seh.addActionListener(this); jb_add=new JButton("添加"); jb_add.addActionListener(this); jb_rec=new JButton("修改"); jb_rec.addActionListener(this); jb_del=new JButton("删除"); jb_del.addActionListener(this); CreateTable table=new CreateTable(cond); JPanel jp1=new JPanel(); JPanel jp2=new JPanel(); JPanel jp3=new JPanel(); JPanel jp4=new JPanel(); jp1.add(jl_num); jp1.add(jt_num); jp1.add(jl_stt); jp1.add(jt_stt); jp2.add(jl_ent); jp2.add(jt_ent); jp2.add(jl_pas); jp2.add(jt_pas); jp3.add(jb_seh); jp3.add(jb_add); jp3.add(jb_rec); jp3.add(jb_del); jp4.add(table.scroll); setLayout(new GridLayout(4,1)); this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); setResizable(false); } } 3.3数据库的连接 数据库的连接有DBConnect类实现提代码如下 import java.sql.*; public class DBConnect { public static Connection getConn() throws Exception{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); return DriverManager.getConnection("jdbc:odbc:123",""); } } 3.4界面事件监听 在前台中,每个按钮都有库的操作的事件。当用户想要增或删除时,点击按钮,而系统会对这些按钮进行监听,并做相应的处理,其实现代码如下: public void actionPerformed(ActionEvent e){ if(e.getSource()==jb_add){ num=jt_num.getText(); stt=jt_stt.getText(); ent=jt_ent.getText(); pas=jt_pas.getText(); try { con = DBConnect.getConn(); st= con.createStatement(); st.executeUpdate("insert into Train values('"+num+"','"+stt+"','"+ent+"','"+pas+"')"); jt_num.setText(""); jt_stt.setText(""); jt_ent.setText(""); jt_pas.setText(""); JOptionPane.showMessageDialog(this, "添加成功!"); }catch(SQLException ae){ while (ae != null) { JOptionPane.showMessageDialog(this, "ERROR" ); ae = ae.getNextException(); } }catch(Exception ex){ ex.printStackTrace(); }finally { try { if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (SQLException t) { JOptionPane.showMessageDialog(this, "ERROR:" + "----- SQLException -----\r\n" ); } } } if(e.getSource()==jb_del){ num= jt_num.getText(); if (JOptionPane.showConfirmDialog(this, "确认要删除吗?") == JOptionPane.YES_OPTION) { try { Connection con = DBConnect.getConn(); Statement st = con.createStatement(); st.executeUpdate("delete from Train where number='"+ num + "'"); JOptionPane.showMessageDialog(this, "已删除!"); jt_num.setText(""); }catch(SQLException ae){ while (ae!= null) { JOptionPane.showMessageDialog(this, "ERROR" ); ae = ae.getNextException(); } }catch(Exception ex){ ex.printStackTrace(); }finally { try { if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (SQLException ex) { JOptionPane.showMessageDialog(this, "ERROR"); } } } } if(e.getSource()==jb_rec){ num=jt_num.getText(); stt=jt_stt.getText(); ent=jt_ent.getText(); pas=jt_pas.getText(); try { Connection con = DBConnect.getConn(); Statement st = con.createStatement(); st.executeUpdate("update Train set starttime='"+stt+"',endtime='"+ent+"',via='"+pas+"' where number='"+num+"'"); jt_num.setText(""); jt_stt.setText(""); jt_ent.setText(""); jt_pas.setText(""); JOptionPane.showMessageDialog(this, "修改成功!"); }catch (SQLException ex) { while (ex != null) { JOptionPane.showMessageDialog(this, "ERROR"); ex = ex.getNextException(); } } catch (Exception ex) { ex.printStackTrace(); } finally { try { if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (SQLException ex) { JOptionPane.showMessageDialog(this, "ERROR" ); } } } if(e.getSource()==jb_seh){ num=jt_num.getText(); try { Connection con = DBConnect.getConn(); Statement st = con.createStatement(); ResultSet rst = null; rst=st.executeQuery("select * from Train where number='"+num+"'"); if (rst.next() == false) { JOptionPane.showMessageDialog(this, "找不到该列车"); }else{ ResultSet rs=st.executeQuery("select * from Train where number='"+num+"'"); jt_num.setText(""); table.vector.removeAllElements(); table.tm.fireTableStructureChanged(); while (rs.next()) { Vector vector=new Vector(); vector.addElement(rs.getString(1)); vector.addElement(rs.getString(2)); vector.addElement(rs.getString(3)); vector.addElement(rs.getString(4)); table.vector.addElement(vector); } table.tm.fireTableStructureChanged(); } }catch (SQLException ex) { while (ex != null) { JOptionPane.showMessageDialog(this, "ERROR" ); ex = ex.getNextException(); } } catch (Exception ex) { ex.printStackTrace(); } finally { try { if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (SQLException ex) { JOptionPane.showMessageDialog(this, "ERROR:" + "----- SQLException -----\r\n"); } } } }
烈车时刻查询决策系统是便民类的系统。该系统能够为用户提供有关列车时刻充足的信息和快捷的查询手段。在计算机普及的信息时代,用电脑软件来查询列车时刻已经替代了一直以来人们使用传统的方式查询列车时刻,用传统的方式存在着许多缺点,如:效率低、时间长、繁琐,给用户带来了诸多不便。使用电脑软件进行查询,具有很多优点,例如:查询迅速、方便、清晰、信息存储量大等。因此有利于人们快速、方便的查找到所需的相关列车时刻信息。从真正意义上做到了“便民”。 列车时刻查询和决策工作是一项琐碎、繁杂的工作,由于列车时刻在各种节日休假时期经常性的调整,导致列车时刻表必须经常修改,以确保准确无误的向用户及时的提供列车时刻信息。几十年前的那种传统的方式存在着许多缺点,如:效率低、时间长、繁琐,给用户带来了诸多不便。在计算机普及的信息时代,使用电脑软件进行查询,使查询更加迅速、方便、清晰。 此列车时刻查询决策系统软件,能帮助人们利用计算机快速方便的查询列车时刻。本软件集列车基本数据、车次管理、列车查询于一身,目的在于能够使管理人员更加方便快捷的对列车时刻进行更新和管理。同时使用户更加方便快速的查询列车时刻信息。此列车时刻查询决策系统使列车时刻信息的查询工作更系统化、规范化、自动化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值