spring mvc
框架架构
框架流程:
1,1,用户发送请求至前端控制器DispatcherServlet
2,DispatcherServlet收到请求调用HandlerMapping处理器映射器.
.3,处理器映射器根据请求url找到具体的处理器,生成处理器对象和处理器拦截器如果有则生成)一并返回给DispatcherServlet.
处理器映射器根据请求url找到具体的处理器,生成处理器对象和处理器拦截器如果有则生成)一并返回给DispatcherServlet.4 ,DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5,执行处理器(Controller,也叫后端控制器)。
.6,Controller执行完成返回ModelAndView
7,HandlerAdapter将控制器执行结果的的ModelAndView中返回给DispatcherServlet的的的
8,DispatcherServlet将ModelAndView传给ViewReslover视图解析器9,ViewReslover解析后返回具体查看10,DispatcherServlet对查看进行渲染视图(即将模型数据填充至视图中).11,DispatcherServlet响应用户
组件说明:
以下组件通常使用框架提供实现:
◆ DispatcherServlet的:前端控制器用户请求到达前端控制器,它就相当于MVC模式中的C,DispatcherServlet的是整个流程控制的中心,由它调用其它组件处理用户的请求;分发器的存在降低了组件之间的耦合性。
HandlerMapping:处理器映射器的的的HandlerMapping负责根据用户请求找到处理程序即处理器,用用用SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
处理器:处理器。处理器是继的的DispatcherServlet的前端控制器的后端控制器,在DispatcherServlet的的的的控制下处理器对具体用户的请求进行处理由于处理程序涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发处理程序。
HandlAdapter:适配器处理器通过的的的HandlerAdapter对处理器进行执行,这是适配器 式的应用,通过适配器扩展可以对更多型的处理器进行执行。 视图解析器:视图解析器视图解析器负责将处理查询查询查询查询结果生成查看视图,视图解析器首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成视图视图对象,最后对查看进行渲染将处理结果通过页面展示给用户。
查看:视图
用用SpringMVC框架提供了很多的浏览视图类型的支持,包括:jstlView,freemarkerView,pdfView等我们最常用的视图就是JSP。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
组件扫描器
使用组件扫描器省去在弹簧容器配置每个控制器类的繁殖使用<上下文:组分扫描>自动扫描标记@Controller的控制器类,配置如下:
<! -扫描控制器注解,多个包间使用半角逗号分隔 - >
<context:component-scan base-package =“cn.xunjie.controller.first”/>
映射器
注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的URL匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装的URL对应的方法的方法。
从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。
<! - 注解映射器 - >
<bean class =“org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping”/>
注解式处理器适配器,
注解式处理器适配器,对标记@ResquestMapping的方法进行适配。
从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。
配置如下: <! - 注解适配器 - >
<bean class =“org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter”/>
<MVC:注释驱动>
用用SpringMVC使用<MVC:注解驱动>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,
可用在springmvc.xml配置文件中使用<MVC:注解驱动>。替代注解处理器和适配器的配置>
视图解析器
<bean class =“org.springframework.web.servlet.view.InternalResourceViewResolver”> <property name =“viewClass” value =“org.springframework.web.servlet.view.JstlView”/> <property name =“prefix”value =“/ WEB-INF / jsp /”/> <property name =“suffix”value =“。jsp”/>
</豆>
InternalResourceViewResolver :支持JSP视图解析
viewClass :JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar包。
此属性可以不设置,默认为JstlView。
前缀和后缀:查找视图页面的前缀和后缀,最终视图的位为:
前缀+逻辑视图名+后缀,逻辑视图名需要在控制器中返回的ModelAndView的指定,比如逻辑视图名为你好,
则最终返回的jsp视图地址“WEB-INF / jsp / hello.jsp”
整合的MyBatis的
Dao层:
1,SqlMapConfig.xml,空文件即可。需要文件头
.2的applicationContext-dao.xml。
a )数据库连接池
b)SqlSessionFactory对象,需要spring和mybatis整合包下的。
c)中配置映射器扫描器文件服务层:
1,的applicationContext-service.xml的中包扫描器,扫描@Service注解的类。
2,applicationContext-trans.xml配置事务。表现层:Springmvc.xml 1,包扫描器,扫描@Controller注解的类.2,配置注解驱动3,视图解析器
在web.xml中配置前端控制器.Spring容器的监听
帖子乱码问题过滤器
sqlMapConfig.xml
在类路径下创建的MyBatis / 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>
</配置>
数据配置源 的的applicationContext-dao.xml
配置数据源,配置的SqlSessionFactory中,映射扫描器。
<?xml version = “1.0” encoding = “UTF-8”?> < beans xmlns = “http://www.springframework.org/schema/beans” xmlns:context = “http://www.springframework.org/schema/context” xmlns:p = “http://www.springframework.org/schema/p” xmlns:aop = “http://www.springframework.org/schema/aop” xmlns:tx = “http://www.springframework.org/schema/tx” xmlns:xsi = “http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation = “http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http:/ /www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd“ >
<! - 加载配置文件 - > < context:property-placeholder location = “classpath:db.properties” /> <! - 数据库连接池 - > < bean id = “dataSource” class = “org.apache.commons.dbcp.BasicDataSource” destroy-method = “close” > < property name = “driverClassName” value = “$ {jdbc.driver}” /> < property name = “url” value = “$ {jdbc.url}” /> < property name = “username” value = “$ {jdbc.username}” /> < property name = “password” value = “$ {jdbc.password}” /> < property name = “maxActive” value = “10” /> < property name = “maxIdle” value = “5” /> </ bean > <! - mapper配置 - > <! - 让弹簧管理SqlSessionFactory中使用的MyBatis和弹簧整合包中的 - > < bean id = “sqlSessionFactory” class = “org.mybatis.spring.SqlSessionFactoryBean” > <! - 数据库连接池 - > < property name = “dataSource” ref = “dataSource” /> <! - 加载的MyBatis的全局配置文件 - > < property name = “configLocation” value = “classpath:mybatis / SqlMapConfig.xml” /> </ bean > <! - 配置Mapper扫描器 - > < bean class = “org.mybatis.spring.mapper.MapperScannerConfigurer” > < property name = “basePackage” value = “com.xunjie.springmvc.mapper” /> </ bean >
</ beans > Db.properties jdbc.password =根 |
的的applicationContext-service.xml的中
<?xml version = “1.0” encoding = “UTF-8”?> < beans xmlns = “http://www.springframework.org/schema/beans” xmlns:context = “http://www.springframework.org/schema/context” xmlns:p = “http://www.springframework.org/schema/p” xmlns:aop = “http://www.springframework.org/schema/aop” xmlns:tx = “http://www.springframework.org/schema/tx” xmlns:xsi = “http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation = “http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http:/ /www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd“ >
< context:component-scan base-package = “com.xunjie.springmvc.service” />
</ beans > |
的applicationContext-transaction.xml
<?xml version = “1.0” encoding = “UTF-8”?> < beans xmlns = “http://www.springframework.org/schema/beans” xmlns:context = “http://www.springframework.org/schema/context” xmlns:p = “http://www.springframework.org/schema/p” xmlns:aop = “http://www.springframework.org/schema/aop” xmlns:tx = “http://www.springframework.org/schema/tx” xmlns:xsi = “http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation = “http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http:/ /www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd“ > <! - 事务管理器 - > < 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 = “delete *” propagation = “REQUIRED” /> < tx:method name = “update *” propagation = “REQUIRED” /> < tx:method name = “find *” propagation = “SUPPORTS” 只读= “true” /> < tx:method name = “get *” propagation = “SUPPORTS” 只读= “true” /> </ tx:attributes > </ tx:advice > <! - 切面 - > < aop:config > < aop:advisor advice-ref = “txAdvice” pointcut = “执行(* com.xunjie.springmvc.service。*。*(..))” /> </ aop:config > </ beans >
springmvc.xml
|
web.xml中
<?xml version = “1.0” encoding = “UTF-8”?> < web-app xmlns:xsi = “http://www.w3.org/2001/XMLSchema-instance” xmlns = “http://java.sun.com/xml/ns/javaee” xsi:schemaLocation = “http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd” id = “WebApp_ID” version = “2.5” > < display-name > springmvc -web </ display-name > < welcome-file-list > < welcome-file > index.html </ welcome-file > < welcome-file > index.htm </ welcome-file > < welcome-file > index.jsp </ welcome-file > < welcome-file > default.html </ welcome-file > < welcome-file > default.htm </ welcome-file > < welcome-file > default.jsp </ welcome-file > </ welcome-file-list > <! - 加载spring容器 - > < context-param > < param-name > contextConfigLocation </ param-name > < param-value > classpath:spring / applicationContext- *。xml </ param-value > </ context-param > < listener > < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class > </ listener >
< servlet > < servlet-name > springmvc </ servlet-name > < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class > < init-param > < param-name > contextConfigLocation </ param-name > < param-value > classpath:spring / springmvc.xml </ param-value > </ init-param > </ servlet > < servlet-mapping > < servlet-name > springmvc </ servlet-name > < url-pattern > * .action </ url-pattern > </ servlet-mapping > </ web-app > |
DAO
MyBatis的****。
服务
如图1所示,服务由弹簧管理
2,弹簧对服务进行事务控制。
ItemService接口
公共 接口 ItemService {
List <Items> getItemsList(); }
|
ItemServiceImpl实现类
@服务 公共类 ItemServiceImpl 实现 ItemService {
@ Autowired 私人 ItemMapper itemMapper ;
@覆盖 public List <Items> getItemsList(){ List <Items> itemList = itemMapper .getItemList(); 返回 itemList ; }
} |
1.3控制器
@Controller 公共类 ItemController {
@Autowired private ItemService itemService ;
@RequestMapping (“/ itemList” ) public ModelAndView getItemList(){ List <Items> list = itemService .getItemsList(); ModelAndView modelAndView = new ModelAndView(); modelAndView .addObject(“itemList” ,list ); modelAndView .setViewName(“itemList” ); 返回 modelAndView ; } } |
型号/ ModelMap
ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据,如下://调用服务查询商品信息
Items item = itemService.findItemById(id);
model.addAttribute(“item”,item);
页面通过$ {item.XXXX}获取项目对象的属性值。
使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。
如果使用模式则可以不使用的ModelAndView的对象,模型对象可以向页面传递数据,查看对象则可以使用字符串返回值替代。
不管是型号还是ModelAndView中的,其本质都是使用请求对象向JSP传递数据。
如果使用型号则方法可以改造成:
@RequestMapping("/itemEdit")
public String itemEdit(HttpServletRequest request, Model model) {
//从Request中取id
String strId = request.getParameter("id");
Integer id = null;
//如果id有值则转换成int类型
if (strId != null && !"".equals(strId)) {
id = new Integer(strId);
} else {
//出错
return null;
}
Items items = itemService.getItemById(id);
//创建ModelAndView
//ModelAndView modelAndView = new ModelAndView();
//向jsp传递数据
//modelAndView.addObject("item", items);
model.addAttribute("item", items);
//设置跳转的jsp页面
//modelAndView.setViewName("editItem");
//return modelAndView;
return "editItem";
}
支持的数据类型
参数类型推荐使用包装数据类型,因为基础数据类型不可以为空
整形:整数,INT
字符串:字符串
单精度:浮动,浮动
双精度:双,双
布尔型:布尔,布尔
说明:对于布尔类型的参数,请求的参数值为真或假。
处理器方法:
public String editItem(Modelmodel,Integer id,布尔状态)throwsException
请求网址:http:// localhost:8080 / xxx.action?id = 2 &status = false
@RequestParam
使用@RequestPar am常用于处理简单类型的绑定。
value :参数名字,即入参的请求参数名字,如value = “item_id “ 表示请求的参数区中的名字为item_id 的参数的值将传入;
required :是否必须,默认是true ,表示请求中一定要有相应的参数,否则将报;
TTP状态400 - 必需整数参数' XXXX'不存在
defaultValue :默认值,表示如果请求中没有同名参数的默认值
定义如下:
public String editItem(@RequestParam(value =“item_id”,required = true)String id){
}
绑定POJO
@RequestMapping("/updateitem")
public String updateItem(Items items) {
itemService.updateItem(items);
return "success";
}
编码问题
修改tomcat配置文件添加编码与工程编码一致,如下:
<Connector URIEncoding =“utf-8”connectionTimeout =“20000”port =“8080”protocol =“HTTP / 1.1”redirectPort =“8443”/>(不推荐)
另一种方法对参数进行重新编码:
String userName new
String(request.getParamter(“userName”)。getBytes(“ISO8859-1”),“utf-8”)
ISO8859-1是Tomcat的默认编码,需要将Tomcat的编码后的内容按UTF-8编码
自定义转换器
public class DateConverter 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) {
e.printStackTrace();
}
return null;
}
}
<!-- 加载注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 转换器配置 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
</set>
</property>
<bean class="cn.itcast.springmvc.convert.DateConverter"/>
</bean>
SpringMVC与struts2中的不同
推荐阅读