06_03_SpringMVC||day03_SpringMVC第三天||(总结篇,原文很详细)

第一章、 搭建整合环境

1.1 ssm整合说明

1.2 搭建整合ssm环境
  • 注:数据库中name字段需要调整字符集
1.3 ssm整合之编写Spring框架
  • 最后测试中@Test执行后会有红字(log4j的警告:不影响执行)
    • 在resources中引入log4j.properties即可
1.4.1 ssm整合之编写SpringMVC框架
  1. web.xml中配置前端控制器以及中文乱码过滤器
  2. resources中创建springmvc.xml
  3. 然后就可以发请求,去访问Controller中的方法。
  4. 编写index.jsp来模仿一个请求
  5. 编写Contorller类及方法
  6. 向控制层指定多的页面跳转
1.4.2 ssm整合之Spring整合SpringMVC框架


* 注:该监听器是Spring已经提供好的

  1. 配置监听器需要在pom.xml导入包:spring-web
    • 用到里面的ContextLoaderListener
  2. web.xml中配置spring的监听器
    1. 配置Spring监听器及解决加载问题
          <!-- 配置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-INF目录下的applicationContext.xml配置文件
      1. 解决方法一:复制一份到WEB-INF目录下【不建议】
      2. 解决方法二:将配置文件在resources下做一个统一管理【建议】
        • 表明加载类路径下的配置文件,ContextLoaderListener监听器就知道去找类路径下的文件。
            <!-- 设置配置文件的路径-->
            <context-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:applicationContext.xml</param-value>
            </context-param>
        
    • web.xml中三大组件齐全了【Servlet(SpringMVC的前端控制器),过滤器(中文乱码),监听器(Spring的)】
  3. 这时候启动服务器,就将Spring配置文件,SpringMVC配置文件都加载了–>Service和Controller两个类都放到了容器当中
    • 这时候就可以用依赖注入了。
  4. 编辑AccountController类,调用Service方法
    • 能调用其中的方法,表示整合成功。
        @Controller
        @RequestMapping("/account")
        public class AccountController {
        
            //该注解表示按类型自动注入
            @Autowired
            private AccountService accountService;
        
            @RequestMapping("/findAll")
            public String findAll(){
                System.out.println("表现层:查询所有账户。。。");
        
                //调用Service方法(如果上面能注入成功)
                accountService.findAll();
        
                return "list";
            }
        }
    
1.5.1 ssm整合之搭建和测试Mybatis环境
  1. 在AccountDao类中的方法上加注解
    1. 比如查询所有信息
    2. 保存账户信息
    public interface AccountDao {
    
        //查询所有账户信息
        @Select("select * form account")
        public List<Account> findAll();
    
        //保存账户信息(注解中#{}表达式:表示从account表中取值(对应的属性))
        @Insert("insert into account(name, money) values(#{name}, #{money})")
        public void saveAccount(Account account);
    }
    
  2. 编写核心配置文件
    1. 创建一个xml文档(new一个file文件,将xml后缀名写上即可)
    2. 创建SqlMapConfig.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">
      
    3. 创建SqlMapConfig.xml编写跟标签:内容
          <configuration>
          <!-- 配置环境 -->
          <environments default="mysql">
              <environment id="mysql">
                  <!-- 表示事务类型-->
                  <transactionManager type="JDBC"/>
                  <!-- 表示应用连接池:如果不用前面加UN-->
                  <dataSource type="POOLED">
                      <!-- 里面配置呢几个属性-->
                      <!-- 配置驱动-->
                      <property name="driver" value="com.mysql.jdbc.Driver"/>
                      <!-- 是请求的连接-->
                      <property name="url" value="jdbc:mysql:///ssm"/>
                      <!-- 用户名-->
                      <property name="username" value="root"/>
                      <!-- 密码-->
                      <property name="password" value="1234"/>
                  </dataSource>
              </environment>
          </environments>
      
          <!-- 引入映射配置文件:如果没有就将AccountDao接口路径传入-->
          <mappers>
              <!-- 1. 本来用resource属性
                      里面写的是dao文件中配置好的xml文件(如:cn.blood.dao.xxx.xml)
                   2. 这里没有该xml文件,所以用class属性
                      里面写接口类的全路径-->
              <!--
              <mapper class="cn.blood.dao.AccountDao"/>
              -->
              <!-- 【重点】下面与上面区别:以后再dao包中加任何接口,都可以扫描到(范围问题)-->
              <package name="cn.blood.dao"/>
          </mappers>
      
      </configuration>
      
    4. 编写测试类:TsetMybatis
      1. 加载配置文件
        1. Resource导入的是import org.apache.ibatis.io.Resources;包下的
        2. 调用getResourceAsStream方法,将配置文件全名复制进来
        3. 将异常抛出(Exception)
        4. 会返回一个InputStream输入流
          InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
      
      1. 有了输入流,创建SqlSessionFactory对象(工厂对象)
        1. new一个SqlSessionFactoryBuilder
            new SqlSessionFactoryBuilder().build(is);
            * 注:build方法选择inputStream流的
        
        1. 会返回一个SqlSessionFactory工厂对象
          SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
      
      1. 有了工厂对象,使用工厂对象创建SqlSession对象
        1. 使用openSession();方法来拿到SqlSession返回值
          SqlSession session = factory.openSession();
      
      1. 用SqlSession对象获取–>代理对象
          AccountDao dao = session.getMapper(AccountDao.class);
      
      1. 代理拿到就可以查询所有数据(并遍历显示出来)
        • 因为输出account,所以需要给Account类中加toString()方法
          List<Account> list = dao.findAll();
          for(Account account : list){
              System.out.println(account);
          }
      
      1. 关闭资源
          session.close();
          is.close();
      
    5. 执行后的运行结果:
  • 注: ssm整合之编写Mybatis框架测试保存方法
        TestMybatis测试类中
        /*
            测试保存
         */
        @Test
        public void run2() throws Exception {
            Account account = new Account();
            account.setName("熊大");
            account.setMoney(400d);
    
    
            //1. 加载配置文件(Mybatis的配置文件)
            InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
            //2. 有了输入流,创建SqlSessionFactory对象(工厂对象)
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            //3. 有了工厂对象,使用工厂对象创建SqlSession对象
            SqlSession session = factory.openSession();
            //4. 用SqlSession对象获取-->代理对象
            AccountDao dao = session.getMapper(AccountDao.class);
            //5. 保存
            dao.saveAccount(account);
            //6. 提交事务
            session.commit();
            //6. 关闭资源
            session.close();
            is.close();
        }
    
1.5.2 ssm整合之Spring整合Mybatis框架
  1. 在applicationContext.xml中配置:其实就是将刚才Mybatis配置文件中的东西转移到Spring配置中(让Spring来帮忙创建,代理,存到IOC的容器当中)
        <!-- Spring整合MyBatis框架-->
        <!-- 配置连接池(c3p0)-->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="com.mysql.jdbc.Driver"/>
            <property name="jdbcUrl" value="jdbc:mysql:///ssm"/>
            <property name="user" value="root"/>
            <property name="password" value="1234"/>
        </bean>
    
        <!-- 配置SqlSessionFactory工厂-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!-- 配置AccountDao接口所在的包-->
        <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="cn.blood.dao"/>
        </bean>
    
  2. 当补充完applicationContext.xml,由于和SqlMapConfig.xml功能一样,就将SqlMapConfig.xml直接删除即可(删完测试类TestMybatis用不了了)
  3. 在AccountDao接口上加,,repository注解
  4. 在AccountServiceImple中注入accountDao接口
        //写个这个注解相当于:把这个类交给IOC的容器进行了管理
        @Service("accountService")
        public class AccountServiceImpl implements AccountService {
        
            @Autowired
            private AccountDao accountDao;
        
            public List<Account> findAll() {
                System.out.println("业务层:查询所有账户...");
                return accountDao.findAll();
            }
        
        
            public void saveAccount(Account account) {
                System.out.println("业务层:保存所有账户...");
                accountDao.saveAccount(account);
            }
        }
    
  • 全部讲完,整合一边(这时候保存的方法用不了)
    1. AccountController的补充
        /**
         * 账户web
         */
        @Controller
        @RequestMapping("/account")
        public class AccountController {
        
            //该注解表示按类型自动注入
            @Autowired
            private AccountService accountService;
        
            @RequestMapping("/findAll")
            public String findAll(Model model){ //想要存值用Model对象
                System.out.println("表现层:查询所有账户。。。");
        
                //调用Service方法(如果上面能注入成功)
                List<Account> list = accountService.findAll();
                model.addAttribute("list", list);
        
                return "list";
            }
        }
    
    1. list.jsp的补充
        <%--
          Created by IntelliJ IDEA.
          User: WarGod
          Date: 2020/9/3
          Time: 0:12
          To change this template use File | Settings | File Templates.
        --%>
        <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
        <!-- 下面的是引入的jstl标签库-->
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        <html>
        <head>
            <title>Title</title>
        </head>
        <body>
        
            <h3>查询了所有的账户信息</h3>
        
            <c:forEach items="${list}" var="acount">
                ${acount.name}
            </c:forEach>
        
        </body>
        </html>
    
    
1.5.3 ssm整合之Spring整合Mybatis框架配置事务
  1. 没写保存的原因–>因为保存需要手动来写事务的管理。
  2. 在Spring中学过一个声明式事务管理
  3. 在applicationContext.xml中进行配置
        <!-- 配置Spring框架声明式事务管理-->
        <!-- 配置事务管理器(是Mybatis框架用到的事务管理器,是一个实现类)-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!-- 配置事务通知-->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="find*" read-only="true"/>
                <tx:method name="*" isolation="DEFAULT"/>
            </tx:attributes>
        </tx:advice>
    
        <!-- 配置AOP增强-->
        <aop:config>
            <!-- public可以省略-->
            <aop:advisor advice-ref="txAdvice" pointcut="execution(public * cn.blood.service.impl.*ServiceImpl.*(..))"/>
        </aop:config>
    
  4. 这时说明已经对Service中的方法已经进行了事务管理
  5. 编写index.jsp做测试
        <h3>测试包</h3>
    
        <form action="account/save" method="post">
            姓名:<input type="text" name="name"><br/>
            金额:<input type="text" name="money"><br/>
            <input type="submit" value="保存"><br/>
        </form>
    
  6. 编写AccountController
        /**
         * 用来保存l
         * @return
         */
        @RequestMapping("/save")
        public void save(Account account, HttpServletRequest request, HttpServletResponse response) throws IOException { //response就可以实现重定向了
            accountService.saveAccount(account);
            //表示:保存走完了直接做一个重定向-->定向到findAll这个方法
            response.sendRedirect(request.getContextPath()+"/account/findAll");
            return ;
        }
    
  • 重点:当从前端传入的中文乱码时候
    1. 编辑application.xml配置文件,将里面(Spring整合MyBatis框架)中JDBC参数配置中jdbcUrl进行修改。
        修改前
        <property name="jdbcUrl" value="jdbc:mysql:///ssm"/>
        修改后
        <property name="jdbcUrl" value="jdbc:mysql:///ssm?useUnicode=true&amp;characterEncoding=utf-8"/>
    
    1. 详细看连接->>
      数据库插入中文变成问号问题

详细的原文

详页连接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂野小白兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值