springMVC学习笔记初识springmvc
Posted 拐柒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springMVC学习笔记初识springmvc相关的知识,希望对你有一定的参考价值。
springMVC学习笔记(一)初识springmvc
springMVC
spring MVC 是spring给我提供的一个用于简化web开发的框架。
MVC体系结构
经典三层(代码架构):
dao层、业务层、表现层(view+controller)。
MVC模式是说代码的组织方式:
M:model 模型(数据模型(pojo、vo、po、bean等)和业务模型(业务逻辑))
V:view 识图(jsp、html)
C:controller 控制器(servlet)
spring MVC框架是一个应用于表现层的框架。
spring MVC本质可以认为是对servlet的封装,简化我们servlet的开发,便于我们接受请求,返回相应,跳转页面。
spring MVC开发流程
1、配置DispatcherSevlet 前段控制器
2、开发处理具体业务逻辑的handler(@controller、@RequestMapping)
3、xml配置文件配置controller扫描,配置springmvc三大件
4、将xml文件路径告诉springmvc(DispatcherSevlet )
springmvc请求流程
1、用户发送请求给DispatcherSevlet
2、请求查询通过处理器映射器查找执行的handler,并返回给DispatcherSevlet
3、通过处理器适配器去请求之情handler
4、处理器适配器执行handler并返回modelAndView给DispatcherSevlet
5、DispatcherSevlet通过视图解析器进行解析识图,并返回view给DispatcherSevlet
6、渲染视图
其中处理器映射器HandlerMapping、处理器适配器HandlerAdapter、视图解析器ViewResolver是springmvc的三大核心组件。
springmvc 九大组件
HandlerMapping
处理器映射器。其作用是用来查找handler的,也就是处理器,具体表现形式可以是类,也可以是方法。添加了@RequestMapping的每个方法都可以看成是一个handler。handler负责具体实际的请求处理,在请求到达后,HandlerMapping的作用便是找到请求相应的处理器handler和interceptor。
HandlerAdapter
HandlerAdapter 是⼀个适配器。因为 Spring MVC 中 Handler 可以是任意形式的,只要能处理请
求即可。但是把请求交给 Servlet 的时候,由于 Servlet 的⽅法结构都是
doService(HttpServletRequest req,HttpServletResponse resp)形式的,要让固定的 Servlet 处理
⽅法调⽤ Handler 来进⾏处理,便是 HandlerAdapter 的职责。
HandlerExceptionResolver
HandlerExceptionResolver ⽤于处理 Handler 产⽣的异常情况。它的作⽤是根据异常设置
ModelAndView,之后交给渲染⽅法进⾏渲染,渲染⽅法会将 ModelAndView 渲染成⻚⾯。
ViewResolver
ViewResolver即视图解析器,⽤于将String类型的视图名和Locale解析为View类型的视图,只有⼀
个resolveViewName()⽅法。从⽅法的定义可以看出,Controller层返回的String类型视图名
viewName 最终会在这⾥被解析成为View。View是⽤来渲染⻚⾯的,也就是说,它会将程序返回
的参数和数据填⼊模板中,⽣成html⽂件。ViewResolver 在这个过程主要完成两件事情:
ViewResolver 找到渲染所⽤的模板(第⼀件⼤事)和所⽤的技术(第⼆件⼤事,其实也就是找到
视图的类型,如JSP)并填⼊参数。默认情况下,Spring MVC会⾃动为我们配置⼀个
InternalResourceViewResolver,是针对 JSP 类型视图的。
RequestToViewNameTranslator
RequestToViewNameTranslator 组件的作⽤是从请求中获取 ViewName.因为 ViewResolver 根据
ViewName 查找 View,但有的 Handler 处理完成之后,没有设置 View,也没有设置 ViewName,
便要通过这个组件从请求中查找 ViewName。
LocaleResolver
ViewResolver 组件的 resolveViewName ⽅法需要两个参数,⼀个是视图名,⼀个是 Locale。
LocaleResolver ⽤于从请求中解析出 Locale,⽐如中国 Locale 是 zh-CN,⽤来表示⼀个区域。这
个组件也是 i18n 的基础。
ThemeResolver
ThemeResolver 组件是⽤来解析主题的。主题是样式、图⽚及它们所形成的显示效果的集合。
Spring MVC 中⼀套主题对应⼀个 properties⽂件,⾥⾯存放着与当前主题相关的所有资源,如图
⽚、CSS样式等。创建主题⾮常简单,只需准备好资源,然后新建⼀个“主题名.properties”并将资
源设置进去,放在classpath下,之后便可以在⻚⾯中使⽤了。SpringMVC中与主题相关的类有
ThemeResolver、ThemeSource和Theme。ThemeResolver负责从请求中解析出主题名,
ThemeSource根据主题名找到具体的主题,其抽象也就是Theme,可以通过Theme来获取主题和
具体的资源。
MultipartResolver
MultipartResolver ⽤于上传请求,通过将普通的请求包装成 MultipartHttpServletRequest 来实
现。MultipartHttpServletRequest 可以通过 getFile() ⽅法 直接获得⽂件。如果上传多个⽂件,还
可以调⽤ getFileMap()⽅法得到Map<FileName,File>这样的结构,MultipartResolver 的作⽤就
是封装普通的请求,使其拥有⽂件上传的功能。
FlashMapManager
FlashMap ⽤于重定向时的参数传递,⽐如在处理⽤户订单时候,为了避免重复提交,可以处理完
post请求之后重定向到⼀个get请求,这个get请求可以⽤来显示订单详情之类的信息。这样做虽然
可以规避⽤户重新提交订单的问题,但是在这个⻚⾯上要显示订单的信息,这些数据从哪⾥来获得
呢?因为重定向时么有传递参数这⼀功能的,如果不想把参数写进URL(不推荐),那么就可以通
过FlashMap来传递。只需要在重定向之前将要传递的数据写⼊请求(可以通过ServletRequestAttributes.getRequest()⽅法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE
中,这样在重定向之后的Handler中Spring就会⾃动将其设置到Model中,在显示订单信息的⻚⾯
上就可以直接从Model中获取数据。FlashMapManager 就是⽤来管理 FalshMap 的。
spring url-pattnern
url-pattern的作用就是拦截匹配的url请求,进入springmvc框架处理 。
方式1:带后缀,比如xx.do,xx.action,该种方式比较精确,方便,以前和现在都有很大的使用比例
方式2:/ 不会拦截jsp,拦截restful风格,但是会拦截.html等静态资源(静态资源:出了servlet、jsp以外的js,css,png等),因为tomcat服务器中,还有一个web.xml,项目中也有一个web.xml,是继承关系。在父级web.xml中有一个defaultservlet,url-pattern是“/”,在项目中也配置了“/”,覆写了web.xml。父web.xml中有个jspServlet,这个servlet拦截 .jsp文件,而我们并没有覆写该servlet。所以是springmvc不拦截.jsp,把jsp交给了web容器tomcat。
可以通过配置文件配置解决对静态资源的拦截
1、
<!--静态资源配置,方案一
原理:添加该标签之后,会在springmvc上下文中定义一个defaultServletHttpRequestHandler对象,
该对象对进入dispatchServlet的url进行请求过滤,如果发现是一个静态资源请求,那么会把请求转回web应用服务器(tomcat中的defaultServlet来处理)
如果不是静态资源,那么继续交由springmvc框架处理。该方式存在弊端,只可以把静态资源放在webapp目录下面。
-->
<mvc:default-servlet-handler/>
2、
<!--静态资源配置,方案二
springmvc 自己处理静态资源
mapping:静态资源约定url规则,location:指定静态资源存放位置
-->
<mvc:resources mapping="/resources/**" location="classpath:/"></mvc:resources>
方式3:/* 拦截所有,包括jsp
数据输出
springmvc在handler方法上传入Map、Model、ModelMap参数,并想这些参数中保存数据(放入到请求域中),都可以在页面获取到。运行都是的具体类型都是BindingAwareModelMap,相当于给BindingAwareModelMap保存的数据都会放入请求域中。
Map(jdk中接口)
Model(spring框架的一个接口)
ModelMap(是map接口的一个实现类)
BindingAwareModelMap(继承了ExtendModelMap,ExtendModelMap继承了ModelMap,实现了Model接口),真正运行时使用的是BindingAwareModelMap。
springmvc请求参数绑定
请求参数绑定:springmvc如何接受请求参数。浏览器向后台发送请求时使用的是http协议(超文本传输协议),这里传输的是一个文本。
原生servlet接受请求整型参数
1)request.getParameter(“xxx”);
2)Integer.parseInt(“xxx”);
springmvc接受请求整型参数
springmvc在接受整形参数的时候,直接在handler方法中声明形参即可。参数绑定:取出参数值,绑定到handler方法的形参上。
servlet对象支持,以及简单数据类型参数
1、如果要在springmvc中使用servlet原生对象,直接在handler方法形参中声明出来即可。
2、springmvc在接受简单类型参数的时候,直接在handler方法中声明形参即可。简单数据类型(八种基本数据类型,及其包装类型),传递参数名和声明形参名称保持一致。如果不一致,可以通过@RequestParam(“xxx”)来指定。
3、pojo类型接收,需要保持参数名称和pojo中属性名保持一致。
4、时间Date类型转换,自定义数据类型转换器进行转换。
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
return null;
}
}
xml中定义
<!--自动注册最合适的处理器映射器,处理器适配器-->
<mvc:annotation-driven conversion-service="conversionService2" />
<!--注册自定义类型转换器-->
<bean id="conversionService2" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters" >
<set>
<bean class="com.lagou.edu.convert.DateConverter"></bean>
</set>
</property>
</bean>
以上是关于springMVC学习笔记初识springmvc的主要内容,如果未能解决你的问题,请参考以下文章