spagobi 4.0 中文问题初探

         Spagobi4.0版本出来有一段时间了,之前忙于项目,没有时间专门研究下新版的中文问题。听有的网友说,新版本支持中文输入了,但是中文显示上还有些问题。于是,从官网上下载了最新版的 all in one包。解压,启动。进入登录界面,眼前一亮。新版本在登录界面和进入系统的主界面上更改比较大,整体来说还算不错。

         进入主界面后,一下子还有点不太适应,很多原来版本的功能不知道入口在哪里了。摸索了一下,找到了三个功能入口:Engines management,Data source,Maps。

        spagobi 4.0 中文问题初探_第1张图片

engines management中找一个引擎的description字段,增加了几个中文字符,发现能正常保存,刷新界面后也能正常显示。data source界面里中文内容可以正常保存,但是刷新后显示乱码。Maps中新增一条记录,不出意外,返回一大推提示,中文字符不能保存。

         这里先把软件环境介绍下。下载后的all in one包中将默认系统运行数据库改成的MySql。改数据库之前先要到官网下载4.0版本的mysql数据库初始化sql ,创建好数据库后执行初始化sql文件。然后,需要修改以下几个文件:

         conf/server.xml:修改其中的Resource name="jdbc/spagobi"资源定义中的数据库连接配置为:这里需要注意的是url中的characterEncoding=utf-8&useOldAliasMetadataBehavior=true两个连接参数,第一个连接参数指定数据库的字符集为UTF-8,第二个参数解决了部分页面提示“ENGINE_ID”,”DS_ID” 列不存在异常,据说这是mysql的一个bug。

         webapps/spagobi/WEB-INF/classes目录下的3个文件:hibernate.cfg.xml,jbpm.hibernate.cfg.xml和quartz.properties文件中的数据库方言都改成MySQLDialect。

         这些文件修改完后,不要再用bin/SpagoBIStartup.bat启动了,直接使用bin/ startup.bat启动即可。启动完成后在验证上边提到的三个功能,中文问题依然存在,不过看数据库中相应的表,前两个引擎管理和数据源管理表中均能正常保存中文内容了。

         已经能正常使用的engines management功能暂时先不管他具体怎么实现的。下边重点看一下data source和Maps两个功能。

         data source管理中,通过火狐浏览器的fire debug插件查看后台数据处理URL发现如下图:

spagobi 4.0 中文问题初探_第2张图片

         通过对比Engines management功能的URL:

spagobi 4.0 中文问题初探_第3张图片

发现有两点不同

(1)   请求的URL路径不同。引擎管理功能中使用“http://localhost:8081/SpagoBI/servlet/AdapterHTTP?“,数据源管理功能中使用“http://localhost:8081/SpagoBI/restful-services/domains/listValueDescriptionByType?”。熟悉之前版本源码的朋友应该知道,servlet/AdapterHTTP是之前版本中所有后端处理的统一入口。现在新版本中增加了另外一种处理后端数据的web url “restful-services”。

(2)   响应头信息中Content-Type内容不同。正常保存和显示中文的引擎管理功能中Content-Type=application/x-json;charset=UTF-8,不能正常显示中文的数据源管理中Content-Type=application/json。也许就是因为这个差异才导致的中文显示乱码。

  那么,这个restful-services到底是什么呢?通过查找web.xml文件,找到了这个配置“<context-param>resteasy.servlet.mapping.prefix/restful-services

Resteasyorg.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher

         通过搜索HttpServletDispatcher,发现,这是一种处理web请求的框架,名字叫“RESTEasyJAX-RS”,通过这个工具可以实现,前端jsp通过发送web url请求来处理或者查询数据。这种工具中又是如何处理响应信息头的呢?通过搜索发现,RESTEasy是通过java注解的方式来实现请求url的定义和响应信息头的配置。其中@Produces就是用来定义响应信息头的。那么,data source管理界面中查询所有已定义的数据源信息的url”http://localhost:8081/SpagoBI/restful-services/datasources?SBI_EXECUTION_ID=-1&_dc=1377007659045&page=1&start=&limit=5”对应的处理类是哪个呢?通过搜索源码中的“@Path("/datasources")”发现,it.eng.spagobi.tools.datasource.service.rest.DataSourceCRUD.java中的getAllDataSources方法正好是查询所有数据源的方法。另外,也可以在“log/SpagoBI_[1]_OperatorTrace.log”文件中发现个中端倪。而这个方法注解上正好有个“@Produces(MediaType.APPLICATION_JSON)”,把这个改成@Produces("application/x-json;charset=UTF-8")就可以了。

       这种处理方式有些麻烦,要找到所有以这种注解方式注解的方法并改成新的注解。这工作量不小,也容易出错。目前我没有发现有没有一种集中统一的方式来处理。

       剩下还有一个中文问题,就是Maps功能。看到这种界面,马上想起来,之前的版本中已经处理过了,方法是:把所有jsp文件中的ISO-88559-1编码改成UTF-8。同时增加html meta UTF-8。还有就是jsp页面中有些input输入框使用了value="<%=StringEscapeUtils.escapeHtml(label) %>" StringEscapeUtils类是“org.apache.commons.lang.StringEscapeUtils.java”这种方式在处理中文的时候同样有问题,保存到数据库中中文字符是转化后的,所以这个类要替换成我写好的“com.zeroy.bi.util.StringEscapeUtils.java”。在一个是在web.xml中增加中文过滤器:

spagobi 4.0 中文问题初探_第4张图片

增加了这些以前成功验证过的配置后,发现,Maps界面中还是不能保存中文,但是其他,像document配置界面是可以保存中文的。这时不得不去跟踪下源码中的负责集中处理servlet的类“AdapterHTTP.java”。这个类中对form表单提交有两个处理方法,分别是“handleMultipartForm”和“handleSimpleForm”,凡是走了handleSimpleForm方法的都能正常保存中文,而“handleMultipartForm”方法却不可以。这又是为什么呢?原来,决定要走这个两个方法中哪一个的判断逻辑是:

spagobi 4.0 中文问题初探_第5张图片

    而isMultipartContent方法判断的是jsp中form表单的enctype属性。如下两个form的不同定义:
	
 
	
    正是因为Maps功能页面jsp中form 使用enctype='multipart/form-data'属性,才会使处理类中使用了“handleMultipartForm”方法进行处理。那么这个方法要怎么改呢?也很简单,只需要改一下249行的代码即可,如下图
  
 
  
    到这里,集中常见的中文处理问题已经都能解决,但还是不很完美。希望有研究的同学能提供更好的解决方法。欢迎加QQ群:150039031

你可能感兴趣的:(spagobi,汉化)