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的区别:
Interceptor | Filter | |
多个的执行顺序 | 按照配置的顺序,但是也可以通过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>