一、什么是SpringMVC?
(一)是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。
(二)Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。
(三)采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
二、那什么是MVC呢?
MVC(Model-View-Controller,模型-视图-控制器)指把页面、后台的交付分成3层来组成,是一种解决页面代码(视图代码)和后台代码分离的设计思想!!
➢ 模型:指封装数据的数据模型
➢ 视图:指的是页面
➢ 控制器:指接收页面发送数据过来的类
三、为什么要学习SpringMVC ?
首先,可能有人会问我们已经学习了Servlet/JSP了。为什么还要学习SpringMVC呢 ?接下来我们分析一下:
(一)servlet的缺点
①数据类型转化,因为http协议传输的和web容器解析后的都是文本类型,那如果遇到货币、日期之类的,我们就需要大量的转化,繁琐易错。
② servlet只有doGet和doPost,一个servlet类只能处理一个url-pattern。
(二)springMVC的好处
➢ 一个请求对一个方法
➢ 自动支持上传组件,支持各种视图解析器
➢ 自动支持JSON的转成
➢ 支持数据的自动封装
四、SpringMVC能干什么?
- 天生与Spring框架集成,如:(IOC,AOP)
- 支持Restful风格
- 进行更简洁的Web层开发
- 支持灵活的URL到页面控制器的映射
- 非常容易与其他视图技术集成,如:Velocity、FreeMarker等等
- 因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)
- 非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的API
- 更加简单、强大的异常处理
- 对静态资源的支持
- 支持灵活的本地化、主题等解析
五、SpringMVC怎么玩?
(1)入门案例
①创建maven的web项目,导入开发的坐标(spring-context,spring-web,spring-webmvc,servlet-api,jsp-api)
②编写index.jsp主页面和suc.jsp成功页面
③编写controller类(控制器类),方法就可执行
@Controller
public class HolleController {
@RequestMapping("hello.do")
public String say(){
System.out.println("方法执行成功....");
return "suc";
}
}
④在web.xml中配置前端控制器
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springMVC.xml配置文件,配置的是spring的配置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--配置启动加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
⑤编写springMVC.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="cn.tx.demo"/>
<!--视图解析器-->
<bean id="resourceView" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--跳转页面的路径-->
<property name="prefix" value="/WEB-INF/"/>
<!--跳转页面的后缀名称-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
⑥启动Tomcat测试
(2)RequestMapping注解
RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
RequestMapping注解可以作用在方法和类上
作用在类上:第一级的访问目录
作用在方法上:第二级的访问目录
细节:路径可以不编写 / 表示应用的根目录开始
RequestMapping的属性
①path :指定请求路径的url; ② value: value属性和path属性是一样的;
③mthod: 指定该方法的请求方式; ④ params: 指定限制请求参数的条件;
六、请求参数的绑定
①绑定机制
1、表单提交的数据都是k=v格式的 username=haha&password=123;
2、SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的;
3、要求:提交表单的name和参数的名称是相同的
;
②支持的数据类型
1、基本数据类型和字符串类型;2、实体类型(JavaBean);3、集合数据类型(List、map集合等);4、基本数据类型和字符串类型;5、如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name;
③给集合属性数据封装:JSP页面编写方式:list[0].属性
(一)请求参数中文乱码的解决
在web.xml中配置过滤器
<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>
(二)自定义类型转换器(解决日期问题)
①第一种方式使用DateTimeFormat注解的方式
直接在要转换格式的日期属性上加注解
例如:@DateTimeFormat(pattern = “yyyy-MM-dd”)
②第二种方式,自定义类型转换器。如果想自定义数据类型转换,可以实现Converter的接口
//自定义类型转换器 把String转换成Date
public class StringToDate implements Converter<String,Date> {
public Date convert(String s) {
/*进行数据类型转换的方法*/
if(s == null){
throw new RuntimeException("请输入内容");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ss");
try {
//进行转换
return sdf.parse(s);
} catch (ParseException e) {
//抛出运行异常
throw new RuntimeException(e);
}
}
}
springMVC.xml中注解
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="自定义类型转换器路径"/>
</set>
</property>
</bean>
<!--让映射器、适配器和处理器生效(默认不配置也是可以的)-->
<mvc:annotation-driven conversion-service="conversionService" />
七、常用注解
(一)RequestParam注解
作用:把请求中的指定名称的参数传递给控制器中的形参赋值
属性:value:请求参数中的名称;
required:请求参数中是否必须提供此参数,默认值是true,必须提供;
defaultValue:如果没有传请求参数,使用默认值;
(二)RequestBody注解
作用:用于获取请求体的内容(注意:get方法不可以)
属性:required:是否必须有请求体,默认值是true;
(三)PathVaribale注解
作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符;
属性:value:指定url中的占位符名称;
Restful风格的URL:请求路径一样,可以根据不同的请求方式去执行后台的不同方法;
restful风格的URL优点:结构清晰、符合标准、易于理解、扩展方便;
①编写新的controller
@Controller
public class EmpController {
@RequestMapping(path = "/emp",method = RequestMethod.POST)
public String save(){
System.out.println("保存数据....");
return "suc";
}
@RequestMapping(path = "/emp",method = RequestMethod.GET)
public String findAll(){
System.out.println("查询数据....");
return "suc";
}
@RequestMapping(path = "/emp/{id}",method = RequestMethod.GET)
public String findById(@PathVariable(value = "id")Integer id){
System.out.println("通过id查询员工...."+id);
return "suc";
}
}
②修改前端控制器的配置文件
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
(四)RequestHeader注解
作用:获取指定请求头的值;
属性:value:请求头的名称;
@RequestMapping("/save3.do")
public String save3(@RequestHeader(value = "Accept") String header){
System.out.println("Accept请求头的值:"+header);
return "suc";
}
(五)CookieValue注解
作用:用于获取指定cookie的名称的值;
属性:value:cookie的名称
@RequestMapping("/save4.do")
public String save4(@CookieValue(value = "JSESSIONID") String cookie){
System.out.println("值:"+cookie);
return "suc";
}