SSM之springMVC(2/4)

下一节 SSM之springMVC(1/4)

目录

springMVC和mybatis整合

需求

整合思路

准备环境

整合dao

sqlMapConfig.xml

applicationContext-dao.xml

逆向工程po类及mapper类

整合service

定义service接口

Service接口实现类

applicationContext-service.xml

applicationContext-transaction.xml(事务控制)

整合springMVC

spring.xml

web.xml(前端控制器)

编写Controller(handler)

加载spring容器(web.xml)

Controller方法的返回值

参数绑定

Spring参数绑定的过程

默认支持的类型

HttpServletRequest

HttpServletResponse

HttpSession

Model/ModelMap

简单类型

pojo绑定

自定义参数绑定实现日期类型绑定

Springmvc和struts2的区别

乱码

post乱码

get乱码


springMVC和mybatis整合

需求

使用springmvc和mybatis完成商品列表查询。

springMVC+mybatis的系统架构:

整合思路

第一步:整合dao层

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

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

第二步:整合service层

       通过spring管理service接口。

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

实现事务控制。

第三步:整合springMVC

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

准备环境

Jdk1.8、eclipse MARS.2、mysql5.7

所用jar包:

数据库驱动包、mybatis包、mybatis和spring整合包、log4j包、dbcp数据库连接池包、spring包、jstl包

整合dao

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">

<configuration>

    <!-- 配置别名 -->

    <typeAliases>

        <!-- 批量扫描别名 -->

        <package name="com.ssm.po"/>

    </typeAliases>

   

    <!-- 配置mapper 由于使用spring和mybatis的整合包进行mapper扫描,这里不需要配置了 -->

    <!-- <mappers> </mappers> -->

   

</configuration>

applicationContext-dao.xml

配置:

数据源

SqlSessionFactory

Mapper扫描器

逆向工程po类及mapper类

加入到项目中。

整合service

定义service接口

public interface ItemsMapperCustom {

    public ItemsCustom findItemsList(ItemsQueryVo itemsQueryVo) throws Exception;

}

Service接口实现类

public class ItemsServiceImpl implements ItemsService{

    @Autowired

    private ItemsMapperCustom itemsMapperCustom;

    @Override

    public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception {

        return itemsMapperCustom.findItemsList(itemsQueryVo);

    }

}

applicationContext-service.xml

<!-- 商品管理的service -->

<bean id="itemsService"class="com.ssm.service.impl.ItemsServiceImpl"/>

applicationContext-transaction.xml(事务控制)

<!-- 事务管理器,对mybatis操作数据库事务控制,spring使用jdbc的事务控制类 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

   <!-- 数据源,dataSource在applicationContext-dao.xml中配置了 -->

   <property name="dataSource" ref="dataSource"/>

</bean>

<!-- 通知 -->

<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<!-- 传播行为 -->

<tx:method name="save*" propagation="REQUIRED"/>

<tx:method name="delete*" propagation="REQUIRED"/>

<tx:method name="insert*" propagation="REQUIRED"/>

<tx:method name="update*" propagation="REQUIRED"/>

<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>

<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>

<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>

</tx:attributes>

</tx:advice>

<!-- aop -->

<aop:config>

<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.ssm.service.impl.*.*(..))"/>

</aop:config>

整合springMVC

创建springmvc.xml文件,配置处理器映射器、适配器、视图解析器。

spring.xml

<!-- 可以扫描controller、service、...

    这里让扫描controller,指定controller的包

     -->

    <context:component-scan base-package="com.ssm.controller"></context:component-scan>

   

    <!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置

        mvc:annotation-driven默认加载很多的参数绑定方法,

        比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter

        实际开发时使用mvc:annotation-driven

     -->

    <mvc:annotation-driven></mvc:annotation-driven>

   

    <!-- 视图解析器 -->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <!-- 配置jsp路径的前缀 -->

      <property name="prefix" value="/WEB-INF/jsp/"/>

        <!-- 配置jsp路径的后缀 -->

        <property name="suffix" value=".jsp"/>

    </bean>

web.xml(前端控制器)

<!-- springMvc前端控制器配置 -->

  <servlet>

      <servlet-name>springmvc</servlet-name>

      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

      <init-param>

      <!-- contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加

             载WEB-INF/servlet名称—servlet.xml(springmvc-servlet.xml)

       -->

          <param-name>contextConfigLocation</param-name>

          <param-value>classpath:springmvc.xml</param-value>

      </init-param>

      <!-- load-on-startup:表示servlet随服务启动; -->

      <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

      <servlet-name>springmvc</servlet-name>

      <!--

            第一种:*.action 或者 *.do,访问以.action或*.do结尾 由DispatcherServlet进行解析

            第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析

           使用此种方式可以实现 RESTful风格的url

            第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,

            仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。

     -->

      <url-pattern>*.action</url-pattern>

  </servlet-mapping>

编写Controller(handler)

@Controller

public class ItemsController {

    @Autowired

    private ItemsService itemsService;

    //商品查询

    @RequestMapping("/queryItems")

    public ModelAndView findItemsList() throws Exception{

        List<ItemsCustom> itemsCustomsList=itemsService.findItemsList(null);

        ModelAndView modelAndView=new ModelAndView();

        modelAndView.addObject("itemsList", itemsCustomsList);

        modelAndView.setViewName("itemsList");

        return modelAndView;

    }

}

加载spring容器(web.xml)

<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>/WEB-INF/classes/spring/applicationContext-*.xml</param-value>

</context-param>

<listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

Controller方法的返回值

返回ModelAndView:

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

返回String

       如果controller方法返回string,

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

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

@RequestMapping(value = "/selectByPrimaryKey", method = { RequestMethod.POST, RequestMethod.GET })

    public String selectByPrimaryKey(Model model) throws Exception {

        ItemsCustom itemsCustom = itemsService.selectByPrimaryKey(1);

        model.addAttribute("itemsList", itemsCustom);

        return "itemsUpdate";

    }

2、redirect重定向

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

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

return "redirect:findItemsList.action";

3、forward页面转发

通过forward进行页面转发,浏览器地址栏不变,request可以共享。

return "forward:findItemsList.action";

 

返回void

       在controller方法形参上可以定义request和response,使用request和response指定响应结果:

1、使用request转向页面,如下:

request.getRequestDispatcher("页面路径").forward(request, response);

2、通过response页面重定向:

response.sendRedirect("url");

3、通过response指定响应结果,例如响应json数据如下:

response.setCharacterEncoding("utf-8");

response.setContentType("application/json;charset=utf-8");

response.getWriter().write("json串");

参数绑定

Spring参数绑定的过程

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

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

默认支持的类型

直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定的过程中,如果遇到下边类型直接进行绑定。

HttpServletRequest

通过request对象获得请求信息

HttpServletResponse

通过response处理响应信息

HttpSession

通过session对象得到session中存放的对象

Model/ModelMap

Model是一个接口,modelMap是一个接口实现。

作用:将model数据填充到request域。

简单类型

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

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

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

通过required属性指定参数是否必须要传入。

@RequestMapping(value = "/selectByPrimaryKey", method = { RequestMethod.POST, RequestMethod.GET })

    //@RequestParam里边指定request传入参数名称和形参进行绑定

    //通过required属性指定参数是否必须要传入

    //通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定

    public String selectByPrimaryKey(Model model,@RequestParam(value="id",required=true) Integer items_id) throws Exception {

        ItemsCustom itemsCustom = itemsService.selectByPrimaryKey(items_id);

        model.addAttribute("itemsList", itemsCustom);

 

        return "itemsUpdate";

    }

pojo绑定

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

页面标签中name属性值与pojo形参保持一致才能绑定成功

自定义参数绑定实现日期类型绑定

对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。

将请求日期数据串传成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。

 

所以自定义参数绑定将日期串转成java.util.Data类型。(pojo)

Springmvc.xml

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

<bean id="conversionService"

class="org.springframework.format.support.FormattingConversionServiceFactoryBean">

    <!-- 转换器 -->

    <property name="converters">

        <list>

            <!-- 日期转换器 -->

            <bean class="com.ssm.controller.converter.CustomDateConverter"/>

        </list>

    </property>

</bean>

com.ssm.controller.converter

public class CustomDateConverter implements Converter<String, Date> {

    @Override

    public Date convert(String source) {

        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        try {

            return simpleDateFormat.parse(source);

        } catch (ParseException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return null;

    }

}

Springmvc和struts2的区别

1、springmvc是基于方法开发的,struts2基于类开发的。

Springmvc将url和controller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。

Springmvc的controller开发更类似于service开发。

2、springmvc可以进行单例开发,也可以多例,但建议使用单例开发;struts2通过类的成员变量接收参数,无法使用单例开发,只能使用多例。

3、经过实际测试,struts2速度慢,在于使用struts2标签,如果使用struts2建议使用jstl。

乱码

post乱码

在web.xml添加post乱码filter

<!-- 乱码过滤器:解决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>

get乱码

两个解决方法:

1、修改tomcat配置文件添加编码与工程编码一致

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

2、对参数进行重新编码

String userName=new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),”utf-8”)

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

 

 

下一节 SSM之springMVC(3/4)

猜你喜欢

转载自blog.csdn.net/qq_40802448/article/details/88585473