【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.pswp.cn/news/535121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535121.shtml
英文地址,請注明出處:http://en.pswp.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&…

python調用窗口找到文件,使用Python在Mac OS X中查找當前活動窗口

Is there a way to find the application name of the current active window at a given time on Mac OS X using Python?解決方案This should work:#!/usr/bin/pythonfrom AppKit import NSWorkspaceactiveAppName NSWorkspace.sharedWorkspace().activeApplication()[NSAp…

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…