SpringMVC知识点整理

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>

猜你喜欢

转载自blog.csdn.net/coding_doge/article/details/112310730