1.5 动态添加表单元素
动态添加表单元素是指页面中的表单元素并不是固定不变的,而是在程序执行时,由系统根据实际情况自动生成的。下面将通过实际例子介绍如何生成动态表单元素。
实例021 根据数据表结构自动生成数据录入页面
这是一个可以提高基础技能的实例
实例位置:光盘\mingrisoft\01\021
实例说明
在制作信息录入模块时,一般的步骤是先创建数据库,然后设计数据表中的字段,再进行数据库的连接,最后设计信息录入页面。但是这种方法有一个弊端,如果数据表的结构改变了,程序也需要进行相应的改变。如果让程序根据数据表的结构自动生成数据录入页面,就可以避免该问题。运行本实例,当在下拉列表中选择tb_wyUserOne数据表时,此时数据表中只有两个字段(账号和密码),如图1.29所示;当在下拉列表中选择tb_wyUserTwo数据表时,再次运行程序,此时数据表中有3个字段(账号、密码和性别),如图1.30所示。
图1.29 数据表中有两个字段
图1.30 数据表中有3个字段
技术要点
本实例主要根据ResultSetMetaData类对象中的方法来确定生成表单元素的个数。ResultSetMetaData类对象可以通过调用ResultSet对象的getMetaData()方法获得,实际上ResultSetMetaData类就是描述及解释数据含义的数据。下面介绍ResultSetMetaData类中比较常用的方法。
(1)getColumnCount()。
语法:
public int getColumnCount() throws SQLException
● 返回值:整数值(所有字段的数目)。
(2)getColumnName()。
语法:
public String getColumnName() throws SQLException
返回值:字符串(所有字段的名称)。
(3)getColumnDisplaySize(int column)。
语法:
public int getColumnDisplaySize(int column) throws SQLException
其中参数column是字段的索引值,第一个字段为1,第二个字段为2,依次类推。
● 返回值:整型(字段最大的字符数目)。
(4)getColumnType(int column)。
语法:
public int getColumnType(int column) throws SQLException
其中参数column是字段的索引值,第一个字段为1,第二个字段为2,依次类推。
● 返回值:整型(SQL的数据类型定义在java.sql.Types)。
(5)getColumnType(int column)。
语法:
public String getColumnTypeName(int column) throws SQLException
其中参数column是字段的索引值,第一个字段为1,第二个字段为2,依次类推。
● 返回值:字符串(根据字段的索引值取得数据表字段的名称)。
(6)isReadOnly(int column)。
语法:
public boolean isReadOnly(int column) throws SQLException
其中参数column是字段的索引值,第一个字段为1,第二个字段为2,依次类推。
● 返回值:布尔型(如果字段只能够读取的话返回true,反之返回false)。
(7)isWritable(int column)。
语法:
public boolean isWritable(int column) throws SQLException
其中参数column是字段的索引值,第一个字段为1,第二个字段为2,依次类推。
● 返回值:布尔型(如果字段只能够写入的话返回true,反之返回false)。
实现过程
(1)创建JDBConnection.java类,实现对数据库的连接和查询的操作,代码如下:
import java.sql.*; public class JDBConnection { private final String dbDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; private final String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_database01"; private final String userName = "sa"; private final String password = ""; private Connection con = null; public JDBConnection() { try { Class.forName(dbDriver).newInstance(); //加载数据库驱动 } catch (Exception ex) { } } public boolean creatConnection(){ //创建数据库连接 try{ con = DriverManager.getConnection(url, userName, password); con.setAutoCommit(true); } catch (SQLException e) { } return true; } public ResultSet executeQuery(String sql){ //对数据库的查询操作 ResultSet rs; try { if (con == null) { creatConnection(); } Statement stmt = con.createStatement(); try { rs =stmt.executeQuery(sql); }catch (SQLException e){ return null; } }catch(SQLException e){ return null; } return rs; } public void closeConnection(){ //关闭数据库的操作 if (con != null) { try { con.close(); } catch (SQLException e) { } finally { con = null; }}}}
(2)根据数据表的结构自动生成数据录入页面,关键代码如下:
<% String table=""; if(request.getParameter("table")!=null){ table=request.getParameter("table"); String sql="select * from "+table+""; try{ ResultSet rs=connection.executeQuery(sql); ResultSetMetaData mdrs=rs.getMetaData(); %> <table width="289" border="0" align="center" cellpadding="0" cellspacing="0"> <form name="form2" method="post" action=""> <%for(int i=1;i <= mdrs.getColumnCount();i++){%> <tr> <td align="center" width="81" height="25"><%=mdrs.getColumnName(i)%></td> <td width="208" height="25"><input type="text" name="textfield"></td> </tr> <tr><%}%> </tr></table> <%}catch (Exception e){}}%>
举一反三
根据本实例,读者可以:
设计在线论坛中的用户注册模块;
设计电子商务网站后台的商品信息添加模块;
设计在线订单模块。
实例022 动态生成投票选项
这是一个可以提高基础技能的实例
实例位置:光盘\mingrisoft\01\022
实例说明
在开发网络应用程序时经常需要制作在线投票栏目,这就涉及在线维护投票模块。通常参与投票的选项是逐个进行添加的,如果某个选项添写重复或是错误就需要将其删除,再重新添加,这样很不方便。如果可以一次性将全部选项添加到页面中,经过确认后,再将全部选项添加到数据库就会减少很多不必要的麻烦。运行本实例,在“请输入投票选项”文本字段中输入参与投票的选项内容,然后单击“添加投票选项”按钮,即可在页面中添加一个默认值为刚添加的选项内容的文本字段。如图1.31所示,直到全部数据添加完成,并确认无误后,单击“保存投票信息”按钮,即可将投票信息一次性保存到数据库中。
图1.31 投票信息一次性设置
技术要点
实现投票信息一次性设置的关键是如何将新添加的数据项显示到页面上,这就需要在每次添加新的数据项时,将以前添加的数据项及内容添加到页面中,再根据数据项的个数动态生成包含数据项文本的文本字段。获取数据项个数可以通过如下代码实现:
List list = (List) session.getAttribute("list"); for(int i=0;i<list.size();i++){ }
实现过程
(1)单击“添加投票选项”按钮后,将表单信息保存到session中,代码如下:
<% if (action.equals("insertOne")) { List list=null; //定义List集合 if(session.getAttribute("list")==null){ //判断session的值是否为空 list=new ArrayList(); //通过Array实例化List集合 }else{ list=(List)session.getAttribute("list"); //获取List集合中的数据 } list.add(request.getParameter("name")); //将从请求中获取的数据添加到List集合中 session.setAttribute("list",list); //将List集合存储到session中 response.sendRedirect("index.jsp"); //跳转到主页 } %>
(2)将投票信息以文本字段形式添加到页面中,代码如下:
<% List list=(List)session.getAttribute("list"); //读取session中存储的List数据 String allName=""; for(int i=0;i<list.size();i++){ //通过for循环输出List中的数据 allName=(String)list.get(i); %> <tr><td width="230" height="25">选项名称:</td> <td width="85" height="25"><input type="text" name="allName" value="<%=allName%>"></td> </tr> <%}%>
(3)单击“保存投票信息”按钮后,应用For循环语句,将页面中添加的投票选项保存到数据表中,代码如下:
<% request.setCharacterEncoding("gbk"); String action=request.getParameter("action"); //获取请求中的数据 if(action.equals("insertAll")){ List list=(List)session.getAttribute("list"); //获取session中存储的List集合数据 String allName = ""; for(int i=0;i<list.size();i++){ //通过for循环输出List中的数据 allName=(String)list.get(i); String sql="insert into tb_book values('"+allName+"')"; //向数据库中添加数据 connection.executeUpdate(sql);} //执行添加语句 connection.closeConnection(); //关闭数据库 session.invalidate(); //清空session %> <script language="javascript" type="text/javascript"> alert("添加成功");parent.location.href='index.jsp';</script> <%}%>
举一反三
根据本实例,读者可以:
实现动态数据添加。