三层架构
-
表现层:负责数据展示
-
业务层:负责业务处理
-
数据层:负责数据操作
-
MVC(Model View Controller),一种用于设计创建Web应用程序表现层的模式
-
入门案例制作
①导入SpringMVC相关坐标
-
<!-- servlet3.1规范的坐标 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--jsp坐标--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <!--spring的坐标--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!--spring web的坐标--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!--springmvc的坐标--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.9.RELEASE</version> </dependency>
②定义表现层业务处理器Controller,并配置成spring的bean(等同于Servlet)
-
@Controller public class UserController { public void save(){ System.out.println("user mvc controller is running ..."); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--扫描加载所有的控制类类--> <context:component-scan base-package="com.itheima"/> </beans>
③web.xml中配置SpringMVC核心控制器,用于将请求转发到对应的具体业务处理器Controller中(等同于Servlet配置)
-
<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*:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
④设定具体Controller的访问路径(等同于Servlet在web.xml中的配置)
-
//设定当前方法的访问映射地址 @RequestMapping("/save") public void save(){ System.out.println("user mvc controller is running ..."); }
⑤设置返回页面
-
//设定当前方法的访问映射地址 @RequestMapping("/save") //设置当前方法返回值类型为String,用于指定请求完成后跳转的页面 public String save(){ System.out.println("user mvc controller is running ..."); //设定具体跳转的页面 return "success.jsp"; }
入门案例工作流程分析
-
服务器启动
-
加载web.xml中DispatcherServlet
-
读取spring-mvc.xml中的配置,加载所有com.itheima包中所有标记为bean的类
-
读取bean中方法上方标注@RequestMapping的内容
-
-
处理请求
-
DispatcherServlet配置拦截所有请求 /
-
使用请求路径与所有加载的@RequestMapping的内容进行比对
-
执行对应的方法
-
根据方法的返回值在webapp目录中查找对应的页面并展示
使用注解形式转化SpringMVC核心配置文件为配置类
-
@Configuration @ComponentScan(value = "com.itheima",includeFilters = @ComponentScan.Filter(type=FilterType.ANNOTATION,classes = {Controller.class}) ) public class SpringMVCConfiguration implements WebMvcConfigurer{ //注解配置放行指定资源格式 // @Override // public void addResourceHandlers(ResourceHandlerRegistry registry) { // registry.addResourceHandler("/img/**").addResourceLocations("/img/"); // registry.addResourceHandler("/js/**").addResourceLocations("/js/"); // registry.addResourceHandler("/css/**").addResourceLocations("/css/"); // } //注解配置通用放行资源的格式 @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable();; } }
基于servlet3.0规范,自定义Servlet容器初始化配置类,加载SpringMVC核心配置类
-
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { //创建Servlet容器时,使用注解的方式加载SPRINGMVC配置类中的信息,并加载成WEB专用的 //ApplicationContext对象 //该对象放入了ServletContext范围,后期在整个WEB容器中可以随时获取调用 @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMVCConfiguration.class); return ctx; } //注解配置映射地址方式,服务于SpringMVC的核心控制器DispatcherServlet @Override protected String[] getServletMappings() { return new String[]{"/"}; } @Override protected WebApplicationContext createRootApplicationContext() { return null; } //乱码处理作为过滤器,在servlet容器启动时进行配置,相关内容参看Servlet零配置相关课程 @Override public void onStartup(ServletContext servletContext) throws ServletException { super.onStartup(servletContext); CharacterEncodingFilter cef = new CharacterEncodingFilter(); cef.setEncoding("UTF-8"); FilterRegistration.Dynamic registration = servletContext.addFilter("characterEncodingFilter", cef); registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE),false,"/*"); } }
-
删除spring-mvc.xml
-
删除web.xml
POJO类型参数传参
-
@RequestMapping("/requestParam4") public String requestParam4(User user,String age){ System.out.println("user.age="+user.getAge()+",age="+age); return "page.jsp"; }
类型转换器
SpringMVC对接收的数据进行自动类型转换,该工作通过Converter接口实现
-
日期类型格式转换
-
声明自定义的转换格式并覆盖系统转换格式
-
<!--5.启用自定义Converter--> <mvc:annotation-driven conversion-service="conversionService"/> <!--1.设定格式类型Converter,注册为Bean,受SpringMVC管理--> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <!--2.自定义Converter格式类型设定,该设定使用的是同类型覆盖的思想--> <property name="formatters"> <!--3.使用set保障相同类型的转换器仅保留一个,避免冲突--> <set> <!--4.设置具体的格式类型--> <bean class="org.springframework.format.datetime.DateFormatter"> <!--5.类型规则--> <property name="pattern" value="yyyy-MM-dd"/> </bean> </set> </property> </bean>
自定义类型转换器
-
自定义类型转换器,实现Converter接口,并制定转换前与转换后的类型
-
<!--1.将自定义Converter注册为Bean,受SpringMVC管理--> <bean id="myDateConverter" class="com.itheima.converter.MyDateConverter"/> <!--2.设定自定义Converter服务bean--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!--3.注入所有的自定义Converter,该设定使用的是同类型覆盖的思想--> <property name="converters"> <!--4.set保障同类型转换器仅保留一个,去重规则以Converter<S,T>的泛型为准--> <set> <!--5.具体的类型转换器--> <ref bean="myDateConverter"/> </set> </property> </bean>
//自定义类型转换器,实现Converter接口,接口中指定的泛型即为最终作用的条件 //本例中的泛型填写的是String,Date,最终出现字符串转日期时,该类型转换器生效 public class MyDateConverter implements Converter<String, Date> { //重写接口的抽象方法,参数由泛型决定 public Date convert(String source) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; //类型转换器无法预计使用过程中出现的异常,因此必须在类型转换器内部捕获,不允许抛出,框架无法预计此类异常如何处理 try { date = df.parse(source); } catch (ParseException e) { e.printStackTrace(); } return date; } }
通过注册自定义转换器,将该功能加入到SpringMVC的转换服务ConverterService中
-
<!--开启注解驱动,加载自定义格式化转换器对应的类型转换服务--> <mvc:annotation-driven conversion-service="conversionService"/>
-