深入了解SSM框架(案例(SSM+Jsp) + 详细分析 + 思维导图)

news2024/11/22 16:02:40

1.Spring

Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。

Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地`new`一个对象,而是让Spring框架帮你来完成这一切。

2.SpringMVC

SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。

3.mybatis

mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据

4.执行流程

5.功能列表

新增
删除
修改
查询
分页

6.案例(用户管理)

 

 DAO(Data Access Object) 数据访问源

@Repository
public interface UserDao {

    /**
     * 根据id查询学生信息
     */
    @Select("select * from user where id = #{id} and id is not null")
    public User findOne(Integer id);

    @Select("select * from user limit 2")
    public List<User> findAll();

    @Insert("insert into user values(null,#{username},#{phone},#{password},#{email})")
    public int insertOne(User user);

    @Delete("delete from user where id = #{id}")
    public int deleteOne(Integer id);

    @Update("update user set username=#{username},phone=#{phone},password=#{password},email=#{email} where id = #{id}")
    public int updateOne(User user);

    @Select("select count(*) from user")
    public int totalCount();

    @Select("select * from user limit #{begin},#{size}")
    public List<User> findAllByPagination(@Param("begin") int begin, @Param("size") int size);

    @Select("<script>select * from user\n" +
            "   <where>\n" +
            "<if test=\"user != null\">\n"+
            "   <if test=\"user.username != null and user.username != ''\">\n" +
            "       username like #{user.username}\n" +
            "   </if>\n" +
            "   <if test=\"user.phone != null and user.phone != ''\">\n" +
            "       phone = #{user.phone}\n" +
            "   </if>\n" +
            "   <if test=\"user.email != null and user.email != ''\">\n" +
            "       email = #{user.email}\n" +
            "   </if>\n" +
            "</if>\n"+
            "</where>\n" +
            "limit #{begin},#{size}</script>")
    public List<User> findByCondition(@Param("user") User user, @Param("begin") int begin, @Param("size") int size);
}

Service业务逻辑层

接口

public interface UserService {
    public User findOne(Integer id);

    public boolean insertOne(User user);


    public boolean deleteOne(Integer id);

    public boolean updateOne(User user);

    public List<User> findAll();

    public int totalCount();

    public PageBean<User> findAllByPagination(int currentPage, int pageSize);

    public PageBean<User> findByCondition(User user, int currentPage, int pageSize);
}

实现

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public User findOne(Integer id) {
        return userDao.findOne(id);
    }

    @Transactional(rollbackFor = {Exception.class})
    @Override
    public boolean insertOne(User user) {
        return userDao.insertOne(user) > 0;
    }

    @Transactional(rollbackFor = {Exception.class})
    @Override
    public boolean deleteOne(Integer id) {
        return userDao.deleteOne(id) > 0;
    }

    @Transactional(rollbackFor = {Exception.class})
    @Override
    public boolean updateOne(User user) {
        return userDao.updateOne(user) > 0;
    }

    @Override
    public List<User> findAll() {
        return userDao.findAll();
    }

    @Override
    public int totalCount() {
        return userDao.totalCount();
    }

    @Override
    public PageBean<User> findAllByPagination(int currentPage, int pageSize) {
        int begin = (currentPage - 1) * pageSize;
        List<User> users = userDao.findAllByPagination(begin, pageSize);
        int totalCount = this.totalCount();
        return new PageBean<>(users, totalCount);
    }

    @Override
    public PageBean<User> findByCondition(User user, int begin, int size) {
        if (!Objects.isNull(user)) {
            if (user.getUsername() != null && !(" ").equals(user.getUsername()) && user.getUsername().length() > 0){
                user.setUsername("%"+user.getUsername()+"%");
            }
        }
        List<User> list = userDao.findByCondition(user, begin, size);
        int totalCount = this.totalCount();
        return new PageBean<>(list,totalCount);
    }
}

Controller(视图控制层)

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/list")
    public String list(HttpSession session) {
        List<User> users = userService.findAll();
        session.setAttribute("users", users);
        int recordsCount = userService.totalCount();
        session.setAttribute("count", recordsCount);
        session.setAttribute("currentPage", 1);
        return "userlist";
    }


    @GetMapping("/addUser")
    public String showAdd() {
        return "addUser";
    }

    @PostMapping("/addUser")
    public String showList(User user, HttpSession session) {
        userService.insertOne(user);
        return list(session);
    }

    @GetMapping("/delUser")
    public String showList2(User user, HttpSession session) {
        userService.deleteOne(user.getId());
        return list(session);
    }

    @GetMapping("/echo")
    public String echoUser(Integer id, Model model) {
        User user = userService.findOne(id);
        model.addAttribute("user", user);
        return "updUser";
    }

    @PostMapping("/updUser")
    public String updUser(User user, HttpSession session) {
        userService.updateOne(user);
        return list(session);
    }

    @GetMapping("/pagination")
    public String queryAllByPagination(@RequestParam("begin") int currentPage,
                                       @RequestParam("size") int pageSize,
                                       HttpSession session) {
        PageBean<User> userPageBean = userService.findAllByPagination(currentPage, pageSize);
        setProps(userPageBean, session, currentPage);
        return "userlist";

    }

    @GetMapping("/condition")
    public String findByCondition(@RequestParam(value = "user",required = false) User user,
                                  @RequestParam(value = "begin", defaultValue = "1") int currentPage,
                                  @RequestParam(value = "size", defaultValue = "2") int pageSize,
                                  HttpSession session) {
        if (user != null) {
            session.setAttribute("u", user.getUsername());
            session.setAttribute("p", user.getPhone());
            session.setAttribute("e", user.getEmail());
        }
        PageBean<User> userPageBean = userService.findByCondition(user, currentPage, pageSize);
        setProps(userPageBean, session, currentPage);
        return "userlist";
    }

    private void setProps(PageBean<User> userPageBean, HttpSession session, int currentPage) {
        List<User> users = userPageBean.getRows();
        int totalCount = userPageBean.getTotalCount();
        session.setAttribute("users", users);
        session.setAttribute("count", totalCount);
        session.setAttribute("currentPage", currentPage);
    }
}

Jsp页面展示

用户列表

<%@ page import="com.axu.pojo.User" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户列表</title>
    <style>
        form{
            margin-left: 50%;
            transform: translate(-35%);
        }
        #footer{
            display: flex;
            justify-content: space-around;
        }
    </style>
</head>
<body>
<h1 align="center">用户列表信息</h1>
<form action="/condition" method="get">
    <input type="text" name="username" placeholder="请输入您要查询的用户名">
    <input type="text" name="phone" placeholder="请输入您要查询的用户的手机号">
    <input type="text" name="email" placeholder="请输入您要查询的用户的邮箱">
    <input type="submit" value="查询">
</form>
<button style="margin-left: 95%"><a href="/addUser">新增</a></button>
<table align="center" border="1px solid #000" cellpadding="3px" cellspacing="0">
    <tr align="center">
        <th width="150px">id</th>
        <th>用户名</th>
        <th>手机号</th>
        <th>密码</th>
        <th>邮箱</th>
        <th>操作</th>
    </tr>
    <%
        List<User> users = (List<User>) session.getAttribute("users");
        for (User user : users) {

    %>
    <tr align="center">
        <td><%=user.getId()%>
        </td>
        <td><%=user.getUsername()%>
        </td>
        <td><%=user.getPhone()%>
        </td>
        <td><%=user.getPassword()%>
        </td>
        <td><%=user.getEmail()%>
        </td>
        <td>
            <button><a href=/echo?id=<%=user.getId()%>>编辑</a></button>&nbsp;&nbsp;&nbsp;&nbsp;<button><a
                href=/delUser?id=<%=user.getId()%>>删除</a></button>
        </td>
    </tr>
    <%
        }
    %>
</table>
<div style="padding-left: 62%;color: orange">总计:<%=session.getAttribute("count")%>条数据</div>
<div id="footer">
    <div>
        页码:

    <button><a
            href="/condition?username=<%=session.getAttribute("u")%>&phone=<%=session.getAttribute("p")%>&email
            =<%=session.getAttribute("e")%>&begin=1&size=2">1
    </a></button>
        <button><a
                href="/condition?username=<%=session.getAttribute("u")%>&phone=<%=session.getAttribute("p")%>&email
            =<%=session.getAttribute("e")%>&begin=2&size=2">2
        </a></button>
        <button><a
                href="/condition?username=<%=session.getAttribute("u")%>&phone=<%=session.getAttribute("p")%>&email
            =<%=session.getAttribute("e")%>&begin=3&size=2">3
        </a></button>
        <button><a
                href="/condition?username=<%=session.getAttribute("u")%>&phone=<%=session.getAttribute("p")%>&email
            =<%=session.getAttribute("e")%>&begin=4&size=2">4
        </a></button>
    </div>
    <div>默认显示<font color="orange">2</font>条数据</div>
</div>
<div style="margin-left: 19%">第 <font color="red"><%=session.getAttribute("currentPage")%></font> 页</div>
</body>
</html>

新增用户信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加用户</title>
</head>
<body>
<h1>添加用户信息</h1>
<form action="/addUser" method="post">
    <input type="text" name="username" placeholder="请输入用户名"><br>
    <input type="text" name="phone" placeholder="请输入手机号"><br>
    <input type="password" name="password" placeholder="请输入密码"><br>
    <input type="text" name="email" placeholder="请输入邮箱"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

更新用户信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户修改</title>
</head>
<body>
<h1>修改用户信息</h1>
<form action="/updUser" method="post">
    <input type="hidden" name="id" value="${user.id}"><br>
    <input type="text" name="username" placeholder="请输入用户名" value="${user.username}"><br>
    <input type="text" name="phone" placeholder="请输入手机号" value="${user.phone}"><br>
    <input type="password" name="password" placeholder="请输入密码" value="${user.password}"><br>
    <input type="text" name="email" placeholder="请输入邮箱" value="${user.email}"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

7.思维导图

 8.分析

分层思想很重要,以上的代码耦合性还是很重,分层让代码变得简洁、见名知意、易维护,降低了维护成本,为什么要降低代码的耦合性?首先耦合性高的情况下,代码不易维护,牵一发而动全身,动一处,可能就会导致整个项目瘫痪,大大提高了时间成本,SSM框架的分层思想,大大降低了代码的耦合性, 方便Code View以及Code refactoring(重构)!!!

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

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

相关文章

swagger 接口测试,用 python 写自动化时该如何处理?

在使用Python进行Swagger接口测试时&#xff0c;可以使用requests库来发送HTTP请求&#xff0c;并使用json库和yaml库来处理响应数据。以下是一个简单的示例代码&#xff1a; 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站百万播…

vim编辑器基本使用

一、写在前面 今天在练习git相关操作时&#xff0c;无意间发现当你使用commit命令提交代码时&#xff0c;忘记添加备注信息会自动进入一个奇怪的模式&#xff0c;按esc键亦或是ctrlC都无法退出&#xff0c;这个奇怪的模式也就是vim编辑器。如下图&#xff1a; vim是一种文本…

前端工程化-VUE

前端工程化-VUE Vue-cliNode.js1&#xff0e;什么是Node.js2&#xff0e;Node.js的安装 高效的开发离不开基础工程的搭建。本章主要介绍如何使用Vue进行实际SPA项目的开发&#xff0c;这里使用的是目前热门的JavaScript应用程序模块打包工具Webpack&#xff0c;进行模块化开发、…

嵌入式C语言中if/else如何优化详解

观点一&#xff08;灵剑&#xff09;&#xff1a; 前期迭代懒得优化&#xff0c;来一个需求&#xff0c;加一个if&#xff0c;久而久之&#xff0c;就串成了一座金字塔。 当代码已经复杂到难以维护的程度之后&#xff0c;只能狠下心重构优化。那&#xff0c;有什么方案可以优雅…

Spring 源码解析 - FactoryBean 获取 Bean 过程

一、FactoryBean FactoryBean是Spring框架提供的一个核心接口之一&#xff0c;用来创建复杂或无法通过默认构造函数创建的对象。这种情况下通过实现FactoryBean接口&#xff0c;可以自定义实例化Bean的过程&#xff0c;包括Bean的对象类型、初始化、销毁等。 在应用场景中&am…

RK3588平台开发系列讲解(进程篇)程序的二进制格式 ELF

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、ELF 文件二、二进制文件组成三、运行程序为进程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢CPU 是不能执行文本文件里面的指令的,这些指令只有人能看懂,CPU 能够执行的命令是二进制的,比如“0101”…

Selenium还能这么玩:自动管理浏览器

这是个系列文章&#xff0c;主要讲selenium一些实战操作&#xff0c;使用 Python 编写代码。可以把他们应用到自动化测试&#xff0c;也可以应用到网络爬虫中。 这篇文章介绍一个操作&#xff0c;可以让selenium 控制浏览器共用同一个 session。他的应用场景是&#xff1a;共用…

pwn3-绕过防御-ROP(1)

**ROP&#xff1a;**全程Return Oriented Programming(面向返回的编程)&#xff0c;在栈溢出基础上&#xff0c;利用程序中已有的小片段(gadgets)&#xff0c;改变寄存器或变量的值&#xff0c;从而控制程序执行流程&#xff0c;从而绕过NX防御&#xff0c;常见有ret2text,ret2…

Linux:samba服务 (smbd)

smb服务器为centos7 使用的yum安装&#xff08;如果不会搭建本地yum仓库可以查看&#xff09; Linux&#xff1a;rpm查询安装 && yum安装_鲍海超-GNUBHCkalitarro的博客-CSDN博客 samba 简介 samba 使用了 1.SMB 协议 Server Message Block&#xff0c;服务消息块 2…

【LeetCode】769. 最多能完成排序的块

769. 最多能完成排序的块&#xff08;中等&#xff09; 方法一&#xff1a;贪心 思路 由于arr是[0,..., n-1] 的一个排列&#xff0c;若已遍历过的数中的最大值 max 与当前遍历到的下标相等&#xff0c;说明可以进行一次分割&#xff0c;累加答案。 代码 class Solution { …

javaScript蓝桥杯---用什么来做计算

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 古以算盘作为计算工具。算盘常为木制矩框&#xff0c;内嵌珠子数串&#xff0c;定位拨珠&#xff0c;可做加减乘除等运算。站在前人的肩膀上&#xff0c;后人研究出计算器&#xff0c;便利了大家的生活&#xff0c;我…

从贝叶斯派的角度去看L1和L2

前沿 推导的两个角度 带约束条件的优化求解&#xff08;拉格朗日乘子法&#xff09;贝叶斯学派的&#xff1a;最大后验概率 理解的两个角度 贝叶斯学派的角度&#xff0c;L2参数符合高斯先验&#xff0c;L1参数符合laplace先验。从有约束问题角度&#xff0c;用拉格朗日转换…

一“幕”了然 ,平行云助力中车打造“掌上工厂”(文末活动报名)

“全球工业生产效率提高1%&#xff0c;成本降低300亿。” 所以工业界有这样一种说法&#xff0c;叫做“工业领域的1%革命”。 Gartner曾预言&#xff1a;到2021年&#xff0c;将有一半的大型工业公司使用数字孪生技术&#xff0c;而这可以使这些公司的生产有效性提高10%。如今…

rust学习 - 构建mini 命令行工具

rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为构建命令行程序的最佳选择。 实现一个命令行搜索工具grep,可以在指定文件中搜索指定的字符串。想实现这个功能呢&#xff0c;可以按照以下逻辑流程处理&#xff1a; 获取输入文件路径、需要搜索的字符串读取文…

基于Alexnet网络实现猫狗数据集分类(Keras框架)

目录 1、作者介绍2、Alexnet网络2.1 网络介绍2.2 AlexNet网络的主要特点 3、基于Alexnet网络实现猫狗数据集分类3.1 猫狗大战数据集3.2 数据集处理3.3 准备工作3.4 训练过程3.4 对比实验3.4.1 HALCON平台下的Alexnet实验3.4.2 HALCON平台下的Resnet-50对比实验3.4.3 HALCON平台…

进程的通信——管道和共享内存

进程间的通信有很多种 管道 匿名管道pipe 命名管道 System V IPC System V 消息队列 System V 共享内存 System V 信号量 POSIX IPC 消息队列 共享内存 信号量 互斥量 条件变量 读写锁 这篇文章主要介绍管道和共享内存 管道 管道内核数据结构&#xff1a;在Linux2.6中 struct …

搭建自动化测试环境

目录 1、安装Python并配置环境变量。2、安装Pycharm开发工具。3、安装Selenium4、安装浏览器&#xff1a;Chrome和Firefox的其中之一。5、浏览器驱动&#xff1a;下载Chrome浏览器驱动或者是Firefox浏览器驱动。6、配置webdriver公众号粉丝福利 自动化测试环境&#xff1a; Pyt…

接口反应慢优化

遇到某个功能&#xff0c;页面转圈好久&#xff0c;需要优化 1.F12 查看接口时间 2.看参数 总共耗时9.6s Waiting for sercer response 时间是2秒 Content Download 7秒 慢在Content Download F12查看接口响应 显示Failed to load response data:Request content was e…

这些10款优秀的交互设计软件,你知道吗?

交互软件可以帮助设计师从“可用性”和“用户体验”的角度优化他们的作品。如果设计师想创建一个令人满意的交互设计作品&#xff0c;一个方便的交互设计软件是必不可少的。 根据设计师的个人喜好和方便&#xff0c;选择易于使用的交互设计软件来完成创建。本文盘点十款易于使…

【P55】JMeter 图形结果(Graph Results)

文章目录 一、图形结果&#xff08;Graph Results&#xff09;参数说明二、准备工作三、测试计划设计 一、图形结果&#xff08;Graph Results&#xff09;参数说明 可以以图形的方式查看和分析相关指标 使用场景&#xff1a;一般在调试测试计划期间用来查看相关指标&#xf…