内容概要
- 原理简介
- DispatcherServlet
- RequestMapping
- ResponseBody
- param
- RequestParam
- 重定向与转发
Spring MVC原理
- SpringMVC是一个开源的Java的的框架,为开发强大的基于Java的的网络的应用程序提供全面的基础架构支持,由RodJohnson撰写,于2003年6月首次发布
- Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构用于开发灵活和松散耦合的Web应用程序的组件
- 模型(Model)封装了应用程序数据,通常由POJO类组
- 视图(View)负责渲染模型数据,生成客户端浏览器可以解释HTML输出
- 控制器(Controller)处理用户请求并构建适当的模型
DispatcherServlet
- SpringMVC框架是围绕DispatcherServlet设计的,它处理所有的HTTP请求和响应
- DispatcherServlet处理HTTP请求事件顺序
- 在接收到HTTP请求后;分发器会查询HandlerMapping以调用相应的控制器
- 控制器接受请求并根据使用的GET或POST方法调用相应的服务方法。服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet
- DispatcherServlet将从视图解析器的获取请求的定义视图,当视图完成;分发器将模型数据传递到最终的视图,并在浏览 器上呈现
- 所有上述组件,即:HandlerMapping,Controller和ViewResolver是WebApplicationContext中的一部分,它是普通的ApplicationContext中的扩展,带有网络应用程序所需的一些额外功能
具体流程:
- 1.通过浏览器或app发送请求给服务器,如:HTTP://本地主机:8080 /第1页
- 2.所有请求会交给的DispatcherServlet来处理
- 3.在DispatcherServlet内部,会通过HandlerMapping来检查,检查是否有@RequestMapping注解对应这个URI
- 4.如果没有,返回404,如果有,让Controller来调用该方法
- 5.方法的返回值交给ViewResolver来处理,按照配置好的前缀和后缀拼接成一个JSP或HTML的文件路径
- 6.将JSP或HTML处理为对应的视图对象交给的DispatcherServlet
- 7.由DispatcherServlet将视图对象输出给服务器
- 8.服务器将结果发给客户端
RequestMapping
- DispatcherServlet将请求委派给控制器来执行特定功能,@Controller注解指定特定的类充当控制器角色,@RequestMapping注解用于将URL映射到特定的方法
- 1.基本使用
@Controller
public class MainController {
@RequestMapping(value = "/page1",)
public String p1(){
return "p1";
}
}
- 2.多层URI
@RequestMapping(value = "/p1/user")
public String user1(){
return "p1";
}
- 3. @ RequestMapping不仅可以写在方法上,也可以写在类上方
@Controller
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/p1")
public String user1(){
return "p1";
}
}
- 4.多个URI指向同一个JSP
@RequestMapping(value = {"/p2","/","/user/*})
public String user2(){
return "p1";
}
- 5.结合请求方法
@RequestMapping(value = "/getInfo",method = RequestMethod.GET)
public String getInfo(){
return "p1";
}
- 6.带有请求头(区分是否可以访问)
@RequestMapping(value = "/p3",headers = "token=123123")
public String user3(){
return "p1";
}
ResponseBody
- 1.改变返回结果为json
- gson,jackson,fastjson的介绍
@ResponseBody
@RequestMapping(value = "/json")
public List getJson(){
List<String> list = new ArrayList<>();
list.add("aaaaa");
list.add("bbbbb");
return list;
}
params参数
- 限定的是请求参数
如:http://localhost:8080/json?pageId=10
@ResponseBody
@RequestMapping(value = "/json",params = "pageId=10")
public List getJson(){
List<String> list = new ArrayList<>();
list.add("aaaaa");
list.add("bbbbb");
return list;
}
@RequestParam
- 获取请求地址的参数
如:/login?username=xxx&password=yyy
@ResponseBody
@RequestMapping(value = "/login")
public PersonBean login(@RequestParam("username") String name,@RequestParam("password")String psw){
PersonBean pb = new PersonBean();
pb.setPname(name);
pb.setPpsw(psw);
return pb;
}
@ResponseBody
@RequestMapping(value = "/login1")
public PersonBean login2(PersonBean pb){
return pb;
}
<!--某个参数不是必须的-->
@ResponseBody
@RequestMapping(value = "/login")
public PersonBean login(@RequestParam("username") String name,@RequestParam(value = "password",required = false)String psw){
PersonBean pb = new PersonBean();
pb.setPname(name);
pb.setPpsw(psw);
return pb;
}
- 返回XML数据
- 添加注解@XmlRootElement
- 给实体类添加
动态地址取值
- @PathVariable
- localhost/xxpage/page/1
// localhost/j2/page/4
@RequestMapping(value = "/j2/{pageNo}")
public String jump2(@PathVariable("pageNo") int no, Model model){
model.addAttribute("no",no);
return "j2";
}
转发与重定向
- 请求转发
- 请求重定向
@RequestMapping(value = "/j1")
public String jump1(@RequestParam("flag") boolean flag){
if (flag){
// 重定向
return "redirect:success";
}else {
// 转发
return "forward:fail";
}
}
SpringMVC给JSP传值
- Model,ModelMap,Map<String,Object>
- ModelAndView
@RequestMapping(value = "/success")
public String success(Model model,ModelMap modelMap,Map<String,Object> map){
model.addAttribute("msg","ssss");
modelMap.addAttribute("key","value");
map.put("key1","value1")
return "success";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>成功</h1>
${msg},${key},${key1}
</body>
</html>
- ModelAndView:包含几种传值形式
@RequestMapping(value = "/fail")
public ModelAndView fail(){
ModelAndView mv = new ModelAndView();
mv.setViewName("fail");
mv.addObject("key3","value3");
return mv;
}
表单数据获取
- JSP形式
@Controller
public class LoginController {
@RequestMapping("/login")
public String loginView(){
return "login";
}
@RequestMapping("/login1")
public String login(@RequestParam("username") String username,
@RequestParam("password") String psw, Model model){
System.out.println(username+"---"+psw);
if (username.equals("abc")&&psw.equals("123")){
model.addAttribute("username",username);
model.addAttribute("password",psw);
return "success";
}else {
return "fail";
}
}
}