是否可以从Servlet填充下拉列表(在HTML/JSP中)



好的,所以我创建了我的第一个jsp页面,它基本上创建了3个下拉列表,并用从数据库中提取的信息填充它们。

然而,有人告诉我,这是一段糟糕的代码,我应该使用servlet来执行该数据库功能和错误处理,并让jsp严格地进行显示。

原始jsp代码如下:

<%@page import="java.sql.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Code Selector</title>
</head>
<body> 
<h1>Please select the applicable codes:</h1> 
<select name='Code' onchange="showState(this.value)">  
<option value="none">Select a code</option>  
<%
//Pulls the ids and decriptions from the codes table and stores them in the first drop down
try
{
Class.forName("driverName").newInstance();  
Connection con = DriverManager.getConnection("serverURL","username","password");  
Statement stmt = con.createStatement();  
ResultSet rs = stmt.executeQuery("select id, descr from codes");
while(rs.next())
{
%>
<option value="<%=rs.getString(1)%>"><%=rs.getString(1)%> <%=rs.getString(2)%></option>  
<%
}
//Closes the database connection
stmt.close();
con.close();
}
catch (ClassNotFoundException e)
{
System.err.println("ClassNotFoundException: " + e.getMessage());
} 
catch (SQLException e)
{
System.err.println("SQLException: " + e.getMessage());
}
catch (Exception e)
{
System.err.println("Generic Exception: " + e.getMessage());
}       
%>
</select>  
<br>
<br>
<select name='Code2' onchange="showState(this.value)">  
<option value="none">Select a code</option>  
<%
//Pulls the ids and decriptions from the codes table and stores them in the second drop down
try
{
Class.forName("driverName").newInstance();  
Connection con = DriverManager.getConnection("serverURL","username","password");  
Statement stmt = con.createStatement();  
ResultSet rs = stmt.executeQuery("select id, descr from codes");
while(rs.next())
{
%>
<option value="<%=rs.getString(1)%>"><%=rs.getString(1)%> <%=rs.getString(2)%></option>  
<%
}
//Closes the database connection
stmt.close();
con.close();
}
catch (ClassNotFoundException e)
{
System.err.println("ClassNotFoundException: " + e.getMessage());
} 
catch (SQLException e)
{
System.err.println("SQLException: " + e.getMessage());
}
catch (Exception e)
{
System.err.println("Generic Exception: " + e.getMessage());
}       
%>
</select>
<br>
<br>
<select name='otherCode' onchange="showState(this.value)">  
<option value="none">Select a other code</option>  
<%
//Pulls the ids and decriptions from the other codes table and stores them in the third drop down
try
{
Class.forName("driverName").newInstance();  
Connection con = DriverManager.getConnection("serverURL","username","password");  
Statement stmt = con.createStatement();
ResultSet rs2 = stmt.executeQuery("select id, descr from other_codes");
while(rs2.next())
{
%>
<option value="<%=rs2.getString(1)%>"><%=rs2.getString(1)%> <%=rs2.getString(2)%></option>  
<%
}
//Closes the database connection
stmt.close();
con.close();
}
catch (ClassNotFoundException e)
{
System.err.println("ClassNotFoundException: " + e.getMessage());
} 
catch (SQLException e)
{
System.err.println("SQLException: " + e.getMessage());
}
catch (Exception e)
{
System.err.println("Generic Exception: " + e.getMessage());
}       
%>
</select>
<br> 
<br>
<form method = "post">
<input type="submit" value="Submit">
<%
try
{
String Code = request.getParameter("Code");
String Code2 = request.getParameter("Code2");
String otherCode = request.getParameter("otherCode");
Class.forName("driverName").newInstance();  
Connection con = DriverManager.getConnection("serverURL","username","password");  
Statement stmt = con.createStatement();
//ResultSet rs3 = stmt.executeQuery();
System.out.println("This is the first code: " + Code);
System.out.println("This is the second code: " + Code2);
System.out.println("This is the other code: " + otherCode);
con.close();
stmt.close();
}
catch (ClassNotFoundException e)
{
System.err.println("ClassNotFoundException: " + e.getMessage());
} 
catch (SQLException e)
{
System.err.println("SQLException: " + e.getMessage());
}
catch (Exception e)
{
System.err.println("Generic Exception: " + e.getMessage());
} 
%>
<script>
window.close();
</script>
</form>
</body> 
</html>

到目前为止,这就是我对新的jsp和servlet页面的了解:

代码选择器.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>
Codes
</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2 ALIGN="CENTER">
Please select the applicable codes:
</H2>
<FORM ACTION="http://localhost:8088/SomeProgram" METHOD="GET">
<CENTER>
<select name='code' onchange="showState(this.value)">  
<option value="none">Select a code</option>  
</select>
<BR>
<BR>
<select name='code2' onchange="showState(this.value)">  
<option value="none">Select a code</option>  
</select>
<BR>
<BR>
<select name='otherCode' onchange="showState(this.value)">  
<option value="none">Select an other code</option>  
</select>
<BR>
<BR>
<!-- Press this to submit form -->
<INPUT TYPE="SUBMIT" VALUE="Submit"/>
</CENTER>
</FORM>
</BODY>
</HTML>

PullCodes.java(servlet):

package com.firstservlet.alfresco;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
/**
* Servlet implementation class PullCodes
*/
@WebServlet("/PullCodes")
public class PullCodes extends HttpServlet 
{
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public PullCodes() 
{
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
String code = request.getParameter("code");
String code2 = request.getParameter("code2");
String otherCode = request.getParameter("otherCode");
try
{
Class.forName("driverName").newInstance();  
Connection con = DriverManager.getConnection("url","username","password");  
Statement stmt = con.createStatement();  
ResultSet rs = stmt.executeQuery("select id, descr from ref_codes");
ResultSet rs2 = stmt.executeQuery("select id, descr from ref_other_codes");
try
{
while(rs.next())
{
//Is this correct?
code+=("<option value="" + rs.getString(1) + "">" + rs.getString(1) + " " + rs.getString(2) + "</option>");
}
//Closes the database connection
stmt.close();
con.close();
}
catch (Exception e)
{
System.err.println("Insertion Exception: " + e.getMessage());
}       
}
catch (ClassNotFoundException e)
{
System.err.println("ClassNotFoundException: " + e.getMessage());
} 
catch (SQLException e)
{
System.err.println("SQLException: " + e.getMessage());
}
catch (Exception e)
{
System.err.println("Generic Exception: " + e.getMessage());
}   
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
// TODO Auto-generated method stub
}
}

所以现在,在这一点上,我不知道如何从我的html页面访问下拉列表元素。在谷歌上搜索,我没有看到任何显示这件事正在发生的事情。此外,从我所读到的内容来看,servlet在大多数情况下似乎只是处理来自html/jsp页面的信息。我现在正在做的是code+=("<option value="" + rs.getString(1) + "">" + rs.getString(1) + " " + rs.getString(2) + "</option>");。这是正确的吗?如果是,我该如何将其与html/jsp页面链接?或者甚至不可能在加载时访问该html页面并使用servlet填充它?

这方面的经典模式是:

Browser -- request --> Servlet -- forward --> JSP

Servlet用于向JSP传递信息的机制是将值放入实际请求中。

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String id = req.getParameter("id");
String name = getNameFromDBForId(id);
req.setAttribute("name", name);
RequestDispatcher rd = getServletContext().getRequestDispatcher("/page.jsp");
rd.forward(request, response);
}

然后您可以使用JSP EL(表达式语言):

<html>
<body>
<h1>Hello ${name}</h1>
</body>
</html>

EL表达式${name}在多个位置查找name键,其中一个位置是请求(您可以查找其他位置),并替换JSP中的值。

这适用于简单的标量、javabean和集合。

但这是如何将数据从Servlet获取到JSP的基本机制。查找JSTL标记以获取迭代和条件逻辑的示例。

您应该使用JSTL标记。小脚本是离散的,很难维持。检查此链接中是否有与JSTL SQL相关的标记

最新更新