一、在工程目录的web.xml文件中配置Spring以及SpringMVC
D:\workspace_idea\crm_37-0-159-1_BRANCH\src\main\webapp\WEB-INF\web.xml
首先配置Spring
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/applicationContext.xml</param-value>
</context-param>
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.XmlWebApplicationContext</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
再配置SpringMVC
<servlet>
<servlet-name>SpringDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringDispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SpringDispatcher</servlet-name>
<url-pattern>*.json</url-pattern>
</servlet-mapping>
Spring编码配置
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
错误页面配置:
<error-page>
<error-code>403</error-code>
<location>/WEB-INF/views/common/404.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/common/404.jsp</location>
</error-page>
<error-page>
<error-code>405</error-code>
<location>/WEB-INF/views/common/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/views/common/500.jsp</location>
</error-page>
二、配置src\main\resources\spring\applicationContext.xml
配置applicationContext.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
>
<!-- 自动扫描路径配置 -->
<context:component-scan base-package="com.baidu.nuomi,com.niux"/>
<!-- 加载properties配置文件-->
<context:property-placeholder location="classpath*:*.properties" ignore-unresolvable="true" />
<context:property-placeholder location="classpath:properties/*.properties" ignore-unresolvable="true" />
<import resource="spring-mvc.xml" />
</beans>
三、配置spring-MVC.xml
1、配置SpringMVC静态资源访问方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置js,css等静态文件直接映射到对应的文件夹,不被DispatcherServlet处理 若将以下改为:<mvc:default-servlet-handler
/>则使用默认的Servlet来响应静态文件 -->
<mvc:resources mapping="/static/**" location="/static/" />
</beans>
2、配置内容协商[关于内容协商可以参考链接:
http://sishuok.com/forum/blogPost/list/6996.html]
什么是内容协商?
简单点说,就是同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的。
Spring MVC REST是如何决定采用何种方式(视图)来展示内容呢?
1)根据Http请求的header中的Accept属性的值来判读,比如:
Accept: application/xml 将返回xml格式数据
Accept: application/json 将返回json格式数据
优点:是这种方式是理想的标准方式
缺点:是由于浏览器的差异,导致发送的Accept Header头可能会不一样,从而导致服务器不知要返回什么格式的数据
具体配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--主要处理**.json、**.htm-->
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<!-- 扩展名至mimeType的映射,即 /user.json => application/json -->
<property name="favorPathExtension" value="true" />
<!-- 用于开启 /userinfo/123?format=json 的支持 -->
<property name="favorParameter" value="true" />
<property name="parameterName" value="format"/>
<!-- 是否忽略Accept Header -->
<property name="ignoreAcceptHeader" value="false"/>
<property name="mediaTypes" >
<value>
json=application/json
htm=application/html
</value>
</property>
</bean>
</beans>
使用内容协商后,对于同一个URL,例如:http://host:port/user/login.htm或者http://host:port/user/login.json来分别查看URL的页面和返回JSON
内容协商试图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="0">
<!-- 内容协商管理器 用于决定media type -->
<property name= "contentNegotiationManager" ref= "contentNegotiationManager"/>
<!-- 根据mediaTypes增加相应的解析器 -->
<property name= "defaultViews">
<list>
<bean class= "org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
</list>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="suffix" value=".vm"/>
<property name="cacheUnresolved" value="false" />
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="contentType" value="text/html;charset=UTF-8" />
<property name="requestContextAttribute" value="request" />
<property name="exposeSessionAttributes" value="true" />
<property name="attributesMap">
<map>
<entry key="esc"><bean class="org.apache.velocity.tools.generic.EscapeTool"/></entry>
<entry key="render"><bean class="org.apache.velocity.tools.generic.RenderTool" /></entry>
<entry key="context"><bean class="org.apache.velocity.tools.generic.ContextTool"/></entry>
<entry key="jello"><bean class="com.baidu.fis.velocity.tools.JelloTool" /> </entry>
</map>
</property>
<property name="order" value="0" />
</bean>
<bean id="jspViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
<property name="order" value="1" />
</bean>
<bean id="errorCodeExceptionResolver" class="com.baidu.nuomi.crm.helper.exception.ErrorCodeExceptionResolver"/>
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionAttribute" value="exception"></property>
<property name="exceptionMappings">
<props>
<prop key="com.baidu.nuomi.crm.helper.exception.UnauthorizedException">common/500</prop>
<prop key="java.lang.Exception">common/500</prop>
<prop key="java.lang.Throwable">common/404</prop>
</props>
</property>
<property name="warnLogCategory" value="ERROR"></property>
<property name="defaultErrorView" value="common/500"></property>
<property name="defaultStatusCode" value="500"></property>
</bean>
</beans>
四、Controll的具体写法
package com.baidu.nuomi.crm.firmoperate.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.baidu.nuomi.crm.firmoperate.controller.vo.UserVo;
import com.baidu.nuomi.crm.firmoperate.exception.SalerErrorCode;
import com.baidu.nuomi.crm.firmoperate.service.CrmUserService;
import com.baidu.nuomi.crm.helper.exception.ErrorCodeException;
import com.baidu.nuomi.crm.helper.page.Paging;
import com.baidu.nuomi.crm.helper.utils.ResultVOUtil;
import com.baidu.nuomi.crm.helper.utils.beanconvert.BeanConvertUtil;
import com.baidu.nuomi.crm.sso.authority.AuthorityUtil;
import com.baidu.nuomi.crm.sso.authority.enumeration.RoleEnum;
import com.baidu.nuomi.crm.sso.login.LoginUtil;
import com.niux.acl.model.User;
/**
*
* 为页面提供查询销售相关的服务
*
* @author:tian.zheng
* @date:2014年9月14日
* @time:上午8:20:47
*
*/
@Controller
@RequestMapping("/crm/user/saler")
public class SalerController {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
private CrmUserService crmUserService;
/**
*
* 根据当前登录用户的ID(或者是代理用户ID),获取该用户下属销售,有分页
*
* @param name
* 用户姓名
* @param paging
* @return
*/
@ResponseBody
@RequestMapping("getSalersByLoginCmId")
public Object getSalersByLoginCmId(String name, Paging paging) {
// 获取登录的用户ID
Long userId = LoginUtil.getAuthorityUser().getUserId();
// 如果不是城市经理角色、或者代理商城市经理角色,返回错误提示信息
if (!AuthorityUtil.hasRole(userId, RoleEnum.CITY_MANAGER) && !AuthorityUtil.hasRole(userId, RoleEnum.AGENT_CITY_MANAGER)) {
throw new ErrorCodeException(new SalerErrorCode(SalerErrorCode.ERROR_LOGIN_ROLE_NOT_CM));
}
List<UserVo> resultList = crmUserService.getSalerList(name, paging);
return ResultVOUtil.retSuccessPage(resultList, paging);
}
/**
*
* 根据当前登录用户的ID(或者是代理用户ID),获取该用户下属销售,有分页
*
* @param name
* 用户姓名
* @param paging
* @return
*/
@ResponseBody
@RequestMapping("getSalers")
public Object getSalers() {
List<User> salerList = LoginUtil.getSalers();
log.info("salerList size="+salerList.size());
return ResultVOUtil.retSuccess(BeanConvertUtil.convert(salerList, UserVo.class));
}
}