【JSP/Servlet】基于WEB的通讯录系统
创始人
2024-02-11 07:34:20

巩固JSP/Servlet

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

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

系统开发描述步骤

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

系统功能描述

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

一、创建一个登录页面

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
welcome
用户名:
密码   :
保存用户名和密码

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

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

写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*/@Overrideprotected 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' %>

error


登录失败,请/index.jsp'>返回

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

五、利用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 {@Overrideprotected 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' %>

tail

Mail Page

<%List 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();%><%}%>
UsernamePasswordPhoneAddressOther Operation
<%=username%><%=password%><%=phone%><%=address%>abc

添加通讯录

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

七、实现增删改功能

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

具体代码

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

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...