这里写目录标题
spring环境搭建
三大框架 jar 包导入
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>PROVIDED</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
spring 配置文件
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--只扫描持久层和业务层,不包含表现层-->
<context:component-scan base-package="com.lhg.ssm">
<!--配置哪些注解不扫描-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
测试spring框架搭建成功
public class Test {
@org.junit.Test
public void test(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
AccountService accountServiceImpl = (AccountService) ac.getBean("accountServiceImpl");
accountServiceImpl.findAll();
}
}
springmvc 环境搭建
springmvc配置文件
<?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:mvc="http://www.springframework.org/schema/mvc"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启解扫描,只扫描Controller注解,一定要controller这个包下-->
<context:component-scan base-package="com.lhg.ssm.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--直接这么写也可以-->
<!--<context:component-scan base-package="com.lhg.ssm.controller"/>-->
<!--配置试图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>
<!--配置静态资源-->
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/js/**" location="/js/" />
<!--开启springmvc注解支持-->
<mvc:annotation-driven />
</beans>
控制层和试图页面
@Controller
@RequestMapping("/account")
public class AccountController {
@RequestMapping("findAll")
public String findAll(){
System.out.println("controller...");
return "list";
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="account/findAll">测试</a>
</body>
</html>
web.xml 配置
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<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:springmvc.xml</param-value>
</init-param>
<!--启动服务器创建该servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
spring 整合 springmvc
web.xml配置新增监听器
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!--配置spring的监听器,默认只加载WEB-INF目录下的applicationContext.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>
</web-app>
整合后,在表现层就可以写 spring 注解将 service 注入,也即在 controller 层调用 service,
mybatis 环境搭建
新建 dao 层代码
public interface AccountDao {
@Select("select * from account where id=#{id}")
Account findById(Integer id);
@Select("select * from account")
List<Account> findAll();
@Insert("insert into account(id, name, money) values(default,#{name},#{money})")
void saveAccount(Account account);
}
SqlMapConfig 配置文件
<?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>
<!--配置环境-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.25.132:3306/ssm?characterEncoding=utf-8" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--引入映射配置文件-->
<mappers>
<!--以前用配置文件是这样引入的,-->
<!--<mapper resource="com/lhg/ssm/mapper/AccountMapper.xml" />-->
<!--但是现在我们用的是注解操作数据库,没有xml文件,所以下面这么写-->
<!--<mapper class="com.lhg.ssm.dao.AccountDao" />-->
<!--或者用下面这种形式,这样一来dao层下面的接口全部都会扫描到l-->
<package name="com.lhg.ssm.dao"/>
</mappers>
</configuration>
测试 mybatis框架
public class TestMybatis {
@Test
public void test() throws IOException {
//加载配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//拿到代理对象
AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
List<Account> lists = accountDao.findAll();
lists.forEach(account -> System.out.println(account));
//保存删除更新需要提交
Account account = new Account();
account.setName("林红川");
account.setMoney(2000);
accountDao.saveAccount(account);
sqlSession.commit();
sqlSession.close();
is.close();
}
}
spring 整合 mybatis
applicationContext 配置文件修改
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--只扫描持久层和业务层,不包含表现层-->
<context:component-scan base-package="com.lhg.ssm">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- spring 整合 mybatis-->
<!-- 配置连接池-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.25.132:3306/ssm?characterEncoding=utf-8" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 配置SqlSessionFactory工厂-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置mapper接口类所在包-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lhg.ssm.dao" />
</bean>
</beans>
经过这一步配置后 sqlmapconfig.xml 文件便可以删掉了,接着把 dao 层类用 注解放入 IOC 容器中
控制层、业务层、持久层代码
@Controller
@RequestMapping("/account")
public class AccountController {
@Autowired
private AccountService accountServiceImpl;
@RequestMapping("test")
public String findAll(Model model){
List<Account> lists = accountServiceImpl.findAll();
model.addAttribute("lists",lists);
return "list";
}
}
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
public Account findById(Integer id) {
return accountDao.findById(id);
}
@Override
public List<Account> findAll() {
return accountDao.findAll().isEmpty()?null:accountDao.findAll();
}
}
@Repository
public interface AccountDao {
@Select("select * from account where id=#{id}")
Account findById(Integer id);
@Select("select * from account")
List<Account> findAll();
@Insert("insert into account(id, name, money) values(default,#{name},#{money})")
void saveAccount(Account account);
}
list.jsp 展示页及注意事项
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>list</title>
</head>
<body>
这是查询结果页
<table border="solder 1px blue">
<tr>
<th>ID</th>
<th>姓名</th>
<th>账户金额</th>
</tr>
<c:forEach items="${lists}" var="account">
<tr>
<td>${account.id}</td>
<td>${account.name}</td>
<td>${account.money}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
注意开头的 isELIgnored=“false” 属性,如果不加上,后面的 jstl 标签解析不出来,会当作文本
spring 整合 mybatis 配置事务(转账)
applicationContext.xml 新增事务配置
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--只扫描持久层和业务层,不包含表现层-->
<context:component-scan base-package="com.lhg.ssm">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- spring 整合 mybatis-->
<!-- 配置连接池-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.25.132:3306/ssm?characterEncoding=utf-8" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 配置SqlSessionFactory工厂-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置mapper接口类所在包-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lhg.ssm.dao" />
</bean>
<!-- 配置 spring 框架声明式事务管理-->
<!--配置事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" read-only="true" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!--配置 AOP 增强-->
<aop:config>
<aop:pointcut id="pt" expression="execution(* com.lhg.ssm.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt" />
</aop:config>
</beans>
表现层、业务层、持久层
@Controller
@RequestMapping("/account")
public class AccountController {
@Autowired
private AccountService accountServiceImpl;
@RequestMapping("findAll")
public String findAll(Model model){
List<Account> lists = accountServiceImpl.findAll();
model.addAttribute("lists",lists);
return "list";
}
@RequestMapping("transfer")
public void transfer( HttpServletRequest request, HttpServletResponse response) throws IOException {
accountServiceImpl.transfer("a","b",500);
response.sendRedirect(request.getContextPath()+"/account/findAll");
return ;
}
}
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
public void transfer(String sourceName, String targetName, int money) {
System.out.println("start transfer...");
//根据名称查询转入转出账户
Account source = accountDao.findByName(sourceName);
Account target = accountDao.findByName(targetName);
//转出账户减钱 转入账户加钱
source.setMoney(source.getMoney()-money);
target.setMoney(target.getMoney()+money);
//更新转入转出账户
accountDao.updateAccount(source);
int i = 1/0;//模拟异常
accountDao.updateAccount(target);
}
}
@Repository
public interface AccountDao {
@Select("select * from account where name=#{name}")
Account findByName(String name);
}
处理结果
当出现异常时,事务回滚,无异常时转账成功;除此外,对数据库的删除、更新、插入都需要事务的支持
springmvc对异常的处理
接上面代码,转账过程调用业务层代码,业务层调用持久层,如出现异常会层层抛出,最终 springmvc 会交给前端控制器,而你没有编写异常处理器组件的话前端控制器也什么都不做,它直接把异常抛给浏览器,这样就不友好了
编写自定义异常类
public class MyException extends Exception {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public MyException(String msg) {
this.msg = msg;
}
public MyException() {
}
}
编写异常处理器
/**
* 当出现异常会调用异常处理器
*/
public class MyExceptionResolver implements HandlerExceptionResolver {
/**
*处理异常业务逻辑
* @param o
* @param e 在控制层方法中抛出的异常对象
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
MyException myException = null;
if (e instanceof MyException){
myException = (MyException) e;
}else {
myException = new MyException("系统正在维护..");
}
//创建 ModelAndView 对象
ModelAndView mv = new ModelAndView();
mv.addObject("errMsg",myException.getMsg());
mv.setViewName("error");
return mv;
}
}
配置异常处理器
springmvc.xml 新增如下配置
<!--配置异常处理器-->
<bean id="myExceptionResolver" class="com.lhg.ssm.exception.MyExceptionResolver" />