springMVC

1.解决视图到控制层的data类型的转换问题

@DateTimeFormat(pattern="yyyy-MM-dd")

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

@ResponseBody

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

  <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>

4.解决ajax请求返回值的乱码和统一设置日期类型转换的问题。

<mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMedia">
                    <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="supportedMedia">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="featur">
                    <list>
                       <!-- Date的日期转换器 -->
                      <value>WriteDateUseDateFormat</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>

5.拦截器

应用的场景:

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

                      2.权限检查:比如登录时的检查,进入处理器检查是否登录,如果没有就直接

                                            返回到登录页面

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

public class Loginterceptor implements HandlerInterceptor {
     /**
     * 预处理回调方法,实现处理器的预处理(如检查登陆),第三个参数为响应的处理器,自定义Controller
     * 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
     */

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        //拦截规则,自己根据业务需求实现
        String username = request.getParameter("username");
        if(null==username ||"".equals(username)){
            response.sendRedirect("/index.jsp");
            return false;
        }
        return  true;
    }

     /**
     * 后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
   */

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle:handle执行完,渲染之前"+modelAndView.getViewName());
    }

    /**
     * 整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中
     */

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion:handle执行完,渲染之前");
    }
}

在resources中文件applicationContext.xml写

    <mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/hell/**"/>
			<mvc:exclude-mapping path="/hell/hell02"/>
			<bean class="com.interceptor.Loginterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

Interceptor与Filter的区别:

InterceptorFilter
多个的执行顺序按照配置的顺序,但是也可以通过order控制顺序根据filter、mapping配置的先后顺序
规范spring容器内,是spring框架支持的在Serclet规范中定义的,是Serclet容器支持的
使用范围可以用于web程序、Application程序、Swing程序中只能用于Web程序
深度拦截器能深入到方法前后和异常抛出等Filter只能Servlet前后起作用

Interceptor:拦截器是基于java的反射机制,而过滤器是基于函数回调。Filter能做的事他都能做,而且·可以在请求前后执行,比较灵活

Filter:主要针对URL地址做一个编码的事情、过滤掉没用的参数、安全效验(比较广泛,例如登录不登录之类),要是太细建议用Interceptor。根据不同情况选择合适的

6.单例模式。

1.什么是单例? 

        系统运行期间有且仅有一个实例。

2.为什么要有单例?

        系统中的一些对象只需要初始化一次即可,例如:KTV中的播放器或者初始化系统参数。

3.单例模式的要求:

        a. 一个类只有一个实例    只提供私有的构造器。

  • 
        private Zhang(){
    
        }

             b.必须自己创建这个实例,定义该类的静态私有对象。

    private static Zhang single;

        c.必须自己向系统提供这个实例,创建一个公共的静态方法,返回这个实例。 

  public static Zhang getSingleton(){

        if(single==null){

            initSingleton();

        }

        return single;

    }

4.饿汉模式:不管你用不用我都给你创建这个实例。(官方语言:在类加载的时候创建这个实例)。 天然线程安全的,每个类中获取这个对象的耗时基本一样

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

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

public class Zhang{

     

     private Zhang() {

          

     }

     

     private static Zhang zhang;

     

        // 静态内部类

     public static class SingletonHelper{

          private static final Zhang INSTANCE = new  Zhang();

     }

     

     public static Zhang getZhang() {

          zhang= SingletonHelper.INSTANCE;

          return zhang;

     }

     

}

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

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

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

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

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

9.SpringMVC中使用ServletAPI。

10.springMVC的异常处理:

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

   @ExceptionHandler(value=RuntimeException.class)

     public String Zhang() {

          return "Zhang";

     }

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

<!-- 全局异常处理 -->  

 <bean  class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

     <property name="exceptionMappings">

          <props>

               <prop key="java.lang.RuntimeException">error</prop>

          </props>

     </property>         

 </bean>

7.在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>



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值