地铁查询系统
1.设计思想:
1)线路查询:这个比较好实现,利用sql语句,根据输入的线路号,查询站点名称并输出到web上;
2)站点查询:这个比较好实现,利用sql语句,根据输入的站点名称,查询线路号并输出到web上;
3)起点—终点查询:利用Dijkstra算法找到最短路径,输入起始站和终点站后,计数最短路径经过的站点数,若中间有换线路,记录线路并输出。
2.源程序代码:
1)UserDao.java
package dao;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.sql.*;
import util.DBUtil;
import java.sql.*;
public class UserDao {
public static Connection getConnection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1");
return con;
}
/**时间复杂度比较复杂,因为换乘结点的关系导致的
最坏情况下(每个站之间都有连线,但是地铁线路图实际上是不存在次情况的):O(2^n)
相反
最优情况下(之间只有唯一的连接点,次情况下也不是很现实的,有的地铁换乘是多个换乘点都在同一条线上的)
此时用hashtable所以是:O(1)
*/
/*private java.util.HashSet<String> GetF(java.util.HashSet<String> beginlist)
{
if (mainht == null || mainht.isEmpty())
{
return null;
}
returnlist = new java.util.HashSet<String>();
if (beginlist.isEmpty())
{
isend = 1;
}
else
{
*//**O(n)
*//*
for (String strbegin : beginlist)
{
if (strbegin.indexOf("-") == -1 && mainht.containsKey(strbegin) == true) //have this key and first load data
{
bxy = (double[])DCht.get(strbegin);
earry = mainht.get(strbegin).toString().split("[,]", -1);
for (String ar : earry)
{
exy = (double[])DCht.get(ar);
isadd = CK(isadd, bxy, exy);
if (isadd == true)
{
returnlist.add(strbegin + "-" + ar);
isend = 0;
}
}
}
else if (strbegin.indexOf("-") > -1 && mainht.containsKey(strbegin.substring(strbegin.lastIndexOf("-") + 1)) == true)
{
temgstr = strbegin.substring(strbegin.lastIndexOf("-") + 1);
bxy = (double[])DCht.get(temgstr);
earry = mainht.get(temgstr).toString().split("[,]", -1); //exchange node
for (String ar : earry)
{
exy = (double[])DCht.get(ar);
isadd = CK(isadd, bxy, exy);
if (isadd == true)
{
if (!strbegin.contains(ar))
{
returnlist.add(strbegin + "-" + ar);
}
isend = 0;
}
}
}
}
}
earry = null;
if (isend == 0)
{
return GetF(returnlist);
}
else
{
return null;
}
}*/
}
2)DBUtil.java
package util;
import java.sql.*;
public class DBUtil {
public static Connection getConnection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1?useSSL=true");
return con;
}
public void close(ResultSet rs) {
}
public void close(PreparedStatement preparedStatement) {
}
public void close(Connection connection) {
}
}
3)index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>线路查询</title>
</head>
<body style="text-align:center" vertical-align="middle">
<h1>地铁查询系统</h1>
<p style="color: black; font-family: 宋体; font-size: 40px" align="center">
<h2>
<input type="button" value="线路查询" onclick="location.href='check1.jsp'"/>
</h2>
<h2>
<input type="button" value="站点查询" onclick="location.href='check2.jsp'"/>
</h2>
<h2>
<input type="button" value="起点—终点查询" onclick="location.href='check3.jsp'"/>
</h2>
</p>
</body>
</html>
4)check1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>线路查询</title>
</head>
<body>
<h2 align="center">
线路查询
</h2>
<form action="check1_pd.jsp" method="get">
<p style="text-align:center;color: black; font-family: 宋体; font-size: 20px">
输入要查询线路的数字:
<br> <input type="text" name="number"/> <br>
<br><input type="submit" value="提交"/>
<input type="reset" value="重置"/> <br>
<br> <input type="button" value="返回菜单" onclick="location.href='index.jsp'"/> <br>
</p>
</form>
</body>
</html>
5)check1_pd.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<title>线路查询</title>
</head>
<body style="text-align:center" vertical-align="middle">
查询结果
<p>
<jsp:useBean id="util" class="util.DBUtil" scope="page"/>
<%
String number=(String)request.getParameter("number");
if(number==""){
out.print("<script language='javaScript'> alert('输入为空'); window.history.back(-1); </script>");
}
else
{
%>
<table border="1" align="center" vertical-align="middle">
<tr style="text-align:center;color: black; font-family: 宋体; font-size: 20px">
<td align="center" width=20%>线路号</td>
<td align="center" width=20%>车站名称</td>
</tr>
<%
int i = 0;
Connection connection = util.getConnection();
PreparedStatement preparedStatement = null;
ResultSet rs = null;
try {
String sql = " select * from test1 where number like ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "%" + number + "%");
rs = preparedStatement.executeQuery();
while (rs.next()) {
i++;
%>
<tr>
<td align="center"><%=rs.getObject(2) %>
</td>
<td align="center"><%=rs.getObject(4) %>
</td>
</tr>
<%
}
if (i == 0) {
out.print("<script language='javaScript'> alert('没有查询到有关信息'); window.history.back(-1); </script>");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
util.close(rs);
util.close(preparedStatement);
util.close(connection);
}
}
%>
</table>
<p style="text-align:center;color: black; font-family: 宋体; font-size: 20px">
<br> <input type="button" value="返回菜单" onclick="location.href='index.jsp'"/> <br>
</p>
</body>
</html>
6)check2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>站点查询</title>
</head>
<body>
<h2 align="center">
站点查询
</h2>
<form id="1" action="check2_pd.jsp" method="get">
<p style="text-align: center; color: black; font-family: 宋体; font-size: 20px">
站点:
<label>
<input type="text" name="data" size="10"/>
</label>
<br><br>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
<br><br> <input type="button" value="返回菜单" onclick="location.href='index.jsp'"/> <br>
</p>
</form>
</body>
</html>
7)check2_pd.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ page import="java.sql.*" %>
<%@ page import="util.DBUtil" %>
<%@ page import="java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>站点查询</title>
</head>
<body style="text-align:center" vertical-align="middle">
查询结果
<p style="text-align: center; color: black; font-family: 宋体; font-size: 20px">
<table border="1" align="center">
<tr>
<td align="center" width=10%>线路</td>
<td align="center" width=10%>站点</td>
</tr>
<%
String data = request.getParameter("data");
String str = "";
Connection connection = DBUtil.getConnection();
PreparedStatement preparedStatement = null;
ResultSet rs = null;
ArrayList<String> list = new ArrayList<String>();
int i = 0;
try {
String sql = "select * from test1 ";
preparedStatement = connection.prepareStatement(sql);
rs = preparedStatement.executeQuery();
while (rs.next()) {
if (data.equals(rs.getObject("data"))) {
if (!list.contains((String) rs.getObject(2))) {
list.add((String) rs.getObject(2));
i++;
%>
<tr>
<td align="center"><%=rs.getObject("number") %>号线</td>
<td align="center"><%=rs.getObject("data") %></td>
</tr>
<%
}
}
}
if (i == 0) {
out.print("<script language='javaScript'> alert('没有查询到有关信息'); window.history.back(-1); </script>");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
}
%>
</table>
<script>
function del() {
var r = confirm("确定要删除吗?")
if (r == true) {
return true;
} else {
return false;
}
}
</script>
<p style="text-align:center;color: black; font-family: 宋体; font-size: 20px">
<br> <input type="button" value="返回菜单" onclick="location.href='index.jsp'"/> <br>
</p>
</body>
</html>
8)check3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>起点——终点查询</title>
</head>
<body>
<h2 align="center">
起点——终点查询
</h2>
<form id="1" action="check3_pd.jsp" method="get">
<p style="text-align: center; color: black; font-family: 宋体; font-size: 20px">
起始站:
<label>
<input type="text" name="one" size="10"/>
</label>
<br><br>
终点站:
<label>
<input type="text" name="two" size="10"/>
</label>
<br><br>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
<br><br> <input type="button" value="返回菜单" onclick="location.href='index.jsp'"/> <br>
</p>
</form>
</body>
</html>
9)check3_pd.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ page import="java.sql.*" %>
<%@ page import="util.DBUtil" %>
<%@ page import="java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>起点-终点查询</title>
</head>
<body style="text-align:center" vertical-align="middle">
查询结果
<p style="text-align: center; color: black; font-family: 宋体; font-size: 20px">
<table border="1" style="align:center;">
<tr>
<td align="center" width=20%>路径</td>
<td align="center" width=2%>经历站点个数</td>
</tr>
<%
String one = request.getParameter("one");
String two = request.getParameter("two");
String str = "";
int number = 1;
Connection connection = DBUtil.getConnection();
PreparedStatement preparedStatement = null;
ResultSet rs = null;
ArrayList<String> list = new ArrayList<String>();
int i = 0;
try {
String sql = "select * from number";
preparedStatement = connection.prepareStatement(sql);
rs = preparedStatement.executeQuery();
while (rs.next()) {
if (one.equals(rs.getObject("one")) && two.equals(rs.getObject("two"))) {
if (!list.contains((String) rs.getObject(4))) {
list.add((String) rs.getObject(4));
i++;
%>
<tr>
<td align="center"><%=rs.getObject("four") %>
</td>
<%
}
}
}
String judgelist = list.get(0);
for (int j = 0; j < judgelist.length() - 1; j++) {
if (judgelist.charAt(j) == '-') {
number++;
}
}
%>
<td align="center"><%=number%>
</td>
</tr>
<%
if (i == 0) {
out.print("<script language='javaScript'> alert('没有查询到有关信息'); window.history.back(-1); </script>");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
}
%>
</table>
<script>
function del() {
var r = confirm("确定要删除吗?")
if (r == true) {
return true;
} else {
return false;
}
}
</script>
<p style="text-align:center;color: black; font-family: 宋体; font-size: 20px">
<br> <input type="button" value="返回菜单" onclick="location.href='index.jsp'"/> <br>
</p>
</body>
</html>
3.运行结果截图







4.编程总结分析
这次的程序对于我们来说还是比较难的,尤其是起点——终点查询的功能,另外那些附加的功能对于我们来说就更难了。
通过此次编程,我对于数据库的使用,Java的认识,HTML的认识更加深入。
5.时间记录日志

