SpringMVC使用

一、在工程目录的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头可能会不一样,从而导致服务器不知要返回什么格式的数据
 
2)根据扩展名来判断,比如:
/mvc/test.xml  将返回xml格式数据 
/mvc/test.json 将返回json格式数据 
/mvc/test.html 将返回html格式数据 
 
缺点:丧失了同一URL的多种展现方式。在实际环境中使用还是较多的,因为这种方式更符合程序员的习惯
 
3)根据参数来判断
/mvc/test?format=xml        将返回xml数据 
/mvc/test?format=json       将返回json数据 
 
缺点:需要额外的传递format参数,URL变得冗余繁琐,缺少了REST的简洁风范

具体配置如下:

<?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));
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值