首先是框架结构图解
Spring常用的xml标头
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
</beans>
第一步:在web.xml中配置Spring的入口DispatcherServlet
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
第二步:在springmvc-context.xml中配置注解扫描与视图解析器
<!--
对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能
如果扫描到有@Component @Controller@Service等这些注解的类
则把这些类注册为bean
-->
<context:component-scan base-package="test.jia.com" />
<!-- 这个类用于Spring MVC视图解析 -->
<beans:bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/pages/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
到这里,Spring最基本的框架已经搭建完成了,可以写个Controller测试一下
@Controller
@RequestMapping("LoginController")
public class LoginController {
@RequestMapping("login")
public String login(HttpServletRequest request , HttpServletResponse response){
System.out.println(" welcome ! ");
return "login";
}
}
启动web项目后,在浏览器访问是通过的,Spring最基本的框架搭建完成。下面我们在此框架的基础上进行功能扩展。
第三步:在springmvc-context.xml中配置Spring拦截器
<!-- 拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*/*"/>
<bean class="test.jia.com.interceptor.UrlsInterceptor">
<property name="urls">
<list>
<!-- 如果请求中包含以下路径,则不进行拦截 -->
<!-- 静态资源 -->
<value>/js</value>
<value>/css</value>
<value>/image</value>
<value>/images</value>
<value>/png</value>
<value>/jpg</value>
<!--
<value>/xxx.do</value>
-->
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
创建UrlsInterceptor拦截器
public class UrlsInterceptor implements HandlerInterceptor {
//存放被拦截的资源路径
private String[] urls;
public void setUrls(String[] urls) {
this.urls = urls;
}
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object object) throws Exception {
//设置回传格式与编码
response.setContentType("text/html;charset=UTF-8");
//获取请求
String requestURI = request.getRequestURI();
//判断uri是否为不拦截的资源
for(String url : urls){
if(requestURI.indexOf(url)!=-1){
return true;
}
}
//逻辑判断,是否拦截
if (1==1) {
//放行
return true;
}else {
//拦截
return false;
}
}
}
第四步:在springmvc-context.xml中读取property配置文件
<!-- 引入配置文件 -->
<context:property-placeholder location="classpath:config.properties"/>
<!-- 测试:将配置文件的username对应的值注入LoginUser的构造中 -->
<beans:bean id="loginUser" class="test.jia.com.entity.LoginUser" >
<constructor-arg value="${username}"></constructor-arg>
</beans:bean>
注:一定要在web.xml配置Spring监听,因为Bean的注入依赖ContextLoaderListener监听
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-context.xml </param-value>
</context-param>
<!-- Spring 监听器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
config.properties配置文件里的内容
username=username
测试:从控制层读取注入的loginUser
@RequestMapping("login")
public String login(HttpServletRequest request , HttpServletResponse response){
System.out.println(" welcome ! ");
WebApplicationContext context =
WebApplicationContextUtils.
getWebApplicationContext(request.getSession().getServletContext());
LoginUser loginUser = context.getBean("loginUser", LoginUser.class);
System.out.println(loginUser);
return "login";
}
第五步:在springmvc-context.xml配置:避免IE执行AJAX时,返回JSON出现下载文件
<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<!--
①错误:
Not found org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
解决方案:
Spring版本变化导致,将class里的
MappingJacksonHttpMessageConverter改为MappingJackson2HttpMessageConverter
②错误:
NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException
解决方案:需要jackson相关Jar包支持
Jar依赖: jackson-core-2.6.0-rc4.jar
jackson-databind-2.6.0-rc4.jar
jackson-annotations-2.6.0-rc4.jar
-->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
第六步:在springmvc-context.xml配置Spring的文件上传相关内容
<!-- 配置springmvc的上传功能 id必须是multipartResolver -->
<!--
错误:
NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
解决方案:
Spring的CommonsMultipartResolver需要apache的FileItemFactory支持
Jar依赖: commons-fileupload.jar
commons-io.jar
-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- maxUploadSize:文件上传的最大值以byte为单位 -->
<property name="maxUploadSize" value="102400000"></property>
<!-- 设置默认编码 -->
<property name="defaultEncoding" value="utf-8" />
</bean>
第七步:在web.xml配置字符编码过滤器
<!-- 字符编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 注入默认属性 -->
<init-param>
<description>字符集编码</description>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- 过滤器名称 -->
<filter-name>encodingFilter</filter-name>
<!-- 拦截哪些请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>