springmvc.xml配置文件
扫描组件:
不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入
<context:component-scan base-package="com.**.controller" />
@ReponseBody乱码问题:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<!-- @ReponseBody乱码问题 -->
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=utf-8</value>
<value>text/html;charset=utf-8</value>
<value>text/xml;charset=utf-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
异常处理类:
<bean id="exceptionHandler" class="com.mp.isrp.exception.handler.MyExceptionHandler" />
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class MyExceptionHandler implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
ModelAndView modelAndView = new ModelAndView("../error");
ex.printStackTrace();
return modelAndView;
}
}
spring内容协商:
同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="true" />
<property name="favorParameter" value="true" />
<property name="parameterName" value="format" />
<property name="ignoreAcceptHeader" value="false" />
<property name="defaultContentType" value="text/html" />
<property name="mediaTypes">
<value>
json=application/json
xml=application/xml
html=text/html
</value>
</property>
</bean>
视图解析器和json解析器:
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="contentNegotiationManager" ref="contentNegotiationManager" />
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
</list>
</property>
</bean>
定义视图文件解析:
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="contentType" value="text/html" />
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
文件上传:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760000" />
<property name="maxInMemorySize" value="40960" />
</bean>
静态资源处理:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherServlet使用 / 拦截了所有的请求,会影响到静态资源文件的获取,这样就需要用mvc:default-servlet-handler和mvc:resources来帮住分类完成获取静态资源的责任
<mvc:resources mapping="/images/**" location="/WEB-INF/images/" cache-period="31556926"/>
<mvc:resources mapping="/js/**" location="/WEB-INF/js/" cache-period="31556926"/>
<mvc:resources mapping="/css/**" location="/WEB-INF/css/" cache-period="31556926"/>
拦截器:
mvc:mapping 拦截器路径配置
mvc:exclude-mapping 拦截器不需要拦截的路径
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/resour/**" />
<mvc:exclude-mapping path="/local/resour/**" />
<bean class="com.WebInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login/**" />
<mvc:exclude-mapping path="/logout/**" />
<bean class="com.AuthenticationInterceptor " />
</mvc:interceptor>
</mvc:interceptors>
com.WebInterceptor
public class WebInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
WebUtil.setRequest(request);
WebUtil.setResponse(response);
return true;
}
}
WebUtil
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class WebUtil {
private static ThreadLocal<HttpServletRequest> request_threadLocal = new ThreadLocal<HttpServletRequest>();
private static ThreadLocal<HttpServletResponse> reponse_threadLocal = new ThreadLocal<HttpServletResponse>();
public static void setRequest(HttpServletRequest request) {
request_threadLocal.set(request);
}
public static HttpServletRequest getRequest() {
return request_threadLocal.get();
}
public static void removeRequest() {
request_threadLocal.remove();
}
public static void setResponse(HttpServletResponse response) {
reponse_threadLocal.set(response);
}
public static HttpServletResponse getResponse() {
return reponse_threadLocal.get();
}
public static void removeResponse() {
reponse_threadLocal.remove();
}
public static void sessionPut(String name, Object value) {
getRequest().getSession().setAttribute(name, value);
}
public static Object sessionGet(String name) {
return getRequest().getSession()
.getAttribute(name);
}
public static void requestPut(String name, Object value) {
getRequest().setAttribute(name, value);
}
public static Object requestGet(String name) {
return getRequest().getAttribute(name);
}
public static void applicationPut(String name, Object value) {
getRequest().getSession().getServletContext()
.setAttribute(name, value);
}
public static Object applicationGet(String name) {
return getRequest().getSession()
.getServletContext().getAttribute(name);
}
public static HttpSession getSession() {
return getRequest().getSession();
}
}
AuthenticationInterceptor 身份验证
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
UserModel user = (UserModel) WebUtil.getSession().getAttribute(LoginConst.LOGIN_USER_MODEL);
//不直接跳转到登录界面,解决直接在tab页中显示的问题。
if (user == null || user.getId() == null || user.getId().trim().equals("")) {
//重定向到登录界面
//response.sendRedirect("http://96.2.38.162:8888/isrp/jsp/global/login/go.jsp");
//转发请求
request.getRequestDispatcher("login.jsp").forward(request, response);//Login
return false;
}
//暂时关闭 FIXME
return true;
}
}