获取jsp中所选动态表行的值

时间:2014-02-09 17:49:25

标签: java jsp dynamic radio-button

我在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条记录,则只有第一条记录在没有单选按钮的情况下打印。我调试了文件,控件在单选按钮行停止。

我不知道,错误在哪里以及为单选按钮提供动态值有什么问题。 我想要做的就是找出用户选择的行。

1 个答案:

答案 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><%
    }%>

祝你好运。