JavaWeb用户登录
参考: 来自b站
0.总体思路和完整代码
1.数据库创建对应的用户表
2.前台页面-登录页面
3.后台实现-登录功能
代码:https://github.com/wangwyForNewTime/JavaWeb-login-JSP-MySQL/tree/main
1.数据库建立
建立这样一个简单的数据库就好啦
2.前台页面
其实up主实例得很好,简单明了。
不过毕竟我本科的时候是靠前端技术才能抱到后端大佬的大腿的,所以这里给一个我曾经的包含表单验证的代码:登录注册前端页面
然后我简单使用的是:
<%--
Created by IntelliJ IDEA.
User: 大喵喵
Date: 2023/2/24
Time: 23:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<div class="mainbac">
<h1>MayBe Something System </h1>
<!-- <div class="lii">Please Choose Your Operation</div> -->
<div class="duzi" >
<ul class="nav nav-tabs nav-justified">
<li style="border-top: 3px solid lightgray;border-right: 3px solid lightgray;border-bottom: none;font-size: 17px;"><a href="#" style="border-bottom: none;">登 录</a></li>
</ul>
<div class="one" id="one">
<form action="index" method="post" id="loginForm" class="bs-example bs-example-form">
<div class="input-group" style="margin-top: 20px;">
<span class="input-group-addon"> ID </span>
<input type="text" class="form-control" name="uname" value="${messageModel.object.userName}">
</div>
<br>
<div class="input-group" style="margin-top: 20px;">
<span class="input-group-addon" value="${messageModel.object.userPwd}">密码</span>
<input type="password" class="form-control" name="upwd">
</div>
<span id="msg" >${
messageModel.msg}</span>
<div class="input-group" style="margin-top: 50px;">
<button type="submit" class="btn btn-primary" style="width: 240px;position: relative;left: 50%;margin-left: -20px;" id="loginBtn">登 录</button>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
3.集成mybatis
mybatis是干啥的我也不清楚,反正java代码要链接数据库就得用它。
3.1 准备好jar包
①建一个文件夹用来放jar包
②准备所需jar包
准备mybatis.jar,参考:[1]
github官网:官方下载
准备mysql-connector-j.jar,参考:[2]
官网:官方下载
然后把刚刚图片显示的俩文件放到刚刚建的lib文件夹下就行。
③ 添加依赖
选module
3.2 准备层
虽然分层思想核心我并不明白,但总归可以依葫芦画瓢
分层思想(解耦:高内聚低耦合)
1.controller层 接收请求(调用service层,返回结果) 响应结果
2.service层 业务逻辑判断
3.mapper 接口类
4.mapper .xml mybatis 与数据库的相关操作
5.entity (po、model ) JavaBean实体
6.util 工具类(通用的方法/类)
7.test 测试类/方法
最后建立这么多
3.3 entity 实体类
创建实体类,取名为User
idea使用技巧alt+insert快速写getset函数
package com.xxxx.entity;
public class User {
private Integer userId;
private String userName;
private String userPwd;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
3.4 mapper
参考:[1]
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 引入dtd -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace就是接口的包名加类名 -->
<mapper namespace="com.xxxx.mapper.UserMapper">
<select id="queryUserByName" resultType="com.xxxx.entity.User" parameterType="String">
<!-- 写SQL语句 -->
select * from pa where username = #{
username}
</select>
</mapper>
UserMapper.java
package com.xxxx.mapper;
import com.xxxx.entity.User;
/*
* 用户接口类
* */
public interface UserMapper {
public User queryUserByName(String username);
}
3.5 mybatis配置文件
注意是在src根目录下创建着俩文件
mysql.properties,注意test1为数据库名字,按需更换,密码是MySQL的密码:
参考:[1]
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=UTF-8
username = root
password = 1234
mybatis-config.xml,注意mysql.properties相当于存放的是mybatis-config.xml的参数。mybatis-config.xml在property name="keyword"
时,keyword需要对应。比如mysql.properties用的username
这样的拼写,那么mybatis-config.xml需要对应写property name="username"
而不能property name="uname"
mybatis-config.xml:
参考:[1]
<?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="mysql.properties"/>
<!-- 默认使用的环境 ID(比如:default="development")
也就是说我们可以配置多套<environment>环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- JDBC 驱动-->
<property name="driver" value="${driver}"/>
<!-- url数据库的 JDBC URL地址。-->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.xxxx.mapper"/>
</mappers>
</configuration>
3.6 util
建立一个GetSqlSession.java
/**
*
*/
package com.xxxx.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class GetSqlSession {
public static SqlSession createSqlSession(){
SqlSessionFactory sqlSessionFactory = null;
InputStream input = null;
SqlSession session = null;
try{
//获取mybatis的环境配置文件
String resource ="mybatis-config.xml";
//以流的方式获取resourse
input = Resources.getResourceAsStream(resource);
//创建会话工厂
sqlSessionFactory=new SqlSessionFactoryBuilder().build(input);
//通过工厂得到SqlSession
session=sqlSessionFactory.openSession();
return session;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args){
System.out.println(createSqlSession());
}
}
3.7 测试
新建test.java
package com.xxxx.test;
import com.xxxx.entity.User;
import com.xxxx.mapper.UserMapper;
import com.xxxx.util.GetSqlSession;
import org.apache.ibatis.session.SqlSession;
public class Test {
public static void main(String[] args){
//获取sqlSession对象
SqlSession session = GetSqlSession.createSqlSession();
//得到对应的Mapper
UserMapper userMapper = session.getMapper(UserMapper.class);
//调用方法,返回用户对象
User user = userMapper.queryUserByName( "wen");
System.out.println(user);
}
}
运行结果
4.后台功能
4.1 总体思路
分层思想:
思路:
1.接收客户端的请求(接收参数:姓名、密码)
2.参数的非空判断
如果参数为空
通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
将消息模型对象设置到request作用域中
请求转发跳转到登录页面 return
3.通过用户姓名查询用户对象
4.判断用户对象是否为空
如果为空
通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
将消息模型对象设置到request作用域中
请求转发跳转到登录页面 return
5.将数据库中查询到的用户密码与前台传递的密码作比较
如果不相等,通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
将消息模型对象设置到request作用域中
请求转发跳转到登录页面
如果相等,表示登录成功
将用户信息设置到session作用域中
重定向跳转到首页
controller层(接收请求、响应结果)
1.接收客户端的请求(接收参数:姓名、密码)
2.调用service层的方法, 返回消息模型对象
3.将消息模型对象设置到request作用域中
4.请求转发跳转到登录页面
service层(业务 逻辑)
1.参数的非空判断
如果参数为空
将状态码、提示信息、回显数据设置到消息模型对
返回消息模型对象
2.调用dao层的查询方法,通过用户名查询用户对象
3.判断用户对象是否为空
将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
4.将成功状态、提示信息、用户对象设置消息模型对象,并return
mapper层(Dao层 )
定义对应的接口
4.2 消息模型对象
在这个目录下,创建MessageModel.java文件
package com.xxxx.entity.vo;
/*
* 消息模型对象(数据响应)
* 状态码
* 1=成功,0=失败
* 提示信息
* 字符串
* 回显数据
* object对象
* */
public class MessageModel {
private Integer code=1; //状态码(1=成功,0=失败)
private String msg="success!";//提示信息
private Object object;//回显对象(基本数据类型、字符串类型、List、Map等)
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
4.3 业务逻辑
先写一个小工具人代码用于判断非空
package com.xxxx.util;
/*
* 字符串工具类
* */
public class StringUtil {
/*
* 判断字符是否为空
* 如果为空返回true
* */
public static boolean isEmpty(String str){
if(str ==null || "".equals(str.trim())){
return true;
}
return false;
}
}
再写主业务逻辑
package com.xxxx.service;
import com.xxxx.entity.User;
import com.xxxx.entity.vo.MessageModel;
import com.xxxx.mapper.UserMapper;
import com.xxxx.util.GetSqlSession;
import com.xxxx.util.StringUtil;
import org.apache.ibatis.session.SqlSession;
/*
* 业务逻辑
* */
public class Userservice {
/**
* 用户登录
* 1.参数的非空判断
* 如果参数为空
* 将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
* 2.调用dao层的查询方法,通过用户名查询用户对象
* 3.判断用户对象是否为空
* 将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
* 4.将成功状态、提示信息、用户对象设置消息模型对象,并return
*/
public MessageModel userLogion(String uname, String upwd) {
MessageModel messageModel=new MessageModel();
//1.参数的非空判断
if(StringUtil.isEmpty(uname) || StringUtil.isEmpty(upwd)){
//将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
messageModel.setCode(0);
messageModel.setMsg("UseName or PassWord cannot be null");
//回显数据
User u=new User();
u.setUserName(uname);
u.setUserPwd(upwd);
return messageModel;
}
// 2.调用dao层的查询方法,通过用户名查询用户对象
SqlSession session= GetSqlSession.createSqlSession();
UserMapper userMapper=session.getMapper(UserMapper.class);
User user= userMapper.queryUserByName(uname);
//3.判断用户对象是否为空
if(user==null){
//将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
messageModel.setCode(0);
messageModel.setMsg("no this user");
//回显数据
User u=new User();
u.setUserName(uname);
u.setUserPwd(upwd);
return messageModel;
}
//4.比较密码
if(!upwd.equals(user.getUserPwd())){
System.out.println(user.getUserName()+" "+user.getUserPwd()+" "+user.getUserId());
messageModel.setCode(0);
messageModel.setMsg("the password wrong");
return messageModel;
}
//5.登录成功,将用户信息设置带消息模型中
messageModel.setObject(user);
return messageModel;
}
}
4.4 Servlet
package com.xxxx.controller;
import com.xxxx.entity.vo.MessageModel;
import com.xxxx.service.Userservice;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/index")//这个/很重要
public class UserServlet extends HttpServlet {
//实例化UserService对象
private Userservice userService =new Userservice();
/*
* 用户登录
1.接收客户端的请求(接收参数:姓名、密码)
2.调用service层的方法 ,返回消息模型对象
3.判断消息模型的状态码
如果状态码是失败
将消息模型对象设置到request作用城中,请求转发跳转到login.jsp
如果状态码是成功
将调息模型中的用户信息没置到session作用城中,重定向跳转到index. jsp
* */
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
// 1.接收客户端的请求(接收参数:姓名、密码)
String uname =request.getParameter("uname");
String upwd=request.getParameter("upwd");
//2.调用service层的方法 ,返回消息模型对象
MessageModel messageModel=userService.userLogion(uname,upwd);
//3.判断消息模型的状态码
if(messageModel.getCode()==1){
//成功
//将调息模型中的用户信息没置到session作用城中,重定向跳转到index. jsp
request.getSession().setAttribute("user",messageModel.getObject());
response.sendRedirect("test.jsp");
}else{
//失败
//将调息模型中的用户信息没置到session作用城中,重定向跳转到index. jsp
request.setAttribute("messageModel",messageModel);
request.getRequestDispatcher("index.jsp").forward(request,response);
}
}
}
在写这部分代码的时候,一直报错找不到javax.servlet.annotation.WebServlet
,直接在网上搜,全是教各种配置,导入jar包,折腾了很久很久,但一直报错,真的很冒火。然后越发不对劲,后来csdn关键词链接给了一个可能性,是tomcat版本原因。果然是,tomcat10以上的版本导入包的时候语句已经改变,变成了import jakarta.servlet.annotation.WebServlet;
具体原因以及操作参考这个博主
4.5 IDEA的毛病
虽然写的时候不报红,服务器运行时就这找不到那找不到
例如,一个java: 无法访问org.apache.ibatis.session.SqlSession
我直接搜错误,网上全是MAVEN的情况怎么解决,关键我没用到MAVEN呀。但我发现这个函数就是在mybatis的jar包里面的,报找不到,就是jar包没添加上,所以我采用了单独添加jar包
然后apply,搞定