单例模式。
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>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/161200.html