SSM之springMVC(2/4)
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)