学习目标:
1、介绍SpringMVC框架
2、能够实现SpringMVC的环境搭建
3、能够说出入门案例的执行过程
4、说出入门案例中涉及的SpringMVC常用组件
5、掌握RequestMapping的使用
6、掌握SpringMVC的参数绑定
7、掌握SpringMVC的自定义类型转换器的使用
8、掌握SpringMVC的常用注解
学习内容:SpringMVC基本概念三层架构与mvc
什么是mvc
m :model 实体类, 封装数据
v: view 视图(html||jsp)
c: controller 控制器 servlet
mvc开发模式是用于web层一套开发模式
SpringMVC入门(一)创建项目、添加依赖、配置web.xml
步骤:
1.创建web项目,导入依赖(spring-webmvc)
2.配置web.xml,配置核心前端控制器(DispathcerServlet)
1.依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
2.配置web.xml,配置核心前端控制器(DispathcerServlet
<!--2.配置核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc核心配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--在类路径下加载springmvc的配置文件-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--目前这种配置DispatcherServlet对象是第一个用户访问的时候才会创建的。创建DispatcherServlet对象的时候-->
<!--才会加载springmvc配置文件,目前存在问题:第一个用户体验差,速度慢。
目标: 让tomcat服务器一旦启动,马上创建DispatcherServlet对象。
解决方案: 添加<load-on-startup>标签,数字越小越先创建,负数无效。
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置核心控制器的请求路径-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3.配置springMVC.xml
<!--1. 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀名-->
<property name="prefix" value="/"/>
<!--配置后缀名-->
<property name="suffix" value=".jsp"/>
</bean>
<!--2. 开启注解扫描 基包扫描-->
<context:component-scan base-package="com.itheima.controller"/>
<!--3. 开启注解驱动 目前即使没有这一步也不会报错,但是等会要学习类型转换器需要使用-->
<mvc:annotation-driven/>
4.编写控制器
/*
注意: 如果一个普通的Java类需要变成控制器,需要添加@Controller注解
*/
@Controller
public class HelloController {
// @RquestMapping配置方法的映射路径 相当于servlet的里面url-pattern
@RequestMapping("/hello")
public String hello(){
System.out.println("hello方法被调用了");
return "success"; //返回值代表了视图的名称,视图解析器会为该返回值添加前缀名与后缀名。 /pages/success.jsp
}
}
SpringMVC三大组件
1)处理器映射器: HandlerMapping (RequestMapingHandlerMapping)
- 找到对应的方法
2)处理器适配器:HandlerAdapter (RequestMappingHandlerAdapter)
- 执行对应的方法
3)视图解析器:ViewResolver ( InternalResourceViewResolver )
@RequestMapping注解使用
请求参数绑定(一)简单类型作为参数
//注意: 提交的参数如果需要接收,只需要在形参上声明即可,springmvc会自动帮助你封装
//注意2: 如果使用基本数据类型形参有几个,那么浏览器就必须传递几个参数, 如果使用包装类型,那么传递的参数个数可以与形参不匹配。
//注意3: 参数名字必须与形参的名字要一致,否则没法封装
@RequestMapping("/save")
public String save(Integer id,String name){
System.out.println("获取id :"+ id +" 姓名:"+ name);
return "success";
}
请求参数绑定(二)bean类型作为参数
1.编写user.jsp页面,提供表单传递参数
<form action="/user/update.do" method="get">
用户名:<input type="text" name="userName"/><br/>
年龄:<input type="text" name="age"/><br/>
地址:<input type="text" name="address"/><br/>
<input type="submit" value="提交"/>
</form>
2.实体类
public class User {
private String userName;
private Integer age;
private String address;
3.测试方法
//测试: 提交的参数会自动封装到对象,前提:提交的请求参数必须与对象属性名一致。
@RequestMapping("/update")
public String update(User user){
System.out.println("接收用户对象:"+user);
return "success";
}
成员方法有集合变量:
private String userName;
private Integer age;
private List<Address> list; //存在多个地址
jsp代码:
<form action="/user/update.do" method="get">
用户名:<input type="text" name="userName"/><br/>
年龄:<input type="text" name="age"/><br/>
省份1:<input type="text" name="list[0].province"/><br/>
城市1:<input type="text" name="list[0].city"/><br/>
省份2:<input type="text" name="list[1].province"/><br/>
城市2:<input type="text" name="list[1].city"/><br/>
<input type="submit" value="提交"/>
</form>
测试类:
//测试: 提交的参数会自动封装到对象,前提:提交的请求参数必须与对象属性名一致。
@RequestMapping("/update")
public String update(User user){
System.out.println("接收用户对象:"+user);
return "success";
}
请求参数绑定自定义类型转换器
在项目中需要通过前端传递日期类型到后台,但是mvc无法将字符串自动转为date类型。
这时我们可以通过自定义类型转换器实现将参数转换成想要的类型。
步骤:
自定义一个类实现Converter接口(自定义的转换器)
2.需要把自定义类型的转换器存储到类型转换器的工厂中,到时候如果再遇到该类型的时候,springmvc会自动从工厂中取出转换器帮你去转换。
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
//source是传过来的日期字符串,转为指定类型的date类型对象
date = dateFormat.parse(source);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
在springMVC.xml配置类型转换器
<!--2. 创建自定义类型转换器的对象,并且交给spring容器。-->
<bean id="converter" class="com.itheima.utils.StringToDateConverter"/>
<!--3. 把自定义类型转换器对象注册到类型转换器的工厂-->
<bean id="conversionFactory" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!--converters注册类型转换器,由于该属性是set集合类型,所以需要使用<set>标签-->
<property name="converters">
<set>
<ref bean="converter"/>
</set>
</property>
</bean>
<!--4. 交给注解驱动启动类型转换器的工厂-->
<!--3. 开启注解驱动 目前即使没有这一步也不会报错,但是等会要学习类型转换器需要使用-->
<mvc:annotation-driven conversion-service="conversionFactory"/>