【JSP/Servlet】基于WEB的通讯录系统

news2024/9/19 19:56:12

巩固JSP/Servlet

  • 系统开发描述步骤
    • 系统功能描述
      • 一、创建一个登录页面
      • 二、模拟数据(用数据库模拟用户名和密码还有用户的通讯录)
      • 三、创建一个JDBC工具类
      • 四、判断在登录页面输入的用户名和密码是否正确
      • 五、利用cookie实现保存
      • 六、以表格形式显示出我的通讯录
      • 七、实现增删改功能
  • 具体代码

注意:通讯单词是 mail,但我自己写的时候写成了 tail,然后快写完才发现,所以这里就假装tail是 mail吧。

系统开发描述步骤

这边是从前端往后端的方式开发。

系统功能描述

  1. 首先有一个登录页面,登录页面需要输入用户名和密码,有记住选项(如果选择了记住下回就直接跳转到我的通讯录,无需登录),然后登录。
  2. 正确登录后就跳转到通讯录系统的欢迎界面,欢迎界面有个“我的通讯录”的超链接;
  3. 点击它会以表格的方式展示所有联系人的信息;
  4. 然后我们可以对这个通讯录进行增删改;
  5. 可以选择退出登录其他用户。

一、创建一个登录页面

首先我们创建一个index.jsp文件,然后在里面编写登录页面的代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>welcome</title>
  </head>
  <body>
    <form action="" method="post">
      用户名: <input type="text" name="username" ><br>
      密码&nbsp;&nbsp;&nbsp;: <input type="password" name="password" ><br>
      <input type="checkbox" name="res" value="1" >保存用户名和密码<br>
      <input type="submit" value="登录" >
    </form>
  </body>
</html>

页面效果图:
在这里插入图片描述

二、模拟数据(用数据库模拟用户名和密码还有用户的通讯录)

写SQL把用户名和密码模拟出来:

drop table if exists user;

create table user(
	id int primary key auto_increment,
	username varchar(255),
	password varchar(255)
);

insert into user(username,password) values('admin','admin');
insert into user(username,password) values('zhangsan','258');
insert into user(username,password) values('xmq','369');

写SQL把用户的通讯录模拟出来:

drop table if exists tail;

create table tail(
	id int primary key auto_increment,
	name varchar(255),
	password varchar(255),
	phone varchar(255),
	address varchar(255)
);

insert into tail(name,password,phone,address) values("xmq","123","13979463154","beijing");
insert into tail(name,password,phone,address) values("zhangsan","654","13979658754","nanjing");
insert into tail(name,password,phone,address) values("lisi","156","13974873154","tianjing");

以下是得到的通讯录(当然可以通过外键让每个用户拥有不同的通讯录,但这里为了方便让每个用户都使用同一个通讯录):
在这里插入图片描述

三、创建一个JDBC工具类

接下来创建一个JDBC工具类,方便操作:

package javaweb.tail.util;

import java.sql.*;
import java.util.ResourceBundle;

public class DBUtil {
    private static ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
    private static String driver = bundle.getString("driver");
    private static String url = bundle.getString("url");
    private static String name = bundle.getString("name");
    private static String password = bundle.getString("password");

    static {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 返回连接数据库对象
     *
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, name, password);
    }

    /**
     * 关闭所用的资源
     *
     * @param conn
     * @param sta
     * @param rs
     */
    public static void close(Connection conn, Statement sta, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (sta != null) {
            try {
                sta.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

    }
}

配置文件中的属性可以自行设置;

四、判断在登录页面输入的用户名和密码是否正确

如果正确的话跳转到“我的通讯录”页面,如果失败的话就提示“重新登录,请返回”:
所以我们得创建一个Servlet,如果登录成功需要跳转到我的通讯录的话,就得存取数据,然后利用request进行转发显示到页面上:

package javaweb.tail;

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 javaweb.tail.util.DBUtil;

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

@WebServlet("/user/login")
public class UserServlet extends HttpServlet {
    /**
     * 使用模板方法模式实现登录和退出检验
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String servletPath = request.getServletPath();
        if("/user/login".equals(servletPath)){
            doLogin(request,response);
        }
    }

    private void doLogin(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException{
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        //设置一个标志变量,判断是否登录成功
        boolean flag = false;
        try{
            conn = DBUtil.getConnection();
            String sql = "select * from user where username=? and password=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,username);
            ps.setString(2,password);
            rs = ps.executeQuery();
            if(rs.next()){
                flag = true;
            }

        }catch(SQLException e){
            e.getClass().getName();
        }finally{
            DBUtil.close(conn,ps,rs);
        }
        if(flag){
            // 登录成功跳转到“我的通讯录”页面
            response.sendRedirect(request.getContextPath()+"/mytail.jsp");
        }else{
            // 登录失败,请重新登录
            response.sendRedirect(request.getContextPath() + "/error.jsp");
        }


    }
}

在这里插入图片描述
这里的error.jsp代码:

<%@ page contentType='text/html;charset=UTF-8' language='java' %>
<html>
<head>
    <title>error</title>
</head>
<body>
<h1>登录失败,请<a href='<%=request.getContextPath()%>/index.jsp'>返回</a></h1>
</body>
</html>

登录成功效果展示:
在这里插入图片描述
登录失败效果展示:
在这里插入图片描述

五、利用cookie实现保存

这里重新定义一个欢迎页面,写一个servlet判断浮现在浏览器的首个页面,如果cookie存在且符合,那么直接跳转到我的通讯录,如果不符合且没有就跳转到登录页面为欢迎页面。
在web.xml先部署一波:
在这里插入图片描述

在何时创建cookie呢?
在首次登录成功且选择了保存的UserServlet里,因为创建成功才有的保存:
在这里插入图片描述

下面是判断首页面的代码:

package javaweb.tail;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import javaweb.tail.util.DBUtil;

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

@WebServlet("/welcome")
public class WelcomeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        String username = null;
        String password = null;

        // 获取Cookie对象集
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for(Cookie cookie:cookies){
                if(cookie.getName().equals("username")){
                    username = cookie.getValue();
                }else if(cookie.getName().equals("password")){
                    password = cookie.getValue();
                }
            }
        }
        // 如果存在判断用户名和密码是否正确,错误则直接返回到登录页面
        if(username!=null&&password!=null){
            Connection conn = null;
            PreparedStatement ps =null;
            ResultSet rs = null;
            boolean flag = false;
            try{
                conn = DBUtil.getConnection();
                String sql = "select * from user where password=? and username=?";
                ps = conn.prepareStatement(sql);
                ps.setString(1,password);
                ps.setString(2,username);
                rs = ps.executeQuery();
                if(rs.next()){
                    flag = true;
                }
                
            }catch (SQLException e){
                e.printStackTrace();
            }finally {
                DBUtil.close(conn,ps,rs);
            }
            if(flag){
                //这里登录成功也要建一下session会话对象
                //因为session对象浏览器关了就找不着了,而cookie是还在的
                HttpSession session = request.getSession();
                session.setAttribute("username",username);
                response.sendRedirect(request.getContextPath() + "/mytail.jsp");
            }else {
                response.sendRedirect(request.getContextPath() + "/index.jsp");
            }
        }else{
            response.sendRedirect(request.getContextPath() + "/index.jsp");
        }
    }
}

测验一波:
测验最后的结果是点击了保存后,关闭浏览器直接输入登录网址直接跳转到我的通讯录页面!

六、以表格形式显示出我的通讯录

首先创建一个JavaBean用来表示一个通讯录里人,将数据保存在请求域中,通过转发来实现数据的转移,然后在list.jsp中显示出数据。
在这里插入图片描述
这里也是JDBC代码,区别就是建立了一个容器,然后放到请求域转发到要显示数据的.jsp中显示出来,以下是tail.jsp的代码,用来以列表形式显示:

<%@ page import='bean.Tail' %>
<%@ page import='java.util.List' %>
<%@ page contentType='text/html;charset=UTF-8' language='java' %>
<html>
<head>
    <title>tail</title>
  <style type='text/css'>
    a{
      text-decoration: none;
      color:black;
    }
    a:hover{
      text-decoration: underline;
      color:pink;
      cursor:pointer;
      text-align: center;
    }
    table{
      border: 1px solid pink;
      border-collapse: collapse;
      height: 250px;
      width: 500px;
    }

  </style>
</head>
<body>
    <h1 align='center'>Mail Page</h1>
    <table align='center' border='1px'>
      <tr>
        <th align='center'>Username</th>
        <th align='center'>Password</th>
        <th align='center'>Phone</th>
        <th align='center'>Address</th>
        <th align='center' colspan='3'>Other Operation</th>
      </tr>
      <%
        List<Tail> tails = (List)request.getAttribute("tails");
        for(Tail tail:tails){
          String username = tail.getUsername();
          String password = tail.getPassword();
          String phone = tail.getPhone();
          String address = tail.getAddress();
          %>
      <tr>
        <td align='center'><%=username%></td>
        <td align='center'><%=password%></td>
        <td align='center'><%=phone%></td>
        <td align='center'><%=address%></td>
        <td align='center'>a</td>
        <td align='center'>b</td>
        <td align='center'>c</td>
      </tr>

      <%
        }
      %>
    </table>

<hr color='pink'>
<a href=''>添加通讯录</a>

</body>
</html>

效果展示:
在这里插入图片描述

七、实现增删改功能

增删改功能这里就不详写代码了,大概就是Servletjsp之间的转换,多次使用JDBCServlet用来操作数据,jsp用来显示数据!他们显示数据都是显示表格,也就是都跳转到**/tail/list**就可以了
效果图:
在这里插入图片描述
八、实现退出功能
在这里插入图片描述
然后跳转到登录页面即可!

具体代码

具体代码的话需要可以去我的gitee获取就行;
CRUD

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

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

相关文章

2022最新MySQL面试题-有详细完整的答案解析

MySQL专题面试题 MySQL中有哪些存储引擎&#xff1f; InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎&#xff0c;也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务&#xff0c;应该优先考虑InnoDB引擎。 MylSAM存储引擎 在MySQL 5.1及之前的…

操作简单的BI数据分析软件有哪些?实际体验如何?

使用者没有IT基础&#xff0c;不懂代码&#xff0c;又需要对大量复杂的数据进行深度分析&#xff1b;分析效率要高&#xff1b;报表要直观易理解&#xff1b;最好能让每个浏览者都自己动手做分析。现在市面上&#xff0c;能够满足这些要求的BI数据分析软件有哪些&#xff1f;实…

一文速通MybatisPlus

目录 Mybatis-plus简介 MP特性 框架的结构 MP快速入门 配置日志输出 主键生成策略 自动填充 方式一&#xff1a;数据库级别 方式二&#xff1a;代码控制级别(常用) 乐观锁和悲观锁 测试乐观锁单线程成功的例子 乐观锁多线程失败案例 查询操作 分页查询 删除操作 删除…

C++ 手动实现单向循环链表(课后作业版)

单向循环链表&#xff0c;并实现增删查改等功能 首先定义节点类&#xff0c;类成员包含当前节点的值&#xff0c; 指向下一个节点的指针 循环链表的尾节点指向头节点 节点定义&#xff1a; //node definition template <typename T> class Node { public:T value;Nod…

Vue的生命周期快速入门

图示 流程 new Vue()实例化一个vue实例&#xff0c;然后init初始化event 和 lifecycle&#xff0c; 其实这个过程中分别调用了3个初始化函数&#xff08;initLifecycle(), initEvents(), initRender()&#xff09;&#xff0c;分别初始化了生命周期&#xff0c;事件以及定义cr…

k8s 资源管理及查看命令

关注 迪答数据 公众号获取更多 技术/数据 干货文章 文章传送门&#xff1a;数据治理之指标体系管理 管理容器的计算资源 参考文档&#xff1a; Kubernetes Managing Compute Resources for Containers(opens new window)https://kubernetes.io/docs/concepts/configuration/m…

go slice 扩容机制

前言 go语言没有ArrayList这样的封装&#xff0c;但是官方原生提供slice&#xff0c;底层就是数组存储&#xff0c;并且能自动扩容&#xff0c;相较于ArrayList的默认10&#xff0c;扩容5&#xff0c;slice的逻辑是有区别的。slice默认容量0。 demo go版本号 huahuaMac-min…

第一章 数据库绪论

数据库绪论 数据管理的三个阶段 人工管理阶段 文件系统阶段 数据库系统阶段 基本术语 数据&#xff08;Data&#xff09; 计算机用来描述事物的记录&#xff08;文字&#xff0e;图形&#xff0e;图像&#xff0e;声音&#xff09;数据的形式本身并不能完全表达其内容&a…

Transformer Fusion for Indoor RGB-D Semantic Segmentation

如何聚合多尺度特征这是一个问题&#xff0c;现有的方法大多通过卷积来实现&#xff0c;而很少在特征融合的地方使用长距离依赖&#xff0c;因此对于大物体的分割就会有挑战。本文提出基于transformer的融合策略&#xff0c;来更好的建模上下文。 TransD-Fusion包含①&#xff…

SpringBoot SpringBoot 开发实用篇 6 监控 6.4 info 端点指标控制

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇6 监控6.4 info 端点指标控制6.4.1 问题引入6.4.2 info 端点指标控制…

CleanMyMac4.12最新版mac系统内存空间清理教程

CleanMyMac X可以优化Mac系统。mac系统用久了&#xff0c;用CleanMyMac清理一下效果还不错。可用来清理系统的缓存、日志、语言和垃圾文件&#xff0c;还能卸载应用程序。 Mac是不需要安装任何杀毒软件的&#xff0c;虽然不用杀毒&#xff0c;但是日常的清理还是有必要的&#…

单机高性能网络模型

传统网络模型 PPC和prefork 优点 实现简单 缺点 PPC&#xff1a;fork代价高&#xff0c;性能低父子进程通信要用IPC&#xff0c;监控统计等实现会比较复杂OS的上下文切换会限制并发连接数&#xff0c;一般几百 案例 世界上第一个Web服务器CERN httpd采用PPC模式Apache MP…

简单网页制作代码 HTML+CSS+JavaScript香港美食(8页)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Spring 5有哪些新特性?这份spring5高级编程带你深入剖析,直击P8!

spring Spring 框架可以说是Java 世界最为成功的框架&#xff0c;在企业实际应用中&#xff0c;大部分的企业架构都基于Spring 框架。它的成功来自于理念&#xff0c;而不是技术&#xff0c;它最为核心的理念是IoC &#xff08;控制反转&#xff09;和AOP &#xff08;面向切面…

Flutter高仿微信-第28篇-好友详情-查看个人头像

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.co…

Redis如何实现持久化(AOF、RDB、混合模式)的优缺点

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; Redis ❤️ 支持我&#xff1a;&#x1f44d;点赞 &#x1f33…

OpenStackds集群部署(一)

一、OpenStack简介 Openstack体系架构 1. Openstack服务之间的关系 2.体系架构 3. 硬件要求 4. 网络架构 1.1 什么是OpenStack OpenStack是把一堆计算机资源和一堆存储服务器放到世界上不同的地方&#xff0c;然后通过这个OpenStack提供的不同服务程序连接起来&#xff0…

Linux(基于Centos7)(二)

文章目录一、任务介绍二、任务实施三、任务扩展一、任务介绍 Linux服务器配置与管理&#xff08;基于Centos7.2&#xff09;任务目标&#xff08;一&#xff09; 实施该工单的任务目标如下&#xff1a; 知识目标 1、熟悉Linux文件权限的表示方法。 2、了解改变文件权限的两种…

使用内存技术实现 HTAP 的可行性

万籁 “俱寂” 时&#xff0c;一家知名 IT 研究与顾问咨询机构的发声&#xff0c;给关系型数据库这个平静的池塘丢了颗巨石&#xff1a;2014 年&#xff0c;Gartner 正式提出了 HTAP 这个概念。 Gartner’s definition in 2014: utilizes in-memory computing technologies to …

查阅必备----常用的SQL语句,配语句和图解超详细,不怕你忘记

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 **收录于专栏 数据库 ⭐查阅必备–常用的SQL语句⭐ 文章目录⭐查阅必备--常用的SQL语句⭐一&#xff0c;关键语句大全&am…