项目总结-基于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盯上了。变更有风险,修改需谨慎,拷贝也同样不是件让人省心的事情。总之,路漫漫呐!

     


       



发布了237 篇原创文章 · 获赞 507 · 访问量 39万+
展开阅读全文
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符

使用Springmvc开发微信公众号数据传输问题

06-26

返回给微信服务器的XML格式的字符串,发现在公网Linux服务器中,tomcat的catalina.out文件打印的该字符串少了<ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> 这几行标签,手机微信提示该订阅号无法提供服务,请稍后再试。 该问题找了好久都找不出原因。是springmvc的数据传输有问题吗? 我贴一下springmvc.xml配置,求帮忙解答!!~ <!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 --> <!-- 加载controller的时候,不加载service,因为此时事物并未生效,若此时加载了service,那么事物无法对service进行拦截 --> <context:component-scan base-package="org.jeecgframework.web.*,weixin.*"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> <!-- ApplicationContext --> <bean class="org.jeecgframework.core.util.ApplicationContextUtil"></bean> <!-- 避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射, 配置一个基于注解的定制的WebBindingInitializer,解决日期转换问题,方法级别的处理器映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="cacheSeconds" value="0" /> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 --> </list> </property> <property name="webBindingInitializer"> <bean class="org.jeecgframework.core.interceptors.MyWebBinding" /> </property> </bean> <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- --> <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="3"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="contentType" value="text/html" /> <property name="prefix" value="/webpage/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8"> <property name="maxUploadSize"> <value>104857600</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> </bean> <!-- Bean解析器,级别高于默认解析器,寻找bean对象进行二次处理 --> <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"> </bean> <!-- Excel 处理 根据用户输入进行对象处理 --> <bean id="jeecgExcelView" class="org.jeecgframework.poi.excel.view.JeecgSingleExcelView" /> <!-- 方言 --> <bean id="dialect" class="org.jeecgframework.core.common.hibernate.dialect.DialectFactoryBean"> <property name="dbType" value="${jdbc.dbType}" /> </bean> <!-- 异常处理类 --> <bean id="exceptionHandler" class="org.jeecgframework.core.common.exception.MyExceptionHandler" /> <!-- 系统错误转发配置[并记录错误日志] --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView" value="500"></property> <!-- 默认为500,系统错误(error.jsp) --> <property name="defaultStatusCode" value="404"></property> <property name="statusCodes"><!-- 配置多个statusCode --> <props> <prop key="error">500</prop> <!-- error.jsp --> <prop key="error1">404</prop> <!-- error1.jsp --> </props> </property> <property name="exceptionMappings"> <props> <!-- 这里你可以根据需要定义N多个错误异常转发 --> <prop key="java.sql.SQLException">dbError</prop> <!-- 数据库错误(dbError.jsp) --> <prop key="org.springframework.web.bind.ServletRequestBindingException">bizError</prop> <!-- 参数绑定错误(如:必须参数没传递)(bizError.jsp) --> <prop key="java.lang.IllegalArgumentException">bizError</prop> <!-- 参数错误(bizError.jsp) --> <prop key="org.springframework.validation.BindException">bizError</prop> <!-- 参数类型有误(bizError.jsp) --> <prop key="java.lang.Exception">unknowError</prop> <!-- 其他错误为'未定义错误'(unknowError.jsp) --> </props> </property> </bean> <!-- 拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="org.jeecgframework.core.interceptors.EncodingInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="org.jeecgframework.core.interceptors.AuthInterceptor"> <property name="excludeUrls"> <list> <value>loginController.do?goPwdInit</value> <value>loginController.do?pwdInit</value> <value>loginController.do?login</value> <value>loginController.do?checkuser</value> <value>repairController.do?repair</value> <value>repairController.do?deleteAndRepair</value> <value>cmsMenuController.do?index</value> <value>cmsArticleController.do?cmsArticleListShow</value> <value>cmsArticleController.do?datagridwx</value> <value>cmsArticleController.do?cmsArticleShow</value> <value>cmsController.do?goPage</value> <value>cmsController.do?getMenuList</value> <value>wechatController.do?wechat</value> <value>zpController.do?iscontinue</value> <value>zpController.do?saveZpPrize</value> <value>zpController.do?getZpPize</value> <value>zpController.do?saverecord</value> <value>zpController.do?ggl_new</value> <value>zpController.do?ggl</value> <value>zpController.do?zp</value> <value>zpController.do?goZhuanpan</value> <value>weixinCmsStyleController.do?upload</value> <value>newsItemController.do?newscontent</value> <!-- 保存用户 --> <value>userController.do?saveUser</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors> 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览