好的,所以我创建了我的第一个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相关的标记