JavaBean与数据库的使用

来源:互联网 发布:php ajax返回json数据 编辑:程序博客网 时间:2024/06/05 16:36

1.实验目的
本实验的目的是掌握怎样在JSP中使用Javabean完成数据的封装操作,并能够使用Javabean操作文件或连接数据库。
2.实验内容
编写一个JSP页面:inputAndShow.jsp和一个名字为car的Javabean,其中car由Car.class类负责创建。
1.inputAndShow.jsp的具体要求
inputAndShow.jsp页面提供一个表单。其中表单允许用户输入汽车的牌号、名称和生产日期,该表单将用户输入的信息提交给当前页面,当前页面调用名字为car的bean,并使用表单提交的数据设置car的有关属性的值,然后显示该car的各个属性的值。
该页面还能够显示已经提交的所有车辆信息。
2.Car.java的具体要求
编写的Car.java应当有刻画汽车号码、名称和生产日期的属性,并提供相应的getXxx和setXxx方法,来获取和修改这些属性的值。Car.java能够将汽车的信息保存到某个文本文档,或者能够将汽车的信息保存到某个数据库中,可由同学们自行选择。

实现代码:

(1) Car.java

package jspBean;import java.sql.*;import com.sun.rowset.*;public class Car {    String number;//车牌号    String type;//品牌    String date;//生产日期    int pageSize=10;//每页显示的记录数    int pageAllcount=0;//分页后的总页数    int showPage=1;//当前显示页数    StringBuffer presentPageResult;//显示当前页的内容    CachedRowSetImpl rowSet;//用于存储Result对象    int columns=0;//数据库表的列数    String column[]=new String[100];    Boolean insert=false;    public Car() {        presentPageResult=new StringBuffer();        try {            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");        }        catch(Exception e) {}    }    public int getPageSize() {        return pageSize;    }    public void queryDataBase()//从数据库中获取查询结果并保存到结果集中    {        String uri="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Car";        try {            Connection con=DriverManager.getConnection(uri,"sa","123456");            DatabaseMetaData metadata=con.getMetaData();            ResultSet rs1=metadata.getColumns(null,null,"Cars",null);            while(rs1.next()) {                column[columns]=rs1.getString(4);//获取字段的名字                columns++;//列数加一                }            Statement sta=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);//只读            ResultSet rs=sta.executeQuery("select * from Cars");            rowSet=new CachedRowSetImpl();//创建行级对象            rowSet.populate(rs);            sta.close();            con.close();            rowSet.last();            int m=rowSet.getRow();//总行数            int n=pageSize;//每页显示记录数            pageAllcount=((m%n)==0)? (m/n):(m/n+1); //计算分页后的总页数         }        catch(Exception exp) {        }       }    public void InsertData()//向数据库中插入数据    {        String uri="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Car";        try {            Connection con=DriverManager.getConnection(uri,"sa","123456");            //String sql="insert into Cars values(,?,?,?)";            String sql="insert into Cars values('"+number+"','"+type+"','"+date+"')";            /*            PreparedStatement ps=con.prepareStatement(sql);//创建预编译sql语句            //添加记录            ps.setString(2, number);            ps.setString(3,type);            ps.setString(4,date);            ps.executeUpdate();            ps.close();            */            Statement sta=con.createStatement();            sta.executeUpdate(sql);            sta.close();            con.close();        }        catch(Exception exp) {        }    }    public void setPageSize(int pageSize) {//设置每页显示的记录数        this.pageSize = pageSize;        if(!insert)        {            queryDataBase();        }           }    public void setInsert(Boolean insert) {         this.insert = insert;        if(this.insert)        {        InsertData();        queryDataBase();        }    }    public int getPageAllcount() {        return pageAllcount;    }    public void setPageAllcount(int pageAllcount) {        this.pageAllcount = pageAllcount;    }    public int getShowPage() {        return showPage;    }    public void setShowPage(int showPage) {        this.showPage = showPage;    }    public StringBuffer getPresentPageResult() {        if(showPage>pageAllcount)//如果当前显示页大于页面总数,则跳回第一页            showPage=1;        if(showPage<=0)            showPage=pageAllcount;        presentPageResult=show(showPage);        return presentPageResult;    }    public StringBuffer show(int page)//从结果集中读取内容    {        StringBuffer str=new StringBuffer();        str.append("<table border=1>");        str.append("<tr>");        for(int i=0;i<columns;i++) {            str.append("<th>"+column[i]+"</th>");        }        str.append("</tr>");        try{            rowSet.absolute((page-1)*pageSize+1);//移动到当前页面记录所对应在结果集中的行数                for(int i=1;i<=pageSize;i++)//读取的记录数(行数)小于每页所能显示的记录数                {                    str.append("<tr>");                    for(int k=1;k<=columns;k++)                    {                        str.append("<td>"+rowSet.getString(k)+"</td>");//从之前查询出来的结果集中获取单元格的内容                    }                    str.append("</tr>");                    rowSet.next();                }//for循环结束        }//try结束        catch(SQLException exp) {        }        str.append("</table>");        return str;//返回查询结果    }    public void setNumber(String number) {        this.number = number;    }    public String getNumber() {        return number;    }    public String getType() {        return type;    }    public void setType(String type) {        this.type = type;    }    public String getDate() {        return date;    }    public void setDate(String date) {        this.date = date;    }}

(2)inputAndShow.jsp

<%@ page contentType="text/html;charset=utf-8" %><%@ page import="java.sql.*" %><%@ page import="jspBean.*" %><jsp:useBean id="handle" class="jspBean.Car" scope="request" ></jsp:useBean><html><body bgcolor=yellow><form action="">  汽车牌号:    <input type="text" name="number" >(如:"陕A12345")<br> <br>汽车品牌:   <input type="text" name="type" >(如:"BYD牌")<br>   <br>生产日期:    <input type="text" name="date" >(如:"2016.10")<br>  <br><input type="submit" name="submit" value="提交"></form> <jsp:setProperty name="handle" property="*"/>  <%!int n;%> <%  //n=0; //session.setAttribute("times",new Integer(n)); boolean insert; %> <%  //n=(int)session.getAttribute("times"); //if(n!=0){        out.println(" 最后一个提交的数据为:");       String Number=request.getParameter("number");       String Type=request.getParameter("type");       String Date=request.getParameter("date");       out.println("车牌号:"+Number+" 品牌:"+Type+" 生产日期:"+Date);       if(((Number!=null)&&(Type!=null)&&(Date!=null)))       {           insert=true;       }       else       {           insert=false;       } %>     <jsp:setProperty name="handle" property="insert" value="<%=insert%>" /><%  //} %> <%n++; session.setAttribute("times",new Integer(n)); %> <jsp:setProperty name="handle" property="pageSize" value="5" /> <br>共有<jsp:getProperty name="handle" property="pageAllcount" />页, <br>每页最多显示<jsp:getProperty property="pageSize" name="handle"/>条记录。 <jsp:getProperty property="presentPageResult" name="handle" /><!-- 从bean中获取当前页面要显示的内容 --> <br>单击"前一页"或”后一页“按钮查看记录(当前显示第<jsp:getProperty property="showPage" name="handle"/>页)。 <table>    <tr><td><form action="">         <input type=hidden name="showPage" value="<%=handle.getShowPage()-1 %>">         <input type=submit name="g" value="前一页">         </form> <jsp:setProperty property="*" name="handle" />    </td>    <td><form action="">        <input type=hidden name="showPage" value="<%=handle.getShowPage()+1 %>">        <input type=submit name="g" value="后一页">    </form><jsp:setProperty property="*" name="handle" /></td>    <td><form action="">    输入页码:<input type="text" name="showPage" size=5 >    <input type="submit" name="g" value="提交">    </form><jsp:setProperty property="*" name="handle" /></td>   </tr> </table> </body></html>

结果展示:
初始页面:
这里写图片描述

向数据库中添加数据:
这里写图片描述

(实验总结真的很重要!!!加深你对实验过程中遇到的问题的认识!)
实验总结:
最大的感受就是心力憔悴!
Eclipse中写jsp, 然后Notepad++改java文件。改完到记事本中转换编码。然后到cmd编译得到class文件。然后复制粘贴到WEB-INF的class/jspBean目录下。然后重启eclipse.
反复修改,来回切换真的好累!
问题一大堆,主要都是太粗心大意,太智障了!
主要问题就是:将表单中的数据插入到数据库中。
(1)什么时候插?
将表单的数据通过setProperty传给Car.java之后。由于jsp页面遇见输入表单数据不会停下来,所以页面一开始提交给Car.java的数据都是空的。当前的记录为空因此此条记录以及之后的数据都无法成功插入了。
所以在插入记录时要判断插入的记录的合法性,首先满足不为空,在都不为空的情况下将insert设为true。
(2)插完什么时候显示?怎么显示?
由于一开始进入页面就要显示之前的记录,所以在设置pageSize时就要显示一次。再插入数据后,更新结果集再显示一次。但这两者只能显示一次,否则查询出来的结果表格就是两个表字段叠加,记录混乱。所以在setPageSize时判断当前有没有插入。没有插入就直接显示。有插入则插入后再显示。
(3)插入数据总是失败?
数据库中的为char类型,java中的变量是字符串形式,所以要这样写:
String sql=”insert into Cars values(‘”+number+”’,’”+type+”’,’”+date+”’)”;
(4)Sql的标识规范问题。
由于serial这个列属性用了标识规范,为自动增长,所以是无法手动向里面插入数据的。在用sql语句插入数据时直接省略第一位,insert into try
values(‘B’,’C’,’D’);
(5)我觉得在sql Server中建表时还是用代码的方式比较好,这样方便查看文件,到时候移植到其它的地方(别的电脑)也比较方便,在对sql语句还不熟练的情况下方便测试sql语句,测试好了再到java中操作。

心得体会:
做完这次实验对javaBean产生了深深的厌倦!

写完之后同学要看我的报告我直接说我没写完。凭什么我就要把我辛辛苦苦做了一天多的东西(主要是我太粗心大意太智障才搞了折磨久)直接给你们看,你们吃饭的时候我在想代码,你们打游戏,逛淘宝的时候我在想bug,难道我就不想下去买东西吃,玩玩游戏,逛逛淘宝?
我又不是你老师,没有这个义务,就算是老师也只会对你的错误给你指点,不会直接给你发分答案临摹吧!也不会看见你运行不出来就直接调好发给你吧,要自己发现错误,解决问题,不劳而获对那些付出努力的人真的很不公平。

所以转载文章或者参考代码注明出处这点很重要哦!