java服务器端开发-servlet:3_3、Servlet使用jdbc访问数据库:循环查询添加员工信息

目录

一、前言

二、循环查询添加员工信息

1、配置文件代码:web.xml

2、java代码-查询员工:ListEmpServlet.java

3、html 表格提交代码:addEmp.html

4、java代码-添加员工:AddEmpServlet.java

5、效果演示

(1)下面我们来操作演示一下【查询】

(2)点击“添加新员工”【添加】

(3)填入信息,点击“提交”

(4)点击“查看雇员”【查询】

6、执行流程简单介绍

步骤1:浏览器输入地址

步骤2:匹配配置文件 web.xml 

步骤3:java类ListEmpServlet,进行数据库访问操作,并输出显示

步骤4:点击添加新员工

步骤5:点击提交,表单对应web.xml

步骤6:类AddEmpServlet获取表单提交信息,访问并插入数据库

步骤7:点击 查看雇员

步骤8:java类ListEmpServlet,进行数据库访问操作,并输出显示【即回到步骤3】

三、注意点

1、Servlet对应关系与变换

2、复习2个快捷键

3、方便查看,新建 web03 项目


一、前言

上一篇文章我们介绍了在servlet中如何使用jdbc访问数据库:查询个人员工信息、所有员工信息,详细可参考博文:原创 java服务器端开发-servlet:3_2、Servlet使用jdbc访问数据库:查询员工信息  这篇文章我将介绍:循环查询添加员工信息,为引入重定向作铺垫和准备

二、循环查询添加员工信息

1、配置文件代码:web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1">
	
	<display-name>web03</display-name>
	
	<!-- t07_循环查询添加员工信息 -->
	<!-- 查询员工信息 -->
	<servlet>
		<servlet-name>showFormEmp</servlet-name>
		<servlet-class>t07_循环查询添加员工信息.ListEmpServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>showFormEmp</servlet-name>
		<url-pattern>/show</url-pattern>
	</servlet-mapping>

	<!-- 添加员工信息 -->
	<servlet>
		<servlet-name>addEmp</servlet-name>
		<servlet-class>t07_循环查询添加员工信息.AddEmpServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>addEmp</servlet-name>
		<url-pattern>/add</url-pattern>
	</servlet-mapping>
	
</web-app>

2、java代码-查询员工:ListEmpServlet.java

package t07_循环查询添加员工信息;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 查询mySql里面的员工数据【主要功能】
 * @UpdateTime:2011年02月28日 下午17:30:00
 * @ProjectName: 【项目名】
 * @ClassName:【类名】
 * @CategoryName:【类型】如:Activity
 * @author:luminal、邮箱 luminal_yyh@163.com
 * @since 1.0【版本】
 * @Description:(可以在这里描述这个类的作用)
 * 步骤:
 * 1、测试地址:
 * http://localhost:8080/web03/show
 * 2、查询以后,插入。那么插入成功以后,怎么返回到查询的页面。
 * 点击跳转。或 自动跳转“重定向”(后面介绍)
 */
public class ListEmpServlet extends HttpServlet{
	public void service(HttpServletRequest request,
			HttpServletResponse response) 
	throws ServletException,IOException{
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		Connection conn = null;
		PreparedStatement prep = null;
		ResultSet rst = null;
		try {
			//Class.forName("com.mysql.jdbc.Driver"); //提示被弃用
			Class.forName("com.mysql.cj.jdbc.Driver");
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/jsd1108db",
					"root","你的mysql密码");
			prep = conn.prepareStatement(
					"select * from t_emp");
			rst = prep.executeQuery();
			
			out.println("<table border='1' width='60%' " +
					"cellpadding='0' cellspacing='0'>");
			out.println("<tr><td>ID</td><td>姓名</td>" +
					"<td>薪水</td><td>年龄</td></tr>");
			
			while(rst.next()){
				int id = rst.getInt("id");
				String name = rst.getString("name");
				double salary =rst.getDouble("salary");
				int age = rst.getInt("age");
				
				out.println("<tr><td>" + id 
						+ "</td><td>" + name 
						+ "</td><td>" + salary 
						+"</td><td>" + age 
						+ "</td></tr>");
				
			}
			out.println("</table>");
			
			out.println("<a href='addEmp.html'>添加新员工</a>");
			
		} catch (Exception e) {
			e.printStackTrace();
			out.println("系统繁忙,稍后重试");
		}finally{
			if(rst != null){
				try {
					rst.close();
				} catch (SQLException e) {
				}
			}
			if( prep != null){
				try {
					prep.close();
				} catch (SQLException e) {
				}
			}
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
				}
			}
		}
	}
	
}

3、html 表格提交代码:addEmp.html

<html>
<head>
	<!-- 模拟一个消息头(content-type) content里面内容:“文本/网页,字符编码”-->
	<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<!-- body定义总体样式 -->
<body style="font-size:18px; font-style:fond; color:red; ">
	<!-- action="add",对应web.xml中标签url-pattern里的"/add" -->
	<form action="add" method="post">
		<fieldset>
			<legend>录入员工信息</legend>
				姓名:<input name="name" /><br />
				薪水:<input name="salary" /><br />
				年龄:<input name="age" /><br />
				<input type="submit" value="提交" />
		</fieldset>
	</form>
</body>
</html>






4、java代码-添加员工:AddEmpServlet.java

package t07_循环查询添加员工信息;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 员工信息插入mysql【主要功能】
 * @UpdateTime:2011年02月28日 下午17:30:00
 * @ProjectName: 【项目名】
 * @ClassName:【类名】
 * @CategoryName:【类型】如:Activity
 * @author:luminal、邮箱 luminal_yyh@163.com
 * @since 1.0【版本】
 * @Description:(可以在这里描述这个类的作用)
 */
public class AddEmpServlet extends HttpServlet{
	public void service(HttpServletRequest request,
			HttpServletResponse response) 
	throws ServletException,IOException{
		
		request.setCharacterEncoding("utf-8");
		
		//读请求参数
		String name = request.getParameter("name");
		String salary = request.getParameter("salary");
		String age = request.getParameter("age");
		
		//服务端验证一定要有,此处省略...
		response.setContentType(
				"text/html;charset=utf-8");
		PrintWriter out = response.getWriter();

		
		//将员工信息插入数据库【详见JDBC知识点】
		//首先要在mysql里面,建数据库jsd1308db,
		//建表t_emp,才能进行如下操作【mySql建库、表,详见文档】
		Connection conn = null;
		PreparedStatement prep = null;
		try {
			//Class.forName("com.mysql.jdbc.Driver"); //提示被弃用
			Class.forName("com.mysql.cj.jdbc.Driver");
			conn = 
				DriverManager.getConnection(
						"jdbc:mysql://localhost:3306/jsd1108db",
						"root","qwe123654");
			prep = 
				conn.prepareStatement("insert into " +
						"t_emp(name,salary,age) " +
						"values(?,?,?)");
			prep.setString(1, name);
			//salary写成sal,报NullPointerException
			//执行后面的-->"系统繁忙,稍后重试"
			prep.setDouble(2, Double.parseDouble(salary));
			prep.setInt(3, Integer.parseInt(age));
			prep.executeUpdate();
			
			out.println("插入成功");

			/*
			show对应web.xml的“<url-pattern>/show</url-pattern>”
			它也可以是一个html,如:ListEmpServlet类调用了addEmp.html
			out.println("<a href='addEmp.html'>添加新员工</a>");
			*/
			out.println("<a href='show'>"+"查看雇员</a>");

		} catch (Exception e) {
			//记日志
			e.printStackTrace();
			//判断异常是否能恢复,如果
			//能够恢复,立即恢复;如果不能够
			//恢复(系统异常,比如数据库服务暂停,
			//连接数据库的网络中断),则提示用户稍后重试。
			out.println("系统繁忙,稍后重试");
		}finally{
			if(prep != null){
				try {
					prep.close();
				} catch (SQLException e) {
					//一定不执行,所以日志都没打印了
					}
			}
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					
					}
			}
		}
		
		
		
	}
}

5、效果演示

(1)下面我们来操作演示一下【查询】

启动tomact,部署web项目,在谷歌浏览器输入:http://localhost:8080/web03/show

(2)点击“添加新员工”【添加】

它的地址变为:http://localhost:8080/web03/addEmp.html

(3)填入信息,点击“提交”

它的地址变为:http://localhost:8080/web03/add

(4)点击“查看雇员”【查询】

它的地址变为:http://localhost:8080/web03/show

可以看到多了一条信息,我们依次按照以上方式:循环查询添加员工信息

 

6、执行流程简单介绍

步骤1:浏览器输入地址

http://www.localhost:8080/web03/show

步骤2:匹配配置文件 web.xml 

浏览器地址的 show  对应 <url-pattern>的 /show

	<!-- 查询员工信息 -->
	<servlet>
		<servlet-name>showFormEmp</servlet-name>
		<servlet-class>t07_循环查询添加员工信息.ListEmpServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>showFormEmp</servlet-name>
		<url-pattern>/show</url-pattern>
	</servlet-mapping>

然后找到 java包、类ListEmpServlet

步骤3:java类ListEmpServlet,进行数据库访问操作,并输出显示

ListEmpServlet类查询数据库,并以表格的形式输出显示,目前的表格是在java类中嵌套 html 代码的形式

步骤4:点击添加新员工

java类ListEmpServlet的关键代码,如下:

out.println("<a href='addEmp.html'>添加新员工</a>");

它会链接到文件:addEmp.html,地址为:http://localhost:8080/web03/addEmp.html

即跳转到下面界面(数据是后加上的)

步骤5:点击提交,表单对应web.xml

addEmp.html 表单提交的关键代码,如下:

<form action="add" method="post">

表单提交的 add  对应 

配置文件 web.xml 中 <url-pattern>的 /add

	<!-- 添加员工信息 -->
	<servlet>
		<servlet-name>addEmp</servlet-name>
		<servlet-class>t07_循环查询添加员工信息.AddEmpServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>addEmp</servlet-name>
		<url-pattern>/add</url-pattern>
	</servlet-mapping>

然后找到 java包、类AddEmpServlet

步骤6:类AddEmpServlet获取表单提交信息,访问并插入数据库

员工数据插入数据库成功,出现如下界面:

它的地址变为:http://localhost:8080/web03/add

步骤7:点击 查看雇员

java类AddEmpServlet的关键代码,如下:

out.println("<a href='show'>"+"查看雇员</a>");

这里的 show 对应配置文件 web.xml 的  /show

	<!-- 查询员工信息 -->
	<servlet>
		<servlet-name>showFormEmp</servlet-name>
		<servlet-class>t07_循环查询添加员工信息.ListEmpServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>showFormEmp</servlet-name>
		<url-pattern>/show</url-pattern>
	</servlet-mapping>

然后找到 java包、类ListEmpServlet

步骤8:java类ListEmpServlet,进行数据库访问操作,并输出显示【即回到步骤3】

ListEmpServlet类查询数据库,并以表格的形式输出显示,目前的表格是在java类中嵌套 html 代码的形式

它的地址从  http://localhost:8080/web03/add  变为:http://localhost:8080/web03/show

 

三、注意点

1、Servlet对应关系与变换

(1)addEmp.html 表单提交的关键代码,如下:

<form action="add" method="post">

表单提交的 add  对应 

配置文件 web.xml 中 <url-pattern>的 /add

	<!-- 添加员工信息 -->
	<servlet>
		<servlet-name>addEmp</servlet-name>
		<servlet-class>t07_循环查询添加员工信息.AddEmpServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>addEmp</servlet-name>
		<url-pattern>/add</url-pattern>
	</servlet-mapping>

然后找到 java包、类AddEmpServlet

 

(2)java类ListEmpServlet的关键代码,如下:

out.println("<a href='addEmp.html'>添加新员工</a>");

它会链接到文件:addEmp.html,地址为:http://localhost:8080/web03/addEmp.html

 

(3)java类AddEmpServlet的关键代码,如下:

out.println("<a href='show'>"+"查看雇员</a>");

这里的 show 对应配置文件 web.xml 的  /show

它的地址从  http://localhost:8080/web03/add  变为:http://localhost:8080/web03/show

	<!-- 查询员工信息 -->
	<servlet>
		<servlet-name>showFormEmp</servlet-name>
		<servlet-class>t07_循环查询添加员工信息.ListEmpServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>showFormEmp</servlet-name>
		<url-pattern>/show</url-pattern>
	</servlet-mapping>

然后找到 java包、类ListEmpServlet

 

2、复习2个快捷键

值得注意的是myEclipse和Android Studio都有一些快捷键,大家要熟悉,这里复习两个

(1)打开其所在计算机目录

(2)快捷拷贝myEclipse上的:项目名、包名、类名等纯文本

 

3、方便查看,新建 web03 项目

之前的 web02 项目已经演示了6个案例,配置文件和其他文件越来越多,

有起冲突的,同时也为了方便查看就新建一个 web03 项目,如下图:

    

有时候新建 web项目,有些耗时间,你可以直接拷贝 web02 进行删减:

1、右击 web02,copy,右击 web02,paste

2、然后会出现如下提示框,点击 OK 即可

如下图,都复制过来了,

然后你就可以删除 不要的案例包 和 web.xml等配置文件   

     

如上右图,我这里把它进行重命名为 web03,

值得注意的是无论你是重命名项目,还是上面这样拷贝项目,

它的名字上下文都要对应,这个我以前有讲到,详细可参考博文:

java服务器开发-servlet:1_3、入门注意点,如:重命名、项目导入、常见问题  一、项目重命名

 

 

 

 

/* * Copyright (c) 2000 David Flanagan. All rights reserved. * This code is from the book Java Examples in a Nutshell, 2nd Edition. * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied. * You may study, use, and modify it for any non-commercial purpose. * You may distribute it non-commercially as long as you retain this notice. * For a commercial use license, or to purchase the book (recommended), * visit http://www.davidflanagan.com/javaexamples2. */ package com.hexiang.examples.servlet; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; import java.io.*; /** * This class demonstrates how JDBC can be used within a servlet. It uses * initialization parameters (which come from the web.xml configuration file) * to create a single JDBC database connection, which is shared by all clients * of the servlet. ***/ public class Query extends HttpServlet { private static final long serialVersionUID = -5616899811848789885L; Connection db; // This is the shared JDBC database connection public void init() throws ServletException { // Read initialization parameters from the web.xml file ServletConfig config = getServletConfig(); String driverClassName = config.getInitParameter("driverClassName"); String url = config.getInitParameter("url"); String username = config.getInitParameter("username"); String password = config.getInitParameter("password"); // Use those init params to establish a connection to the database // If anything goes wrong, log it, wrap the exception and re-throw it try { Class.forName(driverClassName); db = DriverManager.getConnection(url, username, password); } catch (Exception e) { log("Can't create DB connection", e); throw new ServletException("Query: can't initialize: " + e.getMessage(), e); } } /** Close the database connection when the servlet is unloaded */ public void destroy() { try { db.close(); } // Try to close the connection catch (SQLException e) {} // Ignore errors; at least we tried! } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); // We're outputting HTML PrintWriter out = response.getWriter(); // Where to output it to // Output document header and a form for entering SQL queries // When the form is submitted, this servlet is reloaded out.println("<head><title>DB Query</title></head>\n" + "<body bgcolor=white><h1>DB Query</h1>\n" + "<form><b>Query: </b><input name='q'>" + "<input type=submit></form>"); // See if a query was specified in this request. String query = request.getParameter("q"); if (query != null) { // display the query text as a page heading out.println("<h1>" + query + "</h1>"); // Now try to execute the query and display the results in a table Statement statement = null; // An object to execute the query try { // Create a statement to use statement = db.createStatement(); // Use it to execute the specified query, and get result set ResultSet results = statement.executeQuery(query); // Ask for extra information about the results ResultSetMetaData metadata = results.getMetaData(); // How many columns are there in the results? int numcols = metadata.getColumnCount(); // Begin a table, and output a header row of column names out.println("<table border=2><tr>"); for(int i = 0; i < numcols; i++) out.print("<th>" + metadata.getColumnLabel(i+1) + "</th>"); out.println("</tr>"); // Now loop through the "rows" of the result set while(results.next()) { // For each row, display the the values for each column out.print("<tr>"); for(int i = 0; i < numcols; i++) out.print("<td>" + results.getObject(i+1) + "</td>"); out.println("</tr>"); } out.println("</table>"); // end the table } catch (SQLException e) { // If anything goes wrong (usually a SQL error) display the // error to the user so they can correct it. out.println("SQL Error: " + e.getMessage()); } finally { // Whatever happens, always close the Statement object try { statement.close(); } catch(Exception e) {} } } // Now, display the number of hits on this page by invoking the // Counter servlet and including its output in this page. // This is done with a RequestDispatcher object. RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/counter"); if (dispatcher != null) { out.println("<br>Page hits:"); // Add a request attribute that tells the servlet what to count. // Use the attribute name defined by the Counter servlet, and // use the name of this class as a unique counter name. request.setAttribute(Counter.ATTRIBUTE_NAME,Query.class.getName()); // Tell the dispatcher to invoke its servlet and include the output dispatcher.include(request, response); } // Finally, end the HTML output out.println("</body>"); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值