1、 SpringMVC是什么?
SpringMVC是一种基于JAVA的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品,以及融合在Spring Web Flow中
SpringMVC 已经称为目前最主流的MVC框架之一,并且随着Spring3.0的发布,全面超所Struts2,成为最优秀的MVC框架。它通过一套注解,让一个简单的java类称为处理请求的控制器,而无须事先任何接口。同时它还支持RESTful编程风格的请求。
2、 使用了SpringMVC能做些什么?
客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转
当然这些是广意义上的,SpringMVC配置了许多方便的类,配合插件jar包使用,可以减轻开发人员在开发中的难度。若是配合使用Spring框架,一些简易的功能完全可以用注解来开发不用怎么编写代码。
3、 怎么使用?
SpringMVC的开发步骤:
- 导入SpringMVC相关坐标
- 配置SpringMVC核心控制器DispathcerServlet
- 创建Controller类和视图页面
- 使用注解配置Controller类中业务方法的映射地址
- 配置SpringMVC核心文件spring-mvc.xml
- 客户端发起请求测试
当然,不同的使用方式有不同的开发步骤,但这些步骤肯定是会包括的。
而SpringMVC的执行流程如下:

@ RequestMapping 注解
• 作用:用于建立请求URL和处理请求方式之间的对应关系
• 位置:
- 类上,请求URL的第一级访问目录。此处不写,就相当于应用的根目录
- 方法上,请求URL的第二级访问目录,与类上的使用@requestMapping标注的一级目录一起组成访问虚拟路径
• 属性:
- value:用于指定请求的URL,它和path属性的作用是一样的
- method:用于指定请求的方式
- params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
• 例如:
- params = {“accountName”},表示请求参数必须有accountName
- params = {“money!=100”},表示请求参数中money不能是100
使用该注解,需要在Spring-mvc.xml文件中配置视图解析器和组件扫描。
SpringMVC的相关组件:
• 前端控制器:DispatcherServlet (重点)
- 其功能:调用其他组件进行使用,
- 跟Servlet差不多。一个写调用其他类的代码,一个调用其他组件使用
• 处理器映射器:HandlerMapping
• 处理器适配器:HandlerAdapter
• 处理器:Handler
• 视图解析器:ViewResolver
• 视图:View
• 在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。
SpringMVC中的数据响应
SpringMVC框架中存在了许多数据响应的方法,以下我挑几条我认为实用的出来。
页面跳转
方法1: 声明一个Model类型,该类型在访问时SpringMVC会自动配置该类,使用该类可以对页面进行数据的传递,而返回直接返回字符串即可跳转页面
@RequestMapping("/test3")
public String test3(Model model){
model.addAttribute("name","王五");
return "/src/web_jsp/index.jsp";
}
方法2: 该方法不需要配置Model,返回字符串即可跳转
@RequestMapping("/con")
public String say(){
return "success";
}
但前提,需要配置视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/src/web_jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
所有使用字符串进行页面跳转的方法都需要和视图解析器中的前缀和后缀相拼接,拼接后的的字符串才是最终返回的地址。
回写数据
- Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print(“hello world”)即可,那么在Controller中想直接回写字符串该怎么样?
- 通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”)回写数据,此时不需要视图跳转,业务方式返回值void。
@RequestMapping("/test5")
public void test4(HttpServletResponse response) throws IOException {
response.getWriter().print("回写数据");
}
- 将需要回写的字符串直接返回,但此时需要通过@responseBody注解告知SpringMVC框架,方法返回的字符串不是跳转,而是直接在http响应体中返回。
@RequestMapping("/test6")
@ResponseBody
public String test4() throws IOException {
return "直接在响应体中返回数据";
}
另一种:返回对象与集合
• 在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,因此,我们可以使用mvc的注解驱动代替上述配置。
<mvc:annotation-driven></mvc:annotation-driven>
• 使用< mvc:annotation-driven >自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在Spring-xml.xml配置问价你中使用< mvc:annotation-driven >替代注解处理器和适配器配置。
• 同时用< mvc:annotation-driven >默认底层就会基础jackson进行对象或集合的json格式
字符串的转换
SpringMVC的数据请求
获得数据类型
• 客户端请求类型参数的格式是:name=value&name=value
• 服务器要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
- 基本类型参数
- POJO类型参数
- 数组类型参数
- 集合类型参数
获得基本类型参数
• Controller业务方式的参数名称要与请求参数的name一致,参数值会自动映射匹配
// java代码
@RequestMapping("/test10")
@ResponseBody
public void test9(String name,String age) throws IOException {
System.out.println(name);
System.out.println(age);
}
//<!-- 浏览器地址栏 - 通过get请求向方法发送数据 -->
//http://localhost:8080/路径?name=value&age=value
获得POJO类型参数
• Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配
• 有过ASP.net MVC的基础应该知道,就是实体类中的属性而已,使用实体类来接收
public class User{
private String name;
private String age;
}
// java代码
@RequestMapping("配置路径")
@ResponseBody
public void 方法(实体类类型 接收实体类值) throws IOException {
System.out.println(接收实体类值);
}
获得数组类型参数
• Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配
• 而具体用法就是使用 数组类型 来接收就好
获得集合类型参数
• 获得集合参数时,要将集合参数包装到一个POJO中才可以。
• 当使用ajax提交时,可以知道contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无序使用POJO进行包装
获得Restful风格的参数
• Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
• 其主要用于客户端和服务器交互的软件,基于整个风格设计的软件可以更加简洁,更有层次,更易于实现缓存机制等
• Restful 风格的请求是使用 “url+请求方式” 表示一次请求目的,HTTP 协议里面四个表示方式的动词如下:
- GET:用于获取资源
- POST:用于新建资源
- PUT:用于更新资源
- DELETE:用于删除资源
• /路径/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。
• 地址/路径/1可以写成/路径/{参数},占位符{参数}对应的就是1的值。
• 在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
各类方式获得请求数据
参数绑定注解@RequestParam
• 当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
• 注解@ReqeuestParam还有如下参数可以使用:
- value:映射前的请求参数名称
- required:此在指定的请求参数是否必须包括,默认时true,提交时如果没有此参数则报错
- defaultValue:当没有指定请求参数时,则使用指定的默认值赋值。前提required为false
@RequestMapping("/test15")
@ResponseBody
public void test14(@RequestParam(value = "data",required = false,defaultValue = "老刘") String name) throws IOException {
System.out.println(name);
}
自动类型转换器
• SpringMVC默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int类型进行参数设置
• 但是不是所有的数据类型都提供了转化器,没有提供的就需要自定义转换其,例如:日期类型
• 自定义类型转换器的开发步骤:
- 定义转换器类实现Converter接口
- 在配置文件中声明转换器
- 在 < annotation-driven > 中引用转换器
获得Servlet相关API
• SpringMVC 支持使用原始 ServletAPI 对象作为控制器方法的参数进行注入,常用的对象如下:
- HttpServletRequest
- HttpServletResponse
- HttpSession
@RequestMapping("/test18")
@ResponseBody
public void test17(HttpServletRequest request,HttpServletResponse response)throws IOException {
System.out.println(request);
System.out.println(response);
}
获得请求头数据
@RequestHeader
- 使用该注解可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
- @RequestHeader注解的属性如下:
value:请求头的名称
required:是否必须携带此请求头
@CookieValue
- 使用该注解可以获得指定Cookie的值
- @CookieValue注解的属性如下:
value:指定cookie的名称
required:是否必须携带此cookie
4、个人总结:
学习SpringMVC有段时间,如果说没有学习过Spring直接跨过学习SpringMVC我不认为这是很好的选择,因为它的一些基础理论需要以Spring的理论来搭建。尽管学习了有段时间,但我也无法保证这些就是SpringMVC的全部用途,因为视频始终是人展现给我们的,真正的核心还得是自己去寻找。
综合以上,SpringMVC还是可以给我们的开发带来很大的帮助,只要体验过手敲Servlet就知道了。
部分内容来自于 黑马程序员SSM框架整合视频集 中的视频笔录。

153

被折叠的 条评论
为什么被折叠?



