赞
踩
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,难道我就不想下去买东西吃,玩玩游戏,逛逛淘宝?
我又不是你老师,没有这个义务,就算是老师也只会对你的错误给你指点,不会直接给你发分答案临摹吧!也不会看见你运行不出来就直接调好发给你吧,要自己发现错误,解决问题,不劳而获对那些付出努力的人真的很不公平。
所以转载文章或者参考代码注明出处这点很重要哦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。