创建一个JavaWEB项目——Servlet验证MySQL数据库实现登录

Posted 美少女降临人世间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建一个JavaWEB项目——Servlet验证MySQL数据库实现登录相关的知识,希望对你有一定的参考价值。

创建一个JavaWEB项目

这个项目就是简单的登录页面,验证数据是否与mysql数据库中信息匹配。

项目搭建准备工具

1、Tomcat

tomcat下载地址:https://tomcat.apache.org/

  • 将tomcat下载之后,解压放在磁盘中的一个目录下方。其目录结构如下:

配置Tomcat服务器

  1. 选择Run下面的Edit Configurations

  2. 点击左上角“+”选择Tomcat Server下面的Local

  3. 点击右边的Configure

  4. 在弹出窗口中选择tomcat的home目录
    选择tomcat的根目录

  5. 配置项目根目录
    在tomcat的配置窗口中选择Deployment,点击右上角“+”,选择项目的根目录。

  6. tomcat服务器启动成功

  • 启动项目

  • 启动tomcat,自动跳出一个tomcat的主页,则tomcat服务器启动成功,其地址为:http://localhost:8080/,页面如下:

2、数据库

  1. 新建数据库:在mysql数据库中新建一个mybase数据库
  2. 创建数据表:在数据库mybase下新建user表
  3. 添加字段:其中有id、username、password和email四个字段。
  4. 对应输入数据
字段名idusernamepasswordemail
记录值1tom123xxx

注意:数据库、数据表、字段名和记录值不要输错,否则找不到相应的数据。

项目搭建步骤

一、创建项目

  1. 在File下选中New Project
  2. 选择Java Enterprise
    不用改动,直接选择next。
  3. finish创建项目
  • 进行相应设置:
    Name: demo(自定义名称)
    其他无需改动
  1. 完成后显示的画面

二、项目目录结构

1、创建实体包main(存放数据表结构对应的类)

创建User类,其中有id、username、password、email四个参数。为其提供构造器、getter、setter和tostring方法。

2、导入相关工具

  • 导入数据库链接的相关包:将连接池(c3p0-0.9.1.2)、DBUtils(commons-dbutils-1.4)、MySQL链接(mysql-connector-java-5.0.4-bin)三个包导入到到/web/WEB-INF/lib文件夹下。
  • 其目录结构如下:

3、导入Utils工具包(JavaWeb常用工具类:数据库操作DataSourceUtils)

数据库技术:c3p0 也就是说要使用这个工具类必须引入c3p0的jar包和配置文件

  1. 在src下新建utils包
  2. 在包下引入‘DataSourceUtils.java’文件
    代码如下:
    package utils;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class DataSourceUtils 
    
    	private static DataSource dataSource = new ComboPooledDataSource();
    
    	private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    
    	// 直接可以获取一个连接池
    	public static DataSource getDataSource() 
    		return dataSource;
    	
    
    	// 获取连接对象
    	public static Connection getConnection() throws SQLException 
    
    		Connection con = tl.get();
    		if (con == null) 
    			con = dataSource.getConnection();
    			tl.set(con);
    		
    		return con;
    	
    
    	// 开启事务
    	public static void startTransaction() throws SQLException 
    		Connection con = getConnection();
    		if (con != null) 
    			con.setAutoCommit(false);
    		
    	
    
    	// 事务回滚
    	public static void rollback() throws SQLException 
    		Connection con = getConnection();
    		if (con != null) 
    			con.rollback();
    		
    	
    
    	// 提交并且 关闭资源及从ThreadLocall中释放
    	public static void commitAndRelease() throws SQLException 
    		Connection con = getConnection();
    		if (con != null) 
    			con.commit(); // 事务提交
    			con.close();// 关闭资源
    			tl.remove();// 从线程绑定中移除
    		
    	
    
    	// 关闭资源方法
    	public static void closeConnection() throws SQLException 
    		Connection con = getConnection();
    		if (con != null) 
    			con.close();
    		
    	
    
    	public static void closeStatement(Statement st) throws SQLException 
    		if (st != null) 
    			st.close();
    		
    	
    
    	public static void closeResultSet(ResultSet rs) throws SQLException 
    		if (rs != null) 
    			rs.close();
    		
    	
    
    
    

4、导入并配置与数据库连接的文件

  1. 在src文件夹下导入文件c3po-config.xml
  2. ‘jdbcUrl’中的数据库名改为自建的数据库名,例:mybase
    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    	<default-config>
    		<property name="user">root</property>
    		<property name="password">root</property>
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<property name="jdbcUrl">jdbc:mysql:///mybase</property>
    	</default-config> 
    </c3p0-config> 
    

三、编写Servlet

  1. 新建一个class,自定义命名为ServletDemo,使其实现Servlet接口。
  • 这时出现了一个问题:识别不到Servlet接口。
  • 解决办法:使用maven配置一下

打开pom.xml,在其中加入如下代码:
xml <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> </dependency>
添加之后刷新pom.xml。

2. 导入Servlet包
此时再看ServletDemo,Servlet就能找到了。

3. 项目默认代码

	package web;
	
	import javax.servlet.*;
	import java.io.IOException;
	
	/**
	 * @author Elvira
	 * @date 2020/11/11 21:57
	 * @description
	 */
	public class ServletDemo implements Servlet 
	    @Override
	    public void init(ServletConfig servletConfig) throws ServletException 
	
	    
	
	    @Override
	    public ServletConfig getServletConfig() 
	        return null;
	    
	
	    @Override
	    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException 
	
	    
	
	    @Override
	    public String getServletInfo() 
	        return null;
	    
	
	    @Override
	    public void destroy() 
	
	    
	
  • init()就是初始化参数的方法
    public void init(ServletConfig servletConfig) throws ServletException 
        System.out.println("初始化参数的方法");
    
    
  • service()是执行业务逻辑的方法
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException 
        System.out.println("执行业务逻辑的方法");
    
    
  • destroy()是销毁servlet的方法
    public void destroy() 
        System.out.println("销毁Servlet");
    
    

四、配置Servlet映射文件

如果项目中没有web.xml文件(有的话这一步可以省略)

  • 需要在web.xml文件中配置。此时我们发现项目里没有web.xml这个文件。
  1. 点击Project Structure
  2. 选择Modules,点击左上角的“+”,选择下方的Web
  3. 在这个页面配置web.xml文件的路径。完成后点击ok即可。
  4. 此时web.xml文件就出现在项目中了。

项目中有web.xml文件,直接配置

  • 配置这个Servlet的映射关系,加入如下代码:
    <servlet>
        <servlet-name>servlet</servlet-name><!-- 自定义名称 -->
        <servlet-class>web.ServletDemo</servlet-class><!-- 项目完整路径 -->
    </servlet>
    <servlet-mapping><!-- mapping 表示映射 -->
        <servlet-name>servlet</servlet-name><!-- 自定义名称 -->
        <url-pattern>/tologin</url-pattern><!-- 请求名 -->
    </servlet-mapping>
    
  • 在web.xml中有以上设置内容表示设置正确,才能进行请求和响应。(如果没有响应设置信息,尝试手动添加。)
  • 注意<url-pattern>/tologin</url-pattern>: 为URL地址栏中的地址’ /tologin’,也是html中href="/tologin"或action=”/login”设置的请求名。

五、登录界面

  1. 在web上点击右键->New->HTML File->
    对话框中File name: login.html

  2. 在login.html中编写登录界面代码。
    使点击登录超链接,跳转到指定的servlet。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>login</title>
    </head>
    <body>
    <a href="/tologin">登录</a>
    <form action="/login" method="post">
        username:<input type="text" name="uname"><br>
        password:<input type="password" name="upass"><br>
    </form>
    
    </body>
    </html>
    
  • 注意:代码中‘/tologin’和‘/login’要与web.xml中的servlet-name一致
    Html上的输入框必须全部命名:例如name=”username”(name中设置的值在request请求时需要使用,名称要对应,否则获取不到输入值);

  • 此时在浏览器输入:http://localhost:8080/login.html,显示如下画面:

点击上方的登录链接,控制台输出的内容:

完善

一、登录界面

对页面中的form表单编写一个登录的servlet,请求名称为/login。

<form action="/login" method="post">
    username:<input type="text" name="uname"><br>
    password:<input type="password" name="upass"><br>
</form>
  • 用户名参数名为uname,密码为upass;
  • 表单提交的servlet名为/login

二、控制登录的servlet

  1. 继承HttpServlet,重写init、dopost、doget、destroy四个方法。
    package web;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author Elvira
     * @date 2020/11/12 11:15
     * @description
     */
    public class LoginServlet extends HttpServlet 
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
            //处理get请求
        
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
            //处理post请求
    
        
    
        @Override
        public void destroy() 
            System.out.println("销毁方法");
        
    
        @Override
        public void init() throws ServletException 
            System.out.println("初始化");
        
    
    
    
  • 在dopost方法中进行参数的接收和登录测试
    //1. 接收参数
    //"uname"为html中设置的编辑框名称
    String uname = req.getParameter("uname");
    //"upass"为html中设置的编辑框名称
    String upass = req.getParameter("upass");
     //2. 跳转页面测试
     if ("admin".equals(uname))
          req.getRequestDispatcher("/success.html").forward(req,resp);
       else 
          req.getRequestDispatcher("/error.html").forward(req,resp);
      
    

开启服务器,显示如下页面:

  • 填写一个错误的用户名点击登录,表单提交后跳转一个错误的页面:
    代码如下:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>error</title>
    </head>
    <body>
    <h1>登录失败</h1>
    </body>
    </html>
    

  • 输入正确的用户名admin后提交表单:
    跳转到一个成功页面:

三、连接数据库验证(重点)

  • 在LoginServlet的dopost方法中进行数据库中信息的验证。
    // 2.验证用户名和密码
     QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
     //下句中的user为数据表名,username和password为数据表中的字段
     String sql = "select * from user where username=? and password=?";
     //user为User类的实例化对象
     User user = null;
     try 
         //下句中的User为main中定义class文件名
         //下句中的uname,upass为‘1. 接收参数 ’中定义字符型的变量名
         user = runner.query(sql, new BeanHandler<User>(User.class), uname,upass);
      catch (SQLException e) 
         e.printStackTrace();
     
    
  • 测试页面的跳转
    if(user != null)
    //用户登录成功
        req.getRequestDispatcher("/success.html").forward(req,resp);
    else
        //用户登录失败
        req.getRequestDispatcher("/error.html").forward(req,resp);
    
    

完整代码

package servlet;

import main.User;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import utils.DataSourceUtils;

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

/**
 * @author Elvira
 * @date 2020/11/12 11:15
 * @description
 */
public class LoginServlet extends HttpServlet 
    String myEncoding = null;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        //处理get请求
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("<script>alert('请通过表单登录');location.href='/login.html'</script>");
    

    @Override
    public void init(ServletConfig config) throws ServletException 
        System.out.println("初始化方法");
        myEncoding = config.getInitParameter("myEncoding");
        System.out.println("String myEncoding = " +  myEncoding);

    

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        //处理post请求
        //编码格式要在接收参数之前
        req.setCharacterEncoding(myEncoding);
        //1. 接收参数
        String uname = req.getParameter("uname");
        String upass = req.getParameter("upass");
        // 2.验证用户名和密码
        QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
        //下句中的user为数据表名,username和password为数据表中的字段
        String sql = "select * from user where username=? and password=?";
        //user为User类的实例化对象
        User user = null;
        try 
            //下句中的User为main中定义class文件名
            //下句中的uname,upass为‘1、接收参数 

以上是关于创建一个JavaWEB项目——Servlet验证MySQL数据库实现登录的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb项目中的Servlet

JavaWeb编程servlet初级应用

JavaWeb MySQL 实现登录验证

JavaWeb---总结通过Servlet生成验证码图片

Javaweb 响应——生成验证码

Javaweb 响应——生成验证码