springmvc简述:
Spring C 层框架的核心是 DispatcherServlet,它的作用是将请求分发给不同的后端处理器,也即 使用了一种被称为Front Controller 的模式(后面对此模式有简要说明)。 Spring 的C 层框架使用了后端控制器来、映射处理器和视图解析器来共同完成C 层框架的主要工作。并且spring 的C 层框架还真正地把业务层处理的数据结果和相应的视图拼成一个对象,即我们后面会经常用到的ModelAndView 、ModelMap、Model对象
这只是一个简单的入门项目,希望能够帮助到各位。
项目结构
项目搭建
先来配置SpringMVC的核心配置文件(springmvc.xml)
框架入口 web.xml。SpringMVC入口是基于servlet,Struts2是基于Filter,两者有点区别。
这里的DispatcherServlet 就是一个Servlet ,也是对请求进行转发的核心Servlet 。在这里即所有.action 的请求将首先被DispatcherServlet 处理,而DispatcherServlet 它要作的工作就是对请求进行分发(也即是说把请求转发给具体的Controller )。可以简单地认为,它就是一个总控处理器,但事实上它除了具备总控处理理器对请求进行分发的能力外,还与spring 的IOC 容器完全集成在一起,从而可以更好地使用spring 的其它功能。
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
springmvc
*.action
简单的hello.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
${msg }
控制层 HelloSpringMVC.java
ModelAndView 对象是包含视图和业务数据的混合对象,即是说通过此对象,我们可以知道所返回的相应页面(比如这里返回hello.jsp 页面)
package com.zwk.servlct.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloSpringMVC {
@RequestMapping("hello") //映射url请求路径
public ModelAndView hello(){
//利用ModelAndView来转发数据,给前端视图
ModelAndView mav = new ModelAndView();
//存储数据,将其传递给前端页面
mav.addObject("msg", "hello");
//设置转向地址
mav.setViewName("/WEB-INF/jsp/hello.jsp");
return mav;
}
}
访问地址 http://localhost:8080/Springmvc_01/hello.action
简析spring mvc 工作原理
(1 )启动服务器,根据web.xml 的配置加载前端控制器(也称总控制器) DispatcherServlet 。在加载时、会完成一系列的初始化动作。
(2 )根据servlet 的映射请求(上面的helloWorld 实例中针对.do 请求),并参照“控制器配置文件”(即spmvc-servlet.xml 这样的配置)文件,把具体的请求分发给特定的后端控制器进行处 理(比如上例会分发给HelloWorld 控制器进行处理)
(3 )后端控制器调用相应的逻辑层代码,完成处理并返回视图对象( ModelAndView )给前端处理器。
(4 )前端控制器根据后端控制器返回的 ModelAndView 对象,并结合一些配置(后面有说明),返回一个相应的页面给客户端。
小结 :这种Front Controller 模式常应用在主流的web 框架中,比如典型的struts1.x 框架.FrontController 模式:所有请求先交给一个前端处理器(总控处理器)处理,然后前端处理器会参照一些配置文件再把具体的请求交给相应的后端处理器。后端处理器调用逻辑层代码,并根据逻辑返回相应的视图对象给前端控制器。然后前端控制器再根据视图对象返回具体的页面给客户端(提示:和spring mvc一样,在struts1.x 中前端控制器是Servlet, 而在struts2 中前端控制器是Filter )。
概述 FrontController 模式:前端控制器预处理并分发请求给后端控制器,后端控制器进行真正的逻辑处理并返回视图对象,前端控器器根据视图对象返回具体页面给客户端。
初识spring mvc 的视图
在前面的HelloWorld 实例中,在HelloWorld.java 中返回 ModelAndView mav =new ModelAndView( ) 参数为hello 和 hello.jsp ,它会对应于当前项目根目录下的 hello.jsp 页面。但 spring mvc 为我们提供了一个特别的视图定位方式,下面改进前面的 HelloWord 实例:
改进一:在springmvc.xml中加入如下代码
改进二:在 HelloSpringMVC.java改成如下代码,只有一行代码
@RequestMapping("hello") //映射url请求路径
public ModelAndView hello(){
//利用ModelAndView来转发数据,给前端视图
ModelAndView mav = new ModelAndView();
//存储数据,将其传递给前端页面
mav.addObject("msg", "hello");
//设置转向地址
mav.setViewName("hello");
return mav;
}
简析视图定位 :当返回 ModelAndView 对象名称为hello 时,会给hello 加上前后缀变成/WEB-INF/page/hello.jsp 。因此在给前后缀赋值时,应特别注意它和返回的 ModelAndView 对象能否组成一个正确的文件全路径。
在前面的“简析spring mvc 工作原理(4) ”点中提到在根据ModelAndView 对象返回页面时,会结合一些配置。这里就是结合了视图定位方式,给viewName加上前后缀进行定位。
下面我们重点分析@RequestMapping ()。
RequestMapping注解有六个属性:value、 method、consumes,produces、consumes,produces
value: 指定请求的实际地址,指定的地址可以是URI Template 模式。在只有单个参数value默认不用写,在多个参数是就需要指定参数类型为value;
method: 指定请求的method类型,没有指定请求方式时,默认就是 GET、POST、PUT、DELETE等。限定请求方式 @RequestMapping(value="login",method={RequestMethod.GET, RequestMethod.POST});
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params: 指定request中必须包含某些参数值是,才让该方法处理;
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
类级别的基路径请求
通过为方法配置请求路径来进行访问,而下面我们将为类配置一个请求实例,这种类似于struts2中package-namespace。代码如下
@Controller
@RequestMapping("/user")
public class HelloSpringMVC {
@RequestMapping(value="hello") //映射url请求路径
public String hello(Model model){
//存储数据,将其传递给前端页面
model.addAttribute("msg", "hello");
return "hello";
}
访问地址 http://localhost:8080/Springmvc_01/user/hello.action
简述ModelAndView、ModelMap、Model三者的区别和联系
@RequestMapping(value="hello") //映射url请求路径
public String hello(ModelMap model){
//存储数据,将其传递给前端页面
model.addAttribute("msg", "hello");
return "hello";
}
@RequestMapping(value="hello") //映射url请求路径
public String hello(Model model){
//存储数据,将其传递给前端页面
model.addAttribute("msg", "hello");
return "hello";
}
Model :是包含四个addAttribute 和一个 merAttribute方法的接口,ModelMap :实现了Map接口,包含Map方法。视图层通过request找到ModelMap中的数据。
ModelMap是Model的实现类,在api上没有太大区别,都不需要new直接放在方法的参数中,通过return的值去找页面。可以理解为它们是一样的。
ModelAndView:是包含ModelMap 和视图对象的容器。正如名字暗示的一样既包含模型也包含视图,而ModelMap只是包含模型的信息。
简述@requestparam和@pathvariable
@RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,而 @PathVariable 是从一个URI模板里面来填充
来看请求路径 http://localhost:8080/Springmvc_01/user/hello/100.action?name=zs&password=123
@RequestMapping(value="hello/{id}")
public String hello(Model model, @PathVariable Integer id,
@RequestParam String name, @RequestParam(value="password",required=true,defaultValue="1") String password){
//存储数据,将其传递给前端页面
model.addAttribute("msg", "hello");
System.out.println(id); //值为 100
System.out.println(name); //值为 zs
System.out.println(password); //值为 123
return "hello";
}
@RequestParam 支持下面四种参数
defaultValue 如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值
name 绑定本次参数的名称,要跟URL上面的一样
required 这个参数是不是必须的
value 跟name一样的作用,是name属性的一个别名
先简单说下请求路径和请求参数 http://localhost:8080/Springmvc_01/user/hello/100.action? name=zs&password=123
请求路径: 问号前面的就是请求路径 如 http://localhost:8080/Springmvc_01/user/hello/100.action 代码如下
@RequestMapping(value="hello/{id}")
public String hello(Model model, @PathVariable Integer id)
请求参数: 而请求参数就是问号后面的 如 name=zs&password=123 代码如下,标红部分
@RequestMapping(value="hello/{id}")
public String hello(Model model, @PathVariable Integer id,
@RequestParam String name, @RequestParam(value="password",required=true,defaultValue="1") String password)