Servlet+HTML+JDBC+MySQL组合运用小案例

目    录(本篇字数:2147)

何为Servlet?

Servlet生命周期

Servlet接口使用

HttpServlet类

JDBC简介

JDBC 连接 MySQL 数据库

HttpServlet + Html + JDBC + MySQL案例


  • 何为Servlet?

       Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

  • Servlet生命周期

       Servlet本身仅是一个接口,它并不是实现类。所以我们只能实现Servlet接口,通过接口里的方法来走一遍它的生命周期吧。

首先,我新建了一个 HelloServlet ,实现Servlet接口,载入接口提供的方法。代码如下:

package com.xww;

import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloServlet implements Servlet{

	@Override
	public void destroy() {
		System.out.println("destroy");
	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init");
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("service");
	}
}

       要想让它跑起来,我们还缺对它的配置。在 web.xml 中配置 Servlet 代码如下:

	<servlet>
		<servlet-name>HelloServlet</servlet-name>
		<servlet-class>com.xww.HelloServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloServlet</servlet-name>
		<url-pattern>/hello</url-pattern>
	</servlet-mapping>

       这里解释一下上面这几个属性的作用。<servlet-name> 不用多说,但要注意的是在 <servlet-mapping> 中的 <servlet-name> 内容要与任意一个 <servlet> 中的 <servlet-name> 一致即可。原理就是在于 <servlet-mapping> 映射可以是一对多的。

       <url-pattern> 这里指的是在访问时输入的 url,例如我们可以这样访问(首先确保服务器可以运行):

       从上图可以看出我访问了 4 次,这样就可以得出Servlet的生命周期了。

Servlet的生命周期:

  • 先调用 init() 初始化,初始化完成之后便不再调用.
  • 接着调用 service() 接受请求,之后每一次请求只调用 service() 方法.
  • 在服务器关闭时,调用 destory() .
  • Servlet接口使用

       介绍了Servlet接口,接下来是关于Servlet的一些常用方法。首先,是Servlet提供的 init() 方法,这个方法里有了一个 

ServletConfig 参数,我们可以利用 ServletConfig 来获取一下关键信息。例如:

1. 先在 web.xml 文件中加入如下代码来设置 web 应用的全局参数(键值对方式)

	<context-param>
		<param-name>username</param-name>
		<param-value>admin</param-value>
	</context-param>
	<context-param>
		<param-name>password</param-name>
		<param-value>12345</param-value>
	</context-param>

2. 我们现在可以通过 ServletConfig 来获取这个参数了,在 init() 方法中写入如下代码:

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init");
		ServletContext context = config.getServletContext();
		String username = context.getInitParameter("username");
		String password = context.getInitParameter("password");
		System.out.println("username:" + username);
		System.out.println("password:" + password);
	}

借助 ServletContext 来获取 web 应用的全局参数值,其结果也如出一辙的打印到控制台

3. 到此为止,还没使用到请求。接着我新建了一个 login.html 文件,简单的利用表单提交方式来配合 servlet 的功能。 login.html代码如下:

<!DOCTYPE html>
<html>
<head>
<title>login.html</title>

<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

</head>

<body>
	Login page.
	<br/>
	<br/>

	<form action="hello" method="post">
	 UserName: <input type="text" name="user">
	 PassWord: <input type="password" name="pwd">
	<input type="submit" value="Login"> 
	</form>

</body>
</html>

以上需要注意的是,action 内容要与配合调用的 servlet 的 <url-pattern> 一致。

4. 修改 HelloServlet 类,添加如下代码:

package com.xww;

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

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloServlet implements Servlet{

	private ServletContext servletContext;
	
	@Override
	public void destroy() {
		System.out.println("destroy");
	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init");
		servletContext = config.getServletContext();
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("service");
		// 获取请求的参数内容
		String user = req.getParameter("user");
		String pwd = req.getParameter("pwd");
		System.out.println("请求:user:" + user);
		System.out.println("请求:pwd:" + pwd);
		// 获取 web 应用全局参数
		String username = servletContext.getInitParameter("username");
		String password = servletContext.getInitParameter("password");
		System.out.println("配置:user:" + username);
		System.out.println("配置:password:" + password);

		PrintWriter out = res.getWriter();
		if (username.equals(user) && password.equals(pwd)) {
			out.println("login succeed");
		}else{
			out.println("login failed");
		}
	}
}

5. 验证是否能够登入成功,>当然可以登入了。

  • HttpServlet类

       此类是 Servlet 接口的实现类,通过继承 HttpServlet 可以简化不需要的代码。比如, Servlet 接口中的 getServletConfig() 、

getServletInfo() 、destroy() 等方法都是不经常去使用的。我们继承自 HttpServlet 类的代码就很简单明了:

public class LoginServlet extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	

	}
}

       一般地,我们经常会用到的两种请求方式:Get 、Post,通常会覆盖 doGet() 、doPost() 这两种方法。所以,在之后我们就直接继承 HttpServlet 类而不需要去实现 Servlet接口了,大大的简化了不必要的代码。

  • JDBC简介

      JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。(官方语言描述,看看就好。)

      JDBC,它就像驱动一样,数据库比如:mysql、oracle、db2、sqlSever等,不同的产商肯定实现的方式都不一样,那就要求程序员得每一个数据库的操作都得学会,只有这样才能跟上需求的改变。所以,JDBC,它就站出来了。它为每个产生提供相同的接口,不管数据库底层如何实现。相当于在数据库与应用程序中间加了一层,这就是 JDBC。那么,加了这一层,程序员们就可以通过 JDBC 固定 API 来操作各种不同数据库了,相当机智。

  • JDBC 连接 MySQL 数据库

代码如下:

public class JdbcUtils {

	public static Connection getConnection() throws Exception {
		/**
		 * 步骤:
		 *  1. 声明  driver、jdbcUrl、user、password 四个变量
		 *  2. 新建 jdbc.properties 配置文件,使其在不改源码情况下,变更数据库
		 *  3. 获取 jdbc.properties 文件参数,利用Java反射和输入流方式获取
		 *  4. Class.forName(driver);加载驱动
		 *  5. 获取连接实例
		 */
		String driver = null;
		String jdbcUrl = null;
		String user = null;
		String password = null;

		InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
		Properties properties = new Properties();
		properties.load(inputStream);
		driver = properties.getProperty("driver");
		jdbcUrl = properties.getProperty("jdbcUrl");
		user = properties.getProperty("user");
		password = properties.getProperty("password");
		Class.forName(driver);
		Connection conn = (Connection) DriverManager.getConnection(jdbcUrl, user, password);
		return conn;
	}

	public static void release(Statement statement, Connection conn, ResultSet result) {
		try {
			if (statement != null) {
				statement.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			if (conn != null) {
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			if (result != null) {
				result.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

这里我写了一个Jdbc获取连接的工具类,只要调用 getConnection() 方法就可以连接成功了。注意一点:MySQL 数据库连接参数为如下(也就是上面代码中注释部分 jdbc.properties文件内容),否则将连不上,MySQL 端口和用户名都是默认的。

上图的 person 代表的是你的数据库名称。

  • HttpServlet + Html + JDBC + MySQL案例

      通过如上的几个知识点的综合,我写了一个小案例。在 login.html 中提交表单到 LoginServlet 利用 JDBC 连接 MySQL数据库 进行比对。若数据库中含有该账户,则登入成功,否则失败。

源代码:

public class LoginServlet extends HttpServlet {


	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		Connection conn = null;
		Statement statement = null;
		ResultSet result = null;
		PrintWriter out = resp.getWriter();

		boolean isFind = false;
		String user = req.getParameter("user");
		String pwd = req.getParameter("pwd");
		System.out.println("请求:user:" + user);
		System.out.println("请求:pwd:" + pwd);

		try {
			conn = JdbcUtils.getConnection();
			statement = conn.createStatement();
			result = statement.executeQuery("SELECT * FROM user");
			//循环遍历数据库,比对数据
			while (result.next()) {
				String db_user = result.getString("user");
				String db_password = result.getString("password");
				System.out.println("数据库:user:" + db_user);
				System.out.println("数据库:pwd:" + db_password);
				if (user.equals(db_user) && pwd.equals(db_password)) {
					isFind = true;
					break;
				} else {
					isFind = false;
				}
			}

			if (isFind) {
				out.println("find,login succeed");
			} else {
				out.println("not find,login failed");
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.release(statement, conn, result);
		}

	}
}

MySQL数据库 user 表

我们用 ‘李四’ 来测试一下,登入成功了。

©原文链接:https://blog.csdn.net/smile_Running/article/details/86629670

@作者博客:_Xu2WeI

@更多博文:查看作者的更多博文

posted @ 2019-01-24 19:19  爱写Bug的程序猿  阅读(1813)  评论(0编辑  收藏  举报