SpringMVC_day01
1. SpringMVC入门
1.1 SpringMVC介绍
Spring web mvc和struts2都属于表现层框架,是Spring框架的一部分。
1.2 SpringMVC处理流程
1.3 入门程序
步骤:1.创建web工程,导入springmvc独立运行所需jar包
2.创建springmvc.xml配置文件,可放在src下
3.在web.xml中配置springmvc前端控制器DispatcherServlet
<servlet>
<servlet-name>springmvc</servlet-name>//名字任意,与servlet-mapping中一致即可
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
//指定springmvc配置文件。默认路径为/WEB-INF/${servlet-name}-servlet.xml
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
//配置以action结尾的请求进入springmvc
/*
/拦截所有,不包括jsp;/*拦截所有
*/
<url-pattern>*.action</url-pattern>
</servlet-mapping>
4.加入jsp页面,创建pojo
5.创建ItemController,添加@Controller注解将其交给spring管理
@Controller
public class ItemControllerDemo {
//@RequestMapping:定义请求url到处理器功能方法的映射,里面放的是测试时地址栏里用户请求的url
@RequestMapping("/itemList.action")//.action可写可不写
public ModelAndView queryItemList(){
//创建ModelAndView,用来存放数据和视图
ModelAndView mav=new ModelAndView();
//设置数据到mav;相当于request.setAttribute(arg0, arg1);
mav.addObject("itemList", list);
//设置视图名即页面地址
//有多个页面时,可以在将相同的前后缀配置到springmvc.xml里(详见2.7)
//mav.setViewName("/WEB-INF/jsp/itemList.jsp");
mav.setViewName("itemList");
//最终页面地址为:前缀+逻辑视图名+后缀
return mav;
}
}
6.测试:http://localhost:8080/14.1SpringMVC/itemList.action
2. SpringMVC架构
2.1 框架结构
2.2 架构流程
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet将渲染后的视图响应给用户
2.3 组件说明
-
DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性
-
HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
-
Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
-
HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
-
ViewResolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
-
View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。需要程序员开发的组件有handler、view
2.4 组件扫描器
使用组件扫描器省去在spring容器配置每个Controller类的繁琐。
eg: <!-- 配置controller扫描包,多个包之间用,分隔或再写一行 -->
<context:component-scan base-package="com.itheima.controller" />
2.5 注解映射器和适配器
-
配置处理器映射器
注解式处理器映射器,对类中方法上标记了@ResquestMapping的方法进行映射。将用户输入的url和@ResquestMapping定义的url匹配,匹配成功返回HandlerMethod对象给前端控制器,
HandlerMethod对象中封装url对应的方法Method。
从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。
在springmvc.xml中配置如下:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
-
配置处理器适配器
注解式处理器适配器,对标记@ResquestMapping的方法进行适配。
从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。
在springmvc.xml中配置如下:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
2.6 注解驱动
直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。
<mvc:annotation-driven />//代替2.5中的两段代码
2.7 视图解析器
视图解析器使用SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器支持JSP视图解析。在springmvc.xml配置文件中配置视图解析器如下:
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置视图前后缀-->
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
3. SpringMVC-mybatis整合
3.1 默认支持的参数类型
处理器形参中添加如下类型的参数,处理适配器会默认识别并赋值。
3.1.1 HttpServletRequest
通过request获取请求信息
3.1.2 HttpServletResponse
通过response处理相应信息
3.1.3 HttpSession
通过session获取session中存放的对象
3.2 Model/ModelMap
除了ModelAndView以外,还可以使用Model来向页面传递数据,Model是一个接口,在参数里直接声明model即可。如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用String返回值替代。
不管是Model还是ModelAndView,其本质都是使用Request对象向jsp传递数据。
@RequestMapping("/itemEdit.action")
public String queryById(HttpServletRequest request,Model m) {
String id=request.getParameter("id");
Items item=itemsService.queryById(Integer.parseInt(id));
m.addAttribute("item", item);
return "itemEdit";
}
ModelMap是Model接口的实现类,也可以通过ModelMap向页面传递数据。使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。
@RequestMapping("/itemEdit.action")
public String queryById(HttpServletRequest request,ModelMap mm) {
String id=request.getParameter("id");
Items item=itemsService.queryById(Integer.parseInt(id));
mm.addAttribute("item", item);
return "itemEdit";
}
3.3 绑定简单类型
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。这样,从Request取参数的方法就可以进一步简化。
@RequestMapping("/itemEdit.action")
public String queryById(int id,ModelMap mm) {
Items item=itemsService.queryById(id);//可以直接取出使用
mm.addAttribute("item", item);
return "itemEdit";
}
3.3.1 支持的数据类型
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
整形:Integer、int 字符串:String 单精度:Float、float 双精度:Double、double 布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。或者1或0
3.3.2 @RequestParam
//@RequestParam处理简单类型的绑定,不要求请求参数名称和处理器形参必须一致
value:请求参数的名称
required:默认为true,表示请求中一定要有相应参数,否则报错
defaultValue:设置默认值,如果请求中无相应参数,则为该值
//假设请求参数名为iiid,处理器形参名为id
@RequestMapping("/itemEdit.action")
public StringqueryById(@RequestParam(value="iiid",required=true,defaultValue="1")int id,ModelMap mm) {...}
3.4 绑定pojo类型
如果提交的参数很多,或者提交的表单中的内容很多的时候,可以使用简单类型接收数据,也可以使用pojo接收数据。要求:pojo对象中的属性名和表单中input的name属性名必须一致。
请求的参数名和pojo属性名一致时,会自动将请求参数赋值给pojo的属性。
3.5 解决表单数据post提交乱码问题
在web.xml中:
<!-- 解决post乱码问题 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<!-- 设置编码是UTF8 -->
<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>
-
get请求中文乱码问题
method1: 修改tomcat配置文件添加编码与工程编码一致,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
method2: 对参数进行重新编码:
String userName new
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
3.6 绑定包装pojo,即QueryVo
/*
* 使用QueryVo,则itemEdit.jsp里的name属性应改为item.id,item.price等等,
* item为QueryVo里的Items成员变量名,value中则不用变化,因为上面queryById()
* 里设置的就是item,mm.addAttribute("item", item);
*/
@RequestMapping("/updateItems.action")
public String updateItems(QueryVo vo) {
itemsService.updateById(vo.getItem());
//返回逻辑视图
return "success";
}
3.7 自定义参数绑定
eg: 根据业务需求自定义日期格式
由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。
前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。
- 自定义时间转换器DateConverter
Converter<S,T>
* S:source源类型
* T:targer目标类型
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
//把字符串转换为日期类型
//例:源类型yyyy:MM-dd HH.mm_ss
System.out.println(source);//2015:02-09 13.22_57
SimpleDateFormat sdf=new SimpleDateFormat("yyyy:MM-dd HH.mm_ss");
Date date=sdf.parse(source);
System.out.println(date);//Mon Feb 09 13:22:57 CST 2015
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
-
配置Converter
method1: 一般使用<mvc:annotation-driver />注解驱动加载处理器适配器,可以在此标签上进行配置。
在springmvc.xml中:
<!--配置注解驱动和转换器服务-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 配置转换器converter -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<!--这里的name只能为converters-->
<set>
<bean class="com.itheima.conversion.DateConverter"/>
</set>
</property>
</bean>
method2:
此方法需要独立配置处理器映射器、适配器,不再使用<mvc:annotation-driver />
在springmvc.xml中:
//1.配置处理器映射器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
//2.配置处理器适配器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
//自定义webBinder
<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService" />
</bean>
<!-- 转换器配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.springmvc.convert.DateConverter" />
</set>
</property>
</bean>