一、涉及到的知识点
-
jsp元素基础
-
jsp常用对象
-
html表单、超链接、标题标签
-
js基础(非空验证)
-
Servlet基础知识
-
数据库连接池配置
-
Java基础知识(jdbc)
(用到的东西比较多,但都是皮毛)
二、创建项目
1、创建web项目就不用说了吧,下面说一下目录吧
按照我的步骤来吧,
1、设计数据库
这是我的数据库结构
注意一定要记得设置uid自动为主键,不然可能出现两个人注册同一账号,登录就会出现异常
2、在src下创建net.dj.blen 包 并在包下创建User类(用户模型层)
图·:
代码如下:
package net.dj.blean;
public class User {
private String userid;
private String username;
private String password;
public User(){
}
public User(String userid,String username,String password){
this.userid=userid;
this.username=username;
this.password=password;
}
public String getId() {
return userid;
}
public void setId(String id) {
this.userid = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3、在web目录下创建login.jsp(登录界面)文件和registered.jsp文件(注册界面)创建js文件夹夹 ,并在js文件夹下创建check.js(js脚本实现非空验证)文件
login.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>用户登录</title>
<script type="text/javascript" src="js/check.js"></script>
</head>
<body>
<h3 style="text-align:center">用户登录</h3>
<form action="login" method="post">
账号:<input type="text" name="userid" id="userid"/> <br/>
密码:<input type="password" name="password" id="password"><br/>
<input type="submit" value="登录" onclick="return logcheckForm();"><input type="reset" value="重置">
</form>
</body>
</html>
registered.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
<script type="text/javascript" src="js/check.js"></script>
</head>
<body>
<form action="regist" method="post" >
请输入账号:<input type="text" name="userid" id="userid"><br/>
请输入昵称:<input type="text" name="username" id="username"><br/>
请输入密码:<input type="password" name="password" id="password1"><br/>
请确认密码:<input type="password" id="password2"> <br/>
<input type="submit" value="提交注册" onclick="return recheckForm();">
<input type="reset" value="重置">
</form>
</body>
</html>
check.js代码如下:
function recheckForm() {
//注册非空验证
var txtUserid=document.getElementById("userid")
var txtUsername=document.getElementById("username");
var txtPassword1=document.getElementById("password1");
var txtPassword2=document.getElementById("password2")
var userid=txtUserid.value;
var username=txtUsername.value;
var password1=txtPassword1.value;
var password2=txtPassword2.value;
if(userid==""){
alert("注意,账号不能为空");
return false
}
if (username == ""){
alert("注意用户名不能为空!")
return false;
}
if(password1 == ""){
alert("注意密码不能为空!");
return false;
}
if(password1 != password2){
alert("注意两次输入的密码不一致,请确认");
return false;
}
return true;
}
function logcheckForm() {
//登录非空验证
var txtid=document.getElementById("userid");
var txtpasswod=document.getElementById("password");
var id=txtid.value;
var password=txtpasswod.value;
if(id=="") {
alert("注意账号不能为空");
return false;
}
if(password==""){
alert("密码不能为空");
return false;
}
return true;
}
4、在web目录下创建success.jsp文件(登录成功页面)failure.jsp文件(登录失败页面)reyes.jsp(注册成功页面) reno.jsp(注册失败页面)修改index.jsp文件(主页)
success.jsp文件代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>登录成功</title>
</head>
<body>
<%=request.getParameter("username")%>恭喜登录成功
</body>
</html>
failure.jsp代码:
<%--登录失败页面--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>登录失败</title>
</head>
<body>
<%=request.getParameter("userid")%>登录失败,请检查用户名或者密码是否正确
</body>
</html>
reyes.jsp代码:
%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
<title>注册成功</title>
</head>
<body>
<h3>恭喜注册成功,注册信息如下</h3>
<h3>账号:<%= (String)session.getAttribute("userid")%></h3>
<h3>昵称:<%= (String)session.getAttribute("username")%></h3>
<h3>密码:<%=(String)session.getAttribute("userpassword")%></h3>
<%
session.removeAttribute("userid");
session.removeAttribute("username");
session.removeAttribute("userpassword");
%>
</body>
</html>
reno.jsp代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>注册失败</title>
</head>
<body>
注册失败,可能是id重复了,换个id试试
<a href="registered.jsp">点我去重新注册</a>
</body>
</html>
index.jsp代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<a href="login.jsp">点我去登录</a>
<a href="registered.jsp">点我去注册</a>
</body>
</html>
5、在WEB-INF下创建lib文件夹并导入mysql-conector-java-5.1.38的jar包(版本根据自己实际情况来哈,可能读者版本和我的不一样哦)并修改WEB-INF下的web.xml文件
web.xml配置修改如图:(用黄色框起来的地方可能是不一样的哦,要根据自己的数据库名修改)(jar包一定要添加到当前项目,直接复制进去是不行的)
6、在web目录下创建META_INF文件并在其目录下创建context.xml文件(连接池配置)
7、在src下创建net.dj.dbutil包,在包下创建ConnectionManager类
代码如下:
package net.dj.dbutil;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* 功能:数据库连接管理类
* 作者:摘星
* 日期:2020.8.3
*/
public class ConnectionManager {
private ConnectionManager(){
//私有化构造方法,拒绝实例化
}
public static Connection getConnection(){
//定义数据库连接
Connection conn=null;
try{
Context ctx=new InitialContext();
DataSource ds=(DataSource) ctx.lookup("java:comp/env/jdbc/javaweb");
//通过数据库源获取数据库连接
conn=ds.getConnection();
} catch (SQLException | NamingException throwables) {
throwables.printStackTrace();
}
return conn;
}
}
8、在src下创建net.dj.dao包并在包下创建UserD接口(数据访问接口),在dao包下创建impl包,在impl包下创建UserDaoimpl类(数据访问接口实现类), UserDaoimpl类实现了UserD接口
UserD接口代码:
package net.dj.dao;
import net.dj.blean.User;
public interface UserD {
//登录方法
User login(String uid, String upassword);
//注册方法
int insert(User user);
}
UserDaoimpl类代码:
package net.dj.dao.impl;
import net.dj.blean.User;
import net.dj.dao.UserD;
import net.dj.dbutil.ConnectionManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;
public class UserDaoimpl implements UserD {
//登录方法
@Override
public User login(String uid ,String upassword){
// 声明标志变量
Connection conn=null;
User user=new User();
try{
//获取数据库连接
conn= ConnectionManager.getConnection();
//定义sql字符串
String strsql="select* from user where uid=? and upassword=?";
//创建预备语句对象
PreparedStatement pstmt=conn.prepareStatement(strsql);
pstmt.setString(1,uid);
pstmt.setString(2,upassword);
//执行sql语句
ResultSet rs=pstmt.executeQuery();
//返回结果集的记录
while (rs.next()){
user.setId(rs.getString("uid"));
user.setUsername(rs.getString("uname"));
user.setPassword(rs.getString("upassword"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return user;
}
//注册方法
@Override
public int insert(User user){
//声明插入记录数
int count=0;
//声明数据库连接
Connection conn=null;
try{
//获取数据库连接
conn=ConnectionManager.getConnection();
//定义sql字符串
String strsql="insert into user (uid,uname,upassword) values(?,?,?)";
//创建预备语句对象
PreparedStatement pstmt=conn.prepareStatement(strsql);
//设置占位符的值
pstmt.setString(1,user.getId());
pstmt.setString(2,user.getUsername());
pstmt.setString(3,user.getPassword());
//执行sql更新,返回更新记录数
count=pstmt.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//返回插入记录数
return count;
}
}
9、在src下创建net.dj.servlet包并在其包下创建LoginServlet类和RegistServlet类
LoginServlet类代码:
package net.dj.servlet;
import net.dj.blean.User;
import net.dj.dao.UserD;
import net.dj.dao.impl.UserDaoimpl;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet(name = "LoginServlet" ,value = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设定获取数据字符编码
request.setCharacterEncoding("utf-8");
//获取表单数据
String userid=request.getParameter("userid");
String password=request.getParameter("password");
//创建用户数据访问对象
UserD userd=new UserDaoimpl();
//通过id和密码获取用户信息
User user=userd.login(userid,password);
// 判断是否登录成功
if (userid.equals(user.getId()) && password.equals(user.getPassword())){
//登录成功,跳转到登录成功界面
response.sendRedirect("success.jsp?username="+URLEncoder.encode(user.getUsername(),"utf-8"));
}
else{
response.sendRedirect("failure.jsp?userid="+URLEncoder.encode(userid,"utf-8"));
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
RegistServlet类代码
package net.dj.servlet;
import net.dj.blean.User;
import net.dj.dao.UserD;
import net.dj.dao.impl.UserDaoimpl;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "RegistServlet",value = "/regist")
public class RegistServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设定获取数据字符编码
request.setCharacterEncoding("utf-8");
//获取请求对应的会话
HttpSession session=request.getSession();
//获取表单数据
String uid=request.getParameter("userid");
String uname=request.getParameter("username");
String upassword=request.getParameter("password");
//创建用户实体对象
User user=new User(uid,uname,upassword);
//创建用户数据访问对象
UserD userD= new UserDaoimpl();
//开始注册,返回添加记录数
int count=userD.insert(user);
if (count==1){
//注册成功
//设置session里的user属性
session.setAttribute("userid",uid);
session.setAttribute("username",uname);
session.setAttribute("userpassword",upassword);
//采用重定向跳转到成功界面
response.sendRedirect("reyes.jsp");
}else {
//注册失败
response.sendRedirect("reno.jsp");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
10、运行测试: