SpringMVC知识点整理
date:2021/1/7
1.什么是MVC?
Model View Controller的首字母缩写,他代表的是一种用于设计创建web应用程序表现层的模式。
model 模型用于封装数据,相当于Bean类。
View 视图 用于更好,更直观的展示数据。
Controller 控制器 用于接收用户的交互,通过这种独立的调度器来控制数据与视图,实现处理逻辑。
2.SpringMVC是什么?
是基于java实现mvc模型的轻量级web框架,
特点是更加灵活。
3.SpringMVC的基本实现?
通过配置DispatchServlet来拦截全部请求,然后再根据注解如@RequestMapping 来内部分发,通过这种分发器模式直接将请求的地址与方法连接,简化代码。本质上是通过内置分发器实现的。
4.SpringMVC的核心结构?
控制器对象:用controller标注的控制器类,用来实际实现业务逻辑,这是我们实际操作的部分。
前端控制器:DispatcherSerlvet类,拦截一切请求并进行分发,同时接收返回的值进行渲染输出。
处理器映射器:HandlerMapping类,用于扫描,查询代码的映射关系
视图处理器:ViewResolver 将处理器返回的视图“串”解析成视图对象
5.SpringMVC的加载控制是什么?
指在MVC的配置加载过程中,设定不进行加载的内容,以此来减轻系统负担。
主要实现手段是<context:exclude-filter >子标签和<context:include-filter >
6.SpringMVC如何实现资源放行?
在配置文件中开启mvc命名空间,然后进行如下配置:
<mvc:resources mapping="/img/**" location="/img/"/>
其中mapping是对应请求的路径,支持通配、location对应实际路径。
<mvc:default-servlet-handler/ >
放行所有资源
7.SpringMVC内置字符过滤如何配置?
SpringMVC封装了字符过滤器,可以直接调用,所需配置如下:
<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>
8.注解开发SpringMVC所需注解配置?
@Configuration
@ComponentScan(value = "com.location",includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class))
//对指定资源放行
public class SpringMVCconfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/img/**").addResourceLocations("/img/");
}
//对资源自动放行
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
9.SpringMVC的请求参数类型?
普通类型:
直接写入配置了注解的方法参数即可,注意名字和类型应对应。
//普通参数直接写入方法参数
public String save(String name,int num){
System.out.println(name+num);
//设定具体跳转的页面
return "success.jsp";
}
//也可以用@RequestParam绑定形式参数
public String save(@RequestParam(name="userName",required=true,defaultValue="itheima")String name,int num){
System.out.println(name+num);
//设定具体跳转的页面
return "success.jsp";
}
POJO引用类型:
如果后台方法的形式参数是一个实体类,请求携带的属性会自动填入同名的成员属性,从而创建一个实体类。
如果实体类中有引用类型的成员变量,可以用 XXX.XX为形参,可以将实体类中的引用值正确注入。
如果实体类中有集合类型的变量,可以通过并列的参数进行注入,如:xxx=a&xxx=b&xxx=c.
如果实体类中有Map类型的变量,可以用XXX[‘key’].xxx作为参数进行注入。
如果名称冲突,比如实体类成员变量的名字和另一参数名称相同,dispather分配器会将两个变量都进行赋值,导致它们被注入同样的名字。
数组类型:
集合类型:
10.SpringMVC自动属性填充的实现原理?
通过自动类型转换器:Converter接口的实现类来实现,SpringMVC预先封装了多种类型转换器,由请求携带的参数和Servlet的形参进行匹配,选择具体的转换器并进行匹配。
通常由ObjectToObjectConverter默认转换器实现。
11.如何修改自动类型转换?
<!--声明指定自定义驱动-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!--配置一个bean类,为其内部注入要修改的转换器-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<!--配置实际转换器-->
<bean class="org.springframework.format.datetime.DateFormatter">
<property name="pattern" value="yyyy-MM-dd"/>
</bean>
</set>
</property>
</bean>
或进行简易标注
public String save(@DateTimeFormat(pattern = "YYYY-MM-dd") Date date){
System.out.println(date);}
12.如何自定义类型转换器?
首先,写一个Converter的实现类,实现Converter抽象方法。
//通过方法将类型转换完成
public class MyConverter implements Converter<String ,Integer> {
@Override
public Integer convert(String s) {
Integer i;
try {
i = Integer.parseInt(s);
} catch (NumberFormatException e) {
i=null;
}
return i;
}
然后在配置中写入
<!--声明指定自定义驱动-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!--进行ConversionServiceFactoryBean映射-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.itheima.Converter.MyConverter"/>
</set>
</property>
</bean>
13.SpringMVC实现跳转页面的二种方式?
转发:将Controller方法的返回值设为jsp页面相对路径或forward:xxxx.jsp,就可以实现页面跳转,同时默认的跳转方式也是转发。
重定向:通过返回redirect:xxxx.jsp可以将跳转方式改为重定向。
转发和重定向的区别是是否为一个新的页面,决定了能否使用同一个页面域下的属性。
同时可以通过配置资源视图解析器简化路径
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/"/>
<property name="suffix" value=".jsp"/>
</bean>
14.带数据页面跳转的三种方式?
方法一:使用HttpServletRequest对象作为形参跳转
方法二:使用Model对象进行跳转
方法三:使用ModelAndView对象进行跳转
15.@ResponseBody注解的意义?
SpringMVC的映射方法默认返回值是一个跳转的路径,它会将页面进行转发到返回值,而加入了@ResponseBody注解以后,会将返回值识别为写入页面的内容流,实现流输入。
16.@返回json的三种方式?
第一种:在@ResponseBody注解后,直接returnJSON格式的数据。
第二种:配置自动转换器进行转换
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean
17.SpringMVC对servlet对象的封装?
为了实现和Servlet的隔离,同时简化操作,提供了Servlet对象的封装
消息头对象:@RequestHeader
@RequestMapping("/headerApi")
public String headApi(@RequestHeader("Accept-Encoding") String headMsg){
System.out.println(headMsg);
return "page";
}
session对象: @SessionAttribute
@RequestMapping("/sessionApi")
public String sessionApi(@SessionAttribute("name") String name,
@SessionAttribute("age") int age,
@SessionAttribute("gender") String gender){
System.out.println(name);
System.out.println(age);
System.out.println(gender);
return "page";
}
cookie对象:@CookieValue
@RequestMapping("/cookieApi")
public String cookieApi(@CookieValue("JSESSIONID") String jsessionid){
System.out.println(jsessionid);
return "page";
18.SpringMVC配置跨域访问?
加@CrossOrigin注解就可以了。
19.Interceptor 拦截器和Filter过滤器的区别?
intercept拦截器是属于SpringMVC的技术,他会在方法执行的前后进行运行,从而对数据进行预处理或日志处理等,他与Filter在功能上基本没有区别。
Filter是基于Servlet的技术,相对于intercept更加的底层,同时会针对所有的请求进行过滤,而intercept则只会对SpringMVC框架内的请求进行操作,实际上就相当于一个范围更小的过滤器。
20.如何配置Intercreptor拦截器?
<mvc:interceptors>
<mvc:interceptor>
<!--映射路径——支持通配符-->
<mvc:mapping path="/demo"></mvc:mapping>
<bean name="demoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
21.配置异常处理器的两种方法?
一、实现HandlerExceptionResolver接口
@Component
public class MyException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println(ex.getMessage());
ModelAndView view = new ModelAndView();
System.out.println("here is a exception");
view.addObject("errorMSG",ex.getMessage());
view.setViewName("error.jsp");
return view;
}
}
二、使用ExceptionHandler注解
@Component
@ControllerAdvice
public class MyException2 {
@ExceptionHandler(ArithmeticException.class)
public String doNullException(Exception ex){
System.out.println(ex.getMessage());
return "page.jsp";
}
}
这种方式配置的异常解析器会在controller运行之前就加载好,对于参数异常也能进行拦截,相比前者更实用。
22.web项目异常的常见处理方案?
- 业务异常BusinessException:
- 发送对应消息传递给用户,提醒规范操作
- 系统异常SystemException:
- 发送固定消息传递给用户,安抚用户
- 发送特定消息给运维人员,提醒维护
- 记录日志
- 其他异常OtherException:
- 发送固定消息传递给用户,安抚用户
- 发送特定消息给编程人员,提醒维护
- 纳入预期范围内
- 记录日志
23.SpringMVC上传文件?
SpringMVC集成了文件传输技术,使用MultipartResolver接口的实现类就可以实现上传功能。
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<!--在MVC配置Bean类-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"value="1024000000"></bean>
@Controller
public class FileUploadController {
@RequestMapping(value = "/fileupload")
//参数中定义MultipartFile参数,用于接收页面提交的type=file类型的表单,要求表单名称与参数名相同
public String fileupload(MultipartFile file, HttpServletRequest request) throws IOException {
file.transferTo(new File(file.getOriginalFilename()));
}
24.Restful风格?
Rest( REpresentational State Transfer) 一种网络资源的访问风格,定义了网络资源的访问方式
- 传统风格访问路径
http://localhost/user/get?id=1
http://localhost/deleteUser?id=1 - Rest风格访问路径
http://localhost/user/1 - 优点
隐藏资源的访问行为,通过地址无法得知做的是何种操作
书写简化
配置隐藏方法过滤器,然后在前端表单设置隐藏提交方法
<!--配置拦截器,解析请求中的参数_method,否则无法发起PUT请求与DELETE请求,配合页面表单使用-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>DispatcherServlet</servlet-name>
</filter-mapping>
<!--页面隐藏属性-->
<form action="/user/1" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit"/>
</form>
@RestController
public class UserController {
@RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
public String restDelete(@PathVariable String id){
System.out.println("restful is running ....delete:"+id);
return "success.jsp";
}
}
25.JSR是什么?
表单校验框架JSR(java specification requests)java 规范提案
26.SSM整合配置?
1.mybatis数据库
需要配置:
mysql的执行语句XML文件,用于保存具体语句;
<!--举个栗子-->
<mapper namespace="com.jiaxinger.dao.UserDao">
<insert id="save" parameterType="com.jiaxinger.domain.User">
insert into user (uuid,userName,password,realName,gender,birthday)values(#{uuid},#{userName},#{password},#{realName},#{gender},#{birthday})
</insert>
配置jdbc基本配置,用于连接数据库。
jdbc.username=root
jdbc.password=password
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.driver=com.mysql.jdbc.Driver
2.spring
需要配置:
1.spring applicationcontext核心配置:
开启component组件扫描,同时关闭对SpringMVC使用的controller控制层的的扫描。
<context:component-scan base-package="com.jiaxinger" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2.配置mybatis连接配置,装配mybatis:
配置SqlSessionFactoryBean,开始整合mybatis组件
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!--连接池-->
<property name="dataSource" ref="data"></property>
<!--自动命名-->
<property name="typeAliasesPackage" value="com.jiaxinger.domain"/>
</bean>
<!--读入jdbc基本配置-->
<context:property-placeholder location="classpath:jdbc.properties"/>
开启事务管理器,用于使用druid连接池
<!--开启驱动-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
<!--装配-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.jiaxinger.dao"/>
</bean>
配置druid数据连接池,用于管理会话进程。
<bean id="data" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
配置mapping映射扫描,实现接口和xml的映射。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.jiaxinger.dao"/>
</bean>
3.SpringMVC
需要配置:
1.SpringMVC核心配置:
开启注解扫描
<mvc:annotation-driven/>
<context:component-scan base-package="com.jiaxinger.controller"/>
2.在web配置中装配SpringMVC分发器
<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>
在web配置中设置监听器,获取Spring的context上下文对象
设置上下文参数,设定为可识别的名称加载到应用域中。
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>