Spring-MVC

简介: Spring-MVC

单例模式

   1.什么是单例? 系统运行期间有且仅有一个实例。

   2.为什么要有单例?系统中的一些对象只需要初始化一次即可,例如:KTV中的播放器或者初始化系统参数。

   3.单例模式的要求:

       *【1】一个类只有一个实例

               只提供私有的构造器。

private SingletonClass(){
    }

       【2】必须自己创建这个实例

               定义该类的静态私有对象。

private static SingletonClass single;

       【3】必须自己向系统提供这个实例。

               创建一个公共的静态方法,返回这个实例。

public static SingletonClass getSingleton(){
        if(single==null){
            initSingleton();
        }
        return single;
    }

4.饿汉模式:不管你用不用我都给你创建这个实例。(官方语言:在类加载的时候创建这个实例)。

           天然线程安全的,每个类中获取这个对象的耗时基本一样

   

   5.懒汉模式:在你调用的时候才创建这个实例。不是线程安全,第一次获取此对象会耗时较多。

   6.下面是饿汉模式,使用静态内部类实现延迟加载。

public class SingleTon {
     private SingleTon() {
     }
     private static SingleTon singleTon;
        // 静态内部类
     public static class SingletonHelper{
          private static final SingleTon INSTANCE = new  SingleTon();
     }
     public static SingleTon getSingleTon() {
          singleTon = SingletonHelper.INSTANCE;
          return singleTon;
     }
}

 

 线程安全:饿汉式天生就是线程安全的,懒汉式本身是非线程安全的。

   资源加载和性能:饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。

SpringMVC中静态资源(js,图片,css)的加载。

<mvc:resources location="/static/"  mapping="/staticabc/**"/>

SpringMVC中的转发和重定向(redirect)

SpringMVC中使用ServletAPI。

springMVC的异常处理:

   局部异常处理。只能作用于单个controller。

@ExceptionHandler(value=RuntimeException.class)
     public String error() {
          return "error";
     }

全局异常处理。作用于整个springMVC.

<!-- 全局异常处理 -->  
 <bean  class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
     <property name="exceptionMappings">
          <props>
               <prop key="java.lang.RuntimeException">error</prop>
          </props>
     </property>         
 </bean>

在web项目启动中加载spring的上下文,中文乱码问题。在web.xml中配置:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-*.xml</param-value>
  </context-param>
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <filter>
    <filter-name>encodingFilter</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>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

解决视图到控制层的date类型的转换问题。

    @DateTimeFormat(pattern = "yyyy-MM-dd")  //String转换Date,视图到控制层
    @JSONField(format = "yyyy-MM-dd")  //自定义时间戳转换格式
    private Date birthday;

解决ajax请求的返回值问题。原理:直接将数据写入到响应体中。

@ResponseBody

解决视图层到控制层的中文乱码问题,加入过滤器解决。

<filter>
    <filter-name>encodingFilter</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>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

解决ajax请求返回值的乱码和统一设置日期类型转换的问题。控制层到视图层

<mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                       <!-- Date的日期转换器 -->
                      <value>WriteDateUseDateFormat</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>

拦截器

应用场景

1、日志记录,可以记录请求信息的日志,以便进行信息监控、信息统计等。

2、权限检查:如登录检测,进入处理器检测是否登录,如果没有直接返回到登录页面。

3、性能监控:典型的是慢日志

public class SysInterceptor implements  HandlerInterceptor{
     /**
     * 预处理回调方法,实现处理器的预处理(如检查登陆),第三个参数为响应的处理器,自定义Controller
     * 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
     */
     @Override
     public boolean preHandle(HttpServletRequest request,  HttpServletResponse response, Object handler)
              throws Exception {
          // TODO Auto-generated method stub
          return false;
     }
     /**
     * 后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
   */
     @Override
     public void postHandle(HttpServletRequest request,  HttpServletResponse response, Object handler,
              ModelAndView modelAndView) throws Exception  {
          // TODO Auto-generated method stub
     }
     /**
     * 整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中
     */
     @Override
     public void afterCompletion(HttpServletRequest  request, HttpServletResponse response, Object handler,  Exception ex)
              throws Exception {
          // TODO Auto-generated method stub
     }
}
<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/hello/**"/>
            <mvc:exclude-mapping path="/hello/hello04"/><!--不在拦截范围内-->
            <bean class="com.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>


相关文章
|
7月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
2月前
|
JSON 前端开发 Java
Spring MVC详解(上)
本文介绍了MVC架构及其在Spring MVC框架中的应用。MVC将应用程序分为模型、视图和控制器三部分,分别负责数据处理、用户界面展示和请求处理。Spring MVC作为MVC模式的具体实现,不仅是一个web框架,还提供了强大的功能支持,如URL路由映射、参数传递、JSON数据处理、文件上传等。文章详细讲解了如何在Spring MVC中使用`@RequestMapping`、`@RequestParam`、`@RequestBody`、`@PathVariable`等注解来处理HTTP请求,并展示了具体的代码示例和操作步骤。
63 1
|
5月前
|
前端开发 Java 应用服务中间件
我以为我对Spring MVC很了解,直到我遇到了...
所有人都知道Spring MVC是是开发的,却鲜有人知道Spring MVC的理论基础来自于1978 年提出MVC模式的一个老头子,他就是Trygve Mikkjel Heyerdahl Reenskaug,挪威计算机科学家,名誉教授。Trygve Reenskaug的MVC架构思想早期用于图形用户界面(GUI) 的软件设计,他对MVC是这样解释的。MVC 被认为是解决用户控制大型复杂数据集问题的通用解决方案。最困难的部分是为不同的架构组件想出好的名字。模型-视图-编辑器是第一个。
133 1
我以为我对Spring MVC很了解,直到我遇到了...
|
7月前
|
存储 前端开发 Java
Spring MVC
Spring MVC
50 2
|
7月前
|
设计模式 前端开发 Java
初识Spring MVC
初识Spring MVC
38 0
|
JSON 前端开发 搜索推荐
“一锅端“ Spring MVC 常见使用大全(下)
“一锅端“ Spring MVC 常见使用大全(下)
|
7月前
|
前端开发 安全 Java
什么是Spring MVC?它解决了什么问题?
Spring框架就像一个家族,有众多衍生产品例如boot、security、jpa等等。但他们的基础都是Spring的ioc和aop。ioc提供了依赖注入的容器,aop解决了面向横切面的编程;然后在此二者的基础上实现了其他延伸产品的高级功能。
116 0
|
设计模式 前端开发 Java
spring MVC
spring MVC
43 0
|
JSON 前端开发 Java
Spring MVC详解
Spring MVC详解
|
JSON 前端开发 数据可视化
Spring MVC(上)
Spring MVC(上)