spring-mvc浅析入门

    最近项目很多地方用到了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运行原理

  • 客户请求提交到DispatcherServlet
  • DispatcherServlet控制器查询一个或多个HandlerMapping找到处理请求的Controller
  • DispatcherServlet将请求提交到Controller
  • Controller调用业务逻辑处理后,返回ModelAndView
  • DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
  • 视图负责将结果显示到客户端
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值