Java | 详解创建Web项目、配置Tomcat服务器、实现登录效果

news2024/11/17 11:39:41

本Demo为本人自学,部分技术已不是前沿技术,望谅解。

目录

一、相关工具及技术

        1、相关工具

        2、相关技术

        3、相关 jar 包

二、IDEA 创建 web 项目

        1、创建空项目

        2、classes目录和lib目录配置

        3、tomcat 服务器配置

三、MySQL 配置

        1、登录 mysql

        2、创建 user 表

        3、插入数据

四、项目代码编写

        1、整体思路

        2、前端代码

        3、后端代码

                (1)项目结构

                (2)相关 jar 包

                (3)User 类

                (4)MyBatis 相关配置

                (5)UserDao 类

                (6)UserMapper.xml 映射文件

                (7)LoginServlet 类

五、验证

        1、登录成功

        2、登录失败


一、相关工具及技术

        1、相关工具

  • 数据库:MySQL
  • 编程工具:IDEA 企业版

        2、相关技术

  • 服务器:HttpServlet、BeanUtil
  • 数据库:MyBatis

        3、相关 jar 包

二、IDEA 创建 web 项目

        1、创建空项目

                (1)打开 IDEA 企业版,创建空项目LoginDemo。

                (2)打开项目,在LoginDemo目录下右键,点击 添加框架支持

                 (3)选择 Web应用程序

                点击确定后,项目下多了一个 名为web的目录。

        2、classes目录和lib目录配置

                (1)右键web目录,创建两个新的目录 classeslib 。

                (2)配置 classes 目录

                        a、打开项目结构

                 b、选择模块,打开 路径 。选择 使用模块编译输出路径 选项

                 c、选择 classes 目录的路径

                 d、修改后,点击应用。

                 (3)配置 lib 目录

                        a、项目结构的模块中打开 依赖

                         b、点击 依赖 下面的 + 号(不是模块中的 + 号),选择 JAR或目录... 选项

                         c、选择 lib 目录的路径

                         d、选择 Jar Diirectory 选项,点击确定 

                         e、依赖下出现刚刚选择的 lib 目录,选择并应用。

                        f、点击项目结构的 库 ,点击右上角的 + 号,选择 Java。

                         g、同样的选择 Jar Diirectory 选项,点击确定

                         h、点击确定

                         i、添加成功后,点击确定关闭项目结构。

        3、tomcat 服务器配置

                (1)点击编辑配置

                 (2)点击添加新的运行配置,找到 tomcat ,选择 本地

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器。
下载地址:Apache Tomcat® - Welcome!

        任选一个版本进行下载,我这里选择的是Tomcat 9。下载之后解压到你知道的目录即可。

                (3)配置 Tmocat 服务器

                 启用程序服务器 一栏,点击右边的配置。

                 输入你解压后 tomcat 的目录,主目录和基目录一般是选择一样的。

                 点击 部署,点击下方的加号,选择 工件...

                添加后:

                 选择 文件 -> 项目结构 -> 工件,将名称 ":" 后面的内容去掉,输出目录 "_" 后面的内容去掉(留下项目名),然后勾上两个按钮,点击确定。

                (4)点击 服务,点击运行按钮。红色的字段不是报错,只是服务器运行输出的日志等内容,不用担心。当出现 部署已花费 XXX 毫秒 的字样,浏览器打开如下界面,即说明配置完成。

三、MySQL 配置

        1、登录 mysql

                输入 net start mysql 启动 mysql 数据库服务。

net start mysql

                 输入用户名、密码登录 mysql 。

mysql -u 你的用户名 -p

                查看 mysql 中的数据库,选择你的数据库

show databases;
use 你的数据库;

        2、创建 user 表

                我创建了一张 user 表,包含了 id,name,password 三个字段。其中 id 字段为主键,设置为自动增长。

create table user(
    id int primary key auto_increment,
    name varchar(20),
    password varchar(20)
    );

        3、插入数据

                插入一条记录,用于后面的测试

insert into user values(null,"admin","admin");

                 查看表

select * from user;

四、项目代码编写

        1、整体思路

                用户通过浏览器访问 login.html 页面,输入用户名的密码。服务器接收数据,通过servlet进行解析,如果正确,则跳转到 welcome.html 页面;否则重新跳转回 login.html 页面。

        2、前端代码

                由于这个Demo主要关注后端的代码,前端的代码就简单写了写,仅作为测试。

                (1)index.html 

                         这个页面是浏览器一打开就展示的界面

                      (在tomcat服务器的web.xml配置文件下有相关的配置)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>开始界面</title>
</head>
<body>
<h1>欢迎您来到...首页</h1>
</body>
</html>

附:tomcat服务器对各种资源的访问

对Servlet动态资源的访问:

对html静态资源的访问:

对index为名称的资源的访问:

tomcat服务器的web.xml文件 第4734行

                (2)login.html

                        注意这里 action 的 URL 别写错

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录界面</title>
</head>
<body>
<form action="http://localhost:8080/LoginDemo/loginServlet" method="post">
  姓名:<input type="text" name="name"><br>
  密码:<input type="password" name="password"><br>
  <input type="submit" value="登录">
</form>
</body>
</html>

                (3)welcome.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎界面</title>
</head>
<body>
<h1>欢迎您</h1>
<h2>登录成功</h2>
</body>
</html>

        3、后端代码

                (1)项目结构

                (2)相关 jar 包

 BeanUtils需要导入3个Jar包:

        commons-beanutils-1.9.3.jar
        commons-beanutils-1.9.3-tests.jar
        commons-logging-1.2.jar

CSDN:BeanUtils工具类-Java文档类资源-CSDN文库

官网:Index of /dist/commons/beanutils/binaries (apache.org)

MyBatis需要导入1个Jar包:

        mybatis-3.5.11.jar

CSDN:mybatis-3.5.11-Java文档类资源-CSDN文库

官网:Releases · mybatis/mybatis-3 · GitHub

MySQL需要导入1个Jar包:

        mysql-connector-j-8.0.31.jar

官网:MySQL :: MySQL Community Downloads

CSDN:mysql-connector-j-8.0.31-Java文档类资源-CSDN文库

HttpServlet需要导入1个Jar包:

        servlet-api.jar

打开 tomcat 解压目录下的 lib 目录,找到 servlet-api.jar

                (3)User 类

                        a、使用 IDEA 企业版连接数据库

                                打开 IDEA 右侧的数据库,选择MySQL.

                         填写相关配置,主要是mysql的用户名和密码

                        点击数据源属性,选择你的数据库。

                         找到 user 表

                        b、通过工具创建 User 类

                                右键 user 表,选择 工具 -> 脚本化控制程序 -> Generate POJOs.groovy

                        选择需要生成的位置

                       IDEA将自动生成 User 实体类,注意自动生成的包名可能需要自己改一下。

                (4)MyBatis 相关配置

                        a、配置 jdbc.properties。创建 jdbc.properties 文件,填写数据库连接的相关消息,用于MyBatis的连接。

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_study
username=root
password=root

                        b、配置 mybatis-config.xml。创建 mybatis-config.xml 文件,填写资源包、别名、环境、映射文件等的信息。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--配置资源包-->
    <properties resource="jdbc.properties"/>

    <!--配置别名-->
    <typeAliases>
        <typeAlias type="com.pojo.User" alias="user"/>
    </typeAliases>

    <!--配置环境-->
    <environments default="mysql">
        <environment id="mysql">

            <transactionManager type="JDBC"/>

            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--配置映射文件-->
    <mappers>
        <mapper resource="com/dao/UserMapper.xml"/>
    </mappers>
</configuration>

                (5)UserDao 类

                        定义接口 UserDao 类,这里使用的是xml的方式编写SQL语句,另一种方式是通过注解的方式编写。通过 UserMapper.xml 实现接口。

package com.dao;

import com.pojo.User;

public interface UserDao {
    User findByNameAndPassword(User user);
}

                (6)UserMapper.xml 映射文件

                        填写SQL语句,实现接口。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--配置具体映射文件,namespace属性是指定具体要操纵的类-->
<mapper namespace="com.dao.UserDao">

    <select id="findByNameAndPassword" resultType="user" parameterType="user">
        select *
        from user
        where name = #{name}
          and password = #{password}
    </select>

</mapper>

                (7)LoginServlet 类

                这里编写的实现MySQL语句查询,判断页面跳转的代码。login.html页面通过 acton 的URL跳转到该类。

                首先通过注解的方式配置路径

@WebServlet("/loginServlet")

                实现doPost方法

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

                将tomcat的服务器编码设置为 utf-8 ,避免用户post时中文乱码的问题。

req.setCharacterEncoding("utf-8");

                通过 getParameterMap() 方法获取请求参数

Map<String, String[]> map = req.getParameterMap();

                创建 User 类,通过BeanUtils类打包。

        // 创建 user 对象
        User user = new User();

        // 将 map 中的请求参数封装到 user 对象中
        try {
            BeanUtils.populate(user, map);
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }

                通过MyBatis 获取 UserDao 代理类,查询数据库并返回查询结果。

        // 获取流对象,读取核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 创建 sqlSessionFactoryBuilder 工厂构建者对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 获取 sqlSessionFactory 工厂对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 获取 SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取 UserDao 代理类对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 调用 userDao
        User result = userDao.findByNameAndPassword(user);
        // sqlSession 提交
        sqlSession.commit();
        // sqlSession 关闭
        sqlSession.close();

                判断结果是否为 null,决定请求转发的方向。

        // 判断 result 是否为 null
        if (result == null) {
            // 没有该用户,跳转到 login.html
            req.getRequestDispatcher("/login.html").forward(req, resp);
        } else {
            // 有该用户,跳转到 welcome.html
            req.getRequestDispatcher("/welcome.html").forward(req, resp);
        }

                LoginServlet 类全部代码:

package com.servlet;

import com.dao.UserDao;
import com.pojo.User;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");

        // 获取请求参数
        Map<String, String[]> map = req.getParameterMap();

        // 创建 user 对象
        User user = new User();

        // 将 map 中的请求参数封装到 user 对象中
        try {
            BeanUtils.populate(user, map);
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }

        // 获取流对象,读取核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 创建 sqlSessionFactoryBuilder 工厂构建者对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 获取 sqlSessionFactory 工厂对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 获取 SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取 UserDao 代理类对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 调用 userDao
        User result = userDao.findByNameAndPassword(user);
        // sqlSession 提交
        sqlSession.commit();
        // sqlSession 关闭
        sqlSession.close();

        // 判断 result 是否为 null
        if (result == null) {
            // 没有该用户,跳转到 login.html
            req.getRequestDispatcher("/login.html").forward(req, resp);
        } else {
            // 有该用户,跳转到 welcome.html
            req.getRequestDispatcher("/welcome.html").forward(req, resp);
        }
    }
}

五、验证

        1、登录成功

 

        2、登录失败

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode - 485. 最大连续 1 的个数

与其后悔与抱怨&#xff0c;不如从现在改变 485. 最大连续 1 的个数 - Easy 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续…

原油期货在哪里交易?美原油期货和布伦特原油期货选择哪个交易更好?

石油是与人类社会及经济息息相关的能源&#xff0c;从工业生产、交通运输&#xff0c;以至制造塑胶产品、化妆品及衣服纤维等&#xff0c;无孔不入地渗透我们的日常生活与工商业活动。石油经开采后&#xff0c;未经加工的状态通称为原油&#xff0c;既是不可或缺的能源&#xf…

新茶饮 200+ 门店优化库存成本,需要几个数据分析师?

小 L 是一家茶饮门店的店长&#xff0c;她所在的新茶饮企业已经在全国布局了超过 200 家实体门店。小 L 每周除了整理 Excel 数据向区域总监汇报外&#xff0c;还要抽时间站到柜台前&#xff0c;完成总部要求的“在前线做决策”。虽然忙碌&#xff0c;但还能 Hold 得住&#xf…

云图联动创宇智脑,打造高价值威胁情报赋能的威胁处置闭环与攻击溯源

网络对抗日趋激烈&#xff0c;《关基保护要求》提出更高检测防御要求&#xff0c;高级威胁检测面对需求升级&#xff0c;知道创宇推出创宇云图与创宇威胁情报网关、创宇智脑威胁情报平台联防联控方案&#xff0c;打破单个网络安全产品的孤岛&#xff0c;充分发挥产品联动方案的…

数据结构(2)—算法

&#xff08;1&#xff09;小白建议学习青岛大学王卓老师的数据结构视频&#xff0c;或者购买程杰老师的大话数据结构。 &#xff08;2&#xff09;邀请加入嵌入式社区&#xff0c;您可以在上面发布问题&#xff0c;博客链接&#xff0c;公众号分享&#xff0c;行业消息&#x…

【SpringMVC】数据格式化+数据验证

目录 一、前言 二、目录结构 三、数据格式化 四、数据验证 五、数据格式化、验证梳理图 六、数据格式化、验证梳理图 相关文章 【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程 【SpringMVC】使用篇&a…

ref的使用方法 ,组件通信父传子,组件通信子传父,组件分离模块化, v-model 传值的3种方式

原生获取一个节点&#xff1a;document.getElementById() vue方式操作dom节点&#xff1a;ref 通过给元素设定ref属性在vue实例中获取这个元素: <input type"text" ref"input" placeholder"请输入内容"> 组件挂载后(mounted)才能访问…

【重要】有三AI技术专栏作者邀请,5大权益助力共同成长

知识分享平台众多&#xff0c;我们有三AI公众号是其中一个&#xff0c;在过去的3年里&#xff0c;我们已经写了700多篇&#xff0c;超过200万字的技术文&#xff0c;其中一些专栏作者的贡献功不可没。我们公众号只做原创内容&#xff0c;因为我并不希望平台成为一个靠复制转载内…

通过运维编排实现自动化智能运维与故障自愈

自动化帮助用户消除重复性任务&#xff0c;从而降低运营成本、提高效率并提高团队生产力。但是&#xff0c;将自动化引入复杂的 IT 环境还需要编排。编排是指一次性自动执行多项任务&#xff0c;涉及到计算机系统、中间件和服务的自动布置、协调和管理&#xff0c;利用自动执行…

10个最频繁使用的聚类算法 Python 实现(附完整代码)

大家好&#xff0c;聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术&#xff0c;用于发现数据中的有趣模式&#xff0c;例如基于其行为的客户群。 有许多聚类算法可供选择&#xff0c;对于所有情况&#xff0c;没有单一的最佳聚类算法。相反&#xff0c;最好探索一…

46. 批量规范化

训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化&#xff08;batch normalization&#xff09;,这是一种流行且有效的技术&#xff0c;可持续加速深层网络的收敛速度。 再结合在 将介绍的残差块&#xff0c;批量规范…

盘点 | 基于小程序语法的跨端开发平台

最近&#xff0c;微信于2022年12月18日悄悄的推出了一款名叫“Donut”的开发平台。根据开发文档的产品介绍来看&#xff0c;该平台的核心是多端框架&#xff0c;支持使用小程序进行代码编写&#xff0c;并进行多端编译&#xff0c;从而实现多端开发。 目前Donut开发平台已经开…

Android 音视频入门/进阶教程

后续的音视频文章&#xff0c;都会在这里更新 作为安卓开发仔&#xff0c;对音视频这块&#xff0c;一直是比较感兴趣的&#xff0c;所以&#xff0c;本着学习和记录的态度&#xff0c;我也把我所学的知识记录起来&#xff0c;希望对想音视频感兴趣的小伙伴有所帮忙。 一. 基础…

SpringBoot maven 项目 JDBC 连接多源数据库

此方法支持 mysql&#xff0c;oracle&#xff0c;postgre&#xff0c;sqlserver等等 基本逻辑&#xff1a;1. 加载驱动; 2. 通过DriverManager传入数据库地址&#xff0c;用户名&#xff0c;密码&#xff0c;获取本地数据库连接 1. pom文件下添加依赖 <dependency><…

Android 多线程下载以及断点续传

多线程下载 在日常开发中&#xff0c;我们不可避免的会接到类似这样的需求&#xff0c;下载一个比较大的素材文件或者安装包文件&#xff0c;以此实现APP的自动更新&#xff0c;APP内的素材替换等。由于一般此类文件都比较大&#xff0c;一般会在50M以上&#xff0c;如果我们不…

高效好用的开发工具箱——猿如意

目录 前言&#xff1a; 1.我常用的功能介绍 2.主要功能chatGPT测评 3.我的使用体验和改进建议 前言&#xff1a; 猿如意是一款帮助开发的效率工具&#xff0c;集成了许多有用的工具和文档教程。帮助开发者提升开发效率&#xff0c;帮你从“问题”找到“答案”。尤其是12月…

加注超融合 星辰天合推出 XHERE V2 系列

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;“XSKY星辰天合”&#xff09;成功举办了主题为“能存会算&#xff0c;创新不断”的 XHERE 超融合新品渠道推介会&#xff0c;正式向市场推出 XHERE V2 超融合软件平台。通过继续加大对超融合产品线的…

上云节省 35%计算资源,420 个运维人天:运满满实时计算实践和思考

摘要&#xff1a;本文整理自满帮实时数据团队 TL 欧锐&#xff0c;在 FFA 2022 行业案例专场的分享。本篇内容主要分为四个部分&#xff1a;满帮业务及平台架构介绍实时数据实时产品未来计划Tips&#xff1a;点击「阅读原文」查看原文视频&演讲 ppt01满帮业务及平台架构介绍…

数据可视化系列-01大数据可视化基础

文章目录1.概述2.大数据可视化基础2.1 数据可视化基础知识1、数据可视化简史&#xff1a;2、数据可视化是什么&#xff1a;3、数据可视化的分类&#xff1a;4、数据可视化流程&#xff1a;5、数据可视化的意义&#xff1a;2.2 认识BI和数据可视化工具1、BI的简介&#xff1a;BI…

RabbitMQ:订阅模型-匹配模式

阅模型-匹配模式&#xff0c;相比于前两种订阅模型&#xff0c;是更细致的分组&#xff0c;允许 在RoutingKey 中使用匹配符 *&#xff1a;匹配一个单词#&#xff1a;匹配0个或多个单词 RabbitMQ 订阅模型-匹配&#xff08;topics&#xff09;模式主要有以下六个角色构成&#…