springmvc基础知识记录2

8.springmvc和mybatis整合

8.1需求

springmvc和mybatis整合

8.2整合思路

在这里插入图片描述

第一步:整合dao层

mybatis和spring整合,通过spring管理mapper接口。

使用mapper的扫描器自动扫描mapper接口在spring中注册

第二步:整理service层

通过Spring管理service接口

使用配置方式将service接口配置在spring配置文件中

实现事务控制

第三步:整合springmvc

由于springmvc是spring的模块,不需要整合。

8.3项目结构

在这里插入图片描述

8.4整合dao

8.4.1SqlMapConfig.xml

在这里插入图片描述

8.4.2ApplicationContext-dao.xml

在这里插入图片描述

8.4.3逆向工程生成po类和mapper类

将生成的文件拷贝至工程中。

8.4.4手动定义商品查询mapper

8.5整合service

8.5.1定义service接口

public interface ItemsService {
    List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo)
            throws Exception;
}
public class ItemsServiceImpl implements ItemsService{
    @Autowired
    private ItemsMapperCustom itemsMapperCustom;
    @Override
    public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception {
        return itemsMapperCustom.findItemsList(itemsQueryVo);
    }
}

8.5.2在spring容器配置service

 <!--商品管理的service-->
    <bean id="itemsService" class="com.serviceImpl.ItemsServiceImpl"/>

8.5.3事务控制

<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="save*" propagation="REQUIRED"/>
        <tx:method name="insert*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
        <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
        <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
    </tx:attributes>
</tx:advice>

<!--配置aop-->
<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.serviceimpl.*.*(..))"/>
</aop:config>

8.6整合springmvc

8.6.1springmvc.xml

<!--使用spring组件扫描
一次性配置此包下所有的Handler-->
<context:component-scan base-package="com.controller"/>
<!--代替注解处理器映射器和适配器
mvc:annotation-driven默认加载很多参数绑定方法-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--&lt;!&ndash;注解处理器映射器&ndash;&gt;-->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>-->

<!--&lt;!&ndash;注解的适配器&ndash;&gt;-->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>-->
<!--配置处理器映射器
    springmvc框架根据HandlerMapping接口判断是否是处理器映射器-->
<!--根据bean的name进行查找Handler,将action的url配置在bean的name中-->
<!--<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
<!--&lt;!&ndash;配置处理器适配器-->
<!--springmvc框架根据HandlerAdapter接口判断是否是处理器适配器&ndash;&gt;-->
<!--<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>-->
<!--&lt;!&ndash;配置Handler-->
<!--由于使用了BeanNameUrlHandlerMapping处理映射器,所以name要配置为url&ndash;&gt;-->
<!--<bean name="/itemList.action" class="com.controller.ItemConroller1"></bean>-->
<!--配置视图解析器
要求将jstl的包加到classpath-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/web"/>
        <property name="suffix" value=".jsp"/>
</bean>

8.6.2配置前端控制器

<!-- springmvc前端控制器-->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--contextConfigLocation配置springmvcji加载配置文件(配置处理器,映射器,适配器等等)-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <!--配置文件的地址
        如果不配置contextConfigLocation,默认查找的配置文件名称是classpath下的:servlet名称+"-servlet.xml"
        即springmvc-servlet.xml-->
        <param-value>classpath:springmvc/springmvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--可以配置/:此工程所有的请求全部由springmvc解析,此种方式可以实现RESTful方式,需要特殊处理对静态文件的解析不能由springmvc解析
    可以配置*.do或者*.action,所有请求的url扩展名为.do或.action由springmvc解析,此种方法常用
    不可以配置/*,如果配置/*,返回jsp也由springmvc解析,这是不对的-->
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

8.6.3编写Controller(就是Handler)

@org.springframework.stereotype.Controller
public class ItemConroller1{
    @Autowired
    private ItemsService itemsService;
    @RequestMapping("/queryItems")
    public ModelAndView queryItems()throws Exception {
        //使用静态的数据将商品信息显示在jsp页面
        List<ItemsCustom> itemsList =itemsService.findItemsList(null);
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("itemsList",itemsList);
        modelAndView.setViewName("itemsList");//指定用户访问的jsp页面地址
        return modelAndView;
    }
}

8.6.4编写jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询商品列表</title>
</head>
<body> 
<form action="${pageContext.request.contextPath }/items/queryItem.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td><input type="submit" value="查询"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
   <td>商品名称</td>
   <td>商品价格</td>
   <td>生产日期</td>
   <td>商品描述</td>
   <td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
   <td>${item.name }</td>
   <td>${item.price }</td>
   <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
   <td>${item.detail }</td>
   
   <td><a href="${pageContext.request.contextPath }/items/editItems.action?id=${item.id}">修改</a></td>

</tr>
</c:forEach>

</table>
</form>
</body>

</html>

8.7加载spring容器

<!--配置spring容器监听器-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/config/spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

在web.xml中进行添加

9.商品修改功能开发

9.1开发mapper

mapper:

​ 根据id查询商品信息

​ 根据id更新Items表的数据

9.2开发service

接口功能:
​ 根据ID查询商品信息

​ 修改商品信息

ItemsCustom findItemById(Integer) id) throws Exception;
void updateItems(Integer id,ItemsCustom itemsCustom) throws Exception;
@Override
public ItemsCustom findItemById(Integer id) throws Exception {
    Items items=itemsMapper.selectByPrimaryKey(id);
    //中间对商品信息进行业务处理
    //。。。。。
    //ItemsCustom
    ItemsCustom itemsCustom=new ItemsCustom();
    //将items的属性拷贝到itemsCustom
    BeanUtils.copyProperties(items,itemsCustom);
    return itemsCustom;
}

@Override
public void updateItems(Integer id, ItemsCustom itemsCustom) throws Exception {
    //添加业务校验,通常在service对关键参数进行校验
    //根据id值是否为空,如果为空抛出异常


    //更新商品信息使用updateByPrimaryKeyWithBLOBs根据id更新items表中所有字段包括大文本类型字段
    //updateByPrimaryKeyWithBLOBs必须传入id
    //所以为了确认,设置一遍id,即使其中已经有id值
    itemsCustom.setId(id);
    itemsMapper.updateByPrimaryKeyWithBLOBs(itemsCustom);
}

9.3开发Controller

10.@RequestMapping

定义controller方法对应的url,进行处理器映射使用。

在控制器类名定义一个根路径,这样比较能保证每个url的独特性。

  • URL请求映射

  • 窄化请求映射

在这里插入图片描述

  • 限制http请求方法

在这里插入图片描述

11.controller方法的返回值

  • 返回ModelAndView

    需要方法结束时,定义ModelAndView,将model和view分别进行设置。

  • 返回String

    如果controller方法返回string,

    1. 表示返回逻辑视图名。

    真正视图(jsp路径)=前缀+逻辑视图名+后缀

    在这里插入图片描述

    1. redirect重定向

    商品修改提交后,重定向到商品查询列表。

    redirect重定向特点:浏览器地址栏中的url会变化,修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request(request无法共享)

    在这里插入图片描述

    1. forward页面转发

    request可以共享,地址不变

    在这里插入图片描述

  • 返回void

在这里插入图片描述

12.参数绑定

12.1什么是参数绑定过程

从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上

springmvc中,接收页面提交的数据是通过方法形参来接收,而不是在controller类定义成员变更接收。

在这里插入图片描述

12.2默认支持的类型

首先我们看看Controller的方法中默认支持的形参(即之前我们根据需求手动传入的参数,这些参数处理适配器会默认识别并进行赋值)有:1.HttpServletRequest:通过request对象获取请求信息。 2.HttpServletResponse:通过response处理响应信息。3.HttpSession:通过session对象得到session中存放的对象。4.Model/modelmap/map:通过model向页面传递数据

12.3简单类型

通过@RequestParam对简单类型的参数进行绑定。

如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。

如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。

在这里插入图片描述

可以绑定整型、字符串、单精/双精度、日期、布尔型

12.4pojo绑定

页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo

12.5自定义参数绑定

12.5.1自定义convertor

public class CustomDateConverter implements Converter<String,Date>{
    @Override
    public Date convert(String s) {
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        try {
            return simpleDateFormat.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

12.5.2配置方式1

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!--转换器-->
<!-- conversionService -->
<bean id="conversionService"
      class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <!-- 转换器 -->
    <property name="converters">
        <list>
            <bean class="converter.CustomDateConverter"/>
        </list>
    </property>
</bean>

12.5.3配置方式2

处理器映射器和适配器没有使用mvc:annotation-driven的情况

<!--注解处理器映射器-->
  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

  <!--注解的适配器-->
  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
      <property name="webBindingInitializer" ref="customBinder"></property>
  </bean>
<bean id="customBinder"
        class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
      <property name="conversionService" ref="conversionService"/>
</beans>
<!--转换器-->
  <!-- conversionService -->
  <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
      <!-- 转换器 -->
      <property name="converters">
          <list>
              <bean class="controller.converter.CustomDateConverter"/>
              <bean class="controller.converter.StringTrimConverter"/>
          </list>
      </property>
  </bean>

13.问题

13.1post编码

<!-- 配置springMVC编码过滤器 -->  
<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>  
    <!-- 启动过滤器 -->  
    <init-param>  
        <param-name>forceEncoding</param-name>  
        <param-value>true</param-value>  
    </init-param>  
</filter>  
<!-- 过滤所有请求 -->  
<filter-mapping>  
    <filter-name>CharacterEncodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  

13.2get编码

在这里插入图片描述

发布了151 篇原创文章 · 获赞 110 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_35564813/article/details/104721037