创建一个JavaWEB项目——Servlet验证MySQL数据库实现登录
Posted 美少女降临人世间
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建一个JavaWEB项目——Servlet验证MySQL数据库实现登录相关的知识,希望对你有一定的参考价值。
创建一个JavaWEB项目
这个项目就是简单的登录页面,验证数据是否与mysql数据库中信息匹配。
项目搭建准备工具
1、Tomcat
tomcat下载地址:https://tomcat.apache.org/。
- 将tomcat下载之后,解压放在磁盘中的一个目录下方。其目录结构如下:
配置Tomcat服务器
-
选择Run下面的Edit Configurations
-
点击左上角“+”选择Tomcat Server下面的Local
-
点击右边的Configure
-
在弹出窗口中选择tomcat的home目录
选择tomcat的根目录
-
配置项目根目录
在tomcat的配置窗口中选择Deployment,点击右上角“+”,选择项目的根目录。
-
tomcat服务器启动成功
-
启动项目
-
启动tomcat,自动跳出一个tomcat的主页,则tomcat服务器启动成功,其地址为:http://localhost:8080/,页面如下:
2、数据库
- 新建数据库:在mysql数据库中新建一个mybase数据库
- 创建数据表:在数据库mybase下新建user表
- 添加字段:其中有id、username、password和email四个字段。
- 对应输入数据
字段名 | id | username | password | |
---|---|---|---|---|
记录值 | 1 | tom | 123 | xxx |
注意:数据库、数据表、字段名和记录值不要输错,否则找不到相应的数据。
项目搭建步骤
一、创建项目
- 在File下选中New Project
- 选择Java Enterprise
不用改动,直接选择next。
- finish创建项目
- 进行相应设置:
Name: demo(自定义名称)
其他无需改动
- 完成后显示的画面
二、项目目录结构
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包和配置文件
- 在src下新建utils包
- 在包下引入‘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、导入并配置与数据库连接的文件
- 在src文件夹下导入文件c3po-config.xml
- ‘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
- 新建一个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这个文件。
- 点击Project Structure
- 选择Modules,点击左上角的“+”,选择下方的Web
- 在这个页面配置web.xml文件的路径。完成后点击ok即可。
- 此时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”设置的请求名。
五、登录界面
-
在web上点击右键->New->HTML File->
对话框中File name: login.html -
在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
- 继承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数据库实现登录的主要内容,如果未能解决你的问题,请参考以下文章