最近项目很多地方用到了springmvc框架,由于很久没用过了,感觉生疏了不少,现重新整理一下:
注意图中两个浅绿色箭头,事实上,DispatcherServlet与HandlerMapping和Controller和ViewResolver之间的相互工作还是有一个先后的顺序的
有必要说一下spring-mvc几个主要接口!
DispatcherServlet接口
Spring提供的前端控制器,所有的请求都经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping Bean定位到具体的Controller。
HandlerMapping接口
在基于Spring MVC的Web应用程序中,我们可以为DispatcherServlet提供多个Handler- Mapping供其使用。DispatcherServlet在选用HandlerMapping的过程中,将根据我们所指定的一系列HandlerMapping的优先级进行排序,然后优先使用优先级在前的HandlerMapping。如果当前的HandlerMapping能够返回可用的Handler,DispatcherServlet则使用当前返回的Handler进行Web请求的处理,而不再继续询问其他的HandlerMapping。否则,DispatcherServlet将继续按照各个HandlerMapping的优先级进行询问,直到获取一个可用的Handler为止。
HandlerMapping接口的实现类:
SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到Controller
DefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上
HandlerAdapter接口 -- 处理请求的映射
AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上。
HandlerInterceptor 接口--拦截器
Controller接口
需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理用户请求, 这和 Struts Action 扮演的角色是一致的。一旦 Controller 处理完用户请求,则返回 ModelAndView 对象给 DispatcherServlet 前端控制器, ModelAndView 中包含了模型( Model )和视图( View )。从宏观角度考虑, DispatcherServlet 是整个 Web 应用的控制器;从微观考虑, Controller 是单个 Http 请求处理过程中的控制器,而 ModelAndView 是 Http 请求过程中返回的模型( Model )和视图( View )。
<bean id="loginController" class="com.j1.Controller.LoginController"> <span style="white-space:pre"> </span><property name="successView" value="showAccount"></property> <span style="white-space:pre"> </span><property name="failView" value="login"></property> <span style="white-space:pre"> </span></bean> <span style="white-space:pre"> </span><!--DispatcherServlet根据 HandlerMapping找具体的controller --> <span style="white-space:pre"> </span><bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <span style="white-space:pre"> </span><property name="mappings"> <span style="white-space:pre"> </span><props> <span style="white-space:pre"> </span><prop key="jsp/login.do">loginController</prop> <span style="white-space:pre"> </span></props> <span style="white-space:pre"> </span></property> <span style="white-space:pre"> </span></bean>loginController.java
public class LoginController extends AbstractController { private String successView; private String failView;//这两个参数是返回传给applicationContext.xml,进行页面分配 public String getSuccessView() { return successView; } public void setSuccessView(String successView) { this.successView = successView; } public String getFailView() { return failView; } public void setFailView(String failView) { this.failView = failView; } /** * */ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { // TODO Auto-generated method stub String cardNo=request.getParameter("cardNo"); String password=request.getParameter("password"); Account account =getAccount(cardNo,password); Map<String ,Object> model=new HashMap<String,Object>(); if(account !=null){ model.put("account", account); return new ModelAndView("jsp/"+getSuccessView(),model); }else{ model.put("error", "卡号和密码不正确"); return new ModelAndView("jsp/"+getFailView(),model); } }//本应该这个方法写在模型层,这地方直接给放在了逻辑层这个地方偷懒了。 public Account getAccount(String cardNo,String password){ if(cardNo.equals("123")&&password.equals("123")){ Account account =new Account(); account.setCardNo(cardNo); account.setBalance(88.8f); return account; }else{ return null; } } }
ViewResolver接口
ViewResolver接口的实现类
UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理
InternalResourceViewResolver类,比上面的类,加入了JSTL的支持
在Spring MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进行渲染。那么在Spring MVC中是如何选择合适的View呢?View对象是是如何创建的呢?答案就在ViewResolver中,ViewResolver接口定义了resolverViewName方法,根据viewName创建合适类型的View实现。
那么,如何配置ViewResolver呢?在Spring中,ViewResolver作为Spring Bean存在,可以在Spring配置文件中进行配置,例如下面的代码,配置了jsp相关的viewResolver。
<!-- viewResolver接口创建合适view --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean>
在Spring MVC中,因为ViewResolver是使用bean来配置的,所以扩展起来非常的容易,可以根据自己的需要定制ViewResolver,然后在配置文件中进行相关的配置即可。
ViewResolver接口声明了resolverViewName方法,这个方法的主要功能是根据ModelAndView中给定的viewName信息,再结合相关的配置,创建出合适类型的View对象。ViewResolver接口是在DispatcherServlet中进行调用的,当DispatcherServlet调用完Controller后,会得到一个ModelAndView对象,然后DispatcherServlet会调用render方法进行视图渲染。
HandlerExceptionResolver接口 --异常处理
SimpleMappingExceptionResolver实现类springMVC运行原理