Springmvc优势:
1. 组件型框架,所有的组件基于角色划分,非常清晰 分工明确
1. 前段控制器(DispatherServlet)
2. 请求处理器(HadlerMapping)
3. 处理器适配器(HadlerAdapter)
4. 视图解析器(ViewResolver)
5. 页面控制器(Controller)
6. 验证器(Vaildator)
2. 可以和spring无缝集成
3. 功能强大 数据验证 格式化 参数绑定
4. 强大的JSP标签库...
SpringMVC和Struts2框架的对比
* 共同点:
1. 都是基于MVC模型编写的表现层框架
2. 底层都是原始的ServletAPI
3. 处理请求的机制都是一个核心的控制器
* 区别:
1. Spring mvc 核心本质是一个Servlet Struts2核心是Filter
2. Spring mvc 基于方法的,struts2是基于类的 --> Spring mvc执行效率比struts高
3. struts2的OGNL表达式页面开发效率比spring mvc高, 但执行效率没哟JSTL表达式执行效率高
spring mvc 入门案例
- 步骤
- 创建一个maven项目,将其部署到本地tomcat服务器中,添加相关坐标依赖
<spring.version>5.0.2.RELEASE</spring.version>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
```
2. 在web.xml中配置核心的控制器 DispatcherServlet
```xml
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--在服务器启动时,加载springmvc.xml文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup> <!--当服务器启动时加载控制器-->
</servlet>
```
3. 在resources目录创建一个springmvc.xml文件,定义以下信息:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="com.huike"/>
<!--视图解析器对象 用于寻找返回页面-->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--手动开启spring mvc 框架注解的支持-->
<mvc:annotation-driven/>
</beans>
```
4. 新建一个index.jsp页面和success.jsp页面以及HelloController,编写以下代码:
1. index.jsp
```html
<a href="hello">入门程序,点我试试...</a>
```
2. success.jsp 在WEB-INF/pages/目录下
```html
<h3>入门案例运行成功了...</h3>
```
3. HelloController
```java
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello(){
System.out.println("执行了hello方法...");
return "success";
}
}
```
5.运行服务器即可.
5.运行服务器即可.
## RequestMapping详解:
1. 作用:用于建立请求URL和处理请求方法之间的对应关系
2. 源码
* @Target({ElementType.METHOD, ElementType.TYPE}):代表该注解既可以定义在方法上,也可以定义在类|接口上
* 定义在类上:代表一级目录
* 定义在方法上:代表二级目录
* 例如 请求路径 为 /account/add 此时 account 代表一级目录 add代表二级目录
* 作用:使项目模块化,可以方便的进行模块化管理
* path 指定请求路径的url value value属性和path属性是一样的
* method():用于指定请求的方式
* params:用于指定限制请求参数的条件.它支持一个简单的表达式.要求请求参数的key和value必须和配置的一模一样
* params = "username" 代表我的请求参数中必须有一个叫username的参数
* params = "username=123" 代表我的请求参数中必须有一个叫username的参数 并且值必须为123
* params = {"username=123","pwd=123456"} 代表我的请求参数中必须有一个叫username的参数 并且值必须为123 还必须有一个叫pwd的参 数值必须为123456
* headers:用于指定限制请求消息头的条件
## 请求参数绑定:
1. 支持的数据类型:
1. 基本类型(基本数据类型和String)
* 保证传递参数的key值和方法中的形参的名字保持一致即可
2. POJO(实体类对象 JavaBean)
1. 定义一个表单 如何将表单中的数据封装成一个对象的属性并且传递给Controller
* Account username password money
* 保证表单中每一个input输入框中的name值必须和方法参数对象中的属性值一致即可
2. 对象中含有另一个对象的引用 怎么处理 Account对象中有一个User属性 User对象
* 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name
3. 数组和集合类型(Array List Map)
* List和Map作为对象的属性存在,在表单请求参数的名称必须和JavaBean中的属性名称相同
* 给List集合中的元素赋值 需要使用下标 eg: list[0].uname;
* 给Map集合中的元素赋值 需要使用键值对 eg: map['one'].uname;
* 存在的问题:
1. 类型转换问题
* 我们前段页面jsp 传递的参数 都是字符串类型 但是后台javaBean的某些属性却是其它数据类型的 比如 double money int age
* 我们的springmvc可以实现一些数据类型的自动转换 有内置的转换器
* 内置转换器有以下几种
* Boolean--->String objectToStringConverter
* Character-->Number
* Character-->String
* Enum-->String
* String-->Enum 等等
* 如何自定义类型转换器
* 自定义字符串转日期 类型转换器
* 步骤:
1. 定义一个类 实现Converter接口 public interface Converter<S, T>
S:表示接收的参数类型 T:表示要转换的目标类型
2. 在重写的convert方法中写业务逻辑代码
3. 需要配置该类为类型转换器 需要在springmvc.xml中加入以下代码:
```xml
<!--配置自定义类型转换器-->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.huike.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!--手动开启spring mvc 框架注解的支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
- 中文乱码问题:
- 可以通过在web.xml中配置过滤器解决 CharacterEncodingFilter
<!--配置 解决中文乱码的过滤器 注意标签顺序问题-->
<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>
- 绑定机制
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
- 要求:提交表单的name和参数的名称是相同的
常用注解:
-
RequetParam:把请求中指定名称的参数给控制器中的形参赋值
- @Target({ElementType.PARAMETER}) 只能作用于参数
- 属性值:
- name(value):如果只有该属性 名字可以省略 请求参数中的名称
- required:请求参数中是否必须提供此参数. 默认值:true 表示必须提供,如果不提供则报错
-
RequestBody注解
- 作用:用于获取请求体的内容(注意:get方法不可以)
- 属性:required:是否必须有请求体,默认值是true
- 注意:required的取值默认为true 当为true时,get请求会直接报错;如果取值为false,get请求不会报错但参数为null;
-
PathVariable注解
- 用于绑定url中的占位符 例如: /delete/{id} 这个{id}为占位符
- 属性:
- value:用于指定url占位符的名称
- required:是否必须提供占位符