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