“综合”web项目编写------手把手0基础教学(二)

news2025/7/11 7:29:35

上一节介绍了编写综合项目的基本流程  “综合”web项目编写------手把手0基础教学(一)

这里将继续介绍项目的编写,一个一个功能挨个实现。

目录

实现用户的登录功能

一 . 编写工具包---封装数据库链接

二 . 构建数据模型

三 . 构建功能模型

四.编写客户端jsp文件

五 . 编写控制端Servlet

第一步.先注册servlet

第二步.设置请求字符集编码格式(“utf-8”)

第三步.获取请求参数

第四步.调取功能模型中的功能(这里调用的是登录login功能)

第五步.返回响应


实现用户的登录功能

一 . 编写工具包---封装数据库链接

我们在功能编写之前可以先做一下准备工作,编写一下工具包,将一些要重复使用的代码封装起来,比如:数据库的链接(对数据库增删改查都要使用),来避免后面重复写。具体代码如下:

package com.my.until;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUntil { //封装数据库的链接
    //属性
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/a01";
    private static final String USER = "root";
    private static final String PASSWORD = "1234";
    //方法
    //链接数据库
    public Connection getConn(){
        try {
            //注册驱动
            Class.forName(DRIVER);
            //链接数据库
            return DriverManager.getConnection(URL,USER,PASSWORD);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

二 . 构建数据模型

编写entity包,创建实体类

实体类是根据数据表进行创建的,我们在先前的数据库中构建了一个users表,那么我们可以根据表来构建用户(user)模型

用户类此时实现序列化接口,然后据数据库中的表定义属性,自动生成方法getter()和setter()

具体代码和注释如下:

package com.my.entity;
 
import java.io.Serializable;
 
//Serializable是序列化接口,实现序列化是为了数据库表中的每一条数据保存到对象中,不再在控制台输出,在客户端显示
 
public class Users implements Serializable {//实现一个序列化接口
    //属性:
    //根据数据库表中的属性构建
     private Integer id;
     private String userName;
     private String userPwd;
    //方法:getter和setter方法,alt+insert自动生成
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    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;
    }
}

三 . 构建功能模型

数据模型构建完,要开始搭建功能模型,我们首先编写功能接口,该接口中存放用户可以实现的功能名,具体代码如下:

package com.my.dao;

//定义功能

import com.my.entity.Users;

public interface UsersDao {
    //登录功能
    Users login(String userName, String userPwd);
}

完成功能接口后,我们要在Impl文件中对接口进行实现,重写接口中的方法,具体代码如下:

package com.my.dao.Impl;

import com.my.dao.UsersDao;
import com.my.entity.Users;
import com.my.until.DBUntil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UsersDaoImpl extends DBUntil implements UsersDao {
    private Connection conn = null;
    private PreparedStatement ps = null;
    private ResultSet rs = null;
    //编写登录功能
    @Override
    public Users login(String userName, String userPwd) {
        Users user = null;
        //获取链接,注册驱动
        conn = getConn();  //工具包中关于数据库链接的方法
        //编写sql语句
        String sql = "select userName,userPwd from Users where userName = ?";
        try {
            //把sql语句发送到数据库中
            ps = conn.prepareStatement(sql);
            //给?赋值
            ps.setString(1,userName);
            //执行sql语句
            rs = ps.executeQuery();
            //判断rs是否为空
            if(rs.next()){
                user = new Users();
                user.setId(rs.getInt(1));
                user.setUserName(rs.getString(2));
                user.setUserPwd(rs.getString(3));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return user;
    }
}

四.编写客户端jsp文件

<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2022/11/17
  Time: 17:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>登录页面</title>
  </head>
  <body>
  <center>
    <form action="/UsersServlet?action=login" method="post">
    <h1>欢迎登录</h1>
    <hr color="red" width="50%">
    <p>账号:<input type="text" name="user" value="user"></p>
    <p>密码:<input type="password" name="password" value="password"></p>
    <p>
      <input type="submit" value="登录"/>
    </p>
    </form>
  </center>
  </body>
</html>

效果:

五 . 编写控制端Servlet

我们上面编写的jsp页面目前是无法实现功能的,下面将通过Servlet的编写让实现登录

编写Servlet实现登录功能,主要分为五大步,其余的就是在这五步中进行拓展

第一步.先注册servlet

用servlet注册完毕,才真正将我们的user类创建完毕,注册Servlet有两种方式,一种是通过注解@WebServlet,另一种则是更改配置文件web.xml

第二步.设置请求字符集编码格式(“utf-8”)

第三步.获取请求参数

第四步.调取功能模型中的功能(这里调用的是登录login功能)

注意:在调用功能时,要在最开头创建功能模型对象

第五步.返回响应

响应分为两种状态:

1.成功状态:将请求信息保存到session作用域中(目的:在浏览器关闭之前,信息都可以一直使用)

2.失败状态:采用重定向,返回页面

以下附详细代码注释:

package com.my.servlet;

import com.my.dao.Impl.UsersDaoImpl;
import com.my.dao.UsersDao;
import com.my.entity.Users;

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;

//注册Servlet,注册完Servlet才是真正创建了User类
@WebServlet("/UsersServlet")

public class UsersServlet extends HttpServlet {
    //创建功能模型对象
    UsersDao m = new UsersDaoImpl();
    //重写方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置字符集编码格式
        req.setCharacterEncoding("utf-8");
        //获取请求参数
        String action = req.getParameter("action");
        //判断action值
        if("login".equals(action)){ //登录
            //获取参数
            String user = req.getParameter("user");
            String password = req.getParameter("password");
            //调用登录功能
            Users auser = m.login(user, password);
            //返回响应:有两种状态,成功/失败
            if(auser!=null){//登录成功
                //将信息保存到session作用域中(目的:在浏览器关闭之前,信息都可以一直被保存)
                req.getSession().setAttribute("auser",auser);
                req.getRequestDispatcher("/success.jsp").forward(req,resp);
                System.out.println("登录成功!");

            }else{
                //重定向返回登录页面
                resp.sendRedirect("/index.jsp");
                System.out.println("登录失败,请检查账号密码!");
            }
        }
    }
}

到这里,我们最简单的登录功能已经实现,但是我们可以对此进行拓展,比如登录成功可以记住密码,实现自动登录等.......下面,我们实现记住密码和自动登录两个功能

由于我们之前已经将数据模型和功能模型搭建好了,后面我们在添加功能时就不用再重复搭建,直接编写功能,修改jsp页面即可

注:这里我们的记住密码和自动登录属于登录功能,无需在功能模型中添加,只修改jsp,servlet代码

我们对servlet代码进行补充,详细注释见代码:

package com.my.servlet;

import com.my.dao.Impl.UsersDaoImpl;
import com.my.dao.UsersDao;
import com.my.entity.Users;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//注册Servlet,注册完Servlet才是真正创建了User类
@WebServlet("/UsersServlet")

public class UsersServlet extends HttpServlet {
    //创建功能模型对象
    UsersDao m = new UsersDaoImpl();
    //重写方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置字符集编码格式
        req.setCharacterEncoding("utf-8");
        //获取请求参数
        String action = req.getParameter("action");
        //判断action值
        if("login".equals(action)){//登录
            //获取请求参数:
            String user =req.getParameter("user");
            String password = req.getParameter("password");
            String jiZhu = req.getParameter("jiZhu");
            String auto = req.getParameter("auto");
            //先执行登录
            Users auser = m.login(user,password);
            //判断登录是否成功!
            if (auser != null){//登录成功
                //把信息保存会话级作用域:
                req.getSession().setAttribute("auser",auser);
                //判断是否记住密码:
                //记住账号密码和记住密码
                Cookie user_cookie = new Cookie("user",user);
                Cookie password_cookie = new Cookie("password",password);
                Cookie jiZhu_cookie = new Cookie("jiZhu",jiZhu);
                Cookie auto_cookie = new Cookie("auto",auto);
                if("1".equals(jiZhu)){//记住密码
                    //判断是否自动登录:
                    if("1".equals(auto)){
                        auto_cookie.setMaxAge(60*60);
                    }
                    //设置记住密码的时间
                    user_cookie.setMaxAge(60*60);
                    password_cookie.setMaxAge(60*60);
                    jiZhu_cookie.setMaxAge(60*60);
                }else{//忘记密码
                    //设置记住密码的时间
                    user_cookie.setMaxAge(0);
                    password_cookie.setMaxAge(0);
                    jiZhu_cookie.setMaxAge(0);
                    auto_cookie.setMaxAge(0);
                }
                //把记住密码添加到响应当中
                resp.addCookie(user_cookie);
                resp.addCookie(password_cookie);
                resp.addCookie(jiZhu_cookie);
                resp.addCookie(auto_cookie);
                //请求转发到成功页面!!!
                req.getRequestDispatcher("/success.jsp").forward(req,resp);
                System.out.println("登录成功!");
            }else{
                //重定向返回登录页面
                resp.sendRedirect("/index.jsp");
                System.out.println("登录失败,请检查账号密码!");
            }
        }
    }
}

我们编写客户端jsp页面,引入c标签库,对存放在请求域中的数据进行操作

具体代码和注释如下:

<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2022/11/17
  Time: 17:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
  <title>登录页面</title>
</head>
<body>
<center>
  <h1>欢迎登录</h1>
  <hr color="red" width="50%">
  <form action="/UsersServlet?action=login" method="post">
    <p>账号:<input type="text" name="user" value="${cookie.user.value}"></p>
    <p>密码:<input type="password" name="password" value="${cookie.password.value}"></p>
    <p>
      <input type="checkbox" name="jiZhu" value="1"
      <c:if test="${cookie.jiZhu.value == 1}"> checked </c:if>
      >记住密码
      <input type="checkbox" name="auto" value="1">自动登录
      <c:if test="${cookie.auto.value == 1}">
        <%-- 自动登录 --%>
        <jsp:forward page="/UsersServlet?action=login&user=${cookie.user.value}&password=${cookie.password.value}&jiZhu=1&auto=1"></jsp:forward>
      </c:if>
    </p>
    <p>
      <input type="submit" value="登录"/>
    </p>
    </form>
  </center>
  </body>
</html>

到此为止,我们的登录功能就编写完毕

下一节我们将介绍分页功能,通过分页来展示用户列表

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

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

相关文章

ASEMI代理艾赛斯IGBT管IXYB82N120C3H1

编辑-Z 艾赛斯IGBT管IXYB82N120C3H1参数&#xff1a; 型号&#xff1a;IXYB82N120C3H1 漏极-源极电压&#xff08;VCES&#xff09;&#xff1a;1200V 连续漏电流&#xff08;IC&#xff09;&#xff1a;82A 功耗&#xff08;PC&#xff09;&#xff1a;1040W 工作结温度…

spring cloud在bootstrap.properties配置spring.profiles.active无效

bootstrap.properties 配置 bootstrap.properties spring.profiles.activeprofiles.active bootstrap-dev.properties / bootstrap-test.properties #服务器地址 spring.cloud.nacos.config.server-addr127.0.0.1:8848 #项目的命名空间的ID spring.cloud.nacos.config.name…

m基于FPGA和MATLAB的数字CIC滤波器设计和实现

目录 1.算法概述 2.仿真效果预览 3.MATLAB/FPGA部分代码预览 4.完整MATLAB/FPGA程序 1.算法概述 CIC滤波器由一对或多对积分-梳状滤波器组成&#xff0c;在抽取CIC中&#xff0c;输入信号依次经过积分&#xff0c;降采样&#xff0c;以及与积分环节数目相同的梳状滤波器。在…

Facebook账号复审的问题。

Facebook账号复审主要指的就是&#xff1a; Facebook个人广告账号&#xff0c;或者是你的企业bn广告系统当中的 Facebook投手号。在投放广告的过程当中&#xff0c;因为违规。或者其他原因。 Facebook需要审核这个Facebook账号的主体。简单的说就是他的合法性。 所以会要求你。…

基于Peer-Group(对等体组)的BGP和 BGP水平分割路由反射器

目录 一、简介 二、基于Peer-Group的IBGP配置 三、基于Peer-Group的EBGP配置 四、IBGP的水平分割与路由反射器 1.水平分割概念 2.现象 【1】R3收到的路由信息如下&#xff1a; 【2】R2收到的路由信息如下&#xff1a; 这就是IBGP水平分割导致的现象&#xff01; 五、…

策略验证_卖出口诀_三种图线交叉点卖出股票需抢先

写在前面&#xff1a; 1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文&#xff1b; 2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》 3. 本系列文章是用来学习技法&#xff0c;文中所得内容都仅仅只是作为演示功能使用 目录 解说 策略代码 结果 解…

m低信噪比下GPS信号的捕获算法研究,分别使用matlab和FPGA对算法进行仿真和硬件实现

目录 1.算法概述 2.仿真效果预览 3.MATLAB/FPGA部分代码预览 4.完整MATLAB/FPGA程序 1.算法概述 GPS卫星发送的信号一般由3个分量组成&#xff1a;载波、伪码和导航电文&#xff0c;其中伪码和导航电文采用BPSK技术去调制载波。GPS使用的两个L波段两种载频&#xff1a; 为了…

react学习随笔

创建react脚手架项目 方法一&#xff1a;在安装好nodejs的情况下 npm install -g create-react-app 全局安装react脚手架 create-react-app 项目名 创建一个新的react项目 方法二&#xff1a;直接安装 npx create-react-app 项目名 npx create-react-app 项目名 --template ty…

org.activiti.engine

org.activiti.engine目录概述需求&#xff1a;设计思路实现思路分析1.TaskService2.RuntimeService3.ProcessEngines4.ProcessEngineLifecycleListener5.ProcessEngines参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,…

详解Unity中的新版Nav Mesh|导航寻路系统 (三)

前言 通过前面两篇的介绍与讲解我们已经对新版NavMesh有了一个基础的了解和使用&#xff0c;本篇我们继续讲解剩余的两个组件NavMeshModifier、NavMeshModifierVolume&#xff0c;这两个组件是主要是用于影响导航网格的生成的。所以内容不是很主要&#xff0c;但也非常重要。 …

LQ0209 颠倒的价牌【枚举+进制】

题目来源&#xff1a;蓝桥杯2013初赛 C A组D题 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小李的店里专卖其它店中下架的样品电视机&#xff0c;可称为&#xff1a;样品电视专卖店。 其标价都是 4 位数字&am…

Pulsar bundle数目的选择

看到今年Pulsar 峰会上挺多人分享负载均衡的内容&#xff0c;这里也整理分享一下相关的内容。 实践中&#xff0c;我们都会 关闭 auto bundle split&#xff0c;保证系统稳定 Pulsar bundle split 是一个比较耗费资源的操作&#xff0c;会造成连接到这个 bundle 上的所有 pr…

SAP 物料分类账配置详解Part 1( 基于SAP S/4HANA1909 版本)

本文将详细介绍&#xff1a;SAP 物料分类账配置要点 &#xff0c;本系统使用的版本是&#xff1a; SAP S/4HANA1909 版本目录 1 物料分类账的后台配置 1.1 激活物料分类帐的评估区域 1.2 分配货币类型并定义物料分类帐类型 1.3 分配物料分类帐类型给评估范围 1.5 定义…

m基于MATLAB的通信系统仿真,包括信号源,载波信号,放大器,带宽滤波器,接收端包括放大器,带宽滤波器,载波解调,低通滤波器等

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 Interference : 200KHz Signal source: 需要在给出的一个excel 文档里调用&#xff0c;我对应的信号是第二竖栏&#xff0c;就是从B1到B60 里面所有的filter(滤波器)都是自己来选值&am…

驱动 私有数据传参点灯

1.在串口工具进行输入&#xff1a; echo 1 > /dev/myled0 ---->led1灯点亮 echo 0 > /dev/myled0 ---->led1灯熄灭 echo 1 > /dev/myled1 ---->led1灯点亮 echo 0 > /dev/myled1 ---->led1灯熄灭 echo 1 > /dev/myled2 ----…

243 h160 相交链表

题解 本题关键: acbbca // 243 h160 相交链表public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode pointAheadA,pointBheadB;int rount2;while (rount>0){if (pointApointB){return pointA;}pointApointA.next;pointBpointB.next;if (pointAnul…

【树莓派不吃灰】命令篇⑥ 了解树莓派Boot分区,学习Linux启动流程

目录1. Linux启动过程1.1 内核引导1.2 运行init初始化进程 —— 初始化系统环境1.3 运行级别 —— runlevel1.4 系统初始化 —— 加载开机启动程序1.5 用户登录1.5.1 方式1&#xff1a;命令行登录1.5.2 方式2&#xff1a;ssh登录&#xff08;常用&#xff09;1.5.3 方式3&#…

[附源码]计算机毕业设计JAVA恒星学院网络计费系统

[附源码]计算机毕业设计JAVA恒星学院网络计费系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Lingo软硬件划分 实例

文章目录一、SM2 加密算法软硬件划分1.1 实验目标1.2 实验过程&#xff08;1&#xff09; 综合考虑使得系统整体性能最&#xff08;2&#xff09;只考虑硬面积&#xff0c;即系统硬件面积最小&#xff08;3&#xff09;只考虑功耗&#xff0c;即系统功耗最小&#xff08;4&…

SpringBoot实用开发篇复习4(实用开发篇完)

在上面一节&#xff0c;我们学习了SpringBoot整合第三方技术&#xff0c;这次我们主要学习监控技术&#xff0c;主要包含四个部分&#xff0c;分别为监控的意义&#xff0c;可视化监控平台&#xff0c;监控的原理&#xff0c;自定义监控指标等&#xff0c;下面一起来学习吧。 …