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

来源:互联网 发布:windows找不到chrome 编辑:程序博客网 时间:2024/06/10 05:01

        最近一个月做的项目是一个微信公众号服务端开发,使用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")@ResponseBodypublic 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盯上了。变更有风险,修改需谨慎,拷贝也同样不是件让人省心的事情。总之,路漫漫呐!

     


       



0 0