我在jsp中有一个页面,我在表中动态显示数据库中的记录,并生成动态行。每行都有一个单选按钮,以便用户可以选择一行。
page1.jsp的代码是:
<form action="page2.jsp" method="post">
<table>
<%
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/Users/hp/Documents/Sample1.accdb";
Connection con = DriverManager.getConnection(database, "", "");
Statement stmnt = con.createStatement();
String source=request.getParameter("from");
String dest=request.getParameter("to")
ResultSet resultset = stmnt.executeQuery("select * from Trains123 where From='" +source+ "' and To='" +dest+ "' ");
while(resultset.next())
{
%>
<tr>
<td><% out.println(resultset.getString("From")); %></td>
<td><% out.println(resultset.getString("To")); %></td>
<td><% out.println(resultset.getString("TrainName")); %></td>
<td><input type="radio" name="TName" value="<%= resultset.getString("TrainName")%>">book</td>
</tr>
</table>
</form>
和page2.jsp上的代码是:
<% out.println(request.getParameter("Tname")); %>
记录集没有问题,值正在打印。但是没有显示单选按钮。另外,如果记录集中有2条记录,则只有第一条记录在没有单选按钮的情况下打印。我调试了文件,控件在单选按钮行停止。
我不知道,错误在哪里以及为单选按钮提供动态值有什么问题。 我想要做的就是找出用户选择的行。
答案 0 :(得分:0)
AFAIR JDBC规范不保证您可以在结果集上使用相同的列名称/编号调用getXxx
两次。大多数JDBC驱动程序都支持它,但有些可能不支持我不确定ODBC是否可能是这个例外。因此,首先尝试将一行中所有列的值添加到这样的额外变量:
String from = resultset.getString("From");
String to = resultset.getString("To");
String trainName = resultset.getString("TrainName");
并以这种方式使用它:
<tr><td><%=form%></td>
<td><%=to%></td>
<td><%=trainName%></td>
<td><input type="radio" name="TName" value="<%=trainName%>"/> book</td>
</tr>
另外请转义这些值,就像trainName
包含'"'
字符一样,您可能会破坏HTML代码。
但更重要的是你编写代码的方式。首先,您应该将视图层(JSP)与代码分开。所以你应该创建一个类,它读取列车列表并简单地将它列入请求,或多或少像这样:
public class RailLink {
public String from;
public String to;
public String trainName;
}
public class Trains {
private Connection getConnection() {
//- This code actually should be put somewhere else.
// Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// String db = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/Users/hp/Documents/Sample1.accdb";
// Connection cn = DriverManager.getConnection(db, "", "");
return cn;
}
public static List<RailLink> findLinks(String from, String to) {
assert from != null && to != null;
List<RailLinks> links = new LinkedList<>();
try (
Connection cn = getConnection();
PreparedStatement ps = cn.prepareStatement("SELECT * FROM Trains123 WHERE \"From\" = ? AND \"To\" = ?");
) {
ps.setString(1, from);
ps.setString(2, to);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
RailLink link = new RailLink();
link.from = rs.getString("From");
link.to = rs.getString("To");
link.trainName = rs.getString("TrainName");
links.add(link);
}
}
}
return links;
}
}
现在编写一个处理表单的servlet:
public class FindLinks extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse respone) {
List<RailLink> links = Trains.findLinks(request.getParameter("from"), request.getParameter("to"));
request.setAttribute("rail-links", links);
request.getRequestDispatcher("page1.jsp").forward(request, response);
}
}
最后将page1.jsp修改为:
<%@page ...%>
...
<% List<RailLink> links = request.getAttribute("rail-links");
if (links != null) {%>
<table><%
for (RailLink l : links) {%>
<tr><td><%=l.from%></td>
<td><%=l.to%></td>
<td><%=l.trainName%></td>
<td><input type="radio" name="TName" value="<%=l.trainNam%"/> book</td>
<%}%>
</table><%
}
else {%>
<p>No connections found.</p><%
}%>
祝你好运。