SpringMVC
SpringMVC简介
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
SpringMVC四大核心组件
DispatcherServlet : 前端控制器,接收所有请求—核心控制器!
HandlerMapping: 解析请求格式的.判断希望要执行哪个具体的方法.
HandlerAdapter: 负责调用具体的方法.
ViewResovler:视图解析器.解析结果,准备跳转到具体的物理视图
SpringMVC运行原理
![](https://i-blog.csdnimg.cn/blog_migrate/c8bf160dc1fb478154a6b62792942405.png)
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 类中的实现方法
![](https://i-blog.csdnimg.cn/blog_migrate/318ae0d43890933e85053cd62159850f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ebd283d6b6888e9270cb88ab909d9afa.png)
环境搭建创建工程导入jar包Jar包在01资料中lib文件夹
commons-logging-1.1.3.jar spring-aop-4.1.6.RELEASE.jar spring-aspects-4.1.6.RELEASE.jar spring-beans-4.1.6.RELEASE.jar spring-context-4.1.6.RELEASE.jar spring-core-4.1.6.RELEASE.jar spring-expression-4.1.6.RELEASE.jar spring-jdbc-4.1.6.RELEASE.jar spring-tx-4.1.6.RELEASE.jar spring-web-4.1.6.RELEASE.jar spring-webmvc-4.1.6.RELEASE.jar |
配置核心控制器Web.xml 中配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>springmvc01</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 读取配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 初始化的时候加载这个Servlet,如果没有指定或者是负数的时候,则该容器在被选择的时候才被加载 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 此处表示拦截的请求 第一种: / 表示拦截所有请求 第二种: *.do 表示拦截以.do为结尾的请求 注意 /*是错误的拦截方式! --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 字符编码过滤器 --> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> |
在src目录下创建springmvc.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 扫描注解 --> <context:component-scan base-package="com.xypuxing.controller"></context:component-scan> <!-- 注解驱动 --> <!-- org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping --> <!-- org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置视图解析器前缀 --> <property name="prefix" value="/WEB-INF/views/"></property> <!-- 配置视图解析器后缀 --> <property name="suffix" value=".jsp"></property> </bean> </beans> |
编写控制器
package com.xypuxing.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; // 定义控制器 @Controller publicclass HelloController { // 映射的请求路径 @RequestMapping("hello") public String hello(){ // 返回的视图名称 return"hello"; } } |
添加页面![](https://i-blog.csdnimg.cn/blog_migrate/383df7e5154f888cded9764b31641d87.png)
测试:
![](https://i-blog.csdnimg.cn/blog_migrate/358fafcd47f157d56550590d5775213a.png)
|
返回页面时的返回值类型ModelAndView
@RequestMapping("view") public ModelAndView view(){ ModelAndView mv = new ModelAndView(); mv.addObject("name", "ModelAndView"); mv.setViewName("view"); returnmv; } |
后台存储数据,可以通过EL表达式在页面获取数据! Springmvc的转发重定向在 该类UrlBasedViewResolver中有相应的转发,重定向。 Redirect:重定向
@RequestMapping("test") public String test(){ // 返回的视图名称,注意路径问题,该index.jsp 应该在WebContent目录下 return"redirect:/index.jsp"; } |
Forward:转发 默认
// 映射的请求路径 @RequestMapping("hello") public String hello(){ // 转发到名称为view的controller return"forward:/view"; } |
SpringMVC静态资源过滤静态资源:css,js,img等
|
SpringMVC接收参数对象传值创建实体类
package com.xypuxing.pojo; publicclass Student { private Integer id; private String uname; private String pwd; } |
在WEB-INF/views目录下创建页面login.jsp
<body> <form action="login" method="post"> username:<input type="text" name="uname"/><br> pwd:<input type="password" name="pwd"/><br> <input type="submit" value="登录"/><br> </form> </body> |
编写控制器
@Controller publicclass UserController { // 当项目启动的时候,直接运行login.jsp页面 @RequestMapping("/") public String index(){ return"login"; } @RequestMapping("login") public String login(Student stu){ System.out.println(stu); return"hello"; } } |
测试结果![](https://i-blog.csdnimg.cn/blog_migrate/32957519408c6cadbb93018cff117078.png)
|
注意点:实体类中的属性名称,必须保存跟页面的name属性一致! 使用@RequestParam注解页面login.jsp
<form action="login" method="post"> username:<input type="text" name="username"/><br> pwd:<input type="password" name="password"/><br> <input type="submit" value="登录"/><br> </form> |
控制器
@RequestMapping("login") public String login(@RequestParam("username") String username,@RequestParam("password")String password){ System.out.println(username+"\t"+password); return"hello"; } |
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/9578867cde0b148ccfc22f7504ad6ba0.png)
注意:@RequestParam 注解中有几个参数 Value:页面传递过来的参数名称 DefaultValue :表示默认值 Required:参数是否必须,不过次参数没有什么作用,通常不用写。 如果页面传递的参数与方法中传入的参数名称一样!则可以直接拿到!
![](https://i-blog.csdnimg.cn/blog_migrate/5f5e4aed0954a3190f82ce2fefdc49f9.png)
|
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"; } |
感恩分享,感恩生活,感谢学习,互相成长。