- 什么是springMVC?
Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、
轻量级Web框架。S springmvc S struts2 视图层,控制层
S spring S spring 中间层,业务层
M mybatis H hibernate 持久层
自定义mvc
请求--->中央控制器---->找到对应的Action类---->
action实例化----->反射调用方法 ------>拿到结果,返回视图
ssm/userAction.action?methodName=login&username=zs&password=123
UserAction中的属性
User user = new User();
private String username;
springmvc
请求---->中央控制器---->找到对应的映射方法---->赋值 调用方法 ------>拿到结果,返回视图
ssm/user/login?uname=zs
@RequestMapping('/user/login')
public String login(String uname){ ...... return 'index' }
springmvc的工作原理
- SpringMVC处理请求的流程
2.1 首先用户发送请求-->DispatherServlet
2.2 DispatcherServlet-->HandlerMapping Controller
2.3 DispatcherServlet-->HandlerAdapter
2.4 HandlerAdapter-->处理器功能处理方法的调用 参数赋值
2.5 ModelAndView的逻辑视图名-->ViewRecolver
2.6 View-->渲染
2.7 返回控制权给DispatcherServlet,由DispatcherServlet返回呼应给用户,流程结束 - SpringMVC核心开发步骤
3.1 DispatcherServlet在web.xml中的部署描述,从而拦截请求到springMVC
3.2 HandlerMapping的配置,从而将请求映射到处理器 @RequestMapping()
3.3 HandlerAdapter的配置,从而支持多种类型的处理器
3.4 处理器(页面控制器)的配置,从而进行功能处理
@Controller
3.5 ViewResolver的配置,从而将逻辑视图名解析为具体的视图技术
- SpringMVC的组件
4.1 前端控制器(DispatcherServlet)
4.2 请求到处理器映射(HandlerMapping)
4.3 处理器适配器(HandlerAdapter)
4.4 视图解析器(ViewResolver)
4.5 处理器或页面控制器(Controller)
4.6 验证器(Validator)
4.6 命令对象(Command 请求参数绑定到的对象就叫命令对象)
4.7 表单对象(Form Object提供给表单展示和提交到的对象就叫表单对象) 如何在项目中添加springmvc
5.1 添加相关依赖<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- ********************** JSTL依赖 ********************** --> <!-- 缺少下面的这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config--> <!-- 原因:org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包--> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
5.2 在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml)
5.3 修改web.xml
- 第一个springMVC程序:HelloWorld
- 页面跳转
7.1 转发:"forward:path"
7.2 重定向:"redirect:path"
注1:这两种跳转方式将会绕开视图解析器的前缀和后缀
注2:还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。 - 访问其它的静态资源(被springmvc拦截了)
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/><mvc:resources location="/static/" mapping="/static/**" cache-period="86400" />
SpringMVC会自动给静态资源Response添加缓存头Cache-Control和Expires值 常用注解
9.1 @Controller:用于标识处理器类@RestController注解相当于@ResponseBody + @Controller合在一起的作用
9.2 @RequestMapping:请求到处理器功能方法的映射规则,可定义到类和方法
常用参数:value、method 可将@RequestMapping标签定义到类名处窄化路径
9.3 @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定
常用参数:value、required、defaultValue 注:required设置成false的参数类型必须是引用类型,因为基本数据类型是不能为null的
9.4 @ModelAttribute:请求参数到命令对象的绑定
常用参数:value
9.4.1 可用@ModelAttribute标注方法参数,方法参数会被添加到Model对象中(作用:向视图层传数据)
9.4.2 可用@ModelAttribute标注一个非请求处理方法,此方法会在每次调用请求处理方法前被调用(作用:数据初始化)
9.4.3 可用@ModelAttribute标注方法,方法返回值会被添加到Model对象中(作用:向视图层传数据)但此方法视图的逻辑图就会根据请求路径解析,例如:a/test42 --> /WEB-INF/a/test42.jsp 太麻烦几乎不用,不用直接保存到Model或ModelAndView中
9.5 @SessionAttributes:指定ModelMap中的哪些属性需要转存到session
常用参数:value、types 注1:必须放到class类名处
9.6 @InitBinder(自学):用于将请求参数转换到命令对象属性的对应类型
例如:日期格式到后台的数据转换 birthday=2000年10月10日 --> java.util.Date birthday;
9.7 @RequestBody(重要
~):用于目前比较流行的ajax开发的数据绑定(即提交数据的类型为json格式)注1:使用@RequestBody注解的时候,前台的Content-Type必须要改为application/json, 如果没有更改,前台会报错415(Unsupported Media Type)。 后台日志就会报错Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported。 这些错误Eclipse下Tomcat是不会显示错误信息的,只有使用了日志才会显示 $.ajax({ url : "jsontest", type : "POST", async : true, contentType : "application/json", data : JSON.stringify(json), dataType : 'json', success : function(data) { if (data.userstatus === "success") { $("#errorMsg").remove(); } else { if ($("#errorMsg").length <= 0) { $("form[name=loginForm]").append(errorMsg); } } } });
9.8 @ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
注1:@RestController @RestController=@Controller+@ResponseBody
9.9 其它
@CookieValue cookie数据到处理器功能处理方法的方法参数上的绑定 @RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定 @RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换); @ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因; @ExceptionHandler:注解式声明异常处理器; @PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定, @PostConstruct或@PreDestroy:初始化方法/销毁方法
请求处理方法的参数及返回值
10.1请求处理方法的参数HttpServletRequest/ServletRequest HttpServletResponse/HttpServletResponse HttpSession Model/ModelAndView/ModelMap/Map WebRequest/NativeWebRequest Locale InputStream/Reader OutputStream/Writer Principal HttpEntiry<?> RedirectAttributes Errors BindingResult SessionStatus UriComponentsBuilder 带@PathVariable,@MatrixVariable注释的对象 @RequestParam,@RequestHeader,@RequestBody,@RequestPart 特别重要的是:org.springframework.ui.Model类型,每次调用请求处理方法时,SpringMVC都创建Model对象并将 其注入到各种对象
10.2返回值的类型
ModelAndView String(代表一个逻辑视图名) void Map View Callable DeferredResult 其它任意类型,spring将其视作输出给View的对象模型
- springmvc配置一个首页
附录一:spring常用注解
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Aspect//切面
@Pointcut//定义需要切面的地方,表达式参数(https://blog.csdn.net/elim168/article/details/78150438)
@annotation//当执行的方法上拥有指定的注解时生效。
@After
@Before
@Around
附录二:Ant 风格路径表达式
ANT通配符有三种:
? 匹配任何单字符
- 匹配0或者任意数量的字符
** 匹配0或者更多的目录
“add” /WEB-INF/jsp/add.jsp
struts2和springMVC的区别:
1、springmvc入口是一个servlet前端控制器( DispatcherServlet ),struts2入口是一个filter过滤器(StrutsPrepareAndExecuteFilter).
2、struts2通过在action类中定义成员变量接收参数,(属性驱动和模型驱动),它只能使用多例模式管理action.
springmvc通过在controller方法中定义形参接收参数,springmvc可以使用单例模式管理controller.
3、springmvc是基于方法开发的,注解开发中使用requestMapping将url和方法进行 映射,如果根据url找到controller类的方法生成一个handler处理器对象(只包括一个method).
struts2是基于类开发的,每个请求过来创建一个action实例,实例对象中有若干个方法.
开发中建议使用springmvc,springmvc方法更类似service业务方法.
4、struts2采用值栈存储请求和相应的数据,通过OGNL存取数据;springmvc通过参数绑定期将request请求内容解析,并给方法形参赋值.
5、struts2和springmvc的速度是相当的,由于struts2的漏洞较多,更多企业使用springmvc
6、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。
7、设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。
8、拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。