MVC模型
MVC模型的由来
一、Model1 模型:
Model1 模型是很早以前项目开发的一种常见模型(此模型不是MVC模型),项目主要由JSP和 JavaBean 两部分组成。JSP的职责是展示数据和处理数据,所有逻辑代码都写在JSP中,导致代码重用性很低,维护也不方便。
二、Model2 模型:
Model2 模型是基于MVC架构的设计模式,是在 Model1 的基础上进行改良。它把处理请求和展示数据进行了分离。Servlet作为前端控制器,负责接收客户端发送的请求,后端JavaBean来完成实际的逻辑处理,最后转发到相应的JSP页面处理显示响应。
SpringMVC
Spring MVC是一个基于Java的实现了MVC设计模式的轻量级Web框架,通过把Model、View、Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发。
SpringMVC 的执行流程:
SpringMVC 中三大组件:
1、处理器映射器: HandlerMapping
负责解析请求URL,分配请求到对应的Handler进行处理,HandlerMapping会将处理器和拦截器封装,形成一个处理器执行链(HandlerExecuteChain),@RequestMapping中拦截特定方式(get)提交的请求就是通过拦截器实现的。Spring MVC提供了许多HandlerMapping的实现,默认使用的是BeanNameUrlHandlerMapping。
2、处理器适配器: HandlerAdapter
Spring mvc 采用适配器模式来适配调用指定Handler,根据Handler的不同种类采用不同的适配器Adapter
例举三种适配器:
SimpleControllerHandlerAdapter
:使用此适配器的控制器写法:需要实现 Controller 接口
public class ControllerTest implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
mv.setViewName("success");
return mv;
}
}
还需要在SpringMvc.XML中配置:
<bean id="simpleControllerHandlerAdapter " class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<bean name="/hello" class="com.test.web.controller.ControllerTest"></bean>
HttpRequestHandlerAdapter
:使用此适配器的控制器写法:需要实现HttpRequestHandler接口:
public class ControllerTest implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
}
}
还需要在SpringMvc.XML中配置:
<bean name="/hello" class="com.test.web.controller.ControllerTest"></bean>
<bean id=" httpRequestHandlerAdapter" class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
RequestMappingHandlerAdapter
:这种是实际开发中使用最多的:使用注解@Controller 配置
@Controller
public class ControllerTest {
@RequestMapping("hello")
public String sayHello() {
System.out.println("控制器方法执行了");
return "success";
}
}
配置有两种方式:
常用:
<mvc:annotation-driven></mvc:annotation-driven>
不常用:
<bean id="requestMappingHandlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
3、视图解析器: ViewResolver
负责将处理结果生成View视图,首先会根据逻辑视图名解析成物理视图名,也就是具体的页面地址,再生成View视图对象,最后对View进行渲染,将处理结果通过页面展示给用户。
每一种映射策略对应一个具体的视图解析器实现,还可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高,SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析。
常用注解
@ RequestParam
将请求参数绑定到控制器的方法参数上,是springmvc中的接收普通参数的注解
属性value是请求参数的名称,可以指定获取某一个参数值,也可以用Map接收所有参数值
required是请求参数是否必须提供参数,默认是true,表示必须提供。
@RequestBody
通过Http传递参数一般有两种方式,一种是通过url,一种是通过body,@RequestBody就是去解析body然后映射到我们的参数上。
属性required是否必须有请求体,默认是true,在使用该注解时,当为true时get的请求方式会报错,取值为false的话,get的请求是null。
@ResponseBody
@ResponseBody 是作用在方法上的,表示该方法的返回结果直接写入response body中,可以也直接用在类上 ,最典型的例子就是 @RestController 这个注解,它就包含了 @ResponseBody 这个注解,但在类上用@RestController时,其内的所有方法都会默认加上@ResponseBody,也就是默认返回JSON格式。
@PathVariable
该注解是用于绑定url中的占位符,spring3.0以后,url才开始支持占位符的,它是springmvc支持的rest风格url的一个重要的标志,占位符:@RequestMapping(value=“/test/{name}/{id}”),{name}和{id}就是url的占位符,然后请求路径可以这样写:(http://localhost:8080/test/张三/1)
@RequsetMappring
用来处理请求地址映射的,也就是说将其中的所有处理器方法都映射到该url路径上,有6个属性
method:指定请求类型,比如get、post、delete等,也可以直接用GetMapping等注解。
value:指请求的地址,如果是多个地址可以用{}来指定。
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。
consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
params:指定request中必须包含某些参数值是,才让该方法处理。