SpringMVC基础教程
1. 最简单的配置
首先是要有相应的配置文件:
文件内容:
1 <context:component-scan base-package="com.imethsoft.server.*" /> 2 <!-- 开启注解 --> 3 <mvc:annotation-driven /> 4 5 <!-- 静态资源(js/image)的访问 --> 6 <mvc:resources mapping="/images/**" location="/images/" cache-period="31556926" /> 7 <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926" /> 8 <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926" /> 9 10 <!-- 定义视图解析器 --> 11 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 12 <property name="prefix" value="/"></property> 13 <property name="suffix" value=".jsp"></property> 14 </bean>
在web.xml配置如下即可:第一种方式:文件放在WEB-INF下面,取名为springMVC-servlet.xml
1 <!-- 配置SpringMVC --> 2 <servlet> 3 <servlet-name>springMVC</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <load-on-startup>1</load-on-startup> 6 </servlet> 7 8 <servlet-mapping> 9 <servlet-name>springMVC</servlet-name> 10 <url-pattern>/</url-pattern> 11 </servlet-mapping>
第二种方式:文件位置随意放、或者名字不为springMVC-servlet.xml
在web.xml配置如下即可:
1 <!-- 配置SpringMVC --> 2 <servlet> 3 <servlet-name>springMVC</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <init-param> 6 <!-- 加载SpringMVC的xml到 spring的上下文容器中 --> 7 <param-name>contextConfigLocation</param-name> 8 <param-value>classpath:applicationContext-servlet.xml</param-value> 9 </init-param> 10 <load-on-startup>1</load-on-startup> 11 </servlet> 12 13 <servlet-mapping> 14 <servlet-name>springMVC</servlet-name> 15 <url-pattern>/</url-pattern> 16 </servlet-mapping>
二者方式的区别只是在于springmvc有自带的加载路径和文件名,当然一般我们会采取第二种,方便我们自己的命名以及文件放置。
2.配置springMVC-servlet.xml使得我们可以根据URL的结尾进行返回对应的返回值,例如list.json,list.xml
1 <!-- 根据客户端的不同的请求决定不同的view进行响应, 如 /blog/1.json /blog/1.xml --> 2 <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 3 <property name="order" value="1" /> 4 <!-- 在没有扩展名时即: "/blog/1" 时的默认展现形式 --> 5 <property name="defaultContentType" value="text/html" /> 6 <!-- 是否启用扩展名支持,默认就是true --> 7 <property name="favorPathExtension" value="true"></property> 8 9 <!-- 设置为true以忽略对Accept Header的支持 --> 10 <property name="ignoreAcceptHeader" value="true" /> 11 <!-- 用于开启 /blog/123?format=json 的支持,一旦开启就要加format参数 --> 12 <property name="favorParameter" value="false" /> 13 14 <!-- 扩展名至mimeType的映射,即 /blog.json => application/json --> 15 <property name="mediaTypes"> 16 <map> 17 <entry key="xml" value="application/xml" /> 18 <entry key="json" value="application/json" /> 19 </map> 20 </property> 21 22 <property name="defaultViews"> 23 <list> 24 <!-- for application/json --> 25 <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> 26 27 <!-- for application/xml --> 28 <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 29 <property name="marshaller"> 30 <bean class="org.springframework.oxm.xstream.XStreamMarshaller" /> 31 </property> 32 </bean> 33 </list> 34 </property> 35 </bean>
值得要注意的是,你的springmvc中必须要配置
1 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 2 <property name="order" value="2" /> 3 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 4 <property name="prefix" value="/"></property> 5 <property name="suffix" value=".jsp"></property> 6 </bean>
这样配置了以后,能保证的有一点,当用户输入的结尾不存在的时候会默认使用text/html来进行处理,也就是网页处理,因为会自动跳到viewResolver中
在代码块中建议如下处理:
1 @RequestMapping(value="/getById",method=RequestMethod.GET) 2 public ModelAndView getById(Model model, HttpServletRequest request){ 3 4 User user = new User(); 5 user.setUsername("aaa"); 6 user.setPassword("bbb"); 7 8 Map<String, Object> map = new HashMap<String, Object>(); 9 map.put("row", user); 10 return new ModelAndView("getById", map); 11 }
解释:这样的目的在于,如果请求的是单纯的action会跳转到getById.jsp中,如果是其他的结尾会自动转为相应的数据格式
3.统一异常处理
1 <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 2 <property name="defaultErrorView" value="error500"></property> 3 <property name="defaultStatusCode" value="500"></property> 4 <property name="statusCodes"> 5 <props> 6 <prop key="error500">500</prop> <!-- error.jsp --> 7 <prop key="error404">404</prop> <!-- error1.jsp --> 8 </props> 9 </property> 10 <property name="exceptionMappings"> 11 <props> 12 <!-- 这里你可以根据需要定义N多个错误异常转发 --> 13 <!-- 数据库错误(dbError.jsp) --> 14 <prop key="java.sql.SQLException">dbError</prop> 15 <!-- 参数绑定错误(如:必须参数没传递)(bizError.jsp) --> 16 <prop key="org.springframework.web.bind.ServletRequestBindingException">bizError</prop> 17 <!-- 参数错误(bizError.jsp) --> 18 <prop key="java.lang.IllegalArgumentException">bizError</prop> 19 <!-- 参数类型有误(bizError.jsp) --> 20 <prop key="org.springframework.validation.BindException">bizError</prop> 21 <!-- 其他错误为'未定义错误'(unknowError.jsp) --> 22 <prop key="java.lang.Exception">unknowError</prop> 23 </props> 24 </property> 25 </bean>
其次要在web.xml中配置
1 <error-page> 2 <error-code>500</error-code> 3 <location>/error500.jsp</location> 4 </error-page> 5 6 <error-page> 7 <error-code>404</error-code> 8 <location>/error404.jsp</location> 9 </error-page>
这样可以保证在springmvc没有拦截到的时候可以跳转到web.xml中进行拦截错误处理
4.数据格式化
1 <!-- 配置默认的注解映射 --> 2 <mvc:annotation-driven> 3 <mvc:message-converters> 4 <ref bean="stringHttpMessageConverter" /> 5 <ref bean="fastJsonHttpMessageConverter" /> 6 </mvc:message-converters> 7 </mvc:annotation-driven> 8 9 <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> 10 <!-- 避免出现乱码 --> 11 <property name="supportedMediaTypes"> 12 <list> 13 <value>text/plain;charSet=UTF-8</value> 14 </list> 15 </property> 16 </bean> 17 18 <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> 19 <property name="supportedMediaTypes"> 20 <list> 21 <value>application/json;charset=UTF-8</value> 22 <value>text/html;charset=UTF-8</value><!-- 避免IE出现下载JSON文件的情况 --> 23 </list> 24 </property> 25 <property name="features"> 26 <util:list> 27 <value>WriteMapNullValue</value> 28 <value>QuoteFieldNames</value> 29 <value>WriteDateUseDateFormat</value> 30 </util:list> 31 </property> 32 </bean>