文章github地址:https://github.com/ShareCookies/ssm-springBoot/tree/master/spring/springMVC
# Spring MVC框架的使用:
## 1.配置DispatcherServlet:
1.使用Java将DispatcherServlet配置在Servlet容器中:p177
...
附:
添加其他的Servlet和Filter:p248
例:
./附属功能/拦截器
## 2.启用Spring MVC:p180
基于Java进行配置:
配置类上加上@EnableWebMvc注解,即可启用springMVC。
## 3.编写控制器:
1. 编写基本的控制器:
1. 控制器类注册为spring容器的bean。
./控制层注解.txt goto: @Controller
例:
@Controller
public class TestController {}
2. 定义一个方法来处理指定的请求:
./控制层注解.txt goto: @RequestMapping
3. 数据返回
返回的数据可分为2种 :1.html页面 2.其他某种格式的数据(如json,xml等)。
1. 编写模型视图类型(mvc)控制器:(返回html页面)
配置视图解析器:p181 p210(配置一次就好)
控制器方法返回的字符串将会被Spring MVC解读为要渲染的视图名称。
DispatcherServlet会要求视图解析器将这个逻辑名称解析为实际的视图。
例:
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new Internal ResourceViewResolver() ;
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp") ;
//resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);//让InternalResourceViewResolver将视图解析 为JstlView(jsp更进一步),而不是InternalResourceView
return resolver ;
}
1. 控制器返回模型与视图名:
@RequestMapping(value="/register",method=GET)
public StringshowRegistrationForm(Modelmodel){//1.返回模型
model.addAttribute(newSpitter());//新增了一 个Spitter实例到模型中。//模型中的key是spitter,是根据对象类型推断得到的
return"registerForm";//2.返回视图名
}
附:
控制器的处理方法完成时,通常会返回一个逻辑视图名。
如果方法不直接返回逻辑视图名(例如方法返回void),那么逻辑视图名会根据请求的URL判断得出。
2. 视图读取模型数据
registerForm.jsp:
<sf:form method="POST" commandName="spitter">
FirstName:<sf:input path="firstName"/>...
</sf:form>
附:
./图片/传递模型数据到视图中.png
./图片/视图中访问模型数据.png
2. 编写REST类型控制器:(返回json或xml类型数据)
什么是rest:
./REST/README.txt
编写REST类型控制器:
为控制器方法使用@ResponseBody注解,即可返回json或xml类型数据(看Accept请求头)。
例:
./控制层注解.txt goto: @ResponseBody
@ResponseBody
public String loginSuccess(HttpServletRequest request){
return "loginSuccess";
}
详情:
./REST/spring实现RESTful架构.txt
2. 接收请求的输入:p193
./控制层注解.txt goto: 数据的获取
3. 提供资源之外的其他内容
请求头设置或错误信息等 p516
处理异常:
./附属功能/异常处理.txt
附:
控制器编写注意事项:
设计良好的控制器本身只处理很少甚至不处理工作,而是将业务逻辑委托给一个或多个服务对象进行处理。
附:控制器只是用来对外开放请求的,顶多对请求参数做一点处理,所有的业务等逻辑要放到服务层中进行。
附:
sprnigBoot中应用springMvc:
SpringBoot为我们自动配置好了SpringMVC框架,所以通过SpringBoot使用Spring MVC框架,我们可以只需引入mvc的start启动依赖,@EnableWebMvc启用springMVC框架,编写控制器即可。
# Spring MVC框架介绍
介绍:Spring MVC 是 Spring 提供的 Web 开发框架,用来构建Web应用程序。
## springMvc执行流程(springMVC处理请求的过程):P175
1、前端控制器DispatcherServlet:(一切的起源)
用户发来一个请求,首先接受的肯定是servlet容器(DispatcherServlet)。
2、处理器映射器HandlerMapping(返回controller)
前端控制器(DispatcherServlet)收到请求后会解析请求,并通过处理器映射器(HandlerMapping)根据url信息找到我们需要的处理器(Handler)(也可以叫Controller),返回给前端控制器。
例:
/**
* Return the HandlerExecutionChain for this request.
* <p>Tries all handler mappings in order.
* @param request current HTTP request
* @return the HandlerExecutionChain, or {@code null} if no handler could be found
*/
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
3、处理器执行链HandlerExecutionChain(里头包含了controller)
处理器映射器返回的其实是处理器执行链(HandlerExecutionChain),只是处理器执行链里包含了处理器。
而处理器就是我们写的controller层方法。
4、处理器适配器HandlerAdapter(通过适配器执行controller)
前端控制器(DispatcherServlet)查找合适的处理器适配器(HandlerAdapter),通过处理器适配器执行处理器。
例:
HandlerExecutionChain mappedHandler = null;
...
ModelAndView mv = null;
// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
附:
控制器方法执行完后会有两种类型返回:1.视图名和模型 2. restful形式,返回的mv为null,即不走第5步。
1.返回视图名和模型:
控制器方法没有直接产生浏览器中渲染所需的HTML。
控制器方法处理完后,会将请求连同模型和视图名塞入ModelAndView,发送回DispatcherServlet
注:
模型:!
控制器在完成逻辑处理后,通常会产生一些要返回前端的数据信息,这些信息会被放入模型中(model)。
视图:
控制器通常会返回一个String类型的值,这个就是控制器名。
非Ajax的话仅仅给前端数据信息是不够的,还得把这些信息与HTML一起整合。
2. restful形式:
restful形式是处理器适配器执行完处理器后,直接把处理器返回的数据通过消息转换器转换为json,然后塞入response传给客户端,而不返回mv了就跳过了第5步。
5、视图解析器ViewResolver
前端控制器接到ModelAndView之后,交由我们的视图解析器去查找合适的视图,最然进行视图渲染,渲染完成塞入response最终返回给用户。
例:
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
视图渲染。
view.render(mv.getModelInternal(), request, response);
//把模型数据交付给视图后,前端控制器的任务就完成了,视图将使用模型数据进行渲染然后输出,这个输出会通过响应对象直接传递给客户端。