Java+MyEclipse+Tomcat (四)Servlet提交表单和数据库操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:
        前面三篇文章讲述了如何配置MyEclipse和Tomcat开发JSP网站、如何配置Servlet简单实现表单提交、如何配置MySQL实现JSP数据库查询。
        这篇文章主要讲述Servlet表单的提交、Java中实现数据库的查询操作和自己遇到的瓶颈及理解。Java Web基础性文章,希望对大家有所帮助~
        Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门
        Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交
        Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中
        两个项目的免费下载地址(希望对你有所帮助):
        http://download.csdn.net/detail/eastmount/8701707

一. Servlet表单提交

        新建Web Project,项目名称为TestServlet01。项目结构如下图所示:

        然后修改index.jsp代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<style>
		body, div, td, input {font-size:18px; margin:0px; }
		.line {margin:2px; }
	</style>
  </head>
  
  <body>
  <form action="/TestServlet01/servlet/PostServlet" method="POST">
  <div align="center">
	<br/>
	<fieldset style='width:60%'>
		<legend>填写用户信息</legend>
		<br/>
		<div class='line'>
			<div align="left">出发地:
				<input type="text" id="start" name="start" style='font-size:18px' width=200/>
			</div>
		</div>
		<div class='line'>
			<div align="left">到达地:
				<input type="text" id="end" name="end" style='font-size:18px'/>
			</div>
		</div>
		<div class='line'>
			<br />
			<div align="left">请选择性别:
				<input type="radio" name="sex" value="男" id="sexMale">
				<label for="sexMale">男</label>
				<input type="radio" name="sex" value="女" id="sexFemale">
				<label for="sexFemale">女</label>
		    </div>
		</div>
		<div class='line'>
			<div align="left">请选择您的爱好:
				<input type="checkbox" name="interesting" value="音乐" id="i1">
				<label for="i1">音乐</label> 
				<input type="checkbox" name="interesting" value="旅游" id="i2">
				<label for="i2">旅游</label> 
				<input type="checkbox" name="interesting" value="运动" id="i3">
				<label for="i3">运动</label> 
			</div>
		</div>
		<div class='line'>
			<div align="left">请选择车票类型:
				<select name="seat">
					<option>---请选择乘坐类型---</option>
					<optgroup label="卧铺">
						<option value="上铺">上铺</option>
						<option value="中铺">中铺</option>
						<option value="下铺">下铺</option>
					</optgroup>
					<optgroup label="其他">
						<option value="硬座">硬座</option>
						<option value="软座">软座</option>
						<option value="站票">站票</option>
					</optgroup>
				</select>
			</div>
		</div>
		<div class='line'>
			<br />
			<div align="left" class='leftDiv'>备注信息:</div>
			<div align="left" class='rightDiv'>
				<textarea name="description" rows="8" style="width:300px; ">请填写备注信息... </textarea>
			</div>
		</div>
		<div class='line'>
			<div align="left">
				<br/><input type="submit" name="Select" value="提交信息" style='font-size:18px'/><br/>
			</div>
		</div>
	</fieldset>
</div>
</form>
</body>
</html>
        运行效果如下图所示:
        核心代码:
        <form action="/TestServlet01/servlet/PostServlet" method="POST">
            出发地:<input type="text" id="start" name="start" style='font-size:18px'/>
            <input type="submit" name="Select" value="提交信息"/>
        </form>

        然后再src中右键添加Package,包名为servlet;再添加Servlet文件,文件名PostServlet.java。选择图标。前面文章讲述过Servlet的手动配置过程,包括servlet类、映射等,现在它自动生成的WebRoot/WEB-INF/web.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  
  
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>PostServlet</servlet-name>
    <servlet-class>servlet.PostServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>PostServlet</servlet-name>
    <url-pattern>/servlet/PostServlet</url-pattern>
  </servlet-mapping>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
        同时修改src/servlet/PostServlet.java文件,采用POST方法显示表单数据:
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PostServlet extends HttpServlet {

	public PostServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the GET method");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setCharacterEncoding("UTF-8"); //设置输出编码
		request.setCharacterEncoding("UTF-8");
		
		String startName = request.getParameter("start"); //获取出发地
		String endName = request.getParameter("end");     //获取到达地
		String sex = request.getParameter("sex");         //获取性别
		String [] interest = request.getParameterValues("interesting"); //获取兴趣
		String seat = request.getParameter("seat");        //获取座位
		String info = request.getParameter("description"); //获取备注信息
		
		response.setContentType("text/html");  //设置输出类型
		PrintWriter out = response.getWriter(); //获取out对象
		
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.println("<H2>出发地:"+ startName +"</H2>");
		out.println("<H2>到达地:"+ endName +"</H2>");
		out.println("<H2>性别:"+ sex +"</H2>");
		out.println("<H2>兴趣");
		for(String str:interest) {
			out.println(str+" ");
		}
		out.println("</H2><H2>座位类型:"+ seat +"</H2>");
		out.println("<H2>备注信息:"+ info +"</H2>");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}
        运行效果如下图所示:
        

二. Servlet数据库查询

        还是使用上面的项目进行修改,实现Servlet数据库查询操作。数据库配置可以参照上一篇博客配置MySQL的过程,我新建数据库test01,插入表Train,表中数据如下图:

        然后修改index.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<style>
		body, div, td, input {font-size:18px; margin:0px; }
		.line {margin:2px; }
	</style>
  </head>
  
  <body>
  <form action="/TestServlet01/servlet/PostServlet" method="POST">
  <div align="center">
	<br/>
	<fieldset style='width:60%'>
		<legend>填写用户信息</legend>
		<br/>
		<div class='line'>
			<div align="left">出发地:
				<input type="text" id="start" name="start" style='font-size:18px' width=200/>
			</div>
		</div>
		<div class='line'>
			<div align="left">
				<br/><input type="submit" name="Select" value="提交信息" style='font-size:18px'/><br/>
			</div>
		</div>
	</fieldset>
</div>
</form>
</body>
</html>
        修改的PostServlet.java代码如下:
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PostServlet extends HttpServlet {

	//自定义变量
	private Connection connection = null; //定义数据库连接对象
	private String driverName = "com.mysql.jdbc.Driver"; //数据库驱动器
	private String userName = "root"; //数据库用户名
	private String userPasswd = "123456"; //密码
	private String dbName = "test01"; //数据库名称
	private String tableName = "Train"; //表明
	//连接字符串 数据库地址URL MySQL数据库端口3306
	private String url = "jdbc:mysql://localhost:3306/" + dbName + "?user="    
            + userName + "&password=" + userPasswd;
		
	//初始化方法
	public void init(ServletConfig config) throws ServletException
	{
		super.init(config);
	}
	
	public PostServlet() {
		super();
	}

	//处理GET请求方法
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException
	{
		response.setCharacterEncoding("UTF-8"); //设置输出编码
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html");  //设置输出类型
		PrintWriter out = response.getWriter(); //获取out对象
		
		try {
			//数据库操作
			Class.forName(driverName).newInstance();
			connection = DriverManager.getConnection(url);
			Statement statement = connection.createStatement();
			String startName = request.getParameter("start"); //获取出发地
			//注意:startName需要加单引号 否则报错 ——错误:Unknown column 'BeiJing' in 'where clause'
			String sql = "SELECT * FROM " + tableName +" WHERE startname='" + startName+"';";
			if(startName=="") {
				sql = "SELECT * FROM " + tableName;
			}
			ResultSet rs = statement.executeQuery(sql); 
			
			out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
			out.println("<HTML>");
			out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
			out.println("  <BODY>");
			out.println("  <fieldset style='width:60%' ><legend>搜索结果</legend><br />");
			out.println("	<TABLE align='center'border='1' cellspacing='1' cellpadding='1'>");
			out.println("		<TR><TH>车号</TH><TH>出发地</TH><TH>到达地</TH></TR>");
			//循环输出查询结果
			while(rs.next()) {
				out.println("		<TR><TD>" + rs.getString(1) + "</TD>");
				out.println("		<TD>" + rs.getString(2) + "</TD>");
				out.println("		<TD>" + rs.getString(3) + "</TD></TR>");
			}
			out.println("  </TABLE>");
			out.println("  </fieldset>");
			out.println("  </BODY>");
			out.println("</HTML>");
			out.flush();
			out.close();
			rs.close(); // 关闭记录集
			statement.close(); // 关闭声明
		
		} catch(Exception e) {
			System.out.println("错误:"+e.getMessage());
			response.sendRedirect("index.jsp");
		}
	}

	//处理POST请求方法
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException 
	{	
		doGet(request,response);
	}

	//销毁方法
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		try {
			connection.close(); // 关闭连接对象
		}catch(Exception e) {
			System.out.println("关闭数据库错误:"+e.getMessage());
		}
	}
}
        同时WebRoot/WEB-INF/web.xml文件Servlet映射都没有变化,需要在WebRoot/WEB-INF/lib中添加mysql-connector-java-5.1.15-bin.jar,否则会报错“com.mysql.jdbc.Driver错误”。
        运行效果如下图所示:




        写到此处我产生了一个疑问,当表单提交信息时,获取数据库的结果有两种方法:
        1.第一种是上一篇博客中写到的,在JSP中通过<% ....%>调用Java代码实现连接数据库,获取MySQL表中数据并显示;
        2.第二种就是这篇博客中写到的,在JSP中通过Post方法提交表单Form,在Java中通过Servlet获取请求/响应,再通过Java中out.println("<HTML>...")输出数据库中值。

        就这两种方法而言,我想实现的功能是:JSP就赋值布局,显示界面;Java就负责连接数据库、数据库增删改查,处理结果再返回给JSP中显示,而不是相互嵌套的。换句话说:JSP中点击“提交”按钮,TextBox中传递出发地,Java中介绍请求,数据库查询,得到的结果再返回给JSP中显示。
        那怎么实现呢?后面的文章可能会讲到。
        DAO和Java Bean是对JDBC进行分层、模块化的最有效两个方法。DAO(数据库操作对象,Database Access Object)是JDBC下常用模式,DAO出现之前,操作数据库的代码与业务代码都出现在Servlet或者JSP中,不利用业务代码的分离。DAO出现后,所有与数据库相关的操作全被拿到了DAO层实现,Servlet或JSP只操作Java Bean或者DAP层,而DAO层值操作数据库。

        PS:非常高兴我自己通过实际项目找到了这个难点,然后又找到了解决方法。虽然才学习Java Web一周时间,还是学到很多东西的。个人感觉DAO类似于中间件的东西吧!最后希望文章对你有所帮助,这篇文章是讲述Servlet连接MySQL数据库及表单交互之间的知识。如果文章有不足或错误的地方,还请海涵!下一篇文章讲讲Session和一个典型简单的界面布局等相关知识吧!
        (By:Eastmount 2015-5-15 半夜1点   http://blog.csdn.net/eastmount/



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
关系型数据库 MySQL Java
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
78 0
|
17天前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
51 5
|
29天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
44 3
|
29天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
52 2
|
29天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
48 2
|
1月前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
28 4
|
2月前
|
Java 关系型数据库 MySQL
如何用java的虚拟线程连接数据库
本文介绍了如何使用Java虚拟线程连接数据库,包括设置JDK版本、创建虚拟线程的方法和使用虚拟线程连接MySQL数据库的示例代码。
55 6
如何用java的虚拟线程连接数据库
|
29天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
28 1
|
29天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
43 1
|
29天前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
20 1