1.SpringMVC概述
1.1 SpringMVC的历史
SpringMVC 它可以称为一个解决 JavaEE 开发的 B/S 架构项目的表现层的 MVC 的框架。其实在 SpringFramework项目中只是一个子模块而已,最开始在SpringFramework项目中没有SpringMVC子模块,在一段时间里慢慢发展起来解决表现层业务逻辑的时候,才有了Springmvc 这样的子模块是在 SpringFramework项目中基于(AOP IOC 为基础发展起来的),Springmvc 模块应该依赖 ioc 以及 aop。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。
1.2. Springmvc是什么?
Springmvc 也是一个类似于struts2框架的基于MVC 设计模式的表现层框架
1.2.1JAVAEE 开发应用采用经典的三层架构
- 表现层:完成跟客户端进行数据交互的, 处理数据以及模型跳转的。
- 业务逻辑层:完成数据针对需求进行数据加工作处理
- 数据访问层(持久层): 完成对数据的持久化到数据库提供操作对象
1.2.2 MVC 设计模式 没在Java 23种设计模式中
- Model(模型):数据模型(POJO)以及业务模型(Service层中)
- View(视图):模型渲染、填充模型数据用 Jsp 、 pdf 、freemarker
- Controller(控制器):Filter、Servlet作为中央控制器
2. SpringMVC 第一个程序
2.1 pom 文件配置 (导包)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xingxue.springmvc</groupId>
<artifactId>springmvc-demo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<!-- 导入 springmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<!-- 导入 servlet 相关依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- 最小支持的 编译版本 -->
<target>1.7</target>
<!-- 1.7 编译源码 -->
<source>1.7</source>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2 配置 web.xml (应用的描述文件),服务器启动的时候,要去读
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!--
mvc 框架 都有两种控制器:
1.前端控制器 (框架提供) StrutsPrepareAndExectuteFilter (Filter ) 、 DispatcherServlet (Servlet)
2.页面控制器(程序员自己定义) UserAction、RoleAction...... 、 UserController、RoleController
(Action Contoller Handler)
Filter vs Servlet 区别:
相同点:都可以处理http 请求:
Filter : public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
Servlet:public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
不同点:Filter 功能要比 Servlet 强大。 FilterChain chain 实现请求预处理
-->
<servlet>
<!-- DispatcherServlet 组件在init 初始化的时候,会去读取 mvc 配置文件 -->
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<!-- Servlet 组件创建的时候是在第一次请求来的时候才会创建,配上下面可以使 Servlet 组件在应用启动的时候就被创建 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<!-- Tomcat 有一个 rg.apache.catalina.servlets.DefaultServlet 默认拦截 / ,可以处理静态数据(html css js...)
DispatcherServlet 前端控制器 配置上 / 也就覆盖了DefaultServlet
如果不配,就使用不了Spring mvc 提供的 restFul 风格的网络资源架构
restFul :不是一种技术实现,它是一种网络资源架构规则
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.3 开发 Controller 控制器
//页面控制器
@Controller
public class UserController {
@RequestMapping(value="/hello")
public String hello() {
System.out.println("请求来了...");
return "ok";
}
}
2.4 mvc.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
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-4.0.xsd">
<!-- 静态资源处理 -->
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.xingxue"></context:component-scan>
<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>
3. @RequestMapping 请求映射注解
- 该注解用于映射请求 是通过 该注解的 value 属性来映射。
- 该注解可以修饰在类上,也可以修饰在方法上:如果修饰在类上会自动在每个方法的url路径上加上类上的前缀
- 该注解可以使用 method 属性来映射 请求方式
- 该注解可以使用params 属性来映射 请求携带的参数
总结 : RequestMapping 注解中的 value 属性用来映射 url,method属性用于映射请求方式,params 属性用于 映射 请求携带的参数
4.Springmvc 处理请求流程
1.页面发出请求到 dispatcherServlet中央控制器进行处理
2.中央控制器调用 处理器映射器 HandelMapping 查询 Handel
3.处理器映射处理完毕后,返回Handel 以及 HandelExcutionChain(拦截器链)
4.中央控制器调用 处理器适配器 执行Handle
5.处理适配器调用真正的Handel执行
6.Handle执行完毕后,返回ModelAndView
7.处理器适配器ModelAndView返回给中央控制器
8.中央控制器调用视图解析器查询具体的View
9.视图解析器返回真正的View 地址
10.中央控制器调用View 执行 数据模型的 渲染
11.响应请求
总结:
- 玩 springmvc 要配置好 一中心(dispatcherServlet) 三器(HandelMapping、 HandelApater 、 ViewResoler)但是一中心要在web.xml 文件配置 、 三器没有特殊需求的时候可以不配,三器在springmvc 配置文件中配置,但是视图解析器要显示去配置一下(原因视图的位置将来不确定)
- 为什么三器不用配置:前端控制器dispatcherServlet 在创建完成后会自动加载dispatcherServlet.properties 文件,在该文件中就已经配置了相应的三器的实现,如果在springmvc.xml 配置文件中显示的配置了默认的三器,就会覆盖默认的配置
- 程序员:只需要编写View Handel
5.@RequestParam映射请求参数
该注解用于映射请求参数
该注解中的value 属性 用于匹配http 请求过来的参数的名字
该注解中的required 属性用于限定请求是否必须携带参数,默认是true
注解中的defaultValue 属性用于没有携带请求参数的时候,给方法变量赋默认值
可以利用 Controller 动作类方法的签名的方式来获取请求参数值,保证页面参数的名称要跟方法中的形参名称一致,如果方法形参为POJO 类型,要保证页面参数的名称要跟方法中形参POJO中的属性名称一致,满足以上规则可以接收页面数据
处理页面数据中文乱码问题
在 web.xml 应用描述文件中配置
<!-- 引入spring 提供的 POST 提交方式的中文乱码过滤器 :注意一点 提供的 中文乱码过滤器只能处理 POST -->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- RestFul风格的模板URL 携带参数方式:方便后期做网站的SEO优化
获取模板参数使用 @PathVariable
@RequestMapping(value="m4/{id}",method=RequestMethod.GET)
public String m4 (@PathVariable(value="id") String id) {
System.out.println(id);
return "ok";
}
- forward指令和redirect指令
forward指令:可以实现视图的转发以及动作的转发
redirect 指令:可以实现视图的重定向以及动作的重定向
指令的格式:
forward:/xxx.jsp
redirect :/xxx.jsp
如果Handler 方法执行完毕后返回的字符串带有forward 或者redirect ,视图解析器就会另外处理,不会在返回的字符串前后加前缀和后缀
6.Springmvc 提供的隐式对象
- 隐式对象:不需要程序员自己创建的对象,springmvc 自动会创建的对象。拿来就使用
- 框架提供的隐式对象:ModelAndView 、 Model 、 ModelMap 、 Map ,HttpServletRequest、HttpServletResponse等对象可以把数据放入到模型中,自动的放入到请求域中
扩展:
框架还可以自动注入 HttpSession 、 HttpServletRequest 、 HttpServletResponse 等
- 利用 框架提供的 隐式对象来完成数据向页面传递