學(xué)習(xí)視頻:孫哥說SpringMVC:結(jié)合Thymeleaf,重塑你的MVC世界!|前所未有的Web開發(fā)探索之旅
第四章、SpringMVC控制器開發(fā)詳解 二
4.1 核心要點(diǎn)
?? 1. 接收客戶端(Client)請求參數(shù)【講解完畢】 2. 調(diào)用業(yè)務(wù)對(duì)象【講解】 3. 頁面跳轉(zhuǎn)4.2 SpringMVC控制器調(diào)用業(yè)務(wù)對(duì)象【SSM整合】
4.2.1 核心思路分析
4.2.2 編碼
-
dispatcher.xml
<!--設(shè)置注解掃描的路徑--> <context:component-scan base-package="com.baizhi"/> <!--引入SpringMVC的核心功能--> <mvc:annotation-driven/> <!--整合跳轉(zhuǎn)路徑,解耦合--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> <!--連接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/myschool?useSSL=false&allowPublicKeyRetrieval=true"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <!-- 創(chuàng)建SqlSessionFactory SqlSessionFactoryBean--> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.baizhi.entity"/> <property name="mapperLocations"> <list> <value>classpath:com.baizhi.mapper/*Mapper.xml</value> </list> </property> </bean> <!--創(chuàng)建DAO對(duì)象 MapperScannerConfigure--> <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/> <property name="basePackage" value="com.baizhi.dao"/> </bean> <!-- 配置事務(wù)--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
-
DAO
// **POJO** public class User implements Serializable { private Integer id; private String name; private String password; // **建表** create table t_user( id integer primary key auto_increment; name varchar(12), password varchar(12) ); // **DAO** public interface UserDAO { void save(User user); } // **Mapper** <mapper namespace="com.baizhi.dao.UserDAO"> <insert id="save"> insert into admin(name,password) values(#{name},#{password}) </insert> </mapper>
-
Service
public interface UserService { void register(User user); } Service @Transactional public class UserServiceImpl implements UserService { @Autowired private UserDAO userDAO; @Override public void register(User user) { userDAO.save(user); } }
-
Controller
@Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping("/register") public String register(User user) { userService.register(user); return "regOk"; } }
4.2.3 父子工廠(父子容器) 拆分
-
現(xiàn)有SSM開發(fā)中存在的問題
MVC層的對(duì)象(Controller,mvc:annotation-driven/,視圖解析器)與非MVC層的(連接池 DAO Service 事務(wù)),都配置在dispatcher.xml中,最終交給DispatcherServlet創(chuàng)建的工廠來進(jìn)行實(shí)例化,存在著耦合問題,后續(xù)一旦替換MVC的實(shí)現(xiàn),代碼會(huì)受到影響,不利于項(xiàng)目的維護(hù)
-
如何解決
將非MVC的配置放在applicationContext.xml(引入ContextLoaderListener工廠讀取配置)
-
把目前單一的工廠進(jìn)行父子工廠的拆分
-
子工廠(DispatcherServlet)讀取dispatcher.xml
完成與SpringMVC相關(guān)對(duì)象的創(chuàng)建:視圖解析器、自定義類型轉(zhuǎn)換器、攔截器等
-
父工廠(ContextLoaderListener)讀取applicationContext.xml
完成與非SpringMVC相關(guān)對(duì)象的創(chuàng)建:連接池、DAO、Service、事務(wù)、Redis、ES、MQ等
-
-
工廠(容器)在需要獲取對(duì)象進(jìn)行操作時(shí),首先獲取子容器所創(chuàng)建的對(duì)象,如果沒有則繼續(xù)獲得父容器所創(chuàng)建的對(duì)象
-
-
編碼
-
子工廠(子容器)
# dispatcher.xml # SpringMVC相關(guān)的配置 <!--設(shè)置注解掃描的路徑--> <context:component-scan base-package="com.baizhi"/> <!--引入SpringMVC的核心功能--> <mvc:annotation-driven/> <!--整合跳轉(zhuǎn)路徑,解耦合--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> # web.xml子容器的配置 <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:dispatcher.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>
-
父工廠(父容器)
# applicationContext.xml # Spring相關(guān)配置 <context:component-scan base-package="com.baizhi"/> <!--連接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/myschool?useSSL=false&allowPublicKeyRetrieval=true"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <!-- 創(chuàng)建SqlSessionFactory SqlSessionFactoryBean--> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.baizhi.entity"/> <property name="mapperLocations"> <list> <value>classpath:com.baizhi.mapper/*Mapper.xml</value> </list> </property> </bean> <!--創(chuàng)建DAO對(duì)象 MapperScannerConfigure--> <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/> <property name="basePackage" value="com.baizhi.dao"/> </bean> <!-- 配置事務(wù)--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/> # web.xml父容器的配置 <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
-
4.2.4 父子容器問題
-
問題
按照現(xiàn)有父子工廠(容器)的開發(fā)方式,Service層沒有添加事務(wù)。
-
問題成因
獲取的是子容器的UserService,而子容器中沒有事務(wù)配置,所以獲取不到事務(wù)。
-
解決方案
之所以在子容器沒有實(shí)現(xiàn)事務(wù),是因?yàn)榘鼟呙璧娜康陌?,將service的包也交給子容器管理。
子容器:只掃描控制器及與MVC相關(guān)的內(nèi)容 <context:component-scan base-package="com.baizhi.controller"/> 父容器:不掃描控制器與MVC相關(guān)的內(nèi)容 <context:component-scan base-package="com.baizhi"> <context:exclude-filter type="aspectj" expression="com.baizhi.controller"/> </context:component-scan> 注意:在SpingBoot中不會(huì)出現(xiàn)父子容器的問題。
4.3 SpringMVC控制器調(diào)用業(yè)務(wù)對(duì)象總結(jié)(SSM)
4.3.1 完整編碼總結(jié)
-
web.xml
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <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:dispatcher.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> <filter> <filter-name>encodingFilter</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>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
dispatcher.xml
<context:component-scan base-package="com.baizhi.controller"/> <mvc:annotation-driven/> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean>
-
applicationContex.xml
<context:component-scan base-package="com.baizhi"> <context:exclude-filter type="aspectj" expression="com.baizhi.controller"/> </context:component-scan> <!--連接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/myschool?useSSL=false&allowPublicKeyRetrieval=true"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <!-- 創(chuàng)建SqlSessionFactory SqlSessionFactoryBean--> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.baizhi.entity"/> <property name="mapperLocations"> <list> <value>classpath:com.baizhi.mapper/*Mapper.xml</value> </list> </property> </bean> <!--創(chuàng)建DAO對(duì)象 MapperScannerConfigure--> <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/> <property name="basePackage" value="com.baizhi.dao"/> </bean> <!-- 配置事務(wù)--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
-
DAO
// **POJO** public class User implements Serializable { private Integer id; private String name; private String password; // **建表** create table t_user( id integer primary key auto_increment; name varchar(12), password varchar(12) ); // **DAO** public interface UserDAO { void save(User user); } // **Mapper** <mapper namespace="com.baizhi.dao.UserDAO"> <insert id="save"> insert into admin(name,password) values(#{name},#{password}) </insert> </mapper>
-
Service
public interface UserService { void register(User user); } Service @Transactional public class UserServiceImpl implements UserService { @Autowired private UserDAO userDAO; @Override public void register(User user) { userDAO.save(user); } }
-
Controller文章來源:http://www.zghlxwxcb.cn/news/detail-748085.html
@Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping("/register") public String register(User user) { userService.register(user); return "regOk"; } }
下一章:Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(一)文章來源地址http://www.zghlxwxcb.cn/news/detail-748085.html
到了這里,關(guān)于Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:調(diào)用業(yè)務(wù)對(duì)象、父子工廠拆分(applicationContext.xml、dispatcher.xml)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!