【SSM面向CRUD编程专栏 9】SSM框架整合

🛫更多ssm知识见SSM_面向CRUD编程专栏

🚕本博客总结自黑马程序员的ssm框架视频

🚒博主对于该知识尚在学习阶段

🚄如果发现存在问题请毫不吝啬的指出

🚀🚀扎哇太枣糕的博客主页🚀🚀

目录

🔒案例分析

🔑框架结构

​🔓实现


       如果说,面试就像造航母工作就是拧螺丝的话,那么SSM框架就是一把非常适合新手打基础使用的螺丝刀。

                                                        ——鲁迅

        在前面的ssm专栏知识的学习中,我们已经大致清楚了ssm框架有三个框架组合而成——spring、springMVC、MyBatis。这三个框架可已经节省了我们很多的开发时间,现在要做的就是将这三个框架整合到一起,让它们能更好的配合为我们节省更多的开发时间。

🔒案例分析

        由于本篇博客主要是为了讲解ssm框架的整合知识,所以准备了一个比较简单的案例。项目需要连接数据库实现两个功能:在页面上插入数据、查询数据并在页面上显示。

🔑框架结构

        ssm框架在项目src/main/java的目录下一般包含四个package,也就是我们常说的四层,从日常开发的顺序来分依次是domain层(也叫entity层)、mapper层(也叫dao层)、service层controller层。复杂点的也会有五层,多出来一个until层,由于学习时间有限更复杂的情况就不知道了😓         除了domain层以外,其他三层都有相应的配置文件配合spring框架代码的使用,最后要在web.xml文件中将配置文件加载进去,否则配置文件相当于白配并不会生效。除了上面这种配置文件对应方式,还有一种方式就是将spring-xxx合成一个applicationContext.xml,这样可以使配置文件的数量变得更少些,但是对应关系没有上一种清晰,当然配置文件改变了web.xml文件也会跟着改变。本次案例就采用第二种对应方式进行讲解。

🔓实现

🍖项目的层级结构

如果不会创建一个web项目的话,参考往期博客进行创建【SSM面向CRUD编程专栏 3】关于黑马程序员最全SSM框架教程视频,P37集老师跳过的模块创建以及tomcat下载安装配置和运行等诸多问题

🥩pom.xml

<dependencies><!--spring相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.7</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.0.5.RELEASE</version></dependency><!--servlet和jsp--><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version></dependency><!--mybatis相关--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies>

🍕domain层

        数据库中account表对应的实体类,首先需要参考下图创建一个数据库表

        domain层下创建一个Account类对应数据库中的各个字段

public class Account {private Integer id;private String name;private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}
}

🍔mapper层

之前学过MyBatis的代理开发模式,使用这种模式进行开发就不再需要实现类了,但是需要满足以下四个条件

  • mapper标签的namespace = 接口全限名
  • 接口方法 = mapper字标签的id
  • 接口方法参数类型 = mapper字标签的parameterType
  • 接口方法返回值类型 = mapper字标签的resultType

        mapper层创建一个AccountMapper接口,定义插入和查询功能的实现方法

public interface AccountMapper {public void save(Account account);public List<Account> findAll();}

        创建AccountMapper.xml映射文件使用SQL语句对数据库进行操作

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.itheima.mapper.AccountMapper"><insert id="save" parameterType="account">insert into account values(#{id},#{name},#{money})</insert><select id="findAll" resultType="account">select * from account</select></mapper>

         对数据库进行操作,要连接到数据库,在这里需要将数据库的配置抽取到jdbc.properties中方便日后修改(等于号右边的要配成自己数据库的值),又叫解耦合

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=123456

        有了数据库配置之后就需要在applicationContest.xml中配置数据源信息 ,当然需要先加载上面的数据库配置了,也就是常说的创建连接池,连接池的好处相信大家都知道了吧

<!--加载propeties文件-->
<context:property-placeholder location="classpath:jdbc.properties"/><!--配置数据源信息-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"></property><property name="jdbcUrl" value="${jdbc.url}"></property><property name="user" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property>
</bean>

        下面的service层需要使用到AccountMapper对象调用其中的方法,所以需要使用spring框架底层直接创建好对象之后service直接注入,这样的话就需要我们在applicationContest.xml中让spring框架知道它需要做这件事了

<!--配置sessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><!--加载mybatis核心文件--><property name="configLocation" value="classpath:sqlMapConfig-spring.xml"></property>
</bean><!--扫描mapper所在的包 为mapper创建实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.itheima.mapper"></property>
</bean>

        数据库的操作又叫事务,既然有事务就要在applicationContest.xml对它进行声明式事务控制

<!--声明式事务控制-->
<!--平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property>
</bean><!--配置事务增强-->
<tx:advice id="txAdvice"><tx:attributes><tx:method name="*"/></tx:attributes>
</tx:advice><!--事务的aop织入-->
<aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.itheima.service.impl.*.*(..))"></aop:advisor>
</aop:config>

🍟service层

        service层有一个AccountService接口由于阐述业务需求,也就是需要完成哪些功能,一般来说它和AccountMapper接口一样

public interface AccountService {public void save(Account account);public List<Account> findAll();}

        service层下有个Implpackage,又来放所有的接口实现类,比如说这个案例的AccountServiceImpl类。之前创建好的AccountMapper的对象就可以使用注解直接注入,然后调用它的方法

@Service("accountService")
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;public void save(Account account) {accountMapper.save(account);}public List<Account> findAll() {return accountMapper.findAll();}
}

        这里使用了@Service注解,所以需要在applicationContest.xml对注解进行扫描,让框架知道应该创建相应的对象了

<!--组件扫描 扫描service和mapper-->
<context:component-scan base-package="com.itheima"><!--排除controller的扫描--><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>

🌭controller层

        controller层是与前端进行交互的层,决定了请求和响应的具体事项,下面先放代码再进行详解

@Controller
@RequestMapping("/account")
public class AccountController {@Autowiredprivate AccountService accountService;// 保存数据@RequestMapping(value = "/save", produces = "text/html;charset=UTF-8")@ResponseBodypublic String save(Account account){accountService.save(account);return "保存成功";}//查询数据@RequestMapping("/findAll")public ModelAndView findAll(){List<Account> accountList = accountService.findAll();ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("accountList",accountList);modelAndView.setViewName("accountList");return modelAndView;}}

        这里使用了@controller注解,所以需要在SpringMVC.xml配置注解驱动并对注解进行扫描,让框架知道应该创建相应的对象了

<!--组件扫描  主要扫描controller-->
<context:component-scan base-package="com.itheima.controller"/><!--配置mvc注解驱动-->
<mvc:annotation-driven/>

@RequestMapping注解设置了方法的映射地址,前端访问该映射地址的时候会执行对应的方法,类上注解和方法上注解分别对应着两级不一样的映射路径,也就是说当前端发送/account/save请求时,就会调用save方法。produces属性是设置响应的编码格式以防返回给页面一个字符串的时候出现乱码

@ResponseBody注解标明返回的只是一个字符串,而不是进行页面的跳转,如果是页面跳转的话,需要开放静态资源(jsp页面)访问权限,还可以在SpringMVC.xml中配置视图解析器,给返回值加上前缀和后缀(因为开发时的前端页面都会放在一个统一的package下而且页面的后缀基本上都是jsp,于是就可以减少开发时的代码书写)

<!--开放静态资源访问权限-->
<mvc:default-servlet-handler/><!--内部资源视图解析器-->
<bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property>
</bean>

存数据的jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>添加账户信息表单</h1><form name="accountForm" action="${pageContext.request.contextPath}/account/save" method="post">账户名称:<input type="text" name="name"><br>账户金额:<input type="text" name="money"><br><input type="submit" value="保存"><br></form>
</body>
</html>

查询数据对应的jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Title</title>
</head>
<body><h1>展示账户数据列表</h1><table border="1"><tr><th>账户id</th><th>账户名称</th><th>账户金额</th></tr><c:forEach items="${accountList}" var="account"><tr><td>${account.id}</td><td>${account.name}</td><td>${account.money}</td></tr></c:forEach></table>
</body>
</html>

🍿web.xml文件

加载applicationContext.xml文件

<!--spring 监听器-->
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

加载SpringMVC.xml文件,又叫前端控制器

<!--springmvc的前端控制器-->
<servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

配置全局过滤器用于解决POST请求乱码问题

<!--全局过滤器用于解决乱码问题-->
<filter><filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

        至此,ssm的框架整合就告一段落了,每一位大国工匠都是从基础学起,之所以能够异于常人。除了天赋以外就是在夯实基础功之外,加之时间的沉淀和经验的积累。万丈高楼平地起,这就是框架开发的第一站。

     

上一篇:【SSM面向CRUD编程专栏 8】一篇博客快速上手使用MyBatis进行CRUD

下一篇:未完待续……

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

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

相关文章

三万字速通SSM框架入门知识点,快速上手CRUD

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

问题简介 本人是在进行一个ssm框架项目的编写的时候&#xff0c;在数据库中查询到所有的商品信息并返回到页面使用EL表达式进行展现&#xff0c;但是使用tomcat 9.0.58运行的时候报错会出现以下报错情况。 页面报错&#xff1a; 控制台报错&#xff1a; 解决方法 首先看看是不…

check the manual that corresponds to your MySQL server version for the right syntax to use near

首先判断自己是在什么情况下报的错&#xff0c;如果是MyBatis的SQL报错的话&#xff0c;建议直接点击目录跳转到MyBatis时SQL报错&#xff0c;避免浪费时间。如果本文能够对你有所帮助的话&#xff0c;还请在评论区多多支持 目录 &#x1f37b;运行SQL语句、SQL文件等报错 &…

MyBatis的逆向工程工具,自动生成数据库对应的POJO实体类、mapper接口、增删改查mapper.xml文件

下载MyBatis的逆向工程工具&#xff0c;并解压缩到一个不包含中文字符的文件夹下&#xff0c;我直接放到了D盘下&#xff0c;下载地址&#xff1a;MyBatis逆向工程工具下载 如何使用MyBatis的逆向工程工具 下载之后使用idea在一个新窗口中打开&#xff0c;选中工具文件之后&am…

『收藏向 期末SSM课设救急』 教你从搭建到测试运行手撸一个SSM项目实战,附带源码,前端页面、解析和一般遇到的问题(排雷)

&#x1f6eb;ssm知识学习见SSM_面向CRUD编程专栏 &#x1f695;本项目来自动力节点的【米米商城】 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 项目…

【SpringBoot 2】(一)基础知识了解学习

&#x1f6eb;更多知识总结见SpringBoot 2专栏 &#x1f695;本篇知识点总结自尚硅谷雷神的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; ​ 目录…

【SpringBoot 2】(二)快速入门案例HelloWorld

&#x1f6eb;更多知识总结见SpringBoot 2专栏 ( &#x1f695;本篇知识点总结自尚硅谷雷神的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; ​ 目…

【SpringBoot 2】(三)SpringBoot相较于Spring的特点

&#x1f6eb;更多知识总结见SpringBoot 2专栏 &#x1f695;本篇知识点总结自尚硅谷雷神的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; ​ 目录…

井通swtc能不能涨到2元_买一支2块到3块之间的股票,买几十万股吗?这样操作效果怎么样?...

有很多新股民有一种看法&#xff0c;认为高价股风险很大&#xff0c;那么可不可以买2到3元的低价股&#xff0c;是不是风险就很小&#xff0c;以后上涨的力度就会很大&#xff1f;这是很多股民都存在的一个误区&#xff0c;也是很多股市的所谓高手的误导&#xff0c;他们说&…

cad应用程序的组件中发生了未经处理的异常_什么是CAD/CAM?

与许多其他行业一样&#xff0c;牙科技术的生产阶段也越来越自动化。由于牙科实验室工作的价格已成为治疗计划和治疗的主要因素&#xff0c;因此自动化可以在西欧和美国等高薪地区实现更具竞争力的生产。现在&#xff0c;计算机技术的进步使高性价比的单件生产成为可能。近年来…

【SpringBoot 2】(四)详析SpringBoot的常用注解

&#x1f6eb;更多知识总结见SpringBoot 2专栏 &#x1f695;本篇知识点总结自尚硅谷雷神的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680; 目录 向…

苹果7手机严重卡顿_苹果手机仅配备4GB运存都不会卡顿,安卓系统为何要更多内存?...

原标题&#xff1a;苹果手机仅配备4GB运存都不会卡顿&#xff0c;安卓系统为何要更多内存&#xff1f;众所周知&#xff0c;安卓系统历经十余年的发展&#xff0c;目前最低的运行需求是8GB内存&#xff0c;如果是旗舰机的话还要标配12GB或更高。但是前几天刚发布的iPhone12&…

IntelliJ IDEA自动生成自定义的类注释和方法注释

目录 自定义的类注释 自定义方法注释 实现效果&#xff1a;不用手写即可自动生成如下图的类上注释和方法上的注释&#xff0c;我们只需要填写方法注释的参数和返回值文字描述即可&#xff0c;大大节省了代码开发的时间提高代码开发效率。 &#x1f315; 自定义的类注释 Fil…

violinplot如何看懂_一张图告诉你如何看懂个股大趋势

昨日在T0交易利好消息的影响下&#xff0c;券商股全线大幅高开&#xff0c;带动三大指数高开走高&#xff0c;科技题材股全线活跃&#xff0c;两市量能明显放大&#xff0c;形成量价齐升的良性态势&#xff0c;上证冲上2917&#xff0c;收在2915&#xff0c;创业板大涨3%以上&a…

jz指令是什么意思_S7-200 SMART 运动控制指令详解-电气阿伟带小白启程

大家好&#xff0c;我是工控阿伟&#xff0c;今天又跟大家见面了。学习需要坚持&#xff0c;需要钻研&#xff0c;做技术亦是如此&#xff0c;厚积才能博发。阿伟写程序都是自己测试使用过的&#xff0c;需要的可以借鉴&#xff0c;避免走弯路。S7-200 smart 运动控制指令由编程…

【SpringBoot 2】(五)自动配置简析源码 开发中小技巧

写在前面&#x1f6eb;更多知识总结见SpringBoot 2专栏 &#x1f695;本篇知识点总结自尚硅谷雷神的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;…

jar包导出无法显示图片或者音乐_如何制作图片视频短片,配上音乐闪耀朋友圈!...

把图片制作成视频短片&#xff0c;再配上一首好听的音乐&#xff0c;发到朋友圈&#xff0c;不仅可以更具创意的分享自己的生活点滴&#xff0c;更能因您的创意获得一大票的赞哦&#xff01;看到别人分享自己制作的图片视频短片&#xff0c;是不是心痒痒也想做一个呢&#xff1…

【SpringBoot 2】(六)配置文件 web开发相关

写在前面&#x1f6eb;更多知识总结见SpringBoot 2专栏 &#x1f695;本篇知识点总结自尚硅谷雷神的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;…

deepl windows_推荐一个为程序员深度开发的翻译插件DeepL

DeepL深度翻译器DeepL一个程序员的翻译神器&#xff0c;可能有人要问&#xff0c;市面上这么多的翻译插件这么多&#xff0c;我为毛要用你的。首先这个翻译神器可以实现多个翻译引擎的翻译&#xff0c;目前支持有道和google&#xff0c;下一步我会把最近特别流行的翻译软件Deep…

再次携号转网_陕西通信管理局:对移动公司拒绝对用户提供携号转网服务的违法行为处罚!...

据陕西省通信管理局网站11月25日消息&#xff0c;陕西省通信管理局25日发出《关于中国移动西安分公司无正当理由拒绝对用户提供携号转网服务调查处理情况的通报》称&#xff0c;近期&#xff0c;省通信管理局对中国移动西安分公司(以下简称西安移动)无正当理由拒绝对用户提供携…