SpringMVC(二)
目录
SpringMVC(二)
SpringMVC执行原理
- DispatcherServlet表示前端控制器,用户发出请求,DispatcherServlet拦截并接收请求
- HandlerMapping为处理器映射,由DispatcherServlet调用,根据请求url查找Handler
- HandlerExecution表示具体的Handler,根据url查找Controller
- HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等
- HandlerAdapter表示处理器适配器,按照特定的规则取执行Handler
- Handler让具体的Controller执行
- Controller让具体的执行信息返回给HandlerAdapter,如ModelAndView
- HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
- DispatcherServlet调用ViewResolver视图解析器来解析HandlerAdapter传递的逻辑视图名
- ViewResolver将解析的逻辑视图名传给DispatcherServlet
- DispatcherServlet根据ViewResolver解析的视图结果,调用具体的视图
- 最终视图呈现给用户
使用注解开发
- 在Spring配置文件中增加注解驱动
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--自动扫描包,让指定包下的注解生效-->
<context:component-scan base-package="com.yhr.controller"/>
<!--让Spring MVC不处理静态资源-->
<mvc:default-servlet-handler/>
<!--支持MVC注解驱动,自动完成DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter的注册-->
<mvc:annotation-driven/>
<!--添加视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- 使用注解开发Controller
//控制器注解
@Controller
@RequestMapping("/hello")
public class HelloController {
//访问地址:localhost:8080/hello/h1
@RequestMapping("/h1")
public String hello(Model model) {
//封装数据
model.addAttribute("msg", "HelloSpringMVCAnnotation");
//返回视图
return "hello";
}
}
RESTful风格
-
RESTful是一个资源定位及资源操作的风格,可以让软件更简洁,更有层次,更易于实现缓存等机制
-
功能:
- 资源:互联网所有的事物都可以被抽象为资源
- 资源操作:POST、DELETE、PUT、GET
-
使用RESTful操作资源,可以通过不同的请求方式来实现不同的效果
简单实现
@Controller
public class RestFulController {
//原来:http://localhost:8080/add?a=1&b=2
//RESTful风格:http://localhost:8080/add/a/b
@RequestMapping("/add/{a}/{b}")
public String test1(@PathVariable int a, @PathVariable int b, Model model) {
int res = a + b;
model.addAttribute("msg", "结果为" + res);
return "hello";
}
}
处理不同的请求方式
- 在@RequestMapping中加参数
@RequestMapping(value = "/add/{a}/{b}", method = RequestMethod.GET)
- 使用对应的注解:
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping
结果跳转方式
-
无需视图解析器:
- 转发:
return "/index.jsp" - 显式转发:
return "forward:/index.jsp" - 重定向:
return "redirect:/index.jsp"
- 转发:
-
有视图解析器:重定向不变,转发按照解析器的规则写
接收请求参数及数据回显
接收参数
- 提交的域名和处理方法的参数名一致时会自动处理
- 提交的域名和处理方法的参数名不一致时,使用
@RequestParam("name")修饰参数 - 提交的是对象时,参数为实体类
数据显示
- Model:简化的存储数据
- ModelMap:继承了LinkedMap
- ModelAndView:可以设置返回的逻辑视图,实现控制视图层的跳转
中文乱码
- 在web.xml中配置SpringMVC的过滤器
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JSON
- JSON(JavaScript Object Notation)是一种轻量级的数据交换格式
- 采用完全独立于编程语言的纯文本格式来存储和表示数据
语法格式
- 对象表示为键值对,数据由逗号分隔
- 花括号保存对象,方括号保存数组
{"name": "yhr", "age": "3", "sex": "男"}
JSON和JavaScript对象
var obj = {a: 'Hello', b: 'World'};
var json = '{"a": "Hello", "b": "World"}'
- JSON转js对象
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
- js对象转JSON
var json = JSON.stringify({a: 'Hello', b: 'World'});
Controller返回JSON数据
Jackson
- 导入依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
- 使用ObjectMapper中的writeValueAsString方法
@ResponseBody//不经过视图解析器,直接返回字符串
@RequestMapping(value = "/j1", produces = "application/json;charset=utf-8")
public String json1() throws JsonProcessingException {
User user = new User("yhr", 3, "男");
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(user);
}
- 其中@RequestMapping的produces属性可以避免乱码
- 也可以在Spring中配置来防止乱码
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
- @ResponseBody也可以和@Controller合并为@RestController来修饰类
FastJson
- 导入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
- fastjson有三个主要的类:
- JSONObject代表json对象
- JSONArray代表json对象数组
- JSON代表JSONObject和JSONArray的转化
- 常用方法:
- JSON.toJSONString:Java对象转JSON字符串
- JSON.parseObject:JSON字符串转Java对象
- JSON.toJSON:Java对象转JSON对象
- JSON.toJavaObject:JSON对象转Java对象

浙公网安备 33010602011771号