SpringMVC在 获取多个参数、文件上传、Servlet功能单一 方面都能有很好的解决办法;
一、SpringMVC总体执行框架图
上图清晰明了的展示了SpringMVC的工作原理:
SpringMVC整个赖以运作的最核心的组件:核心控制器类(DispatcherServlet),也叫前端控制器——接收request请求,进行response响应;
三大组件
处理器映射器(HandleMapping):通过url,查找对应的handler,找到后就向DispatcherServlet返回"执行链HandlerExecutionChain";(可以通过xml配置或注解方式实现)
处理器适配器(HandleAdaptor):DispatcherServlet无法直接调用“处理器Handler”,必须通过调用“处理器适配器HandlerAdaptor”来间接地执行处理器;——这里有一个适配器模式;“处理器Handler”的执行结果为“ModelAndView”,也必须通过“处理器适配器HandlerAdaptor”间接返回给“DispatcherServlet”;
视图解析器(ViewResolver):DispatcherServlet带着“ModelAndView”去请求“视图解析器ViewResolver”进行视图解析,“视图解析器ViewResolver”根据逻辑视图生成真正的“视图View”,并返回给DispatcherServlet;
最后,DispatcherServlet对视图进行渲染,并响应给用户浏览器。
二、SpringMVC的实现过程
-
导jar包或者添加依赖;
-
编译SpringMVC的两个主配置文件:web.xml + springmvc.xml
1、在 web.xml 中配置SpringMVC的核心类 DispatcherServlet
<!-- 配置Springmvc的核心控制器类,DispatcherServlet --> <servlet> <servlet-name>dispatcherServlet</servlet-name> ————核心控制器类(前端控制器) <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> ————执行springmvc的主配置文件所在 </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <!-- "/"代表项目路径,“/*”则代表项目下的所有资源 --> <url-pattern>/*</url-pattern> ————配置DispatcherServlet类将要拦截的请求,当然是要所有 </servlet-mapping>
2、配置最简单版的springmvc.xml(需要配置包扫描+注解驱动)
3、springmvc.xml中对视图解析器(viewResolver)进行配置:
<!-- 视图解析器 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置前缀 --> <property name="prefix" value="/pages/"></property> <!-- 配置后缀 --> <property name="suffix" value=""></property> </bean>
4、springmvc.xm中对文件上传功能进行配置:
<!-- 配置文件上传配置 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 配置文件上传的编码 --> <property name="defaultEncoding" value="utf-8"></property> <!-- 配置文件上传大小 --> <property name="maxUploadSize" value="1048576"></property> </bean> 注意:如果前端表单中有file控件,则必须指定enctype="multipart/form-data"
5、springmvc.xml中配置 hibernate-validator 自动校验功能:
<!-- 配置hibernate-validator --> <mvc:annotation-driven validator="validator"></mvc:annotation-driven> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> </bean>
6、springmvc.xml中配置定时器 scheduler
<!-- 配置定时器配置 --> <task:scheduler id="scheduler" pool-size="10"/> <task:executor id="executor" keep-alive="3600" pool-size="100-200" queue-capacity="500" rejection-policy="CALLER_RUNS"/> <task:annotation-driven executor="executor" scheduler="scheduler"/>
7、springmvc.xml中配置拦截器 interceptor
<!-- 7、配置拦截器,其中可以配置多个拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/front/**" /> 代表front下的所有,此条必须在前 <mvc:exclude-mapping path="/front/login.shtml"/> 除了/login.shtml <bean id="oneInterceptor" class="cn.java.interceptors.OneInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
8、注意,配置 spring事务的操作,最好放在spring的配置文件(applicationContext.xml)中进行:
<!-- 事务配置及驱动,因为事务是放在业务service层里面的,所以service的包扫描在哪个配置文件,事务配置就在哪个文件, 又因为事务需要用到“basicDataSource”数据源,所以最好是一起把service的包扫描也放到“applicationContext.xml”配置文件中 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="basicDataSource"></property> </bean> <!-- 事务注解驱动 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
三、springMVC面试题总结
1、springMVC和structs2框架有什么区别?
-
springMVC的核心控制器一个Servlet(DispatcherServlet);
-
而Structs2的核心控制器是一个Filter(StructsPreparedAndExecuteFilter);
2、说一下spring实现事务的几种方式?
-
通过注解实现 @Transactional;
-
通过.xml配置文件的方式实现;
3、springmvc中@RequestBody和@ResponseBody的区别?
-
@RequestBody:将奇台传递过来的json数据用 Map、List或者实体类Entity 来接收;
-
@ResponseBody:将将后台返回的数据转成 json 格式,返回给前台;
4、springMVC如何实现重定向和转发?
-
转发:将方法的返回值类型改为String,使用“return forward: 转发路径”;
-
重定向:将方法的返回值类型改为String,使用“teturn redirect:重定向路径”;
细节:如果直接 return “字符串”,默认为 “转发forward”;
5、springMVC如何将数据带入JSP页面?
有三种方式:Map,Model,request;