Spring MVC拦截器
1 / 4 Spring MVC拦截器 Spring为我们提供了: org.springframework.web.servlet.HandlerInterceptor接口, org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器, 实现这个接口或继承此类,可以非常方便的实现自己的拦截器。
有以下三个方法:
Action之前执行: public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler);
生成视图之前执行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView);
最后执行,可用于释放资源 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面) 在preHandle中,可以进行编码、安全控制等处理; 在postHandle中,有机会修改ModelAndView; 在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。 参数中的Object handler是下一个拦截器。
如何使用拦截器? 自定义一个拦截器,要实现HandlerInterceptor接口: Java代码 1. public class MyInteceptor implements HandlerInterceptor { 2. 略。。。 3. }
Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截。 Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器。 当一个请求按Order值从小到大,顺序执行HandlerMapping接口的实现类时,哪一个先有返回,那就可以结束了,后面 2 / 4
的HandlerMapping就不走了,本道工序就完成了。就转到下一道工序了。 拦截器会在什么时候执行呢? 一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。 如果没有找到处理器,那么这个拦截器就不会被执行。
在spring MVC的配置文件中配置有三种方法: 方案一,(近似)总拦截器,拦截所有url Java代码 1. 2. 3. 为什么叫“近似”,前面说了,Spring没有总的拦截器。 会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。 如果是REST风格的URL,静态资源也会被拦截。
方案二, (近似) 总拦截器, 拦截匹配的URL。 Xml代码 1. 2. 3. 4. 5. 6. 就是比 方案一多了一个URL匹配。 如果是REST风格的URL,静态资源也会被拦截。
方案三,HandlerMappint上的拦截器。 如果是REST风格的URL,静态资源就不会被拦截。因为我们精准的注入了拦截器。 Xml代码 1. 2. 3. 3 / 4
4. 5. 6. 7. 如果使用了, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。 当然我们可以通过人工配置上面的两个Bean,不使用 ,就可以 给interceptors属性 注入拦截器了。
其实我也不建议使用 ,而建议手动写详细的配置文件,来替代 ,这就控制力就强了。 如何替换 ?他到底做了什么工作? 一句 实际做了以下工作:(不包括添加自己定义的拦截器) 我们了解这些之后,对Spring3 MVC的控制力就更强大了,想改哪就改哪里。 Xml代码 1. 2. 3. 4. 5. 6. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 4 / 4
25. 26. - 处理.. --> 27. 28. 29. 30. 31.
本文作者:赵磊
拦截器和过滤器的区别
拦截器和过滤器的区别过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,⽽过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作⽤,⽽过滤器则可以对⼏乎所有的请求起作⽤。
④拦截器可以访问action上下⽂、值栈⾥的对象,⽽过滤器不能访问。
⑤在action的⽣命周期中,拦截器可以多次被调⽤,⽽过滤器只能在容器初始化时被调⽤⼀次。
⑥拦截器可以获取IOC容器中的各个bean,⽽过滤器就不⾏,这点很重要,在拦截器⾥注⼊⼀个service,可以调⽤业务逻辑。
⑥拦截器可以获取IOC容器中的各个bean,⽽过滤器就不⾏,这点很重要,在拦截器⾥注⼊⼀个service,可以调⽤业务逻辑。
⑥拦截器可以获取IOC容器中的各个bean,⽽过滤器就不⾏,这点很重要,在拦截器⾥注⼊⼀个service,可以调⽤业务逻辑。
⑥拦截器可以获取IOC容器中的各个bean,⽽过滤器就不⾏,这点很重要,在拦截器⾥注⼊⼀个service,可以调⽤业务逻辑。
拦截器可以获取ioc中的service bean实现业务逻辑,拦截器可以获取ioc中的service bean实现业务逻辑,拦截器可以获取ioc中的service bean实现业务逻辑,触发时机触发时机触发时机有个专业词语叫触发时机有个专业词语叫触发时机有个专业词语叫触发时机1.过滤器和拦截器触发时机不⼀样: 过滤器是在请求进⼊容器后,但请求进⼊servlet之前进⾏预处理的。
请求结束返回也是,是在servlet处理完后,返回给前端之前。
1.过滤器和拦截器触发时间和地点不⼀样: 过滤器是在请求进⼊容器后,但请求进⼊servlet之前进⾏预处理的。
请求结束返回也是,是在servlet处理完后,返回给前端之前。
1.过滤器和拦截器触发时间和地点不⼀样: 过滤器是在请求进⼊容器后,但请求进⼊servlet之前进⾏预处理的。
Spring-Mvc-ppt课件
BeanNameUrlHandlerMapping
dispatcher-servlet.xml
<bean class="org.springframework.web.servlet. handler.BeanNameUrlHandlerMapping"/>
Jsp model 2架构
Model 2采用面向对象技术实现MVC模式 从而扩展
JSP/Servlet的模式。 Model2是MVC在Web上的应用。
一个Model 2规范实现的Web框 架
一个Model 2规范实现的Web框 架
视图层采用JSP实现;控制层采用Servlet实现, 整个框架采用同一个Servlet,以实现请求的中转; 模型层采用Java实现,主要决定用来做什么;在模型 层后添加了一个DAO,目的是将决定做什么和具体怎 么做分开。
<property name="mappings"> <value> /simple.htm=simpleController /test*=testController </value>
</property> </bean> …
ControllerClassNameHandlerMapping
• 支持惯例优先原则 • 在它的应用上下文中找出所有不同的处理
JSP表单标签库:在Spring2.0中引入的表单标签库,使得在JSP中编写 表单 更加容易。
Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。
springmvc之单元测试(MockMvc)-独立测试
springmvc之单元测试(MockMvc)-独⽴测试spring mvc测试框架提供了两种⽅式,独⽴安装和集成Web环境测试(此种⽅式并不会集成真正的web环境,⽽是通过相应的Mock API进⾏模拟测试,⽆须启动服务器)1、mockMvc.perform执⾏⼀个请求;2、MockMvcRequestBuilders.get("/user/1")构造⼀个请求3、ResultActions.andExpect添加执⾏完成后的断⾔4、ResultActions.andDo添加⼀个结果处理器,表⽰要对结果做点什么事情,⽐如此处使⽤MockMvcResultHandlers.print()输出整个响应结果信息。
5、ResultActions.andReturn表⽰执⾏完成后返回相应的结果。
MockMvcBuilder是⽤来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,StandaloneMockMvcBuilder继承了DefaultMockMvcBuilder。
直接使⽤静态⼯⼚MockMvcBuilders创建即可:MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下⽂获取相应的控制器并得到相应的MockMvc;MockMvcBuilders.standaloneSetup(Object... controllers):通过参数指定⼀组控制器,这样就不需要从上下⽂获取了;其中DefaultMockMvcBuilder还提供了如下API:addFilters(Filter... filters)/addFilter(Filter filter, String... urlPatterns):添加javax.servlet.Filter过滤器defaultRequest(RequestBuilder requestBuilder):默认的RequestBuilder,每次执⾏时会合并到⾃定义的RequestBuilder中,即提供公共请求数据的;alwaysExpect(ResultMatcher resultMatcher):定义全局的结果验证器,即每次执⾏请求时都进⾏验证的规则;alwaysDo(ResultHandler resultHandler):定义全局结果处理器,即每次请求时都进⾏结果处理;dispatchOptions:DispatcherServlet是否分发OPTIONS请求⽅法到控制器;StandaloneMockMvcBuilder继承了DefaultMockMvcBuilder,⼜提供了如下API:setMessageConverters(HttpMessageConverter<?>...messageConverters):设置HTTP消息转换器;setValidator(Validator validator):设置验证器;setConversionService(FormattingConversionService conversionService):设置转换服务;addInterceptors(HandlerInterceptor... interceptors)/addMappedInterceptors(String[] pathPatterns, HandlerInterceptor... interceptors):添加spring mvc拦截器;setContentNegotiationManager(ContentNegotiationManager contentNegotiationManager):设置内容协商管理器;setAsyncRequestTimeout(long timeout):设置异步超时时间;setCustomArgumentResolvers(HandlerMethodArgumentResolver... argumentResolvers):设置⾃定义控制器⽅法参数解析器;setCustomReturnValueHandlers(HandlerMethodReturnValueHandler... handlers):设置⾃定义控制器⽅法返回值处理器;setHandlerExceptionResolvers(List<HandlerExceptionResolver>exceptionResolvers)/setHandlerExceptionResolvers(HandlerExceptionResolver... exceptionResolvers):设置异常解析器;setViewResolvers(ViewResolver...resolvers):设置视图解析器;setSingleView(View view):设置单个视图,即视图解析时总是解析到这⼀个(仅适⽤于只有⼀个视图的情况);setLocaleResolver(LocaleResolver localeResolver):设置Local解析器;setFlashMapManager(FlashMapManager flashMapManager):设置FlashMapManager,如存储重定向数据;setUseSuffixPatternMatch(boolean useSuffixPatternMatch):设置是否是后缀模式匹配,如“/user”是否匹配"/user.*",默认真即匹配;setUseTrailingSlashPatternMatch(boolean useTrailingSlashPatternMatch):设置是否⾃动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认真即匹配;addPlaceHolderValue(String name, String value) :添加request mapping中的占位符替代;因为StandaloneMockMvcBuilder不会加载Spring MVC配置⽂件,因此就不会注册我们需要的⼀些组件,因此就提供了如上API⽤于注册我们需要的相应组件。
Spring3.0 MVC 中文教程
Spring3 MVC - 3到Spring MVC框架简介Spring3 MVC框架简介Spring MVC是Spring的框架的Web组件。
它提供了丰富的功能,为建设强大的Web应用程序。
Spring MVC框架的架构,并在这样的高度可配置的方式,每一块的逻辑和功能设计。
此外Spring可以毫不费力地与其他流行的Web框架,如Struts,WebWork的,的Java Server Faces和Tapestry集成。
这意味着,你甚至可以告诉Spring使用Web框架中的任何一个。
比Spring更不紧耦合的servlet或JSP 向客户端呈现视图。
喜欢速度与其他视图技术集成,Freemarker的,Excel或PDF现在也有可能。
Spring3.0 MVC系列∙第1部分:到Spring 3.0 MVC框架简介∙第2部分:在Spring 3.0 MVC创建Hello World应用程序∙第3部分:在Spring 3.0 MVC的形式处理∙第4部分:Spring3 MVC的Tiles Support与Eclipse中的例子插件教程∙第5部分:Spring3 MVC的国际化及本地化教程与范例在Eclipse∙第6部分:Spring3 MVC示例教程Spring主题∙第7部分:创建Spring3 MVC Hibernate 3的示例在Eclipse中使用Maven的在Spring Web MVC,你可以使用任何对象作为命令或表单支持对象,你不需要实现框架特定的接口或基类。
Spring的数据绑定是高度灵活的:例如,将验证错误类型不作为应用系统错误,可以通过评估的不匹配。
因此,你不必重复你的业务对象的属性,简单的无类型的字符串,在表单对象仅仅是为了处理无效的意见,或正确转换的字符串。
相反,它往往是最好直接绑定到业务对象。
请求处理生命周期Spring的Web MVC框架是,像许多其他Web MVC框架,要求为导向,围绕一个中心的servlet,它把请求分派给控制器,提供其他功能,有利于开发Web应用而设计的。
SpringMVC错题合集
SpringMVC错题合集1、在SpringMVC中,Spr ingMVC默认采⽤的HandlerMapping实现类是A: BeanNameUr1HandlerMapping2、在SpringMVC中,DispatcherServlet中使⽤的特殊的Bean包括A: ControllerB: ViewResolverC: HandlerExcepti onResolver3、在SpringMVC中,以下关于拦截器的使⽤说法正确的是A: SpringMVC的拦截器,是属于HandlerMapping级别的B: SpringMVC的拦截器可以有多个HandlerMapping,每个HandlerMapping可以有⾃⼰的拦截器。
C:⼀⼀个请求交给⼀个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如果找到了,就执⾏拦截器,执⾏完拦截后,交给⽬标处理器4、在SpringMVC中,以下关于多个HandlerMapping的执⾏顺序说法正确的是A: Def aultAnnotati onHandl erMapping的order属性值是: 1D: <mvc:resources/ >⾃动注册的Simp1eUr 1Handler Mapping的order属性值是: -214748364 .5、在Spr ingMVC中,关于BaseCommandController提供的功能,说法中包含的是A:将请求参数转换为Command对象B:对数据进⾏验证。
在转换和验证时发⽣错误时,需要在handle (request,response, commanderrors)中进⾏处理C:绑定⽤户类型6、在SpringMVC中,描述正确的是A: DisPatcherServlet是SpringMVC的前端Servlet,和任何的servlet-样,必须在web. xml中配置后,才能起作⽤B:在web. xm1中,根据servlet-mapping的URL不同,可以配置多个DisPatcherServletC: ModelAndView中的view是逻辑视图名,⽽⾮真正的视图对象7、在SpringMVC中,关于SpringMVC核⼼组件说法正确的是A: SpringMVC所有请求都提交给DisptacherServlet, DispatcherServlet查询⼀个或多个HandlerMapping找到处理请求的Controller,将请求提交到ControllerB: Controller进⾏业务逻辑处理后可以返回- -个ModelAndView对象C: Controller查询-⼀个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象8、有关MVC的处理过程,描述正确的是( )A:⾸先控制器接收⽤户的请求,决定调⽤那个模型来进⾏处理B:模型处理⽤户的请求并返回数据C:视图将模型返回的数据呈现给⽤户9、在Spr ingMVC中,SpringMVC是⼀个基于DispatcherServlet的MVC框架,每⼀个请求最先访问的都是Di spatcherServlet, DispatcherServlet负责转发每⼀个Request请求给相应的()。
SpringMVC如何在生产环境禁用Swagger的方法
SpringMVC如何在⽣产环境禁⽤Swagger的⽅法Swagger 是⼀个规范和完整的框架,⽤于⽣成、描述、调⽤和可视化 RESTful 风格的 Web 服务。
总体⽬标是使客户端和⽂件系统作为服务器以同样的速度来更新。
⽂件的⽅法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。
Swagger 让部署管理和使⽤功能强⼤的API从未如此简单。
好吧,以上是官⽅的说法,我直接复制的,在我看来swagger就是⼀个接⼝⽂档管理器,以前我们写接⼝⼀般都是world编写,但是有⼀个问题就是测试的时候需要依赖第三⽅⼯具,GET的接⼝还好,直接浏览器打开,POST的只能依赖另外的⼯具了,⽽Swagger呢,可以直接通过代码中的注解⽣成接⼝⽂档(JavaEE),⼀般⼈都⽤这种⽅式,⽽且直接集成在项⽬中,⽅便成员查看,同时还能直接测试,另外Swagger的界⾯也不错,也许这就是我选择⽤Swagger的原因吧,直接官⽅说的RESTful 风格那个不⽤管,不是RESTful 风格的接⼝也能⽤,当然Swagger还有⼀种⽅式就是⼿动写接⼝说明了,这样的好处就是代码只有代码,因为⼀旦代码中添加了Swagger的接⼝注解后,代码量还是增加了不少,当然坏处就是你改完了代码,还要去改接⼝⽂档SpringMVC集成springfox-swagger2和springfox-swagger-ui很简单,只需要两步:(1)pom中添加依赖<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${springfox-swagger.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${springfox-swagger.version}</version></dependency>(2)添加Swagger的配置类:@Configuration@EnableSwagger2@EnableWebMvc@ComponentScan("com.XXX.controller")public class SwaggerConfig{}但是,如何在⽣产环境禁⽤这些api⽂档呢?试了很多种⽅式,最终找到⼀个简单实⽤的办法:@Configuration@EnableSwagger2@EnableWebMvc@ComponentScan("com.XXX.controller")public class SwaggerConfig{@AutowiredConfigService configService;@Beanpublic Docket customDocket() {if(configService.getServerEnv() == ServerEnvEnum.ONLINE) {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfoOnline()).select().paths(PathSelectors.none())//如果是线上环境,添加路径过滤,设置为全部都不符合.build();}else {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());}}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("XXX系统").description("XXX系统接⼝").license("").licenseUrl("").termsOfServiceUrl("").version("1.0.0").contact(new Contact("","", "")).build();}private ApiInfo apiInfoOnline() {return new ApiInfoBuilder().title("").description("").license("").licenseUrl("").termsOfServiceUrl("").version("").contact(new Contact("","", "")).build();}}应该还有更好的办法!swagger必须要跟springmvc在同⼀个context才⾏,springmvc只是spring的⼀个⼦context。
springMVC配置文件详解
web.xml的配置web.xml应该是整个项目最重要的配置文件了,不过servlet3.0中已经支持注解配置方式了。
在servlet3.0以前每个servlet必须要在web.xml中配置servlet及其映射关系。
但是在spring框架中就不用了,因为Spring中是依赖注入(Dependency Injection)的也叫控制反转(Inversion of Control)。
但是也要配置一个重要的servlet,就是前端控制器(DispatcherServlet)。
配置方式与普通的servlet基本相似。
配置内容如下:<!-- 配置前端控制器--><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><!-- ContextconfigLocation配置springmvc加载的配置文件适配器、处理映射器等--><param-name>contextConfigLocation</param-name><param-value>WEB-INF/classes/spring/springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>spring</servlet-name><!-- 1、.action访问以.action结尾的由DispatcherServlet进行解析2、/,所有访问都由DispatcherServlet进行解析--><url-pattern>/</url-pattern></servlet-mapping>这里需要注意,springmvc.xml是spring配置文件,将在后面讨论。
springmvc期末考试题及答案
springmvc期末考试题及答案Spring MVC期末考试题及答案一、选择题(每题2分,共20分)1. Spring MVC中的控制器(Controller)是什么?A. 一个服务类B. 一个数据访问对象C. 一个业务逻辑类D. 一个处理HTTP请求和响应的组件答案:D2. 在Spring MVC中,以下哪个注解用于映射请求到控制器方法?A. @ServiceB. @AutowiredC. @RequestMappingD. @Repository答案:C3. Spring MVC中的模型(Model)通常用于存储什么?A. HTTP请求数据B. HTTP响应数据C. 业务数据D. 控制器状态答案:C4. 在Spring MVC中,视图(View)的主要职责是什么?A. 处理业务逻辑B. 处理HTTP请求C. 渲染返回给客户端的数据D. 管理数据库连接答案:C5. Spring MVC中的DispatcherServlet的作用是什么?A. 处理数据库事务B. 处理HTTP请求和响应C. 管理Spring容器D. 调度控制器方法的执行答案:B6. 在Spring MVC中,以下哪个注解用于处理POST请求?A. @GetMappingB. @PostMappingC. @PutMappingD. @DeleteMapping答案:B7. Spring MVC中的异常处理器(Exception Handler)的作用是什么?A. 处理业务逻辑异常A. 处理控制器方法抛出的异常B. 处理数据库异常D. 处理Spring容器异常答案:A8. 在Spring MVC中,以下哪个注解用于将参数绑定到控制器方法的参数上?A. @RequestParamB. @PathVariableC. @RequestBodyD. @RequestHeader答案:A9. Spring MVC中的RESTful风格的URL设计通常遵循什么原则?A. 每个URL代表一个资源B. 使用GET请求获取资源C. 使用POST请求创建资源D. 所有以上答案:D10. 在Spring MVC中,以下哪个注解用于处理请求头?A. @RequestParamB. @RequestHeaderC. @RequestBodyD. @PathVariable答案:B二、填空题(每题2分,共20分)1. Spring MVC的入口是________。
SpringBoot使用过滤器和拦截器分别实现REST接口简易安全认证示例代码详解
SpringBoot使⽤过滤器和拦截器分别实现REST接⼝简易安全认证⽰例代码详解本⽂通过⼀个简易安全认证⽰例的开发实践,理解过滤器和拦截器的⼯作原理。
很多⽂章都将过滤器(Filter)、拦截器(Interceptor)和监听器(Listener)这三者和Spring关联起来讲解,并认为过滤器(Filter)、拦截器(Interceptor)和监听器(Listener)是Spring提供的应⽤⼴泛的组件功能。
但是严格来说,过滤器和监听器属于Servlet范畴的API,和Spring没什么关系。
因为过滤器继承⾃javax.servlet.Filter接⼝,监听器继承⾃javax.servlet.ServletContextListener接⼝,只有拦截器继承的是org.springframework.web.servlet.HandlerInterceptor接⼝。
上⾯的流程图参考⾃⽹上资料,⼀图胜千⾔。
看完本⽂以后,将对过滤器和拦截器的调⽤过程会有更深刻理解。
⼀、安全认证设计思路有时候内外⽹调⽤API,对安全性的要求不⼀样,很多情况下外⽹调⽤API的种种限制在内⽹根本没有必要,但是⽹关部署的时候,可能因为成本和复杂度等问题,内外⽹要调⽤的API会部署在⼀起。
实现REST接⼝的安全性,可以通过成熟框架如Spring Security或者 shiro 搞定。
但是因为安全框架往往实现复杂(我数了下Spring Security,洋洋洒洒⼤概有11个核⼼模块,shiro的源码代码量也⽐较惊⼈)同时可能要引⼊复杂配置(能不能让⼈痛快⼀点),不利于中⼩团队的灵活快速开发、部署及问题排查。
很多团队⾃⼰造轮⼦实现安全认证,本⽂这个简易认证⽰例参考⾃我所在的前⼚开发团队,可以认为是个基于token的安全认证服务。
⼤致设计思路如下:1、⾃定义http请求头,每次调⽤API都在请求头⾥传⼈⼀个token值2、token放在缓存(如redis)中,根据业务和API的不同设置不同策略的过期时间3、token可以设置⽩名单和⿊名单,可以限制API调⽤频率,便于开发和测试,便于紧急处理异状,甚⾄临时关闭API4、外⽹调⽤必须传⼈token,token可以和⽤户有关系,⽐如每次打开页⾯或者登录⽣成token写⼊请求头,页⾯验证cookie和token有效性等在Spring Security框架⾥有两个概念,即认证和授权,认证指可以访问系统的⽤户,⽽授权则是⽤户可以访问的资源。
SpringMVC的配置文件
SpringMVC的配置⽂件⼀、root标签跟spring配置⼀样,root标签是beans,毕竟springmvc是spring的⼀个模块在springmvc⾥,⾃动扫描主要是配置controller:⼆、⾃动扫描:⼆、⾃动扫描:在<context:component-scan base-package="com.xxx.controller"/>三、解析器Resolver:解析器有很多种,⽐较重要的是ViewResolverViewResolver也有很多种,其中⽐较重要和常⽤的是InternalResourceViewResolver(内部资源视图解析器)代码:<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean>如果没有视图解析器,我们在controller⾥⾯的代码是这样的:@Controllerpublic class LoginActionController {@RequestMapping("/index")public String toIndex(HttpServletRequest request, ModelMap map, HttpSession session) {return "/WEB-INF/jsp/index.jsp";}⽽使⽤了视图解析器,我们的代码是这样的:@Controllerpublic class LoginActionController {@RequestMapping("/index")public String toIndex(HttpServletRequest request, ModelMap map, HttpSession session) {return "index";}区别在最后⼀句,我们不需要给出⽬标视图的全路径了。
