单例模式。
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>