jsp初学小练习1——Servlet+mvc+数据库连接池实现登录注册

一、涉及到的知识点
  1. jsp元素基础

  2. jsp常用对象

  3. html表单、超链接、标题标签

  4. js基础(非空验证)

  5. Servlet基础知识

  6. 数据库连接池配置

  7. 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、运行测试:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值