SpringMVC
SpringMVC简介
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
SpringMVC四大核心组件
DispatcherServlet : 前端控制器,接收所有请求—核心控制器!
HandlerMapping: 解析请求格式的.判断希望要执行哪个具体的方法.
HandlerAdapter: 负责调用具体的方法.
ViewResovler:视图解析器.解析结果,准备跳转到具体的物理视图
SpringMVC运行原理
SpringMVC VS Struts2
为了证明SpringMVC比Struts2更棒,我们来举行一场擂台!首先有请双方选手入场!
①Struts2
Struts1之后横空出世,以优雅的模型驱动、灵活可插拔的拦截器栈机制配合值栈可以极大的简化表述层开发过程,不论是内部实现还是使用体验都完虐Struts1!
②SpringMVC
SpringMVC是Spring为表述层提供的基于MVC理念的优秀的Web框架,是目前主流的MVC框架之一。Spring3.0后,SpringMVC全面超越Struts2,成为最优秀的MVC框架。SpringMVC环境下请求映射通过一系列MVC注解实现,简单灵活,真正实现了零配置。支持REST风格的URL请求。采用了松散耦合可插拔组件结构,更具扩展性和灵活性。
通过策略接口,Spring框架是高度可配置的,而且包含多种视图技术。SpringMVC框架并不知道使用的视图,所以不会强迫您只使用JSP技术。Spring MVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
③比赛开始!
Struts2 |
SpringMVC |
得分[Struts2/SpringMVC] |
|
模型驱动 |
很经典 |
毫不逊色,且更简洁 |
0/1 |
性能 |
值栈和Action对内存消耗很大 |
请求处理器类单例,效率高 |
0/100 |
核心 |
Filter |
Servlet |
0/0 |
和Spring的兼容性 |
需要使用插件 |
天然支持 |
0/30 |
获取Web资源 |
不能通过Action方法直接获取 |
可以通过handler方法直接获取 |
0/1 |
获取HTTP信息 |
不能通过Action方法直接获取 |
可以通过handler方法直接获取 |
0/1 |
转发 |
配置chain结果类型 |
直接返回forward:/emps |
0/1 |
重定向 |
配置redirect结果类型 |
直接返回redirect:/empList |
0/1 |
REST风格开发 |
不支持 |
天然支持 |
0/50 |
Ajax |
很繁琐 |
很简洁 |
0/1 |
页面开发效率 |
Struts2标签结合OGNL表达式爽翻天 |
仅包含一组表单标签,其他方面需使用JSTL |
1/0 |
Excel |
不支持 |
天然支持 |
0/1 |
拦截器 |
可插拔 |
可插拔 |
1/1 |
总分 |
2/188 |
综合比较之下,SpringMVC相对于Struts2的优势是压倒性的,结论:完虐秒杀!
Spring 和 SpringMVC 的关系
在HttpServletBean类中找到init()方法。在该方法中有一个 initServletBean(); 找到实现类FrameworkServlet 类中的实现方法
环境搭建创建工程导入jar包Jar包在01资料中lib文件夹
配置核心控制器Web.xml 中配置
在src目录下创建springmvc.xml配置文件
编写控制器
添加页面测试: |
||||
返回页面时的返回值类型ModelAndView
后台存储数据,可以通过EL表达式在页面获取数据! Springmvc的转发重定向在 该类UrlBasedViewResolver中有相应的转发,重定向。 Redirect:重定向
Forward:转发 默认
SpringMVC静态资源过滤静态资源:css,js,img等 |
||||
SpringMVC接收参数对象传值创建实体类
在WEB-INF/views目录下创建页面login.jsp
编写控制器
测试结果 |
||||
注意点:实体类中的属性名称,必须保存跟页面的name属性一致! 使用@RequestParam注解页面login.jsp
控制器
结果: 注意:@RequestParam 注解中有几个参数 Value:页面传递过来的参数名称 DefaultValue :表示默认值 Required:参数是否必须,不过次参数没有什么作用,通常不用写。 如果页面传递的参数与方法中传入的参数名称一样!则可以直接拿到! |
Restful风格的传值方式
页面default.jsp
<body> <h1>首页!</h1> <a href="/springmvc01/testA">testA</a> <a href="/springmvc01/testB">testB</a> <a href="/springmvc01/testC">testC</a> </body> |
控制器 @RequestMapping("login") public String login(String username,String password){ System.out.println(username + "\t" + password); return"hello"; } |
@PathVariable(value="path")
如果说@PathVariable(value="path")后续的变量 String xxx 跟@RequestMapping("{path}")一致。则value 属性可以省略!
如果是多层路径
<a href="/springmvc01/path/testA">testA</a> <a href="/springmvc01/path/testB">testB</a> <a href="/springmvc01/path/testC">testC</a> |
@RequestMapping("/path/{url}") public String path(@PathVariable("url") String url){ System.out.println(url); return"hello"; } |