参考资料运行环境一、Spring MVC
1.1 相关概念1.2 SpringMVC框架的特点1.3 SpringMVC 体系架构与执行流程1.3 执行流程示意图1.4 执行流程分析1.5 SpringMVC 请求处理流程1.6 源代码分析 二、SpringMVC的参数处理
2.1 请求数据2.2 GET请求2.3 POST-表单数据2.4 视图解析器 三、参数传递(Controller to View)
3.1 方式一:ModelAndView3.2 方式二:Model3.3 方式三:Map3.4 使用原生的Servlet3.5 小结
参考资料MOOC
运行环境windows10JDK8IDEA 2021.1专业版Spring 5.0.5 一、Spring MVC
学习任务:
完成Spring MVC 环境的搭建,并实现视图层 View 与 控制器 Controller 之间的参数传递超市系统的登录功能 1.1 相关概念
1. SpringMVC
Spring MVC是Spring框架提供的一个 MVC 设计模式的优秀web开发框架,本质上加了@Controller对象,SpringMVC充当控制器(Controller)来建立模型与视图的交互
2.DispatcherServlet **
DispatcherServlet,即中央调度器,是web开发底层Servlet类的子类,它负责接收用户的所有请求** ,用户把请求提交给 DispatherServlet,之后 DispatherServlet把请求转发给Controller对象,最后是由Controller对象处理请求
DispatcherServlet 是SpringMVC中最核心的类,通常在web.xml里配置
3.Handler
处理器,对应MVC中的C,Controller层
类型:Obejct作用:处理实际请求标注了@RequestMapping的所有方法都可以看做是一个 Handler
4.ModelAndView
逻辑视图名 + 视图解析器(找到真实视图)
5.Model
类型:Map常用方法:添加模型数据处理方法的传入参数为Model类型页面也可以直接根据model的key取值
6.View
模型对象,一般为业务层交互后返回的数据
7.InternalResourceViewResolver
视图解析器,重要的有prefix前缀和suffix后缀两个参数
清晰的角色划分灵活的配置功能提供了大量的控制器接口和实现类真正做到与View层的实现无关(JSP、Velocity、Xslt等)国际化支持面向接口编程Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间都可以很方便的结合在一起 1.3 SpringMVC 体系架构与执行流程 1.3 执行流程示意图
1.4 执行流程分析- 浏览器提交请求到中央调度器 DispatcherServlet中央调度器DispatcherServlet直接将请求转发给处理器映射器HandleMapping处理器映射器HandleMapping会根据请求,找到该请求的处理器Handle,并将其封装为处理器执行链后返回给中央调度器DispatcherServlet中央调度器DispatcherServlet根据处理器执行链中的处理器Handle,找到能够执行该处理器的处理器适配器HandleAdapter处理器适配器HandleAdapter调用执行控制器Controller控制器Controller将处理结果以及要跳转的视图封装到一个对象 ModleAndView中,并将其返回给处理器适配器HandleAdapter处理器适配器HandlerAdapter 直接将结果返回给中央调度器 DispatcherServlet中央调度器 DispatcherServlet调用视图解析器ViewResolver,将ModelAndView中的视图名称封装为视图对象View视图解析器ViewResolver 将封装了的视图对象View返回给中央调度器 DispatcherServlet中央调度器DispatcherServlet 调用视图对象View,让其自己进行渲染,即进行数据填充,形成影响对象中央调度器DispatcherServlet响应浏览器
Tomcat启动,创建容器的过程
通过 load-on-start 标签指定,创建 DispatcherServlet 对象,该类是HttpServlet的子类,在创建时候会执行 init()方法在DispatcherServlet对象的init()方法中
- 创建容器,读取配置文件:
WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
- 把容器对象放到ServletContext中
getServletContext().setAttribute(key, ctx);
上面创建容器的作用: 创建@Controller注解所在的类的对象,创建 MyController对象,把这个对象放到springmvc的容器中,容器是map,类似于 `map.put(“myController”, MyController对象)
二、SpringMVC的参数处理2.1 请求数据
请求数据有三种形式:Get请求、Post请求和文件请求
请求方式与提交常见的应用场景
Get请求:
@RequestMapping(method=RequestMethod.GET)
Post请求
@RequestMapping(method=RequestMethod.POST)2.2 GET请求
固定参数1 —— @RequestParam
若请求参数与方法定义的参数名不一致,可使用@RequestParam指定请求域的名称,赋给参,例如:
@RequestMappping("/findByName") public String findUserByName(@RequestParam(value = "username") String name){ System.out.println(name); return "user"; }
也可以用于指定某些参数是否必须传参,若指定为否,不传参数就不会报错,例如:
```java @RequestMappping("/findByName") public String findUserByName(@RequestParam(value = "username", required = false) String name){ System.out.println(name); return "user"; }
固定参数2——value、method、params
可以在@RequestMapping注解内指定请求的类型、路径、参数等,例如:
@RequestMapping(value = "/findByName2", method = RequestMethod.GET, params = "username") public String findUserByName2(String username){ System.out.println(username); return "user"; }
注意这种方式,请求参数必须和方法参数保持一致,否则为空
2.3 POST-表单数据使用对象接收,该对象对应的POJO类应包含表单name属性的set方法,例如:
login.html
User.java
public class User{ private String userName; private String userPassword; // ...setter getter toString() }
Controller.java
@RequestMapping(value = "/login", method=RequestMapping.POST) public String login(User user){ System.out.println(user.getUserName()); System.out.println(user.getUserPassword()); return "user"; }2.4 视图解析器
SpringMVC的视图解析器是通过InternalResourceViewResolver对象实现的,一般是在配置文件中定义:
使用案例:
三、参数传递(Controller to View)
3.1 方式一:ModelAndView
如何将模型数据传递给视图? ModelAndView!
ModelAndView包含视图信息和模型信息,常用方法有:
添加模型数据
ModelAndView addObject(String attributeName, Object attributevalue); ModelAndView addAllObjects(MapmodelMap);
设置视图
void setView(View view); void setViewName(String viewName);
使用案例:
@RequestMapping("/index1") public ModelAndView index(String username){ log.info("welcome! username: " + username); ModelAndView mView = new ModelAndView(); mView.addObject("username", username); mView.setViewName("index"); return mView; }3.2 方式二:Model
使用案例:
Controller.java
@RequestMapping("/login2") public String login (User user, Model model) { System.out.println(user.getUserName()); System.out.println(user.getUserPassword()); Listuser = new ArrayList<>(); // 假设users为model数据 User u = new User(); u.setUserName (user.getUserName()); u.setUserPassword(user.getUserPassword()); users.add(u); model.addAttrebute("users", users); return "user"; }
login.jsp
用户名: $(users.get(0).userName} 密码: $(users.get(0).userPassword}
好处是:不用显示ModelAndView的构造对象,更加简洁
3.3 方式三:Map方式二的Model其实是一个Map的数据结构,现在可用Map作为处理方法传入参数
使用案例:
Controller.java
@Requestmapping("/index3") public String index(String username, Map3.4 使用原生的Servletmodel){ log.info("hello, SpringMVC! username: " + username); model.put("username", username); return "index"; }
将 HttpServletRequest对象作为参数传入相应的处理方法即可,使用案例:
Controller.java
@RequestMapping("/session") public String testSession(HttpSession session){ session.setAttribute("username", "uni") return "user"; }
jsp
session数据: ${sessionScope.username}
注:尽管此方法在SpringMVC中不常用来接收请求的参数,但说明了一个很重要的事实:
Servlet的原生对象如HttpServletRequest、HttpServletResponse、HttpSession等都可以直接作为控制层方法的参数传入,直接使用即可。 3.5 小结
在SpringMVC框架中,从控制层Controller 到视图层View的参数传递有三种方法,ModelAndView、Model还有Map,推荐使用Model对象,因为它是Spring MVC的标准用法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)