博主此篇学习笔记是跟随哔哩哔哩UP主:狂神说Java,视频讲解时整理
UP主链接:https://space.bilibili.com/95256449
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明方式。
web.xml中配置DispatcherServlet:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc-servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
web-app>
新建springmvc配置文件(配置处理器映射器、处理器适配器、视图解析器以及注册bean)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
bean>
<bean id="/hello" class="com.kx.controller.HelloController"/>
beans>
新建Controller类
//注意,这里先导入Controller接口
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// ModelAndView 模型和视图
ModelAndView mv = new ModelAndView();
// 调用业务层
//封装对象放在ModelAndView中
mv.addObject("msg", "HelloSpringMVC!");
//封装要跳转的视图放在ModelAndView中
mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
return mv;
}
}
jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
${msg}
配置tomcat
分析执行流程
- DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
- HandlerMapping为处理器映射。由DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler
- HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器。
- HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
- HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
- Handler让具体的Controller执行。
- Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
- HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
- DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
- 视图解析器将解析的逻辑视图名传给DispatcherServlet。
- DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
- 最终视图呈现给用户。
注解实现SpringMVC
web.xml中配置DispatcherServlet:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc-servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
web-app>
springmvc-servlet.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc-servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
web-app>
创建Controller
@Controller
// @RestController //此注解会返回一个字符串,一般json会用。
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model){
//封装数据
model.addAttribute("msg","Hello,SpringMVC-Annotation!");
return "hello"; //会被视图解析器处理
}
}
/*== 也可以不配置视图解析器,但是要返回全路径,默认请求转发
return "/WEB-INF/jsp/hello.jsp";
//转发:return "forward:/index.jsp";
//重定向:return "redirect:/index.jsp";
==*/
/*== 配置视图解析器:重定向,不需要视图解析器,本质就是重新请求一个新地方,所以注意路径问题。也可以重定向到另一个请求实现。
转发:return "hello";
重定向:return "redirect:/index.jsp";
//return "redirect:hello.do"; //hello.do为另一个请求/
==*/
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
${msg}
配置tomcat
控制器Controller
- 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
- 控制器负责解析用户的请求并将其转换为一个模型。
- 在Spring MVC中一个控制器类可以包含多个方法。
- 在Spring MVC中,对于Controller的配置方式有很多种。
类似注解:Spring中注解开发有提到
@Component 组件 @Service service @Controller controller @Repository dao 这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean
RequestMapping
- @RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作物父路径。
- 为了测试结论更加准确,可以加上项目名测试
概念
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
功能
传统方式操作资源:通过不同的参数来实现不同的效果!方法单一:post和get
使用RESTful操作资源:可以通过不同的请求方式来实现不同的效果!
代码:
@Controller
public class RestFulController {
//映射访问路径
@RequestMapping("/add/{a}/{b}")
public String test(@PathVariable int a, @PathVariable int b, Model model){
int res = a+b;
model.addAttribute("msg","结果为"+res);
return "test";
}
}
@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET) //指定请求方式 //使用method属性指定请求类型 @PathVariable //路径变量 //在Spring MVC中可以使用@PathVariable注解,让方法参数的值对应绑定到一个URL模板变量上
组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
405错误可能是请求方式与后台设置请求方式不符
当有两个相同的url请求且后台设置请求方式相同会报500错误
tomcat修改编码格式
Tomcat文件夹->config->servlet.xml
在web.xml中配置设置编码格式的过滤器:
<filter>
<filter-name>encodingfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>encodingfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
语法格式:
JSON键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值:
{"name": "kongxin"}
{"age": "18"}
{"sex": "男"}
JSON是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
var obj = {a: 'hello', b: 'world'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "hello", "b": "world"}'; //这是一个 JSON 字符串,本质是一个字符串
JSON 和 JavaScipt 对象互转
要实现从JSON字符串转换为JavaScript对象,使用 JSON.parse()方法:
var obj = JSON.parse('{"a": "hello", "b":"world"}');
//结果是 {a: 'hello', b: 'world'}
要实现从JavaScript对象转换为JSON字符串,使用JSON.stringify() 方法:
var json = JSON.stringify({a: 'hello', b: 'world'});
//结果是 '{"a": "hello", "b": "world"}'
添加依赖
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.11.0.rc1version>
dependency>
在springmvc配置文件springmvc-servlet.xml中加入乱码问题配置
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<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>
controller类
@Controller
public class UserController {
@RequestMapping("/j1")
@ResponseBody
//@ResponseBody不会走视图解析器,会直接返回字符串,与 @Controller配合使用;
// 与@Controller一起与单独@RestController效果相同
public String test() throws JsonProcessingException {
//jackson,ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//创建对象
User user = new User("空心",18,"男");
String str = mapper.writeValueAsString(user);
return str;
}
@RequestMapping("j2")
@ResponseBody
public String test2() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Date date = new Date();
//自定义日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm:ss");
// ObjectMapper,时间解析后的默认格式为:Timestamp,时间戳
return mapper.writeValueAsString(sdf.format(date));
}
}
添加依赖
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.68version>
dependency>
乱码配置、环境配置问题相同
Controller类
@RequestMapping("/j3")
@ResponseBody
public String test3() {
User user = new User("空心",18,"男");
return JSON.toJSONString(user);
//Java对象转Json字符串
}
//JSON.parseObject //Json字符串转Java对象
//JSON.toJSON //Java对象转Json对象
//JSON.toJavaObject //Json对象转Java对象