SSM框架模板

SSM(Spring、SpringMVC、MyBatis)

首先对Spring框架和mybatis框架进行整合:(需要进行测试,是否获取到数据库的内容,才能进行下一步对Springmvc框架的整合)

目录结构:

pom.xml文件的模板:

最开始需要做的是导入依赖包,在pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>SSM_2</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>


  <dependencies>
<!--    单元测试包-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

<!--    最常用的包,这个包包括core,beans,-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.18</version>
    </dependency>
<!--Spring-beans包,bean标签-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.3.18</version>
    </dependency>
<!--jdbc包,进行数据库操作的包-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.3.18</version>
    </dependency>
<!--事务管理包-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.3.18</version>
    </dependency>
<!--数据库源的包-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.28</version>
    </dependency>
<!--进行mybatis操作的包-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>

<!--    mybatis-spring的包,进行整合的包-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.6</version>
    </dependency>

  </dependencies>

<!--  这个是IDEA必须存在的,指在用途是告诉IDEA,Mapper.xml文件的位置,因为一般默认情况下IDEA是不会去Java目录的,尽管你添加Java路径都没用-->
  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
    </resources>
  </build>

</project>

applicationContext.xml文件模板:

导入依赖包pom.xml文件之后,配置applicationContext.xml文件,进行连接数据库、事件管理,以及配置Mapper文件和mybatis的映射。(三步,最后一步映射需要在创建mybatis核心配置文件和Mapper文件之后再去配置。)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">

    <!--由spring管理    配置数据源数据库连接(从jdbc属性文件中读取参数) -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="jdbc:mysql://localhost:3307/student?serverTimezone=Asia/Shanghai"/>
        <property name="username" value="root"/>
        <property name="password" value="dada"/>
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    </bean>

    <!-- 整合 mybatis -->
    <bean id="sqlSessionFactory"
          class="org.mybatis.spring.SqlSessionFactoryBean"
          p:dataSource-ref="dataSource"
          p:configLocation="classpath:mybatis-config.xml"/>

    <!--  mybatis自动扫描 将Mapper接口生成代理注入到Spring -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:sqlSessionFactoryBeanName="sqlSessionFactory"
          p:basePackage="dao" />


    <!-- 配置事务管理器 完成手动事务管理  由spring管理事务-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--
        支持注解驱动的事务管理,指定事务管理器。
        配置事务 提供回滚,发生异常数据回滚  需要在类/方法上写注解 @Transactional -->
    <tx:annotation-driven transaction-manager="txManager"/>

<!--    需要注意,这一句不能遗漏,因为我是在Controller类编写的Test测试,用的注解方法,需要用这个扫描注释注解-->
    <context:component-scan base-package="controller"/>
</beans>

在配置applicationContext.xml文件之后,先按照这个文件的第三步配置映射,需要配置mybatis-config.xml文件(告诉映射Mapper.xml文件的位置。注意这个的配置,还需要前面在pom.xml配置bulid标签)和Mapper.xml文件(主要文件,用来存放SQL映射信息)。

mybatis-config.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd" >

<configuration>
    <mappers>
         <mapper resource="mybatis/UserMapper.xml"/>
    </mappers>
</configuration>  

Mapper.xml文件:(放在Java目录下的mybatis包里面)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.UserDao">

    <select id="queryAll" resultType="po.User" parameterType="po.User">
        select *from register
    </select>
</mapper>

这个映射文件,是我进行测试用的,它的作用是查询数据库的所有信息。

测试文件:

UserTestController.java:  (Controller层)

package controller;

import dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import po.User;

import java.util.List;

@Controller("userTestImpl")
public class UserTestImpl {

    @Autowired
    private UserDao userDao;
    public void test(){
        User user = new User();
        List<User> userList = userDao.queryAll(user);
        for (int i = 0; i <userList.size() ; i++) {
            System.out.println(userList.get(i));
        }

    }
}

进行测试TestUser类:

package controller;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestUser {
    
    public static void main(String args[]){
        ApplicationContext appcon = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserTestImpl ut= (UserTestImpl) appcon.getBean("userTestImpl");
        ut.test();
    }
}

需要补充一点,进行测试类之前,还需要编写POJO类和dao层的接口。(这个简单,就不介绍了。)

最后得到一个测试结果:说明连接数据库是成功的。那么就可以尝试将SpringMVC的框架编写进去。

添加Springmvc框架:

添加SpringMVC框架之后的目录结构:

 

 

 

pom.xml文件需要添加的依赖包:

首先,第一步:仍然是导入pom.xml的依赖包,(有关SpringMVC的依赖包,只需要添加spring-webmvc就可以。jstl这个依赖包,是为了在JSP的show页面,使用jstl标签的方法)

 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.18</version>
    </dependency>
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
      </dependency>

web.xml文件:(新增配置文件)

第二步:配置web.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
		http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        id="WebApp_ID" version="4.0">

    <!-- 引入Spring 的配置-->
    <!-- ContextLoaderListener 需要 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 引入SpringMVC 的配置-->
    <!-- 这个Spring Web应用程序的前端控制器(DispatcherServlet),负责
        处理所有应用程序请求  -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- 将所有请求映射到 DispatcherServlet 进行处理 -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <!-- 针对 前端与控制器 数据传递时 的字符过滤器(避免中文乱码) -->
    <filter>
        <filter-name>encoder</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoder</filter-name>
        <servlet-name>springDispatcherServlet</servlet-name>
    </filter-mapping>
    
</web-app>

配置这个文件的时候,我犯了一点错误:因为我是在网上寻找的模板,然后就是在这一句:

<!-- 将所有请求映射到 DispatcherServlet 进行处理 -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>        //就是这个地方,我找到的模板上用的是*.do   //导致最后我在浏览器输入index,出现404.应该修改为/    。这样就不会出现问题。
    </servlet-mapping>

UserController:(控制层和JSP层的代码交互)

第三步:着手创建运行代码。

首先将业务逻辑从Controller分离出来,用一个service层表示。(这里我仍然用查询所有数据的内容为测试)

所以,service层的写法,其实和dao层的方法是一样的。比较简单就略过了。

主要是contoller层,创建了一个UserController。它主要和JSP进行交互。

package controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import po.User;
import service.UserService;

import java.util.List;

@Controller
public class UserController {

    @Autowired
    private UserService userService;
    @RequestMapping("/queryAll")
    public String queryAll(User user, Model model){
        List<User> list= userService.queryAll(user);
        model.addAttribute("userList",list);
        return "show";
    }
    
//    这个是为了方便输入index就显示下面那个index.jsp的页面。
    @RequestMapping("/index")
    public String index(Model model){
        model.addAttribute("user",new User());
        return "index";
    }

}

JSP层的代码:

index.jsp:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form:form modelAttribute="user" method="post" action="${pageContext.request.contextPath}/queryAll">
    <input type="submit" value="查看所有信息">
</form:form>
</body>
</html>

show.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table>
    <tr>
        <th>账号</th>
        <th>密码</th>
        <th>性别</th>
        <th>姓名</th>
    </tr>

    <c:forEach items="${userList}" var="user">
        <tr>
            <th>${user.account}</th>
            <th>${user.password}</th>
            <th>${user.sex}</th>
            <th>${user.name}</th>
        </tr>
    </c:forEach>
</table>
</body>
</html>

这里犯了一个很常见的错误:

 <c:forEach items="${userList}" var="user">

在这一行,我写成了userList,没有使用EL表达式${}的正确格式。导致的问题就是使用user.account。它是不会有提示的。

点拔:

${userList}   像这种EL表达式,它对应的是Controller层 model.addribute("userList",Object )。

那么怎么确定,它获取的是我们需要的EL表示式。主要看返回的是那个页面。

 

最后测试结果:

 

 

一个完整的SSM框架的模板,就完成了。

后续,需要添加其它的功能,那么需要改变的地方,从两部分改变。

一部分:添加功能的SQL映射 (Mapper.xml和mybatis-config.xml)

另一部分:添加Controller和Jsp 对应的映射。

(像pom.xml、application、springmvc、web.xml 这些配置文件只需要配置一次就够了)

首先从mybatis框架改变Mapper.xml的映射文件,改变mybatis-config.xml的指定。最好再测试一下是否获取到了数据。

再从SpringMVC框架 添加UserController类和对应的JSP类。(这两个的数据要相互交映,这一点需要注意。)

UserController类:

@RequestMapping("/index")  指定浏览器的输入页面。
model.addAttribute("user",new User());
return "index";   将model.addribute的数据返回给index.jsp页面。

JSP类(index.jsp、show.jsp):

<form:form modelAttribute="user"   对应index.jsp的model返回的数据
action="${pageContext.request.contextPath}/queryAll">  对应queryALL的contoller的@RequestMapping("/queryAll")方法。
<c:forEach items="${userList}" var="user">  同理,对应queryAll的方法里面的model数据userList

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring.aop 随笔4 如何借助jdk代理类实现aop

0. 下了有一个月的雨&#xff0c;这对鼻炎来说来吗&#xff1f;不好 其实这也算6月份的博客&#xff0c;之前一直疏于整理 本文仅关注jdk代理所实现的spring.aop下&#xff0c;两者的关系完整的aop源码走读请移步相关 spring.aop 的其他随笔 1. 反编译追踪源码 1.1 jdk代理类…

Echarts柱状图数据过多设置滚动条效果

未设置前&#xff1a; 可以看出数据全部挤压在一起了 设置后&#xff1a; 下面多出一个滚动条&#xff0c;并且鼠标可以拖动数据 dataZoom: [{show: true,height:8,bottom:0,startValue: 0, //起始值endValue: 5, //结束值showDetail: false,fillerColor: "rgba(1, 132, …

(5)深度学习学习笔记-多层感知机

文章目录 多层感知机和激活函数代码来源 多层感知机和激活函数 通过在网络中加入一个或多个隐藏层来克服线性模型的限制&#xff0c;使其能处理更普遍的函数关系类型。最简单的方法是将多个全连接层堆叠在一起。每一层都输出到上面的层&#xff0c;直到生成最后的输出&#xf…

springboot开启热部署

第一步引入spring-boot-devtools依赖 <!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><!--默认false改依赖是否可以传递&…

虚幻引擎(UE5)-大世界分区WorldPartition教程(三)

文章目录 前言LevelInstance的使用1.ALevelInstance2.选择Actor创建关卡3.运行时加载LevelInstance 总结 上一篇&#xff1a;虚幻引擎(UE5)-大世界分区WorldPartition教程(二) 前言 在制作大关卡时&#xff0c;可能会遇到这样一种情况&#xff0c;就是关卡中的某些Actor会重复…

Element-Plus select选择器-下拉组件错位bug(有高度滚动时)

1. bug重现 由于项目不便展示&#xff0c;因此在官网复现bug https://element-plus.org/zh-CN/component/select.html#基础用法 2. 调试 源码调试时发现下拉菜单是直接放在body 元素里&#xff0c;这时候希望它不要直接放在body里&#xff0c; 查阅文档看到这两个属性&#x…

量化研究丨全市场多空情绪

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 大家好&#xff0c;我是Le Chiffre 今天我们简单的介绍一个天风期货工具复现&#xff0c;如下图所示&#xff1a; 其实我只是关注了公众号&#xff0c;但是从来没有认真看过他们的研究。在5月底的时候&…

计算机网络速成

更好的阅读体验 \color{red}{\huge{更好的阅读体验}} 更好的阅读体验 因特网概述 网络、互联网和因特网 网络&#xff1a;将多个计算机或计算机网络通过通信线路连接起来&#xff0c;使得它们可以相互通信和交换信息的系统。由若干节点&#xff08;Node&#xff09;和连接这些…

课程20:API项目重构

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

神经网络初谈

文章目录 简介神经网络的发展历程神经网络的初生神经网络的第一次折戟神经网络的新生&#xff0c;Hinton携BP算法登上历史舞台命途多舛&#xff0c;神经网络的第二次寒冬神经网络的重生&#xff0c;黄袍加身&#xff0c;一步封神神经网络的未来&#xff0c;众说纷纭其他时间点 …

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED 思科 4000 系列集成服务路由器 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-isr-4000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 思科 4000 系列…

计算机视觉:分割一切AI大模型segment-anything

1 segment-anything介绍 Segment Anything Model (SAM)来源于Facebook公司Meta AI实验室。据Mata实验室介绍&#xff0c;SAM 已经学会了关于物体的一般概念&#xff0c;并且它可以为任何图像或视频中的任何物体生成 mask&#xff0c;甚至包括在训练过程中没有遇到过的物体和图…

面对“神奇的甲方”:如何应对匪夷所思的需求

在工作中&#xff0c;我们常常会遇到一些“神奇的甲方”&#xff0c;他们总是能给我们带来匪夷所思甚至无厘头的需求。本文将分享作者的经历&#xff0c;并提供一些建议&#xff0c;帮助读者应对这些“无理的需求”。 文章目录 方向一&#xff1a;分享那些你遇到的无理需求方向…

简单的手机记事本怎么把内容标记为完成状态?

很多人平时会在手机记事本上记录一些自己身边需要记住的事情&#xff0c;有的事情做完之后不想删除&#xff0c;又想要和未完成的内容区分开&#xff0c;那么这种情况下可以将它标记为已完成状态。简单的手机记事本怎么把内容标记为完成状态呢&#xff1f;以iPhone手机端敬业签…

【应用笔记】CW32 电容式触摸按键设计指南

前言 CW32 电容式触摸按键设计指南向客户提供一种利用 CW32 内部资源结合软件编程实现电容式触摸按键有效 触摸检测的方法。本指南的内容重点在于工作原理、软件检测过程以及调试指引。 利用芯源半导体的 CW32 系列小规模 MCU 的 IO、比较器、定时器、高速高精度内置 RC 时钟…

技术分享| 融合通讯的架构介绍

在融合通讯中&#xff0c;我们经常听到如下一些术语&#xff1a;MCU服务&#xff0c;SFU架构&#xff0c;MESH架构&#xff0c;星形网络等等。很多客户听到这些数据都是一脸雾水&#xff0c;经常说我们就是要一个可以把多种设备拉到同一个会议中&#xff0c;怎么搞这么复杂。今…

Web安全-Godzilla(哥斯拉)Webshell管理工具使用

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 工具下载地址02 运行环境03 工具介绍04 使用案例 01 工具下载地址 https://github.com/BeichenDream/Godzilla点击页面右侧"releases"&#xff0c;进入工具的版本下载页面。 在个人终端…

[Qt 教程之Widgets模块] —— QFontComboBox 字体选择器

Qt系列教程总目录 文章目录 3.2.1 创建 QFontComboBox3.2.2 成员函数1. 书写系统2. 字体过滤器3. 当前字体4. 信号 该控件用于选择字体&#xff0c;在一些软件中经常有类似控件&#xff0c;如下&#xff1a; Microsoft Office&#xff1a; Photoshop&#xff1a; QFontComboB…

QT调用glog日志流程

glog日志库是Google开源的轻量级的日志库&#xff0c;平时在开发过程中经常要使用到日志&#xff0c;本篇记录Qt项目使用glog日志库的记录。 1.首先下载cmake&#xff0c;Download | CMake 安装设置环境变量&#xff0c;检查安装情况 2.下载glog源码 git clone https://git…

JMeter录制HTTPS脚本解决办法

目录 前言&#xff1a; 背景 解决方法 前言&#xff1a; 在使用JMeter录制HTTPS脚本时&#xff0c;可能会遇到一些问题&#xff0c;例如SSL证书错误或请求失败等。解决这些问题的一种常见的方法是通过安装并信任服务器的SSL证书来解决。 背景 在对某项目进行脚本录制的时…