SpringMVC简介
MVC的任务:将包含业务数据的模块与显示模块的视图解耦。
SpringMVC和JavaEE的区别:

SpringMVC的核心功能:

SpringMVC的使用
1️⃣导包
①spring-webmvc
会导入Spring的五个核心包,MVC的两个核心包,和日志
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>

②servlet-api
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
<scope>provided</scope>
</dependency>
2️⃣配置DispatcherServlet
在web.xml中配置:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--除了web资源根路径下的jsp文件,其余所有都经过dispatcherServlet-->
<url-pattern>/</url-pattern>
</servlet-mapping>
3️⃣配置注解
在application.xml中配置:
<mvc:annotation-driven/>
该标签帮我们注册了HandlerMapping和HandlerAdapter
4️⃣注册Handler
新建一个类,在类上添加@controller注解
@RequestMapping
1️⃣url路径映射
就是建立请求url和handler方法之间的映射关系
① 最基础的映射
直接给直接加个value值
@RequestMapping("hello")
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
② 多个请求映射到一个HandlerMethod
给value值传一个String数组
@RequestMapping({"hello1","hello2","hello3"})
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
③ 使用通配符*来映射
表示hello后面可以加任何文字:
@RequestMapping("hello*")
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
表示hello下的任意子域名
@RequestMapping("hello/*")
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
2️⃣窄化请求
就是在类上使用@RequestMapping注解
@Controller
@RequestMapping("hi")
public class HelloController {
3️⃣请求方法限定
限定HandlerMethod映射的请求url对应的请求方法
在@RequestMapping注解中添加method属性即可
@RequestMapping(value = "hello/*", method = RequestMethod.POST)
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
这样写后,就只有post请求可以访问过来了
也可以直接使用@PostMapping注解(@GetMapping)
@PostMapping("hello")
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
4️⃣请求参数限定
@GetMapping (value = "hello", params = {"username","password"})
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
这样请求必须要携带username和password两个参数才能进来
5️⃣请求头限定
①限定需要的请求头
@RequestMapping(value = "hello", headers = {"abc","def"})
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
则请求报文需要abc和edf两个请求头
②限定请求头ContentType的值
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型
@RequestMapping(value = "hello", consumes = "text/html")
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
③限定请求头Accept的值
Accept代表发送端(客户端)希望接受的数据类型
@RequestMapping(value = "hello", produces = "text/html")
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
Handler方法的返回值
1️⃣ModelAndView
刚刚一直在用
2️⃣void(不推荐)
3️⃣String
实际上就是返回的值作为ViewName,Model直接写到形参中
@RequestMapping("hey")
public String hey(Model model){
model.addAttribute("result","SpringMVC");
return "/WEB-INF/hello.jsp";
}
4️⃣Json(重点)
将返回值写成Object,然后导入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.3</version>
</dependency>
然后在方法上加上@ResponseBody注解
@RequestMapping("hello")
@ResponseBody
public Object hello(){
Vo1 vo1 = new Vo1();
vo1.setUsername("octavius");
vo1.setPassword("123456");
return vo1;
}
也可以在类上用@RestController注解替换@Controller注解,这样这个类下的所有方法都返回Object对象时都会自动转换成Json数据
@RestController
@RequestMapping("hi")
public class HelloController {
@RequestMapping("hello")
/*@ResponseBody*/
public Object hello(){
Vo1 vo1 = new Vo1();
vo1.setUsername("octavius");
vo1.setPassword("123456");
return vo1;
}
}
转发和重定向
@Controller
@RequestMapping("hi")
public class HelloController {
@RequestMapping(value = "hello", produces = "text/html")
public ModelAndView hello(){
ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
modelAndView.addObject("result","SpringMVC");
return modelAndView;
}
@RequestMapping("myforward")
public String hey1(){
return "forward:/hello";
}
@RequestMapping("myredirect")
public String hey2(){
return "redirect:/hello";
}
}
建议:冒号后面加上斜杠,否则就是相对于Handler的路径

本文详细介绍了SpringMVC的HandlerMethod,包括导包、配置DispatcherServlet、注解使用、@RequestMapping的详细映射规则、Handler方法的返回值类型以及转发和重定向操作。重点讲解了如何通过注解实现URL映射、请求参数和头的限制,以及返回JSON数据的方法。

321

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



