声明:转自新浪博客,原地址:http://blog.sina.com.cn/s/blog_681aaa5501017x6k.html
转载此目的是为了自己学习记录笔记使用,如涉及到什么问题,请联系我。
将一个表里的数据在网页上显示出来,并且能在网页端进行添加和删除记录的操作。
初成。效果如下:具体步骤:(在linux环境下操作)
1)将excel里的数据load进MySQL数据库。
2)tomcat的安装与配置。
3)如何通过JDBC连接MySQL数据库。
4)JSP如何实现数据的显示/添加/删除。
1)将excel里的数据load进mysql数据库。
这一步可以写perl脚本,也可以直接使用MySQL的命令,也可以直接在excel里生成SQL的insert语句,或者存为CSV格式后导入。不过首先得建一个数据库,再建一个数据表。下面的命令在MySQL里执行,创建一个名为sequencing_records数据库,和一个名为sequencingrecords的数据表,表中共有7栏。date和lane是int格式的,其余的为字符串格式。
| create databasesequencing_records; use sequencing_records; create table sequencingrecords(date INT NOT NULL, lane INT NOTNULL,sequencer VARCHAR(50),barcodes VARCHAR(500),directoryVARCHAR(50), filename VARCHAR(50), descriptionVARCHAR(500)); |
1.1)直接使用MySQL的命令。
命令为LOAD DATAINFILE。在导入工作进行之前,需要注意要导入的文本文件使用的字符集,如果文本文件中含有ASCⅡ字符集无法表示的内容,那么应该用SETNAMES命令对其内容文本的字符集做出必要的设置。例如,如果文本文件使用了latin-1字符集,则先应运行SET NAMES'latin1'. 此外,要导入的文本文件必须置于mysql的data目录下的sequencing_records数据库的目录下。mysql的data目录因系统而异,可在MySQL下运行show variables like'datadir%';查看。在/etc/my.cnf中也可查看或者修改MySQL的各种配置,包括data存放目录,修改完后重启生效。
| LOAD DATA INFILE'mysql_data_directory/file_tobe_loaded' INTO TABLEsequencingrecords fields terminated by '\t' lines terminated by'\n'; |
1.2)导入CSV格式的文本文件
如果想把在windows环境下用excel创建的CSV文件导入Mysql,使用如下的导入选项:FIELDS TERMINATED BY',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'
1.3)在excel里生成SQL的insert语句。
数据为A-G行,在H行输入如下的公式:
| =CONCATENATE("insert intosequencingrecords(date,lane,sequencer,barcodes,directory,filename,description)values('",A1,"','",B1,"','",C1,"','",D1,"','",E1,"','",F1,"','",G1,"');") |
2)tomcat的配置。
使用的java版本为:
java version"1.6.0_26"
Java(TM) SERuntime Environment (build 1.6.0_26-b03)
JavaHotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
tomcat版本为:apache-tomcat-6.0.35。
在tomcat的webapps目录下新建一个SEQ_RECORDS目录,在该目录中编写jsp文件。
由于需要使用JDBC链接数据库,需要下载一个JDBC驱动程序包,下载地址http://dev.mysql.com/downloads/connector/j/。目前版本为5.1.21。
将mysql-connector-java-5.1.21-bin.jar文件放入tomcat的lib目录下。
在~/.bash_profile中设置CLASSPATH,加上mysql-connector-java-5.1.21-bin.jar的路径,例如exportCLASSPATH=.:$HOME/tomcat_base/lib/mysql-connector-java-5.1.21-bin.jar
进入tomcat的conf目录,在server.xml文件最后的</Host>前添加以下内容:
| <Contextpath="/seq_records" docBase="SEQ_RECORDS" debug="5"reloadable="true" crossContext="true"> </Context> |
3)如何通过JDBC连接MySQL数据库。
以下的java程序通过JDBC链接mysql数据库。
|
import java.sql.DriverManager; import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement; import com.mysql.jdbc.ResultSetImpl; import com.mysql.jdbc.Driver"; public class LinkMysql{ public static void main(String[] args){ try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); Connectionconn =(Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/sequencing_records","user","passwd"); Statementstmt = (Statement)conn.createStatement(); ResultSetImpl rst = (ResultSetImpl)stmt.executeQuery("select * from sequencingrecordsORDER BY date DESC"); rst.last(); int n =rst.getRow(); System.out.println("Total records number:"+n); rst.beforeFirst(); while(rst.next()){ System.out.println(rst.getString("date")); System.out.println(rst.getString("lane")); System.out.println(rst.getString("sequencer")); System.out.println(rst.getString("barcodes")); System.out.println(rst.getString("directory")); System.out.println(rst.getString("filename")); System.out.println(rst.getString("description")); } rst.close(); stmt.close(); conn.close(); } catch(Exception e){ System.out.println("Error: " e.toString()); } } } |
rst.last();int n =rst.getRow();调用rst里的last方法,将当前记录设置为查询结果的最后一条,getRow则提取该记录的编号。该编号即是这次查询的结果集的记录条目总数。用这个方法可以计算数据表中一共有多少条记录。
rst.beforeFirst();将当前记录设置为第一条,以便使用next方法从头开始遍历结果。
4)JSP如何实现数据的显示/添加/删除。
这一步有有三个脚本。sequencingrecords.jsp,SeqAdd.jsp和SeqErase.jsp。
SeqAdd.jsp是添加记录用的,用到了java bean(To behonest,直到现在我也还不知道这个到底是什么)。因此首先得写一个用于数据输入的java程序,SeqData.java,用javac编译后将class文件放入tomcat的lib/seq目录下(新建seq目录),并将lib目录的路径添加进CLASSPATH。
SeqData.java
| package seq; public class SeqData { intdate; intlane; Stringsequencer; Stringbarcodes; Stringdirectory; Stringfilename; Stringdescription; public voidsetDate( int value ) { date = value; } public voidsetLane( int value ) { lane = value; } public voidsetSequencer( String value ) { sequencer = value; } public voidsetBarcodes( String value ) { barcodes = value; } public voidsetDirectory( String value ) { directory = value; } public voidsetFilename( String value ) { filename = value; } public voidsetDescription( String value ) { description = value; } public intgetDate() { return date; } public intgetLane() { return lane; } publicString getSequencer() { return sequencer; } publicString getBarcodes() { return barcodes; } publicString getDirectory() { return directory; } publicString getFilename() { return filename; } publicString getDescription() { return description; } } |
sequencingrecords.jsp从sequencingrecords数据表中读取数据并显示。并且可进行数据的添加和删除。
| <%@ pageimport="java.sql.DriverManager" %> <%@ page import="com.mysql.jdbc.Connection"%> <%@ page import="com.mysql.jdbc.Statement"%> <%@ page import="com.mysql.jdbc.ResultSetImpl"%> <%@ page import="com.mysql.jdbc.Driver"%> <%@ page import="seq.*" %> <%@ page contentType="text/html"language="java" import="java.sql.*"%> <html> <head> <style type="text/css"> table, td, th { border:2px solid green; font-family:calibri; border-collapse:collapse; } th { background-color:green; color:white; } </style> </head> <body> <h1style="font-family:georgia;color:green;text-align:center;">SequencingRecords of Qi Lab</h1> <hr/ > <pstyle="font-family:georgia;color:red;"><b>NOTICE!</b><br>Beforeyou add or delete sequencing records, please read the followinginstructions:</p> <ulstyle="font-family:georgia;color:MidnightBlue;"> <li>ONLY English and numbers areallowed.</li> <li>The format for "date" isYYYYMMDD, for example, August,7th, 2012 should be wrriten as20120807.</li> <li>Use<br> to seperate lines in afield.</li> <li>To display some special symbolssuch as ' and \ ,please add a "\" before them,otherwise it would go wrong. For example. if you want to display ',you should type \'.</li> <li>When you click "Delete" button,records with the same "date" and "lane" would bedeleted.</li> </ul> <hr/ > <pstyle="font-family:georgia;color:MidnightBlue;"><b>Addsequencingrecords</b></p> <jsp:useBean id="seq" class="seq.SeqData"scope="session"/> <FORM METHOD=POST ACTION="SeqAdd.jsp"style="font-family:georgia;color:MidnightBlue;"> Date <INPUT TYPE=TEXT NAME=date SIZE=20VALUE="<%= seq.getDate()%>"><BR> Lane <INPUT TYPE=TEXT NAME=lane SIZE=20VALUE="<%= seq.getLane()%>"><BR> Sequencer <INPUT TYPE=TEXT NAME=sequencer SIZE=50VALUE="<%= seq.getSequencer()%>"><BR> Barcodes <INPUT TYPE=TEXT NAME=barcodes SIZE=200VALUE="<%= seq.getBarcodes()%>"><BR> Directory <INPUT TYPE=TEXT NAME=directory SIZE=50VALUE="<%= seq.getDirectory()%>"><BR> Filename <INPUT TYPE=TEXT NAME=filename SIZE=50VALUE="<%= seq.getFilename()%>"><BR> Description <INPUT TYPE=TEXT NAME=descriptionSIZE=200 VALUE="<%= seq.getDescription()%>"> <P><INPUTTYPE=SUBMIT> </FORM> <hr/ > <table> <tr><th>Action</th><th>Date</th><th>Lane</th><th>Sequencer</th><th>Barcodes</th><th>Directory</th><th>Filename</th><th>Description</th></tr> <% Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn =(Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/sequencing_records","user","passwd"); Statement stmt = (Statement)conn.createStatement(); ResultSetImpl rst = (ResultSetImpl)stmt.executeQuery("select * from sequencingrecordsORDER BY date DESC"); rst.last(); int n = rst.getRow(); out.println("<pstyle=font-family:georgia;color:MidnightBlue;>NOTE</p>"); out.println("<ulstyle=font-family:georgia;color:MidnightBlue;><li>Theserecords are displayed in chronological order, from recent toremote.</li>"); out.println("<li>Total records numberfrom 2009-10-20 to date:<b>"+n+"</b></li></ul>"); out.println("<hr/ >"); rst.beforeFirst(); while (rst.next()){ out.println("<tr>"); out.println("<td><ahref=SeqErase.jsp?date="+rst.getString(1)+"&lane="+rst.getString(2)+"onclick=\"return(confirm('Are you sure todelete?'))\">Delete</a></td>"); out.println("<td>"+rst.getString("date")+"</td>"); out.println("<td>"+rst.getString("lane")+"</td>"); out.println("<td>"+rst.getString("sequencer")+"</td>"); out.println("<td>"+rst.getString("barcodes")+"</td>"); out.println("<td>"+rst.getString("directory")+"</td>"); out.println("<td>"+rst.getString("filename")+"</td>"); out.println("<td>"+rst.getString("description")+"</td>"); out.println("</tr>"); } rst.close(); stmt.close(); conn.close(); %> </table> </body> </html> |
这里要注意的是如何在网页上显示一些特殊字符,比如<和>。<用<,>用>。
数据的添加是通过<jsp:useBean id="seq" class="seq.SeqData"scope="session"/>实现的,这里用到了SeqData.class。<FORMMETHOD=POST ACTION="SeqAdd.jsp"style="font-family:georgia;color:MidnightBlue;">以及</FORM>这两个标签之间的内容描述了具体输入的格式。实现效果如下:
由于输入的数据要被insert进MySQL里,故必须遵循MySQL的一些语法,例如一些特殊字符,必须在前面加上\才能正确insert。此外,如果要在一个field内显示多行,用<br>做分隔符。
输入的数据被保存在一个Bean里面(我猜是这样),传递给SeqAdd.jsp进行下一步处理。
out.println("<td><ahref=SeqErase.jsp?date="+rst.getString(1)+"&lane="+rst.getString(2)+"onclick=\"return(confirm('Are you sure todelete?'))\">Delete</a></td>");这一句实现的效果是在点击DELETE按钮时,跳出一个对话框,问你是否确定删除记录。如果点击确定删除的话,则将这一记录的date和lane传递给SeqErase.jsp,实现数据的删除。
SeqAdd.jsp 处理从web输入的数据,并且添加到数据库。
|
<%@ pageimport="seq.*" %> <%@ page import="java.sql.DriverManager"%> <%@ page import="com.mysql.jdbc.Connection"%> <%@ page import="com.mysql.jdbc.Statement"%> <%@ page import="com.mysql.jdbc.ResultSetImpl"%> <%@ page import="com.mysql.jdbc.Driver"%> <jsp:useBean id="seq" class="seq.SeqData"scope="session"/> <jsp:setProperty name="seq"property="*"/> <%@ page contentType="text/html" language="java"import="java.sql.*"%> <HTML> <BODY> Date: <%= seq.getDate()%><BR> Lane: <%= seq.getLane()%><BR> Sequencer: <%= seq.getSequencer()%><BR> Barcodes: <%= seq.getBarcodes()%><BR> Directory: <%= seq.getDirectory()%><BR> Filename: <%= seq.getFilename()%><BR> Description: <%= seq.getDescription()%><BR> <% Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn =(Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/sequencing_records","user","passwd"); Statement stmt = (Statement)conn.createStatement(); int date = seq.getDate(); int lane = seq.getLane(); String sequencer = seq.getSequencer(); String barcodes = seq.getBarcodes(); String directory = seq.getDirectory(); String filename = seq.getFilename(); String description = seq.getDescription(); stmt.executeUpdate("insert intosequencingrecords(date,lane,sequencer,barcodes,directory,filename,description)values('"+date+"','"+lane+"','"+sequencer+"','"+barcodes+"','"+directory+"','"+filename+"','"+description+"')"); stmt.close(); conn.close(); %> </BODY> </HTML> <%response.sendRedirect("http://hostIP:8080/seq_records/sequencingrecords.jsp");%> |
insertintosequencingrecords(date,lane,sequencer,barcodes,directory,filename,description)values('"+date+"','"+lane+"','"+sequencer+"','"+barcodes+"','"+directory+"','"+filename+"','"+description+"')。java向MySQL传递变量时,得这样写:'"+date+"'
SeqErase.jsp 这一步接受从sequencingrecords.jsp传递过来的删除指令,根据指定的field将数据表里的记录删除。
由于sequencingrecords.jsp传递过来的date和lane是字符串格式的,而MySQL里的定义是int格式的。必须先将之转化为int格式才能使用。
由于java和html都是这十几天内突击学的,好多东西一知半解,一些东西比如java bean还有request.getParameter之类的我也不知道怎么实现的,好在最终还是能work了~如有不当之处,请不吝赐教~
SeqErase.jsp 这一步接受从sequencingrecords.jsp传递过来的删除指令,根据指定的field将数据表里的记录删除。
|
<%@ pageimport="java.sql.DriverManager" %> <%@ page import="com.mysql.jdbc.Connection"%> <%@ page import="com.mysql.jdbc.Statement"%> <%@ page import="com.mysql.jdbc.ResultSetImpl"%> <%@ page import="com.mysql.jdbc.Driver"%> <%@ page contentType="text/html" language="java"import="java.sql.*"%> <HTML> <BODY> <% String date0 = request.getParameter("date"); String lane0 = request.getParameter("lane"); int date = Integer.parseInt(date0); int lane = Integer.parseInt(lane0); Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn =(Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/sequencing_records","user","passwd"); Statement stmt = (Statement)conn.createStatement(); stmt.executeUpdate("delete from sequencingrecords WHEREdate='"+date+"' AND lane='"+lane+"'"); stmt.close(); conn.close(); out.println(date); out.println(lane); %> <br/> <p>The record has beendeleted!</p> </BODY> </HTML> <%response.sendRedirect("http://hostIP:8080/seq_records/sequencingrecords.jsp");%> |
由于java和html都是这十几天内突击学的,好多东西一知半解,一些东西比如java bean还有request.getParameter之类的我也不知道怎么实现的,好在最终还是能work了~如有不当之处,请不吝赐教~