对一个简单的JDBC包装器的扩展及应用(2)

发表于:2007-07-14来源:作者:点击数: 标签:
对一个简单的JDBC包装器的扩展及应用(2) 我使用 java bean来实现很多功能,这样可以减少在jsp中的java代码量,方便我们对界面的改进。我们要实现的功能为对学生的编辑,添加,删除和列表。这些功能定义在两个javabean中:下面是两个jsp文件的主要代码: %-
对一个简单的JDBC包装器的扩展及应用(2)

我使用javabean来实现很多功能,这样可以减少在jsp中的java代码量,方便我们对界面的改进。我们要实现的功能为对学生的编辑,添加,删除和列表。这些功能定义在两个javabean中:下面是两个jsp文件的主要代码:
<%-- student.jsp --%>
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="org.gjt.mm.mysql.*,manger.bean.*,manger.tools.*,manger.business.*" %>
<html>
<head>
<SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript" >
<!--
function doDelete()
{
if(confirm(´你确定删除吗?´)) {
document.EditForm.event.value=´delete´;
document.EditForm.submit();
}
}
function doEdit()
{
if(confirm(´你确定编辑吗?´)) {
document.EditForm.event.value=´showEdit´;
document.EditForm.submit();
}
}
function showAddPage()
{
document.location=´editstudent.jsp?event=showAdd´;
}
</SCRIPT>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<%
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
}
catch (Exception E) {
out.println("Unable to load driver.");
} %>
<jsp:useBean id="table" scope="page" class="manger.bean.ListStudentBean" />
<%
Student[] student=table.getStudent(pageContext);
int total=0;
int currPage=table.getCurPage();
int pageCount=table.getPageCount();
if(student!=null)
{total=student.length;}%>
<FORM NAME="EditForm" ACTION="editstudent.jsp">
<INPUT TYPE="HIDDEN" NAME="event" VALUE="">
<table width="75%" border="1">
<tr>
<td colspan="5">学生列表</td>
</tr>
<tr>
<td>学号</td>
<td>姓名</td>
<td>班级</td>
<td>备注一</td>
<td>选择</td>
</tr>
<%for (int i=0;i<total;i++){
Student current=student[i];%>
<tr>
<td><%=current.getId()%></td>
<td><%=current.getName()%></td>
<td><%=current.getDepart()%></td>
<td><%=current.getSex() %></td>
<td>
<input type="checkbox" name="id" value=<%=current.getId()%>>
</td>
<% } %>
</tr><tr>
<td colspan="5">
<INPUT TYPE="BUTTON" onclick="doEdit();" VALUE="编辑">
<INPUT TYPE="BUTTON" onclick="showAddPage()" VALUE="增加">
<INPUT TYPE="BUTTON" onclick="doDelete();" VALUE="删除">
</td>
</tr>
</table>
</form>
</html>

<%-- studentedit.jsp --%>
<jsp:useBean id="table" scope="page" class="manger.bean.EditStudentBean" />
<%table.processRequest(pageContext);%>
<p>_lt;/p>
<form name="EditForm" action="editstudent.jsp">
<INPUT TYPE="hidden" NAME="event" VALUE="<%=table.getEvent()%>" >
<table width="75%" border="1">
<tr>
<td colspan="2">
<div align="center"><b>编辑学生信息</b></div>
</td>
</tr>
<tr>
<td width="40%">学号:</td>
<td width="60%">
<input type="text" name="id" value="<%=table.getStudent().getId()%>">
</td>
</tr>
<%--下面的一些学生信息我们省略了--%>
<tr>
<td colspan="2">
<input type="submit" name="Submit" value="确定">
</td>
</tr>
</table>
</form>

我的想法是在student.jsp中显示学生列表,从这个页面可以转到增加和编辑页面,也可以在这个页面中删除学生,这三个功能都是由editstudent.jsp完成的。在editstudent.jsp中非常关键的一行代码就是<%table.processRequest(pageContext);%>,这会调用EditStudentBean类的processRequest方法:下面是EditStudentBean类processRequest方法和addStudent方法的代码:
public void processRequest (PageContext pageContext)
throws SQLException,ServletException,IOException{
this.student.setId("");
this.student.setName("");
this.student.setPassword("");
this.student.setDepart("");
this.student.setSex("");
HttpServletRequest request=(HttpServletRequest)pageContext.getRequest();
String event=request.getParameter("event");
//this.event=event;
if(event==null || event.equals("")||event.equals("showAdd"))
{this.event="add";
}
else if(event.equals("showEdit"))
{this.event="edit";
String id=request.getParameter("id");
Student stu=StudentFactory.findStudentById(id);
this.student=stu;
}
else if(event.equals("add"))
{this.addStudent(pageContext);
}
else if(event.equals("delete"))
{this.deleteStudent(pageContext);
}
else if(event.equals("edit"))
{this.editStudent(pageContext);
}
}

public void addStudent(PageContext page)
throws SQLException,ServletException,IOException{
HttpServletRequest request=(HttpServletRequest)page.getRequest();
HttpServletResponse response=(HttpServletResponse)page.getResponse();
JspWriter out=page.getOut();
String id=request.getParameter("id");
String name=request.getParameter("name");
String sex=request.getParameter("sex");
String pass=request.getParameter("password");
String depart=request.getParameter("depart");
if (id!=null&&name!=null&&sex!=null&&pass!=null&&depart!=null
&&!id.equals("")&&!name.equals("")&&!sex.equals("")&&!pass.equals("")&&!depart.equals(""))
{Student s=new Student();
s.setId(id);
s.setName(name);
s.setSex(sex);
s.setPassword(pass);
s.setDepart(depart);
s.save(null);
response.sendRedirect("student.jsp");
}
else
{out.print("请添完所有信息");
}
}

processRequest方法的功能主要为获取提交给editstudent.jsp的event的值,根据不同的event调用不同的函数。例如event=add,则调用addStudent函数。

注意:在设置Student对象的各个属性值时,一定要按照表(见上面的SQL语句)中顺序来设置,例如在表中,id字段在name字段的前面,所以setId方法在setName方法前面,这主要是由于Table类中的putRow函数中执行插入操作的SQL语句有缺陷。在那个SQL语句中,它是按各属性在Row中的顺序来执行插入操作的。如过你不愿意按表中字段的顺序来设置Student的属性,可以对putRow函数更改如下:
String ss = "";
if (conditions==null) {
ss = "INSERT INTO "+name+´(";
for (int i=0;i<row.length();++i) {
String k = row.getKey( i );
ss += k;
if (i != row.length()-1)
ss += ", ";
}

ss +=") VALUES (";
for (int j=0; j<row.length(); ++j) {
String v = row.get( j );
ss += "´"+v+"´";
if (j != row.length()-1)
ss += ", ";
}
ss += ")";
}

限于篇幅,我省略了student.jsp文件中的一些内容,对这个jsp文件进行处理的bean为ListStudentBean,这个类主要实现一个函数getStudent,这个函数主要通过StudentFactory查寻到所有的学生,由于我在此函数中进行了分页处理,因此此函数只返回当前页需要的Student数组。具体的代码参看附件。

总之,我改进之后的这个JDBC封装器还是比较有效的,它能满足一般地需要,当然你也可以根据你的情况对其进行扩充,以更好地适应你的开发

代码在Tomcat4.01+mysql3.23.43下测试通过。

关于作者
宗锋,男,西北大学计算机系硕士。兴趣主要集中在:java,linux,enhydra,barracuda。希望能与有共同爱好的朋友进行交流。E-mail: zong_feng@263.net.

(全文完)

原文转自:http://www.ltesting.net