好的,所以我创建了我的第一个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页面的看法:
码-selector.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填充它?
答案 0 :(得分:1)
经典模式是:
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中的值。
这适用于简单的标量,java bean,集合。
但这是如何将数据从Servlet传入JSP的基本机制。查找JSTL标记,例如迭代和条件逻辑。
答案 1 :(得分:0)
你应该使用JSTL标签。 scriptlet声名狼借,很难维护。 check this link用于JSTL SQL相关标记