什么是mvc?
Model 模型(模型的定义【pojo】、模型的实现【dao、service】)
View 视图 (html/jsp/freemarker)
Controller 控制器 (servlet/filter /springmvc提供的controller/struts2提供的action
mvc是一种设计模式。表现层用到的设计思想。
SpringMVC
1)SpringMVC就是基于MVC设计模型的表现层(Web)框架
2)SpringMVC已经完全超越Struts2
3)使用了SpringMVC可以编写简单Java类作为控制器(代替Servlet)
SpringMVC功能:
1)接收参数(封装参数数据)
2)调用业务层
3)把数据存入域对象 或 转换为json
4)跳转页面(转发和重定向)
SpringMVC 入门程序
1.创建web项目,导入依赖(spring-webmvc)
2.配置web.xml,配置核心前端控制器(DispathcerServlet)
<?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_2_5.xsd"
version="2.5">
<!-- SpringMVC的核心前端控制器 -->
<!--
DispatcherServlet: 核心前端控制器
url-pattern: 配置该控制器拦截的路径 例如: *.do ,接收页面以.do结尾的请求
http://localhost:8080/hello.do
contextConfigLocation参数:读取springMVC的核心配置
classpath:springMVC.xml: 读取项目的类路径下springMVC.xml文件
load-on-startup: 把Servlet的创建从第一次访问改为项目加载(Tomcat启动)
-->
<servlet>
<servlet-name>dispatcherServlet</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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3.编写控制器
package com.huihui.controller.a_hello;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 控制器(Handler)
* 1.作用:
* 1)接收请求
* 2)处理响应
*
* 2.要求
* 2.1 控制器必须交给SpringIOC容器管理 , 加上@Controller注解
* 2.2 在控制器提供请求处理方法,在方法上声明接收什么样的请求 (@RequestMapping)
*/
@Controller
public class HelloController {
/**
* 请求路径: http://localhost:8080/hello.do
* 响应地址: /pages/success.jsp
* 把响应地址进行拆解:
* 1)前缀:/pages/
* 2)页面名称:success
* 3)后缀:.jsp
*
* @return 只需要返回页面名称即可
*/
@RequestMapping("/hello.do")
public String hello(){
System.out.println("进入了HelloController控制器...");
return "success";
}
}
4.配置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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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">
<!-- 1.扫描控制器所在的包 -->
<context:component-scan base-package="com.huihui.controller"/>
<!-- 2. 配置视图解析器: 把页面名称解析成完整的页面地址(加前缀,加后缀) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/pages/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 3.配置SpringMVC注解驱动
注意:必须导入mvc结尾的配置
-->
<mvc:annotation-driven/>
</beans>
5.Tomcat部署测试
三大组件
1)处理器映射器: HandlerMapping (在流程第11步)
作用:根据用户访问路径匹配控制器的方法(找方法)
可以选择使用XML或注解方式来映射方法,通常推荐使用注解@RequestMapping
2)处理器适配器:HandlerAdatper (在流程第12步)
作用:执行控制器的方法(执行方法)
3)视图解析器:ViewResolver (在流程第14步)
作用:把页面名称解析为完整的访问地址(解析页面)
面试题: 请说出SpringMVC的执行流程?
1)SpringMVC执行流程中涉及三大组件:
分别为:
处理器映射器
处理器适配器
视图解析器
2)当前用户发出请求时,请求先交给DispathcerServlet前端控制器执行,
DispathcerServlet会交给doDispathch方法处理
doDispathch方法里面分别有三行核心代码:
1)处理器映射器匹配控制器的方法: getHandler
2)处理器适配器执行上面找到的方法:handle
3)上面执行方法会返回页面名称,通过视图解析器解析为完整页面地址,然后转发页面:
processDispatchResult
自定义类型转换器
有时我们需要从前端传递日期类型到后端,但是SpringMVC无法转换字符串为Date日期类型。这时我们可以通过自定义类型转换器,实现把请求参数值转换为指定的类型。
定义类型转换器
package com.huihui.controller.utils;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日期类型转换器(字符串->日期)
* 泛型一:源类型
* 泛型二:目标类型
*/
public class StringToDateConverter implements Converter<String,Date>{
//编写转换的代码
/**
*
* @param s: 页面传递的字符串
* @return
*/
@Override
public Date convert(String s) {
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(s);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
在springMvc配置类型转换
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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">
<!-- 1.扫描控制器所在的包 -->
<context:component-scan base-package="com.huihui.controller"/>
<!-- 2. 配置视图解析器: 把页面名称解析成完整的页面地址(加前缀,加后缀) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/pages/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 3.配置SpringMVC注解驱动
注意:必须导入mvc结尾的配置
-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 创建处理器映射器 -->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>-->
<!-- 创建处理器适配器 -->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>-->
<!-- 创建类型转换器 -->
<bean id="stringToDateConverter" class="com.huihui.controller.utils.StringToDateConverter"/>
<!-- 配置自定义类型转换器 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 创建项目定义所有类型转换器 -->
<property name="converters">
<set>
<ref bean="stringToDateConverter"/>
</set>
</property>
</bean>
</beans>
请求参数绑定(四)@RequestParam实现参数绑定
需求
当请求参数名称与方法形参不一致时候,如何封装请求数据?
@RequestParam
- 应用场景:当请求参数名称与方法形参不一致时候使用
- 建立请求参数与方法形参的映射关系
// @RequestParam的使用
/**
* 1.位置问题
* 放在参数上
* 2.属性问题
* value: 页面传递的参数名称
* required: 是否必须传递这个参数
* true:必须传递(默认值)
* false:不是必须
* default: 默认值
* 只有在不传递这个参数的情况下才使用默认值
* 应用场景:在分页的时候,页面传递pageNum,pageSize,查询第一页的时候往往不传递pageNum,pageSize参数,这时给pageNum,pageSize设置默认值
*/
@RequestMapping("/find")
public String find(@RequestParam(value ="username",required = false,defaultValue = "jack") String name){
System.out.println(name);
return "success";
}