- Spring MVC
- 一、配置
- 二、Spring MVC的请求流程
- 1.DispatcherServlet
- 2.HandlerMapping (处理器映射)
- 3.Controller (控制器)
- 4.返回 DispatcherServlet
- 5.视图解析器
- 6.视图
- 三、Spring MVC 注解
- 1. @Controller
- 2. @RequestMapping
- 3. @PathVariable、 @RequestParam
- 4. @ModelAttribute
- 四、Spring MVC 客户端跳转
- 五、Spring MVC 文件上传
二、Spring MVC的请求流程 1.DispatcherServlet出现${pageContext.request.contextPath}失效,原因可能是web.xml的文件头有问题,特别注意version不能过低。
从请求离开浏览器以后,第一站就是DispatcherServlet,它会拦截所有请求并发送给Spring MVC 控制器。
2.HandlerMapping (处理器映射)dispatcher org.springframework.web.servlet.DispatcherServlet 1 dispatcher /
处理器映射会根据请求所携带的URL信息来进行决策决定将请求交给哪个控制器处理。
3.Controller (控制器)helloController
一旦选择了合适的控制器, DispatcherServlet 会将请求发送给选中的控制器,到了控制器,请求会卸下其负载(用户提交的请求)等待控制器处理完这些信息:
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
// 处理逻辑
....
}
4.返回 DispatcherServlet
当控制器在完成逻辑处理后,通常会产生一些信息,这些信息就是需要返回给用户并在浏览器上显示的信息,它们被称为模型(Model)。仅仅返回原始的信息时不够的——这些信息需要以用户友好的方式进行格式化,一般会是 HTML,所以,信息需要发送给一个视图(view),通常会是 JSP。
控制器所做的最后一件事就是将模型数据打包,并且表示出用于渲染输出的视图名**(逻辑视图名)。它接下来会将请求连同模型和视图名发送回 DispatcherServlet。**
5.视图解析器这样以来,控制器就不会和特定的视图相耦合,传递给 DispatcherServlet 的视图名并不直接表示某个特定的 JSP。(实际上,它甚至不能确定视图就是 JSP)相反,它传递的仅仅是一个逻辑名称,这个名称将会用来查找产生结果的真正视图。
DispatcherServlet 将会使用视图解析器(view resolver)来将逻辑视图名匹配为一个特定的视图实现,它可能是也可能不是 JSP
6.视图既然 DispatcherServlet 已经知道由哪个视图渲染结果了,那请求的任务基本上也就完成了。
它的最后一站是视图的实现,在这里它交付模型数据,请求的任务也就完成了。视图使用模型数据渲染出结果,这个输出结果会通过响应对象传递给客户端。
三、Spring MVC 注解 1. @Controller用于声明控制器,从操作上来说有点类似于让类继承AbstractController
同时xml中可以取消相关注释并增加扫描:
2. @RequestMapping
用于将路径映射到某方法上。
同事xml中可以取消相关注释:
3. @PathVariable、 @RequestParam如果RequestMapping作用在类上,相当于给所有该类的方法配置的地址增加上这个地址。
用于将获取到的参数并匹配,当@RequestMapping的path属性使用URI模板时,可以使用@PathVariable。而@RequestParam则用在与表单提交的值匹配,该注解有三个变量:value、required、defaultvalue
-
value :指定 name 属性的名称是什么,value 属性都可以默认不写
-
required :是否必须要有该参数,可以设置为【true】或者【false】
-
defaultvalue :设置默认值
我们先看一个示例:
@ModelAttribute
public void model(Model model) {
model.addAttribute("message", "注解成功");
}
@RequestMapping("/value")
public String handleRequest() {
return "test";
}
这样写就会在访问控制器方法 handleRequest() 时,会首先调用 model() 方法将 message 添加进页面参数中去,在视图中可以直接调用,但是这样写会导致该控制器所有的方法都会首先调用 model() 方法,但同样的也很方便,因为可以加入各种各样的数据。
四、Spring MVC 客户端跳转不管是地址 /hello 跳转到 index.jsp 还是 /test 跳转到 test.jsp,这些都是服务端的跳转,也就是 request.getRequestDispatcher("地址").forward(request, response);
如果要实现客户端跳转我们需要吧返回的ModelView页面设为redirect:路径
五、Spring MVC 文件上传如果使用注解的方式上传图片并返回是这样实现的:
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class UploadController {
@RequestMapping("/upload")
public void upload(@RequestParam("picture") MultipartFile picture) throws Exception {
System.out.println(picture.getOriginalFilename());
}
@RequestMapping("/test")
public ModelAndView upload() {
return new ModelAndView("upload");
}
}



