spring-mvc浅析入门

来源:互联网 发布:北京软件测试工资待遇 编辑:程序博客网 时间:2024/06/14 03:12

    最近项目很多地方用到了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请求处理过程中的控制器,而ModelAndViewHttp请求过程中返回的模型(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;}/** *  */@Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response) throws Exception {// TODO Auto-generated method stubString 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运行原理

  • 客户请求提交到DispatcherServlet
  • DispatcherServlet控制器查询一个或多个HandlerMapping找到处理请求的Controller
  • DispatcherServlet将请求提交到Controller
  • Controller调用业务逻辑处理后,返回ModelAndView
  • DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
  • 视图负责将结果显示到客户端
0 0
原创粉丝点击