使用注解的形式进行SpringMVC 的配置:
-
SpringMVC请求响应所经过的步骤:
- 请求离开浏览器时 ,会带有用户所请求内容的信息,至少会包含请求的URL。但是还可能带有其他的信息(例如用户提交的表单)
- DispatcherServlet的任务是将请求发送给Spring MVC控制器 (controller)
- 控制器是一个用于处理请求的Spring组件 DispatcherServlet以会查询一个或多个处理器映射(handler mapping)。处理器映射会根据请求所携带的URL信息来进行决策 一旦选择了合适的控制器,DispatcherServlet会将请求发送给选中的控制器
- 控制器在完成逻辑处理后,通常会产生一些信息,这些信息需要返回 给用户并在浏览器上显示。这些信息被称为模型(model)最后就是将模型数据打包,并且标示出用于渲染 输出的视图名
- DispatcherServlet将会使用视图解析器(view resolver) 来将逻辑视图名匹配为一个特定的视图实现
- 最后就是视图的实现 和 响应
-
使用Java类进行SpringMVC
DispatcherSerlvet
的配置:(需要注意就是这种方式需要的是Servlet3.0以上的版本)public class Config extends AbstractAnnotationConfigDispatcherServletInitializer { /** * 为DispatcherServlet指定servlet 映射.映射的是"/", * (其实就相当于<servlet-mapping>的子元素<url-pattern>用于指定应用于Servlet的URL路径) */ @Override protected String[] getServletMappings() { return new String[] { "/" }; } /** * RootConfig配置类加载的是驱动应用后端的中间层和数据层组件,是父上下文 */ @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { RootConfig.class }; } /** * WebConfig配置类中主要是内容是启用组件扫描,配置视图解析器,配置静态资源的处理。 其实就是使用配置在WebConfig配置类中的bean */ @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { WebConfig.class }; } }
实际上,
AbstractAnnotationConfigDispatcherServletInitializer
会同时创建DispatcherServle
t和ContextLoaderListener
。GetServlet-ConfigClasses()
方法返回的带有@Configuration
注解的类将会用来定义DispatcherServlet
应用上下文中的 beangetRootConfigClasses()
方法返回的带 有@Configuration
注解的类将会用来配 置ContextLoaderListener
创建的应用上下文中的bean 这种方式是传统方式的代替方式 -
视图解析器的配置详解:
- 没有配置视图解析器。如果这样的话,Spring默认会使 用BeanNameView-Resolver,这个视图解析器会查找ID与视 图名称匹配的bean,并且查找的bean要实现View接口,它以这样 的方式来解析视图
- Java类进行视图解析器的配置:
@Configuration @ComponentScan("com.itheima")//开启组件扫描 @EnableWebMvc// 启用SpringMvc public class WebConfig extends WebMvcConfigurerAdapter { @Bean public ViewResolver viewResolver(){ InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/pages/"); resolver.setSuffix(".jsp"); resolver.setExposeContextBeansAsAttributes(true); // 支持JSTL resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class); resolver.setExposeContextBeansAsAttributes(true); return resolver; } }
- Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现:常用的就是三种
视图解析器 描述 InternalResourceViewResolver 将视图解析为Web应用的内部资源(一般为 JSP)(最常用的) FreeMarkerViewResolver 将视图解析为FreeMarker模板(能解析Html后缀) BeanNameViewResolver 将视图解析为Spring应用上下文中的bean,其中 bean的ID与视图的名字相同 (不配置使用的默认的) - 配置Thymeleaf视图解析器:
- 为了要在Spring中使用Thymeleaf,我们需要配置三个启用Thymeleaf与 Spring集成的bean:
- ThymeleafViewResolver:将逻辑视图名称解析为Thymeleaf 模板视图
- SpringTemplateEngine:处理模板并渲染结果在·
- TemplateResolver:加载Thymeleaf模板
- 使用Java代码的方式,配置Spring对Thymeleaf的支持
- 为了要在Spring中使用Thymeleaf,我们需要配置三个启用Thymeleaf与 Spring集成的bean:
-
进行控制器的编写:
@Controller @RequestMapping("/") public class HelloController { @RequestMapping(method = RequestMethod.GET) public String hello(){ return "hello"; } }
配置InternalResourceViewResolver的方式,视图 名“hello”将会解析为“/WEB-INF/views/hello.jsp”路径的JSP
-
表单校验使用的注解:
需要导入的包:
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency>
注解 描述 @AssertFalse 所注解的元素必须是Boolean类型,并且值为false @AssertTrue 所注解的元素必须是Boolean类型,并且值为true @DecimalMax 所注解的元素必须是数字,并且它的值要小于或等于给定的 BigDecimalString值 @DecimalMin 所注解的元素必须是数字,并且它的值要大于或等于给定的 BigDecimalString值 @Digits 所注解的元素必须是数字,并且它的值必须有指定的位数 @Future 所注解的元素的值必须是一个将来的日期 @Max 所注解的元素必须是数字,并且它的值要小于或等于给定的值 @Min 所注解的元素必须是数字,并且它的值要大于或等于给定的值 @NotNull 所注解元素的值必须不能为null @Null 所注解元素的值必须为null @Past 所注解的元素的值必须是一个已过去的日期 @Pattern 所注解的元素的值必须匹配给定的正则表达式 @Size 所注解的元素的值必须是String、集合或数组,并且它的长度要符 合给定的范围 注意在使用这些等注解时,一定要和@valid一起使用,不然@NotBlank不起作用
public class HualalaRegistVO { @NotBlank @Pattern(regexp = "^\\d{11}$", message = "手机号码格式错误") String phoneNumber; //手机号码 @NotBlank String name; //姓名 @NotBlank String loanBody;//借款主体 @NotBlank String loanBodyId;//借款主体ID @NotNull BigDecimal borrowAmount;//借款金额 @NotNull BigDecimal turnover;//月营业额 @NotNull BigDecimal profit; //月利润 @NotBlank String usage;//用途 @NotBlank(groups = {A.clss}) String groupID;//集团ID String source = ""; //来源 String code; //验证码(更换手机号码时使用) String ipAddress; //ip地址 }
-
参数校验的方式:
- 第一种方式就是使用if进行判断:这样的方式是最简单的也是最容易想到的 但是对于属性比较多的时候非常的麻烦 都是重复的代码 (pass)
- 使用Spring框架中的注解的形式 方便的提供参数校验的工作
在对象的入口处 使用@Valid注解 历来对传入的参数进行验证:
- 这样的方式也是比较的繁琐 最终的方式就是使用异常拦截器进行参数的校验:
- 第一种方式就是使用if进行判断:这样的方式是最简单的也是最容易想到的 但是对于属性比较多的时候非常的麻烦 都是重复的代码 (pass)
-
各组件配置总结:
-
配置核心的控制器也就是
DispatcherServlet
,并使Spring容器在TOMCAT初始化时创建.在工程的webapp/WEB_INF
目录下配置web.xml
和 处理编码的过滤器:characterEncodingFilter
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--配置过滤器使用的是filter标签 注意的是filter标签在Servlet标签的之前用来设置字符集--> <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> <!-- SpringMVC的核心控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 配置servlet启动时加载对象 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
视图解析器配置:
<!--配置视图的解析器--> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--表示文件所在的目录 (前缀)--> <property name="prefix" value="/WEB-INF/pages/" ></property> <!--文件的后缀名是什么 (后缀)--> <property name="suffix" value=".jsp"></property> </bean>
-
前端控制器(控制静态资源)
<!-- location属性必须是一个有效的目录,因此必须以 / 结尾 --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/js/" mapping="/js/**"/>
-
文件解析器:
<!-- 配置文件解析器,其id是固定的,必须为multipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置文件的最大尺寸 --> <property name="maxUploadSize" value="10485760"/> </bean>
-
异常处理器:
<!--配置异常处理器--> <bean id="myExceptionResolver" class="cn.maoritian.exception.MyExceptionResolver"/>
-
异常拦截器:
<mvc:interceptors> <mvc:interceptor> <!-- 拦截的方法 --> <mvc:mapping path="/**" /> <!-- 具体的拦截器 --> <bean id="officeHoursInterceptor" class="com.itheiam.interceptor.TimeBasedAccessInterceptor"> <property name="openingTime" value="9"/> <property name="closingTime" value="18"/> </bean> </mvc:interceptor> </mvc:interceptors>
-
自定义类型转换器:
<!--配置自定义类型转换器 使用的标签是bean标签 属性是id 和 class属性--> <bean id="dateConverter" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <!--将自定义的类型转换器注册到set中 第三步将转换器生效--> <bean class="com.itheima.utils.StringToDateConverter"></bean> </set> </property> </bean>
-