设计思路等诸多问题都在上次的 石家庄地铁站项目进度总结 中给出高中,所以这次的总结报告主要写改进过后的代码。
代码如下:
DBYtil类代码如下: package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * 数据库连接工具 * @author Hu * */ public class DBUtil { public static String db_url = "jdbc:mysql://localhost:3306/subway?serverTimezone=UTC"; public static String db_user = "root"; public static String db_pass = "root"; public static Connection getConn () { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver");//加载驱动 conn = DriverManager.getConnection(db_url, db_user, db_pass);//连接数据库 } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 关闭连接 * @param state * @param conn */ public static void close (Statement state, Connection conn) { if (state != null) { try { state.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close (ResultSet rs, Statement state, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (state != null) { try { state.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } SubwayDao类代码如下: package dao; //用于从数据库获取数据并以ZhanDian类的形式输出 import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import entity.ZhanDian; import util.DBUtil; public class SubwayDao { //通过id和表名获取对应表的对应站点 public ZhanDian getCourseByBiaoId(String biao,int id) { String sql = "select * from " + biao + " where id ='" + id + "'"; Connection conn = DBUtil.getConn(); Statement state = null; ResultSet rs = null; ZhanDian zhandian = null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { String name = rs.getString("name"); zhandian = new ZhanDian(id,name); } } catch (Exception e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } return zhandian; } /* //通过id获取对应1的站点 public ZhanDian getCourseById_1(int id){ String sql = "select * from one where id ='" + id + "'"; Connection conn = DBUtil.getConn(); Statement state = null; ResultSet rs = null; ZhanDian zhandian = null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { String name = rs.getString("name"); zhandian = new ZhanDian(id,name); } } catch (Exception e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } return zhandian; } //通过id获取对应3的站点 public ZhanDian getCourseById_3(int id){ String sql = "select * from three where id ='" + id + "'"; Connection conn = DBUtil.getConn(); Statement state = null; ResultSet rs = null; ZhanDian zhandian = null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { String name = rs.getString("name"); zhandian = new ZhanDian(id,name); } } catch (Exception e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } return zhandian; } */ //通过line获取jiedian表中的对应的中转站点 public ZhanDian getCourseByLine(int line) { String sql = "select * from jiedian where line ='" + line + "'"; Connection conn = DBUtil.getConn(); Statement state = null; ResultSet rs = null; ZhanDian zhandian = null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { String name = rs.getString("name"); zhandian = new ZhanDian(name); } } catch (Exception e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } return zhandian; } //通过表名、站点名获取对应表中的对应id public int getIdByBNName(String biao,String name) { String sql ="select * from " + biao + " where name = '" + name + "'"; Connection conn = DBUtil.getConn(); Statement state = null; ResultSet rs = null; ZhanDian zhandian = null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { int id = rs.getInt("id"); zhandian = new ZhanDian(id); } } catch (Exception e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } return zhandian.getId(); } //通过中转站名字和line获取ZhanDian对象 public ZhanDian getZhanDianByName(String name,int line) { String sql ="select * from jiedian where name = '" + name + "' and line = '" + line + "' "; Connection conn = DBUtil.getConn(); Statement state = null; ResultSet rs = null; ZhanDian zhandian = null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { String qidian = rs.getString("qidian"); String zhongdian = rs.getString("zhongdian"); zhandian = new ZhanDian(qidian,zhongdian); } } catch (Exception e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } return zhandian; } } Javabean类的代码如下: package entity; public class ZhanDian { private int id; private int line; private String name; private String qidian; private String zhongdian; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getLine() { return line; } public void setLine(int line) { this.line = line; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getQidian() { return qidian; } public void setQidian(String qidian) { this.qidian = qidian; } public String getZhongdian() { return zhongdian; } public void setZhongdian(String zhongdian) { this.zhongdian = zhongdian; } public ZhanDian(int id,int line,String name) { this.id=id; this.line=line; this.name=name; } public ZhanDian(int id,String name) { this.id=id; this.name=name; } public ZhanDian(String qidian,String zhongdian) { this.qidian=qidian; this.zhongdian=zhongdian; } public ZhanDian(String name) { this.name=name; } public ZhanDian(int id) { this.id=id; } public ZhanDian() { } } Transform类的代码如下: package assist; import dao.SubwayDao; public class Transform { //判断输入的地点名在哪一个线路和对应线路上的对应表中对应id public int transform(String name) { int line=0; int n; SubwayDao sd = new SubwayDao(); //将数据库中one表中的数据存储到数组one中 int id=1; //判断是否在第一条线 for(n=0;n<29;n++) { if(name.equals(sd.getCourseByBiaoId("one",id).getName())) { line=1; return line; } id++; } id=1; for(n=0;n<37;n++) { if(name.equals(sd.getCourseByBiaoId("two",id).getName())) { line=2; return line; } id++; } id=1; for(n=0;n<34;n++) { if(name.equals(sd.getCourseByBiaoId("three",id).getName())) { line=3; return line; } id++; } id=1; for(n=0;n<18;n++) { if(name.equals(sd.getCourseByBiaoId("four",id).getName())) { line=4; return line; } id++; } id=1; for(n=0;n<21;n++) { if(name.equals(sd.getCourseByBiaoId("five",id).getName())) { line=5; return line; } id++; } id=1; for(n=0;n<18;n++) { if(name.equals(sd.getCourseByBiaoId("six",id).getName())) { line=6; return line; } id++; } return line; } //通过起点所在线路的数组,起点和中转站的id和名字得到起点到中转站的站点名字数组 public String[] zhongZhanQ(String [] zhongzhan,int id1,int id,String name1,String name) { String shuchu[]=new String [zhongzhan.length]; int n=0; int i; //起点id1小于中转站id时 if((id1-id)<0) { for(i=(id1-1);i<id;i++) { shuchu[n]=zhongzhan[i]; n++; } } //起点id大于中转站id时 else { for(i=(id1-1);i>(id-2);i--) { shuchu[n]=zhongzhan[i]; n++; } } return shuchu; } //将两个数字和并成一个数字 public int HeBing(int line1,int line2) { String sline1=String.valueOf(line1);//将int型转化为String型 String sline2=String.valueOf(line2);//将int型转化为String型 String sline3; sline3=sline1+sline2; int line3= Integer.parseInt(sline3); //将String型转化为int型 return line3; } //通过终点所在线路的数组,终点和中转站的id和名字得到起点到中转站的站点名字数组 public String[] zhongZhanZ(String [] zhongzhan,int id,int id2,String name,String name2) { String shuchu[]=new String [zhongzhan.length]; int n=0; int i; //终点id小于中转站id时 if((id2-id)<0) { for(i=(id-2);i>(id2-2);i--) { shuchu[n]=zhongzhan[i]; n++; } } //终点id大于中转站id时 else { for(i=id;i<id2;i++) { shuchu[n]=zhongzhan[i]; n++; } } return shuchu; } //通过表名将其数组形式输出 public String[] zu(String biao) { String zu[] = new String[40]; SubwayDao sd = new SubwayDao(); //将数据库中表中的数据存储到数组中 int id=1; int xunhuan=0; if(biao=="one") { xunhuan = 29; }else if(biao == "two") { xunhuan = 37; }else if(biao=="three") { xunhuan = 34; }else if(biao=="four") { xunhuan = 18; }else if(biao=="five") { xunhuan = 21; }else if(biao=="six") { xunhuan = 18; } for(int n=0;n<xunhuan;n++) { zu[n]=sd.getCourseByBiaoId(biao,id).getName(); id++; } return zu; } /* //将表one以数组的形式输出 public String[] oneZu() { String onezu[] = new String[29]; SubwayDao sd = new SubwayDao(); //将数据库中one表中的数据存储到数组one中 int id=1; for(int n=0;n<29;n++) { onezu[n]=sd.getCourseById_1(id).getName(); id++; } return onezu; } //将表three以数组的形式输出 public String[] threeZu() { String threezu[] = new String[34]; SubwayDao sd = new SubwayDao(); //将数据库中one表中的数据存储到数组one中 int id=1; for(int n=0;n<34;n++) { threezu[n]=sd.getCourseById_3(id).getName(); id++; } return threezu; } */ //判断起点和终点是否在一条线上 public boolean tiaoShu(int qidian,int zhongdian) { if(qidian==zhongdian) { return true; }else { return false; } } //通过line获得对应的字符串 public String[] biaoByLine(int line) { String biao[]=new String[40]; switch(line) { case 1: { biao=zu("one"); break; } case 2: { biao=zu("two"); break; } case 3: { biao=zu("three"); break; } case 4: { biao=zu("four"); break; } case 5: { biao=zu("five"); break; } case 6: { biao=zu("six"); break; } } return biao; } //通过int型line获取string型的表名 public String stringByLine(int line) { String biaoname=null; switch(line) { case 1: { biaoname = "one"; break; } case 2: { biaoname = "two"; break; } case 3: { biaoname = "three"; break; } case 4: { biaoname = "four"; break; } case 5: { biaoname = "five"; break; } case 6: { biaoname = "six"; break; } } return biaoname; } } Main类的代码如下: package main; import assist.Transform; //import assist.IntStringInt; import dao.SubwayDao; public class Main { public String zhu(String qidian,String zhongdian/*,int qixian,int zhongxian*/) { String string="";//存储所要输出的字符串 Transform tf = new Transform(); SubwayDao sd = new SubwayDao(); int id1,id2; String qibiao,zhongbiao; int qiid,zhongid; String qiname,zhongname; int qixian,zhongxian; //起始点名字 qiname=qidian; //终点名字 zhongname=zhongdian; qixian=tf.transform(qiname); zhongxian=tf.transform(zhongname); //得出起始站点id1 id1=sd.getIdByBNName((tf.stringByLine(qixian)), qidian); //得出终点对应id2 id2=sd.getIdByBNName((tf.stringByLine(zhongxian)), zhongdian); //如果两个点在一条线上 if(tf.tiaoShu(qixian,zhongxian)) { String zhengzu[] = tf.zhongZhanQ(tf.biaoByLine(qixian), id1, id2, qiname, zhongname); string = string +"起点至终点的站点信息:开始 >> "; int mn; for(mn=0;mn<zhengzu.length&&zhengzu[mn]!=null;mn++) { string = string + mn + String.valueOf(zhengzu[mn]) + ">>"; } string = string + "结束"; string = string + "总共" + String.valueOf(mn-1) + "站"; } //否则在两条线上 else { //得出换站点的line及名字 int line=tf.HeBing(qixian,zhongxian); String name=sd.getCourseByLine(line).getName(); //通过名字获取所交的两个表名 qibiao=sd.getZhanDianByName(name,line).getQidian(); zhongbiao=sd.getZhanDianByName(name,line).getZhongdian(); //通过表名和名字获取对应表里的id值 qiid=sd.getIdByBNName(qibiao,name); zhongid=sd.getIdByBNName(zhongbiao,name); //输出前半段路程数组 String qizu[] = tf.zhongZhanQ(tf.biaoByLine(qixian), id1, qiid, qiname, name); String zhongzu[] = tf.zhongZhanZ(tf.biaoByLine(zhongxian), zhongid, id2, name, zhongname); //输出中途站点信息 string=string + "起点至终点的站点信息:开始"; int m=0; int n=0; for(m=0;m<qizu.length&&qizu[m]!=null;m++) { string = string + ">>" + m + String.valueOf(qizu[m]); } string= string + "(在此站需要换到 " + zhongxian + " 号线)>>"; for(n=0;n<zhongzu.length&&zhongzu[n]!=null;n++) { string = string + m + String.valueOf(zhongzu[n]) + ">>"; m++; } string ="总共经过 " + String.valueOf(m-1) + "站" + string + "结束"; } return string; } } Servlet类的代码如下: package servlet; import java.io.IOException; 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 main.Main; @WebServlet("/Servlet") public class Servlet extends HttpServlet{ private static final long serialVersionUID = 1L; protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String method = req.getParameter("method"); if ("lucheng".equals(method)) { lucheng(req, resp); } } //查找线路 private void lucheng(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException{ Main zhu = new Main(); req.setCharacterEncoding("utf-8"); String qidian = req.getParameter("qidian"); String zhongdian = req.getParameter("zhongdian"); String string=zhu.zhu(qidian, zhongdian); req.setAttribute("message", string); req.getRequestDispatcher("lucheng.jsp").forward(req,resp); } }
界面代码如下:
//face.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>石家庄地铁</title> <style> <%--最顶端的div样式--%> .tou{ background-image:url(image/004_1.jpg); background-size:100% 100%; } .caidan{ background-color:#669999; 100%; heigh:100px; } </style> </head> <frameset rows="120px,*" frameborder="1" border="2" framespacing="0" > <frame src="yemei.jsp" name="yemei"/> <frame src="zhuti.jsp" name="zhuti"/> </frameset> <iframe> <body> <h1 align="center" style="color:red">该浏览器不支持frameset显示</h1> </body> </iframe> </html> //yeimei.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>页眉</title> <style> <%--最顶端的div样式--%> .tou{ background-image:url(image/004_1.jpg); background-size:100% 100%; } .caidan{ background-color:#669999; 100%; } </style> </head> <body> <%-- 顶端要显示的div --%> <div class="tou" > <div> <img src="image/sjzdt.jpg" style="height: 70px; 70px; margin-left:10px; margin-top: 2px;"/> </div> <%-- <div > <img src="image/bei.jpg" style="height: 70px; 35px; margin-left: 990px; margin-top: 2px;"/> </div> --%> <div class="caidan"> <table width="30%"> <tr> <td align='center'> <a href="zhuti.jsp" target="zhuti">首页</a> </td> <td align='center'> <a href="jianjie.jsp" target="zhuti">公司简介</a> </td> <td align='center'> <a href="shuoming.jsp" target="zhuti">使用说明</a> </td > </tr> </table> </div> </div> </body> </html> //zhuti.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>页面主体</title> <style> .zhuti{ background-image:url(image/tu.jpg); background-repeat : repeat; } </style> </head> <body> <div style="100%;height:700px;background:url(image/tu.jpg);background-size:100% 100%;"> <iframe src="shuru.jsp" width="200px" height="170px"></iframe> </div> </body> </html> //shuru.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>石家庄地铁</title> <style> .a{ margin-top: 10px; } </style> </head> <body> <div align="center" style="100%;background:url(image/003_2.jpg);background-size:100% 100%;"> <form action="Servlet?method=lucheng" method="post" onsubmit="return check()"> <div class="a"> 起点站名字:<input type="text" id="qidian" name="qidian" style="60px;"/> </div> <div class="a"> </div> <div class="a"> 终点站名字:<input type="text" id="zhongdian" name="zhongdian" style="60px;"/> </div> <div class="a"> </div> <div class="a"> <button type="submit" class="b">确 定</button> </div> </form> </div> <script type="text/javascript"> function check() { var qidian = document.getElementById("qidian"); var zhongdian = document.getElementById("zhongdian"); if(qidian.value=='') { alert('请填写起点站'); return false; }else if(zhongdian.value==''){ alert('请填写终点站'); return false; } } </script> </body> </html> //lucheng.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> <div style="100%"> <p style="color:red"><%=request.getAttribute("message")%></p> </div> </body> </html> //jianjie.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> <h1>暂无公司简介</h1> </body> </html> //shuoming.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> <h1>暂无使用说明</h1> </body> </html>
以上为最终的项目的所有代码。