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
    评论
`feign-spring-mvc-starter` 是一个 Feign 的扩展,它支持使用 Spring MVC 注解来定义和调用 REST 服务。使用 `feign-spring-mvc-starter`,你可以像使用 Spring MVC 控制器一样定义 Feign 客户端,从而更方便地进行 REST 服务的开发。 在使用 `feign-spring-mvc-starter` 之前,你需要先了解 Feign 和 Spring MVC 的基本概念和用法。 Feign 是一个声明式的 Web 服务客户端,它可以帮助你更方便地定义和调用 REST 服务。Feign 的基本使用方法是定义一个接口,用于描述 REST 服务的 API,然后使用 Feign 注解来声明这个接口。 Spring MVC 是一个基于 Java 的 Web 框架,它提供了一组注解和 API,用于处理 Web 请求和响应。 `feign-spring-mvc-starter` 将 Feign 和 Spring MVC 结合起来,使你可以使用 Spring MVC 注解来定义和调用 REST 服务。使用 `feign-spring-mvc-starter`,你可以更方便地使用 Feign 来调用 REST 服务。 以下是一个使用 `feign-spring-mvc-starter` 的示例: 1. 添加 Maven 依赖 在 pom.xml 文件中添加以下依赖项: ```xml <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-spring-mvc</artifactId> <version>5.3.1</version> </dependency> ``` 2. 定义 Feign 接口 定义一个 Feign 接口,用于描述 REST 服务的 API。例如: ```java @FeignClient(name = "example-service") public interface ExampleClient { @GetMapping("/example") String getExample(); } ``` 在这个接口中,我们使用了 `@FeignClient` 注解来声明这个接口是一个 Feign 客户端,并指定了服务的名称。然后,我们定义了一个 `getExample()` 方法,用于调用 example-service 服务的 /example 路径。 3. 定义 Spring MVC 控制器 定义一个 Spring MVC 控制器,用于处理来自客户端的请求。例如: ```java @RestController public class ExampleController { private final ExampleClient exampleClient; public ExampleController(ExampleClient exampleClient) { this.exampleClient = exampleClient; } @GetMapping("/") public String index() { return exampleClient.getExample(); } } ``` 在这个控制器中,我们注入了 `ExampleClient`,并在 `index()` 方法中使用它来调用 example-service 服务的 /example 路径。 4. 运行应用程序 现在,你可以运行应用程序并访问 http://localhost:8080/ ,你应该会看到来自 example-service 服务的响应。 这就是一个使用 `feign-spring-mvc-starter` 的示例。使用 `feign-spring-mvc-starter`,你可以更方便地使用 Feign 来调用 REST 服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值