项目总结-基于SpringMVC的微信公众号开发

        最近一个月做的项目是一个微信公众号服务端开发,使用SpringMVC开发的。总结下这段时间使用SpringMVC碰到的问题,其实都是这个框架的基础,只是在碰到问题并解决之后才恍然大悟,原来这些技术该这么使用,原来自己生疏了这么多东西。

       1 关于iBatis配置SqlMap映射Java Bean

        数据表的字段和Java Bean的属性一致,则iBatis会自动根据resultClass完成查询结果到Java类的映射的。但是有一点需要注意,iBatis映射类的属性时是以单词为单位的,所以Java类的属性也应该遵循这个规则。一张表定义了一个KEYWORD的字段,对应的Java类属性名是keyWord,后来查询映射时抛出异常说KEYWORD没有可写的方法。很纳闷,后来有道一查发现keyword是一个单词,导致映射出错。

      2 iBatis的resultMap定义,如果resultMap的class是一个类,需要对类的每个属性都定义映射规则,没有定义的属性则为null。本来我以为如果不指定,iBatis会自动映射的,今天测试发现查询返回的类属性值都为空,才发现想偷懒是不行的。

      贴出代码:

     

	<resultMap id="resourceDetail" class="WexinResource">
		<result property="newsMsgs" column="ID" select="wexinNewsMsg.queryByResourceId" />
		<result property="keyword" column="KEYWORD"/>
		<result property="type" column="TYPE"/>
		<result property="title" column="TITLE"/>
		<result property="description" column="DESCRIPTION"/>
		<result property="mediaId" column="MEDIAID"/>
		<result property="localUrl" column="LOCALURL"/>
	</resultMap>

       当resultMap对应的类有关联属性时,使用select,会将对应列作为参数传递给select属性指定的sql,该SQL的执行结果赋给该关联属性。同时如果使用了lazy-load,一般只有在访问该属性时,才会执行这个SQL的。

       3 ResponseBody注解返回文本时中文乱码问题

       使用ResponseBody注解时,如果Action返回类型为String,则SpringMVC会将该String直接返回给客户端;如果是Java对象,则会转换成Json返回给客户端。如果Action方法没有使用该注解,而返回类型是String,则SpringMVC则会将该返回值按照ViewResolver的规则来拼装返回页面。

      

	@RequestMapping(value="/resourcelist")
	public String toResourceList(){
		return "/weixin/resource";
	}
        @RequestMapping(value="/fanslist")
	@ResponseBody
	public ModelAndView toFansList(){
		ModelAndView mv = new ModelAndView("/weixin/getfanslist");
		return mv;
	}

         以上是两种不同的定向到.jsp页面的方法,注解与非注解的方式。如果ResponseBody是普通的Java对象,而且碰巧有中文的话,很可能会出现中文乱码问题,解决办法有两种。一个是在Action上使用注解produces = {"text/xml;charset=UTF-8"},另一种是在SpringMVC的配置文件中设置如下配置,需要注意的是该配置在<mvc:annotation-driven/>的情况下会失效。需要注掉注解驱动的配置才行,而且一旦设置下面的配置之后,客户端  的Accet-CharSet属性将会出现一大堆的编码格式,因而乱码问题可以避免。      

 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
        <property name="messageConverters">  
            <list>  
                <bean class="org.springframework.http.converter.StringHttpMessageConverter" >
               		 <property name = "supportedMediaTypes"> 
	 				 <list>               
	  					 <value>text/plain;charset=UTF-8</value>   
	                 </list> 
	                 </property> 
                </bean>  
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
	      		 	<property name = "supportedMediaTypes"> 
	 				 <list>               
	  					 <value>text/plain;charset=UTF-8</value>   
	                 </list> 
	                 </property> 
      		 </bean>
      		  <bean  class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />  
            </list>  
        </property>  
    </bean>  

        4 SpringMvc文件上传问题

        使用SpringMVC上传文件时,必须通过form表单提交,且设置enctype="multipart/form-data",method="POST",file类型的表单的name属性必须跟Action方法的MultipartFile参数名称一致。而且很奇怪的现象是如果没有选择文件时,提交的Action的该文件字段对象是非null的,只不过该对象的isEmpty是true。文件上传的方法如果使用IOUtils的拷贝方法,会上传失败,但是Spring框架的FileUtils.copyInputStreamToFile方法可以正常完成拷贝。

       总结:编码是个细致活,一不小心,就被bug盯上了。变更有风险,修改需谨慎,拷贝也同样不是件让人省心的事情。总之,路漫漫呐!

     


       




你可能感兴趣的:(项目总结-基于SpringMVC的微信公众号开发)