1、什么是Spring MVC ?简单介绍下你对springMVC的理解?
Spring MVC的主要组件?
2.请求映射、restfulAPl、 返回值、JSON交互、异常处理、拦截器
文章目录
SpringMVC
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
SpringMVC 能干什么
1) 天生与 Spring 框架集成, 如: (IOC,AOP)
2) 支持 Restful 风格
3) 进行更简洁的 Web 层开发
4) 支持灵活的 URL 到页面控制器的映射
5) 非常容易与其他视图技术集成, 如:Velocity、 FreeMarker 等等
6) 因为模型数据不存放在特定的 API 里, 而是放在一个 Model 里(Map 数据结构实现,
因此很容易被其他框架使用)
7) 非常灵活的数据验证、 格式化和数据绑定机制、 能使用任何对象进行数据绑定,
不必实现特定框架的 API
8) 更加简单、 强大的异常处理
9) 对静态资源的支持
10) 支持灵活的本地化、 主题等解析
Spring MVC的主要组件
(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
明确: 我们只需要编写处理具体业务的控制器以及视图。
SpringMVC 怎么玩
1) 将 Web 层进行了职责解耦, 基于请求-响应模型
2) 常用主要组件
1 DispatcherServlet: 前端控制器
2 Controller: 处理器/页面控制器, 做的是 MVC 中的 C 的事情, 但控制逻辑转移到前端控制器了, 用于对请求进行处理
3 HandlerMapping : 请求映射到处理器, 找谁来处理, 如果映射成功返回一个HandlerExecutionChain 对象( 包含一个 Handler 处理器(页面控制器)对象、 多个 HandlerInterceptor 拦截器对象)
4 View Resolver : 视图解析器, 找谁来处理返回的页面。 把逻辑视图解析为具体
的 View,进行这种策略模式, 很容易更换其他视图技术;
如 InternalResourceViewResolver 将逻辑视图名映射为 JSP 视图
5 LocalResolver: 本地化、 国际化
6 MultipartResolver: 文件上传解析器
7 HandlerExceptionResolver: 异常处理器
1) 新建 Web 工程, 加入 jar 包
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
2) 在 web.xml 中配置 DispatcherServlet
3) 加入 Spring MVC 的配置文件: springmvc.xml
1 增加名称空间
2 增加配置
4) 需要创建一个入口页面, index.jsp
<a href="${pageContext.request.contextPath }/helloworld">Hello World</a>
5) 编写处理请求的处理器, 并标识为处理器
6) 编写视图
/WEB-INF/views/success.jsp
<h4>Sucess Page</h4>
7) 部署测试:
http://localhost:8080/SpringMVC_01_HelloWorld/index.jsp
现象:进入index.jsp页面后,点击超链接,则可进入success.jsp页面
HelloWorld 请求流程图解:流程分析:
基本步骤:
1 客户端请求提交到 DispatcherServlet
2 由 DispatcherServlet 控制器查询一个或多个 HandlerMapping, 找到处理请求的 Controller
3 DispatcherServlet 将请求提交到 Controller(也称为 Handler)
4 Controller 调用业务逻辑处理后, 返回 ModelAndView
5 DispatcherServlet 查询一个或多个 ViewResoler 视图解析器, 找到 ModelAndView 指定的视图
6 视图负责将结果显示到客户端
REST
1 参考资料:
1) 理解本真的 REST 架构风格: http://kb.cnblogs.com/page/186516/
2) REST: http://www.infoq.com/cn/articles/rest-introduction
2 RESTful CRUD
1) REST: 即 Representational State Transfer。(资源) 表现层状态转化。 是目前最流行的一种互联网软件架构。
GET 用来获取资源, POST 用来新建资源, PUT 用来 更新资源, DELETE 用来删除资源。
1) 配置 HiddenHttpMethodFilter 过滤器
2) 代码
/**
* Rest 风格的 URL. 以 CRUD 为例:
* 新增: /order POST
* 修改: /order/1 PUT update?id=1
* 获取:/order/1 GET get?id=1
* 删除: /order/1 DELETE delete?id=1
*
* 如何发送 PUT 请求和 DELETE 请求呢 ?
* 1. 需要配置 HiddenHttpMethodFilter
* 2. 需要发送 POST 请求
* 3. 需要发送 POST 请求是携带一个 name="_method" 的隐藏域,值为 DELETE 或 PUT
*
* 在 SpringMVC 的目标方法中 如何得到id 呢? 使用 @PathVariable 注解
*
*/
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)
public String testRestPut(@PathVariable Integer id) {
System.out.println("testRest Put: " + id);
return SUCCESS;
}
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.DELETE)
public String testRestDelete(@PathVariable Integer id) {
System.out.println("testRest Delete: " + id);
return SUCCESS;
}
@RequestMapping(value = "/testRest", method = RequestMethod.POST)
public String testRest() {
System.out.println("testRest POST");
return SUCCESS;
}
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.GET)
public String testRest(@PathVariable Integer id) {
System.out.println("testRest GET: " + id);
return SUCCESS;
}
3) 请求链接
<!-- 实验 1 测试 REST 风格 GET 请求 -->
<a href="springmvc/testRESTGet/1">testREST GET</a><br/><br/>
<!-- 实验 2 测试 REST 风格 POST 请求 -->
<form action="springmvc/testRESTPost" method="POST">
<input type="submit" value="testRESTPost">
</form>
<!-- 实验 3 测试 REST 风格 PUT 请求 -->
<form action="springmvc/testRESTPut/1" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="testRESTPut">
</form>
<!-- 实验 4 测试 REST 风格 DELETE 请求 -->
<form action="springmvc/testRESTDelete/1" method="POST">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="testRESTDelete">
</form>
处理响应数据
1) ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
2) Map 及 Model: 入参org.springframework.ui.Model、
org.springframework.ui.ModelMap 或 java.uti.Map 时, 处理方法返回时, Map 中的数据会自动添加到模型中。
3) @SessionAttributes: 将模型中的某个属性暂存到 HttpSession 中, 以便多个请求之间可以共享这个属性
4) @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中
1 ModelAndView 介绍
1) 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息, 也包含模型
数据信息。
2) 添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map<String, ?> modelMap)
3) 设置视图:
void setView(View view)
void setViewName(String viewName)
文件上传
SpringMvc异常处理
面试
SpringMVC怎么样设定重定向和转发的?
(1)转发:在返回值前面加"forward:",比如"forward:user.do?name=method"
(2)重定向:在返回值前面加"redirect:",比如"redirect:http://www.baidu.com"
SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。
SpringMVC常用的注解有哪些?
@RequestMapping:用于处理请求 url
映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
未完待续~