JavaBean与数据库的使用

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,难道我就不想下去买东西吃,玩玩游戏,逛逛淘宝?
我又不是你老师,没有这个义务,就算是老师也只会对你的错误给你指点,不会直接给你发分答案临摹吧!也不会看见你运行不出来就直接调好发给你吧,要自己发现错误,解决问题,不劳而获对那些付出努力的人真的很不公平。

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

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值