基于MVC+三层架构实现—SMS_登陆注册

做了一个简单的登录注册系统,基于MVC+三层架构的模式,关于MVC+三层架构模式的理解可以看这篇博客 https://blog.csdn.net/w_linux/article/details/79919523


下面是开发全过程

项目目录

这里写图片描述

一、创建数据库(MySQL)

create database sms;use sms;create table student(id int(5) primary key auto_increment,num varchar(5),password varchar(32),name varchar(32),age int(3),score double);
#插入一条记录用来之后的测试
insert into student(id,num,password,name,age,score)values(1,0001,123,'linjie',21,99);

这里写图片描述


二、JavaBean创建

因为在三层架构中View层、Service层、Dao层各司其职,而在MVC中三者model、view、controller三者合起来算是三层架构中的View层,JavaBean相当于model用来承载数据

package linjie.com.beans;import java.io.Serializable;public class Student implements Serializable {private Integer id;         //学生IDprivate String num;         //学号private String name;        //姓名private String password;    //密码private int age;            //年龄private double score;       //成绩//无参构造器public Student() {super();}//带参构造器public Student(String num, String name, int age, double score) {super();this.num = num;this.name = name;this.password = password;this.age = age;this.score = score;}//setters/getterspublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNum() {return num;}public void setNum(String num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}}

三、建立login.jsp

从三层架构里的View层开始上面JavaBean已经完成,现在就是MVC中的view了,当然我这里是用已经完成得项目来写,所以里面有些并没有出现的东西,不需要惊讶。

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SMS登录页面</title>
</head>
<body>${message }<br><form action="${pageContext.request.contextPath }/loginservlet" method="POST">学号:<input type="text" name="num"/><br>密码:<input type="password" name="password"/><br><input type="submit" value="登录"></form><a href="${pageContext.request.contextPath }/toRegisterServlet">注册</a>
</body>
</html>

四、建立LoginServlet.java(servlet)

model和view写完了,就要写控制器了,servlet就是控制器

控制器中的步骤如下

  • 接收请求参数
  • 创建Service对象
  • 调用Service对象的chaeckUser()方法对用户进行验证
  • 验证通过和未通过情况分析

    package linjie.com.servlets;import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;import linjie.com.beans.Student;
    import linjie.com.service.IStudentService;
    import linjie.com.service.StudentServiceImpl;public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1、接收请求参数String num = request.getParameter("num");String password = request.getParameter("password");//获取SessionHttpSession session = request.getSession();if(num==null || "".equals(num.trim())) {session.setAttribute("message", "学号输入有误");response.sendRedirect(request.getContextPath()+"/login.jsp");return;}if(password==null || "".equals(password.trim())) {session.setAttribute("message", "密码输入有误");response.sendRedirect(request.getContextPath()+"/login.jsp");return;}//2、创建Service对象IStudentService service = new StudentServiceImpl();//3、调用Service对象的chaeckUser()方法对用户进行验证Student student = service.checkUser(num,password);//4、验证未通过,则跳转到登录页面,让用户再次输入登录信息。此时页面需要给出用户一些提示if(student==null) {session.setAttribute("message", "用户名或密码输入有误");response.sendRedirect(request.getContextPath()+"/login.jsp");return;}//4、验证通过,则跳转到系统主页index.jspsession.setAttribute("welcomeUser", num);response.sendRedirect(request.getContextPath()+"/index.jsp");}}
    

注意一:

if(num == null || "".equals(num.trim()))

num==null防止用户直接通过地址栏访问,而不是通过表单输入

“”.equals(num.trim())防止用户输入空串

注意二:

为什么要在servlet中创建Service对象?

因为该项目是MVC+三层架构模型,所以servlet属于控制器,而系统业务逻辑需要在service中写(这里指验证用户请求参数),所以需要创建Service对象


五、消除servlet中的异常——>建立service接口以及其实现类

因为在servlet中已经创建了service对象,然而并没有创建这个接口以及其实现类。所以需要通过ctrl+1来消除servlet异常,并创建相应的接口或实现类

IStudentService接口

第二个saveStudent方法是之后用到的

package linjie.com.service;import linjie.com.beans.Student;public interface IStudentService {//对用户进行验证   Student checkUser(String num, String password);//向DB中添加StudentInteger savaStudent(Student student);}

StudentServiceImpl实现类

package linjie.com.service;import linjie.com.beans.Student;
import linjie.com.dao.IStudentDao;
import linjie.com.dao.StudentDaoImpl;public class StudentServiceImpl implements IStudentService {private IStudentDao dao;public StudentServiceImpl() {dao = new StudentDaoImpl();}@Overridepublic Student checkUser(String num, String password) {return dao.selectStudentLogin(num,password);}@Overridepublic Integer savaStudent(Student student) {return dao.insertStudent(student);}}

六、消除StudentServiceImpl中的异常——>创建Dao层(需要写jdbc工具类)

其实到这里就已经很清晰了,是一个很清楚的三层架构

IStudentDao接口

package linjie.com.dao;import linjie.com.beans.Student;public interface IStudentDao {Student selectStudentLogin(String num, String password);Integer insertStudent(Student student);}

StudentDaoImpl实现类

到这里要注意,Dao层是要做什么的,是要与数据库来取得联系的,所以,这里应该先定义一个jdbc工具类,再写Dao层实现类

jdbcUtil.java
package linjie.com.utils;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class jdbcUtil {//加载DB驱动static {try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}private static Connection conn;//获取Connection对象public static Connection getConnection() throws SQLException {String url="jdbc:mysql://localhost:3306/sms";String user="root";String password="1111";if(conn==null || conn.isClosed()) {conn=DriverManager.getConnection(url,user,password);}return conn;}//关闭资源public static void close(Connection conn,Statement stmt,ResultSet rs) throws SQLException {if(conn!=null && !conn.isClosed()) {conn.close();}if(stmt!=null && !stmt.isClosed()) {stmt.close();}if(rs!=null && !rs.isClosed()) {rs.close();}}
}
StudentDaoImpl实现类
package linjie.com.dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import linjie.com.beans.Student;
import linjie.com.utils.jdbcUtil;public class StudentDaoImpl implements IStudentDao {private Connection conn;private Statement stmt;private PreparedStatement ps;private ResultSet rs;@Overridepublic Student selectStudentLogin(String num, String password) {Student student=null;try {conn = jdbcUtil.getConnection();String sql = "select * from student where num=? and password=? ";ps = conn.prepareStatement(sql);ps.setString(1, num);ps.setString(2, password);rs=ps.executeQuery();if(rs.next()) {student = new Student();student.setId(rs.getInt("id"));student.setNum(rs.getString("num"));student.setName(rs.getString("name"));student.setPassword(rs.getString("password"));student.setAge(rs.getInt("age"));student.setScore(rs.getDouble("score"));}} catch (SQLException e) {e.printStackTrace();} finally {try {jdbcUtil.close(conn, ps, rs);} catch (SQLException e) {e.printStackTrace();}}return student;}@Overridepublic Integer insertStudent(Student student) {Integer id =null;try {conn = jdbcUtil.getConnection();String sql="insert into student(num,password,name,age,score) values(?,?,?,?,?)";ps=conn.prepareStatement(sql);ps.setString(1, student.getNum());ps.setString(2, student.getPassword());ps.setString(3, student.getName());ps.setInt(4, student.getAge());ps.setDouble(5, student.getScore());ps.executeUpdate();sql="select @@identity newID";ps = conn.prepareStatement(sql);rs = ps.executeQuery();if(rs.next()) {id = rs.getInt("newID");}} catch (SQLException e) {e.printStackTrace();} finally {try {jdbcUtil.close(conn, ps, rs);} catch (SQLException e) {e.printStackTrace();}}return id;}}

七、register.jsp创建

登录差不多实现了,下面是注册功能,和登录差不多

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SMS注册页面</title>
</head>
<body>${message }<br><form action="${pageContext.request.contextPath }/registerServlet" method="POST">学号:<input type="text" name="num"/><br>密码:<input type="password" name="password"/><br>姓名:<input type="text" name="name"/><br>年龄:<input type="text" name="age"/><br>成绩:<input type="text" name="score"/><br><input type="submit" value="注册"></form>
</body>
</html>

八、ToRegisterServlet

在登录页面跳转到注册页面的时候,因为涉及到跳转,如果是严格按照MVC的话,需要创建一个servlet,然后在servlet中重定向或请求转发到注册页面,也可以不严格的直接跳转注册页面

package linjie.com.servlets;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ToRegisterServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.sendRedirect(request.getContextPath()+"/register.jsp");}}

九、RegisterServlet

package linjie.com.servlets;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import linjie.com.beans.Student;
import linjie.com.service.IStudentService;
import linjie.com.service.StudentServiceImpl;public class RegisterServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//解决中文乱码request.setCharacterEncoding("UTF-8");//1、获取表单参数String num = request.getParameter("num");String password = request.getParameter("password");String name = request.getParameter("name");String ageStr=request.getParameter("age");String scoreStr = request.getParameter("score");Integer age = Integer.valueOf(ageStr);Double score = Double.valueOf(scoreStr);//创建student对象Student student = new Student(num,name,age,score);student.setPassword(password);//创建service对象IStudentService service = new StudentServiceImpl();//调用service对象的saveStudent()方法,将数据写入DBInteger id = service.savaStudent(student);//写入失败if(id == null) {HttpSession session = request.getSession();session.setAttribute("message", "没有注册成功");response.sendRedirect(request.getContextPath()+"/register.jsp");}//写入成功response.sendRedirect(request.getContextPath()+"/login.jsp");}}

十、

然后继续是service层、Dao层的使用,因为上述代码已经包含register的相关代码,这里不多做阐述了。

十一、总结

1、代码并不难,但是主要是理解了MVC+三层架构具体是如何应用的

2、在开发这个简单的项目过程中,其实出现了很多问题,比如不小心把sql文件给Build path了,结果半天没弄出来哪错了。还有就是版本的问题

源码我已经放到github了,可自行下载
https://github.com/ash-ali/SMS_LR

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

harmonyos鸿蒙,鸿蒙HarmonyOS应用权限列表大全

HarmonyOS的应用权限严格按照权限分类分级模型进行定义,如图1所示,具体过程可分为三步: 1、根据不同应用所需实现的功能,明确接口是否需要对外开放。 2、根据接口所涉数据的敏感程度或所涉能力的安全威胁影响,对所有的开放接口进行分级(包括中、低、高、严重)。不对外开放…

小米网关接入Homekit完整教程

Hi 米娜桑&#xff0c;通过我艰苦不懈的追踪发现&#xff0c;绿米智能家庭产品现在也是可以部分支持Homekit啦~ 起因是我发现了这个&#xff1a; https://github.com/snOOrz/homebridge-aqara 然后我又跳转到了这 https://github.com/nfarina/homebridge 那么&#xff0c;我就…

Shot边界检测----2001-2007TRECVID比赛算法总结

概述 Shot边界检测&#xff08;Shot boundary detection &#xff0c;SBD&#xff09;指在视频中自动检测镜头的边界&#xff0c;是视频分析&#xff0c;视频索引&#xff0c;视频摘要&#xff0c;视频搜索和其他基于内容的视频操作的基本的预处理步骤。自动SBD是2001至2007年…

IJCAI探营第一天 6个Tutorial 和13个Workshop为什么都“挤在” RMIT 80号楼?

雷锋网消息&#xff1a;今天是IJCAI大会&#xff08;国际人工智能联合会议&#xff09;的第一天&#xff0c;在寒冷的墨尔本&#xff0c;雷锋网(公众号&#xff1a;雷锋网)的记者来到这里为大家带来大会的最新报道。 大会的前两天在墨尔本皇家理工大学&#xff08;RMIT&#xf…

每日区块链:区块链需求增加,Nvidia有望获得巨额利润;澳洲大学建立世界首家区块链社会科学研究中心

1、区块链需求增加&#xff0c;Nvidia有望获得巨额利润 如今&#xff0c;许多公司已经开始采用区块链技术。市场报告称&#xff0c;区块链市场规模很可能从去年的2.102亿美元增长至2021年的23.125亿美元。 尽管区块链的主要目标是银行、支付系统和金融机构&#xff0c;但其他公…

博士申请 | 皇家墨尔本理工大学鲍芝峰教授招收数据挖掘方向全奖博士生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 皇家墨尔本理工大学 皇家墨尔本理工大学&#xff08;Royal Melbourne Institute of Technol…

RMIT大学“3D打印”创造美好未来-“私人订制”人体骨骼!

-患上恶性骨肿瘤&#xff0c;需要去掉坏骨头&#xff0c;找到替代品植入。但传统假体无法满足患者缺损的精细化要求&#xff0c;经常因为不匹配导致功能障碍。现在通过3D打印的技术将可以改变这一切。 近日&#xff0c;RMIT教授Milan Brandt正在与专家Peter Choong一起开发一项…

阿德莱德计算机专业本科,最新全球高校CS专业排名出炉!想学IT的不能错过这几所澳洲高校!...

近年来&#xff0c;如果被问到哪个专业在世界范围内都“吃香”&#xff0c;那么与计算机相关的专业一定是标准答案&#xff01; 随着社会发展越来越发达&#xff0c;关于计算机类领域的发展可谓是在不断的加速。人工智能、互联网技术存在于日常生活的方方面面。与之相关的信息安…

RMIT阿里UTS中山提出Target-aware Transformer,进行one-to-all知识蒸馏!性能SOTA

关注公众号&#xff0c;发现CV技术之美 本文分享 CVPR 2022 Oral 的一篇论文『Knowledge Distillation via the Target-aware Transformer』&#xff0c;由RMIT&阿里&UTS&中山提出Target-aware Transformer&#xff0c;进行one-to-all知识蒸馏&#xff01;性能SOTA…

悉尼大学计算机工程专业世界排名,2019QS澳洲计算机专业排名,7所大学进入世界百强!...

原标题&#xff1a;2019QS澳洲计算机专业排名&#xff0c;7所大学进入世界百强&#xff01; 说起计算机专业&#xff0c;很多学生会联想到好就业薪水丰厚&#xff0c;不仅是国内&#xff0c;在全球来看&#xff0c;计算机专业人才都非常受欢迎&#xff0c;所以这几年出国留学就…

澳洲转专业学计算机,刚来澳洲留学,我就想转专业!(附转专业攻略)

原标题&#xff1a;刚来澳洲留学&#xff0c;我就想转专业&#xff01;(附转专业攻略) 粥粥最近遇到有朋友问&#xff1a; 澳洲留学可以转学或者转专业不&#xff1f; 这个嘛~ 相信有部分小伙伴在出国留学后&#xff0c; 也可能会遇到过这样的问题。 有的因为感觉专业不适合自己…

rmit计算机科学,更好的选择,更好的未来 —专访RMIT计算机科学Dr. Fengling Han

原标题&#xff1a;更好的选择&#xff0c;更好的未来 —专访RMIT计算机科学Dr. Fengling Han RMIT的计算机专业不仅在世界排名中位于前一百&#xff0c;在计算机行业&#xff0c;也因其课程实用性和雇主满意度而享有很高的声誉&#xff0c;本次RMIT科学工程和健康学院的中国研…

澳洲计算机设计专业大学排名,澳洲设计专业大学排名TOP5

众所周知&#xff0c;澳大利亚是移民大国&#xff0c;移民来自全球100多个国家。其丰富的移民文化使澳大利亚的艺术氛围浓厚而独特&#xff0c;也因此吸引着越来越多的艺术学子前来就读。那么&#xff0c;你知道去澳洲学设计专业可以选择哪些院校吗&#xff1f;下述就是美行思远…

rmit计算机科学选课,RMIT最强最全的IT Master选课指南,“鼠”于你的高分秘籍!...

RMIT的IT课程设计十分地人性化&#xff0c;每个学期的课程根据自身知识的储备的不同会有多个方向的选择。但是&#xff0c;如果对自己的了解不够深入&#xff0c;或者对课程的英语描述不清楚的同学很容易踩雷。所以RMIT的学霸学长根据自己的经验将每个学期的课程分别从&#xf…

手把手教你用鸿蒙HarmonyOS实现微信聊天界面(二)

简介 本系列文章记录作者大三开学第一个月中学习HarmonyOS移动应用开发学习经历&#xff0c;此篇为《微信聊天界面》项目&#xff0c;实现功能有 1、聊天信息功能&#xff0c;包括图片、文字 2、发送定位功能 3、选择发送本机图片功能 4、拍照并发送图片功能 如果在真机调试…

鸿蒙2.0开始推送,华为OS首次登陆手机,亮点槽点都在这里

贾浩楠 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 很快啊&#xff01;华为鸿蒙2.0&#xff0c;这就来了。 目前&#xff0c;鸿蒙2.0已经开放公测&#xff0c;不少华为用户已经开始上手体验了。 据华为消费者业务软件部总裁王成录表示&#xff0c;今年6月初&#xff0c;华为…

2023年人工智能行业研究报告

第一章 行业概况 1.1 定义和分类 人工智能&#xff08;ArtificialIntelligence, AI&#xff09;是一个广泛的计算机科学分支&#xff0c;它致力于创建和应用智能机器。在更深入的层次上&#xff0c;人工智能可以被理解为以下几个方面&#xff1a; 学习和适应&#xff1a;人工…

梭哈大模型,阿里云成了跟风者?

伴随AI大模型潘多拉魔盒打开&#xff0c;云市场GameChanger已到来。对阿里云这个昔日老大哥而言&#xff0c;从“领先者”变为“跟风者”&#xff0c;是否还有机会去重塑行业规则&#xff1f; 这可能是张勇全面掌舵阿里巴巴7年以来&#xff0c;事关未来最重要的一次“梭哈”。 …

国产AI算力芯片简介-2023年

Q&#xff1a;GPGPU和ASIC芯片在AI算力中分别承担什么样的角色&#xff1f; A&#xff1a;早期开放框架基于GPGPU架构实现&#xff0c;因此软件生态更为成熟&#xff0c;对于初级客户来说&#xff0c;上手使用更加方便。GPGPU的通用性也更好&#xff0c;架构更加适合AI中针对模…