风之语

posts(201) comments(182) trackbacks(1)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • ajax(1)
  • android(1)
  • apache(1)
  • AppFuse(1)
  • BIRT(1)
  • iText(1)
  • JSF(8)
  • kettle(1)
  • linux(5)
  • mac(1)
  • maven(1)
  • MSTR(3)
  • Open XML(1)
  • Oracle(21)
  • RCP
  • Struts(2)
  • Struts2(2)
  • SybaseIQ(6)
  • tapestry
  • tomcat(2)
  • weblogic(1)
  • webservice(1)
  • weka(1)
  • 云计算(1)
  • 收藏(31)
  • 数据仓库(11)
  • 架构设计(3)
  • 生活(2)
  • 集群(1)
  • 项目管理(6)

随笔档案

  • 2012年12月 (4)
  • 2012年11月 (1)
  • 2012年7月 (2)
  • 2011年8月 (1)
  • 2011年7月 (1)
  • 2011年3月 (1)
  • 2010年12月 (2)
  • 2010年11月 (4)
  • 2010年10月 (3)
  • 2010年9月 (5)
  • 2010年8月 (1)
  • 2010年7月 (4)
  • 2010年3月 (1)
  • 2010年2月 (3)
  • 2009年12月 (3)
  • 2009年11月 (4)
  • 2009年9月 (3)
  • 2009年6月 (5)
  • 2009年5月 (3)
  • 2009年4月 (2)
  • 2009年3月 (5)
  • 2009年2月 (4)
  • 2009年1月 (2)
  • 2008年11月 (2)
  • 2008年9月 (1)
  • 2008年7月 (2)
  • 2008年6月 (4)
  • 2008年5月 (6)
  • 2008年4月 (1)
  • 2008年3月 (1)
  • 2007年12月 (2)
  • 2007年11月 (5)
  • 2007年10月 (2)
  • 2007年9月 (3)
  • 2007年8月 (3)
  • 2007年4月 (1)
  • 2007年3月 (2)
  • 2007年2月 (2)
  • 2007年1月 (2)
  • 2006年12月 (3)
  • 2006年8月 (2)
  • 2006年7月 (2)
  • 2006年6月 (2)
  • 2006年4月 (2)
  • 2006年3月 (1)
  • 2006年2月 (3)
  • 2006年1月 (6)
  • 2005年12月 (6)
  • 2005年11月 (4)
  • 2005年10月 (17)
  • 2005年9月 (25)
  • 2005年8月 (16)
  • 2005年7月 (8)

相册

  • 技术图片

收藏夹

  • java

link

My wife

  • My wife's blog

最新随笔

  • 1. apache修改最大连接并用ab网站压力测试
  • 2. Vm虚拟机访问本地硬盘文件
  • 3. NFS文件无法写入的权限问题
  • 4. weblogic设置上传文件访问权限
  • 5. 在android上动态实现ichartjs的3D柱形图
  • 6. 使用Oracle trunc 来指定精确的年月日时分秒
  • 7. Quartz 2.1.5 web应用配置
  • 8. LoginAny 使用笔记
  • 9. MyEclipse 无响应的几种解决办法
  • 10. java.sql.SQLException: No more data to read from socket

搜索

  •  

积分与排名

  • 积分 - 402193
  • 排名 - 139

最新评论

  • 1. re: 使用Oracle trunc 来指定精确的年月日时分秒[未登录]
  • 政治
  • --张三
  • 2. re: 干掉流氓软件vrvrf_c.exe,vrvedp_m.exe[未登录]
  • `
  • --1
  • 3. re: 无需刻录DMG光盘,教你在VMWare下安装MAC OS X Snow Leopard 10.6
  • 我走到了换DMG映像的时候,然后就没有反应了,这个是什么情况,是不是我的映像文件有问题,还是。。。。
  • --玉竹常青
  • 4. re: LoginAny 使用笔记
  • 怎么没一个人留言,现在来是不是在挖坟啊
  • --ellipse
  • 5. MSTR web应用的部署[未登录]
  • 请问,如何用oracle Application Server服务器部署mstr web应用?
  • --rocky

阅读排行榜

评论排行榜

MSTR实现单点登陆

MicroStrategy Web 的设计模式

MicroStrategy Web 应用的实现方式是使用类似Struts 的MVC 模式,整个应用的核心是一个servlet 作为MVC 中的Controller 。所有的请求都发送给这个servlet,按照默认的web.xml 中的定义,这个servlet 名称是 mstrWeb, mstrWeb 只接受两种参数evt=或者页面参数 pg=通过在客户自己的应用中,通过URL 就可以访问已经订制的报表、文档或者某个特定页面(例如 共享报表页面)


MicroStrategy Web 的URL 参数说明
h ttp:/ /210.82.33.248/MicroStrategy/servlet/mstrWeb?evt=4001&src=mstrWeb.4001&reportViewMode=1&reportID=D08450DF4E71E2068B9AE78845C1BA28&Port=0&Project=MicroStrategy+Tutorial&Server=FBI&Uid=xxx&Pwd=xxx
在MicroStrategy Web 中要执行一个报表、或者访问一个已知的页面的时候,需要必要的认证信息,从request 或者session 中需要提供的五个最基本认证参数如下:
Server ---- Intelligence Server 的HostName 或者IP 地址
Port –--- Interlligence Server 的监听端口,0 表示默认的端口
Project –--- 项目名称
Uid –--- MSTR 用户名
Pwd –--- MSTR 口令
在具体的应用集成中,往往要求业务用户在登陆业务系统后,在调用MicroStrategy 的时候,不需要再次输入用户信息,即单点认证。在具体实现中,MicroStrategy Web 将上面的五个认证基本参数,封装在一个内部对象中WebIServerSession。每个WebIServerSession 的实例代表一个用户的连接,其中WebIServerSession 代表在Intelligence Server 中的一个用户会话,这个会话通过sessionID进行唯一的标识。


MicroStrategy Web 对SSO 的支持—ExternalSecurity
MicroStrategy Web 提供ExternakSecurity 机制,来支持SSO。External Security 提供如下的接口,这些接口实现以后的客户自定义的ExternalSecurity 通过web.xml 的配置加入到现有的Web 应用中,供MicroStratey Web使用。在用户首次访问MicroStratey Web 的时候,或者是签退后重新访问的时候, Web应用会调用实现中的handlesAuthenticationRequest 的方法,其返回值一共三种,根据返回的参数的不同,Web 应用会调用ExternalSecurity 实现中的不同函数,参见下:



通用的实现ExternalSecurity 步骤流程
1、继承 AbstractExternalSecurity 父类,实现代码public class WithSUN_ExternalSecurity extends AbstractExternalSecurity { ... ...
2、编译的类,打成jar 放在 web-inf/lib 下,或者按照包路径放在 web-inf/classes 下
3、修改 web.xml 中的 mstrWeb Servlet 配置中的 ExternalSecurityClass 参数,注释原有的参数,使用用户定义的类,例如
<param-name>externalSecurityClass</param-name>
<!--param-value>com.microstrategy.web.app.DefaultExternalSecurity</param-value-->
<param-value>com.fbi.WithSUN_ExternalSecurity</param-value>
</init-param>
在不同的项目中,根据集成模式的不同,会有不同的集成模式。解决这个问题的核心是如何根据传入的TOKEN 或者信息获取对应的MSTR 的登录信息。
下面就几种不同的模式进行介绍:

  • Web Universal 作为单独的Web 应用使用
    使用MicroStrategy 的登陆界面,(或者自定义的Login 页面)进行登陆。这个时候用户输入的是外部用户的业务ID,以及Password。
    [解决方式] 通过定义ExternalSecurity 类,实现用户输入的用户信息和MicroStrategy 之间用户的转换。通常是基于数据库用户信息表,通过输入的信息映射到MSTR 的用户信息。使用到了数据库表来存储用户名和密码。
    [需要附加的包]
    SQL Server 的 JDBC 包: jtds-0.9.jar
    Oracle 的JDBC 包:


    模式二 用户有自己的Web 应用,需要调用MicroStrategy Web 的应用
    这种模式下不会提供MSTR 的任何登录的页面,但是要求从发起调用的Web 应用,在访问MicroStrategy,需要通过Session 或者 Request 传递某个参数给MicroStrategy。
    简化的实现是:在Web 应用调用handlesAuthenticationRequest 的时候返回常数COLLECT_SESSION_NOW;
    然后Web 应用会调用getWebIServerSession 方法,在getWebIServerSession 中系统会传递两个参数,RequestKeys 和 ContainerServices,其中前者是对httpRequest 的封装,后者则是对httpSession 的封装。需要在这个方法中返回一个WebIServerSession 的实例。
    接下来,Web应用会调用底层的API 创建相应的Session,并将session 交于SessionManager(内部对象)维护。
    注意一个问题,传入的这个参数,可以考虑加密处理,可以将登录MSTR 的用户名和密码信息加密后直接传入。另外更可为的方式为传入某一个临时的Key利用 Key 从数据库,或者其他位置获得登陆MSTR 的用户名和密码。


  • [模式三] 与 SUN 的Identity Server 进行集成,SSO 软件进行集成,

    客户化方式同模式二,特殊的是:
    步骤1: 需要修改Web 的描述文件web.xml,将应用配置使用SUN SSO 认证,这样当未认证的用户访问Web Universal 的时候,会进入SUN SSO 的登录界面。
    样例,具体项目需要参考SUN 的文档
    - <filter>
    <filter-name>Agent1</filter-name>
    <filter-class>com.sun.amagent.as.filter.AgentFilter</filter-class>
    </filter>
    - <filter>
    <filter-name>Agent2</filter-name>
    <filter-class>com.sun.amagent.as.filter.AgentFilter</filter-class>
    </filter>
    - <filter-mapping>
    <filter-name>Agent1</filter-name>
    <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
    - <filter-mapping>
    <filter-name>Agent2</filter-name>
    <url-pattern>/userinfo/*</url-pattern>
    </filter-mapping>
    步骤2:当用户输入统一的用户身份信息后,认证成功后,进入MicroStrategy 的界面,Web Universal 会调用External Security 模块。
    在handleAuthentication 或者 getWebIServerSession 中获得SUN Identity 的Token,调用SUN SSO Client 的API,需要import SUN 的包:

    view plaincopy to clipboardprint?
    1. import com.iplanet.sso.*;   
    2. import com.iplanet.am.sdk.*;   
    3. import com.sun.identity.authentication.*;   
    4.   
    5. //另外调用SUN 的API 获得认证成功后的令牌 Token,代码片断如下:   
    6. SSOTokenManager manager = SSOTokenManager.getInstance();   
    7. SSOToken ssoToken = manager.createSSOToken(reqKeys);   
    8. if(manager.isValidToken(ssoToken))   
    9. {   
    10. AMStoreConnection dpsc = new AMStoreConnection(ssoToken);   
    11. AMUser dpUser = dpsc.getUser(ssoToken.getPrincipal().getName());   
    12. uid = dpUser.getStringAttribute("uid");   
    13. cn = dpUser.getStringAttribute("cn");   
    14. employeeNo = dpUser.getStringAttribute("employeenumber");   
    15. alias = dpUser.getStringAttribute("iplanet-am-user-alias-list");   
    16. mail = dpUser.getStringAttribute("mail");   
    17. entrydn = dpUser.getStringAttribute("entrydn");   
    18. }  

    通过认证源的返回的信息,如果正常,那么需要根据其他的信息获得MSTR 的登录信息。
    否则,需要参见下面 [关于认证失败的处理]


  • [模式四] 与第三方开发的认证进行集成的样例:
    样例1: 用户自己开发了portal,实现集中的认证源,那么需要在External Sercurity 类的handelAuthentication 或者getWebIServerSession 中利用下面的代码:
    view plaincopy to clipboardprint?
    1. URL url=new URL("http://portal.xbxs.petrochina:38081/ssoauth/SSOValidate?tokenID=" + tokenId);   
    2. URLConnection con=url.openConnection();   
    3. con.setUseCaches(false);   
    4. java.io.BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));   
    5. String line= br.readLine();   
    6. while(null != line){   
    7. if (line.indexOf("SUCCESS")>-1) break;  

    通过认证源的返回的信息,如果正常,那么需要根据其他的信息获得MSTR 的登录信息。
    否则,需要参见下面 [关于认证失败的处理]。



  • [关于认证失败的处理]
    第一种方法是:在 getwebiserversession 中,用提供的credential 创建session,如果创建session 不成功,getwebiserversession 会自动return null。这时getfailureurl 方法会被call with reason =1。可以在getfailureurl 方法中指定reason=1 时出现的错误信息页面的url
    第二个方法是:
    1. 在handlehandlesAuthenticationRequest 中用非建立session 的方法验证credential
    2. 如果验证ok,就call getWebIServerSession,create mstr session
    3. 如果验证不ok,就call getCustomLoginURL, 然后在getCustomLoginURL 方法中,指定error page 的url
    这两个方法那个更好,取决于如何验证mstr credential。如果credential 只能通过session是不是null 来验证,就用方法1。如果是通过其他方法验证credential,就用方法2。
  • posted @ 2009-02-12 17:23 风 阅读(2015) | 评论 (3) | 编辑 收藏

    PPS去广告,学习制作补丁

         摘要: PPS去广告,学习制作补丁  阅读全文

    posted @ 2009-02-08 14:32 风 阅读(1780) | 评论 (0) | 编辑 收藏

    关于RSS 2.0的规范实例

     RSS的历史

      那么RSS究竟代表什么呢?比较普遍的有两种说法,一种是“Rich Site Summary”或“RDF Site Summary”,另一种是“Really Simple Syndication”,之所以有这些分歧,需要从RSS发展的历史说起。

      最初的0.90版本RSS是由Netscape公司设计的,目的是用来建立一个整合了各主要新闻站点内容的门户,但是0.90版本的RSS规范过于复杂,而一个简化的RSS 0.91版本也随着Netscape公司对该项目的放弃而于2000年暂停。

      不久,一家专门从事博客写作软件开发的公司UserLand接手了RSS 0.91版本的发展,并把它作为其博客写作软件的基础功能之一继续开发,逐步推出了0.92、0.93和0.94版本。随着网络博客的流行,RSS作为一种基本的功能也被越来越多的网站和博客软件支持。

      在UserLand公司接手并不断开发RSS的同时,很多的专业人士认识到需要通过一个第三方、非商业的组织,把RSS发展成为一个通用的规范,并进一步标准化。于是2001年一个联合小组在0.90版本RSS的开发原则下,以W3C新一代的语义网技术RDF(Resource Description Framework)为基础,对RSS进行了重新定义,发布RSS1.0,并将RSS定义为“RDF Site Summary”。但是这项工作没有与UserLand公司进行有效的沟通,UserLand公司也不承认RSS 1.0的有效性,并坚持按照自己的设想进一步开发出RSS的后续版本,到2002年9月发布了最新版本RSS 2.0,UserLand公司将RSS定义为“Really Simple Syndication”。

      目前RSS已经分化为RSS 0.9x/2.0和RSS 1.0两个阵营,由于分歧的存在和RSS 0.9x/2.0的广泛应用现状,RSS 1.0还没有成为标准化组织的真正标准。


    什么是RSS?
     
        RSS是一种网页内容联合格式(web content sydication format)。 
        它的名字是Really Simple Syndication的缩写。 
        RSS是XML的一种。所有的RSS文档都遵循XML 1.0规范,该规范发布在W3C网站上。 
         
        在一个RSS文档的开头是一个<rss>节点和一个规定的属性version,该属性规定了该文档将以RSS的哪个版本表示。如果该文档以这个规范来表示,那么它的version属性就必须等于2.0。 
         
        在<rss>节点的下一级是一个独立的<channel>节点,该节点包含关于channel的信息和内容。 
         
    关于本文档     
        该文档是在2002年秋天撰写的,当时的RSS版本为2.0.1。 
        它包含从RSS 0.91规范(2000年)开始的所有的修改和添加,以及包含在RSS 0.92(2000年12月)和RSS 0.94(2002年8月)中的新的特性。 
        
    必需的频道节点 
        下面有一份必须包含的频道(channel)节点的列表,每一个都有一个简单的描述、一个例子、应该出现的位置和更详细描述的超链接。 
       

    元素 描述 范例
    title 频道(channel)名称。它可以告诉别人如何访问你的服务。如果你有一个与你的RSS文件内容一致的HTML网站,你的title元素值应该与你的网站的标题相同。 GoUpstate.com News Headings
    link 响应该频道的网站的URL http://www.goupstate.com/
    description 关于该频道的描述 The latest news from GoUpstate.com, a Spartanburg Herald-Joural Web Site

    可选的频道元素 
        下面是可选的频道元素列表 
     
    节点 描述 范例
    language  使用的语言。这允许聚合器对所有的意大利语站点分组。 en-us
    copyright 版权声明  Copyright 2002, Spartanburg Herald-Journal
    managingEditor 内容负责人的Email geo@herald.com (George Matesky)
    webMaster 技术人员的Email betty@herald.com (Betty Guernsey)
    pubDate 内容的发布时间 Sat, 07 Sep 2002 00:00:01 GMT
    lastBuildDate 最后更新时间 Sat, 07 Sep 2002 09:42:31 GMT
    category 指定该频道所属的一个或多个分类。遵循与item级category元素相同的规则。 <category>Newspapers</category>
    generator 生成该频道的程序名称 MightyInHouse Content System v2.3
    docs 指向rss格式文档的url地址? http://blogs.law.harvard.edu/tech/rss
    cloud 允许所有进程注册一个cloud用于获得频道的更新通知,并为rss种子实现一个轻量级的发布订阅协议。 <cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="pingMe" protocol="soap"/>
    ttl ttl是Time to live的缩写。它指示cache的有效保存时间。 <ttl>60</ttl>
    image 与频道一起显示的图片地址
    rating 该频道的统计图片地址
    textInput 指定一个textbox与该频道一起显示
    skipHours 告诉使用者哪些时段是可以忽略的
    skipDays 告诉使用着哪些天是可以忽略的

    <channel>子节点<image> 
    <image>是一个可选的<channel>子节点,该节点包含三个必需的子元素和三个可选的子元素。 
    <url>是GIF、JPEG或PNG图像文件的URL地址,该图像代表整个频道 
    <title>用于描述上面的图像,等同于HTML语言中的<img>的alt属性 
    <link>是要连接的站点的url,当显示频道时,图像的连接指向该站点。 
    <title>和<link>应该与频道的<title>和<link>有相同的值 
    可选的节点包括<width>和<height>,它们是数字类型,指定图像的宽度和高度,单位为像素 
    <description>就是link的TITLE属性中文本,它将在调用网页时显示出来。 

    图像宽度的最大值为144,默认值为88 
    图像高度的最大值为400,默认值为31 

    <channel>子节点<cloud> 
    <cloud>是一个可选的<channel>子节点。 
    它指定一个可以支持rssCloud接口的web服务,rssCloud接口可以用HTTP-POST,XML-RPC或SOAP1.1实现。 
    它的目的是允许通知注册为cloud的进程频道被更新,从而实现一个轻量级的发布订阅协议。 
    <cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure= "myCloud.rssPleaseNotify" protocol="xml-rpc" />
    在这个例子中,为了请求频道通知,你需要发送一个XML-RPC消息到rpc.sys.com的80端口,路径为/RPC2。调用的过程为myCloud.rssPleaseNotify。 

    <channel>子节点<ttl> 
    <ttl>是一个可选的<channel>子节点。 
    ttl是time to live的缩写。它表示频道在被刷新前应该被缓存的时间。这使得rss源可以被一个支持文件共享的网络所管理,例如Gnutella 
    例如:<ttl>60</ttl> 

    <channel>子节点<textInput> 
    <textInput>是<channel>的可选的子节点,<textInput>包含四个子节点。 
    <title>--提交按钮的标签 
    <description>--该文本输入区的描述 
    <name>--文本输入区的名称 
    <link>--处理文本输入的CGI脚本的URL 
    使用<textInput>的目的有些神秘(?)。你可以用它提供一个搜索引擎输入框,或让读者提供反馈信息。许多聚合器忽略该节点。 

    <item>的节点 
    一个频道可以包含许多项目(item)节点。一个项目可以代表一个故事——比如说一份报纸或杂志上的故事,如果是这样的话,那么项目的描述则是故事的概要,项目的链接则指向整个故事的存放位置。项目的所有节点都是可选的,但是至少要包含至少一个标题(title)和描述(description)。 

    节点 描述 范例
    title item的标题 Venice Film Festival Tries to Quit Sinking
    link item的URL  http://www.nytimes.com/2002/09/07/movies/07FEST.html
    description item概要 Some of the most heated chatter at the Venice Film Festival this week was about the way that the arrival of the stars at the Palazzo del Cinema was being staged.
    author 作者的email地址 oprah@oxygen.net
    category item可以包含在一个或多个分类中 Simpsons Characters
    comments 与item相关的评论的地址 http://www.myblog.org/cgi-local/mt/mt-comments.cgi?entry_id=290
    enclosure 附加的媒体对象
    guid 可以唯一确定item的字符串 http://inessential.com/2002/09/01.php#a2
    pubDate item发布的时间 Sun, 19 May 2002 15:21:36 GMT
    source rss频道来源 Quotes of the Day

    <item>子节点<source> 
    <source>是<item>的可选节点。 
    它的值是item来自的rss频道的名称,从item的title衍生而来。它有一个必须包含的属性url, 该属性链接到XML序列化源。 
    <source url="http://static.userland.com/tomalak/links2.xml">Tomalak's Realm</source>
    该节点的作用是提高连接的声望,进一步推广新闻项目的源头。它可以用在聚合器的Post命令中。当从聚合器通过webblog访问一个item时,<source>能够自动被生成。 

    <item>子节点<enclosure> 
    <enclosure>是<item>的可选节点。 
    它有三个必要的属性。url属性指示enclosure的位置,length指出它的字节大小,type属性指出它的标准MIME类型 
    url必须为一个http url。 
    <enclosure url="http://www.scripting.com/mp3s/weatherReportSuite.mp3" length="12216320" type="audio/mpeg" />

    <item>子节点<category> 
    <category>是<item>的可选节点。 
    它有一个可选属性或域,该属性是一个用来定义分类法的字符串。 
    该节点的值是一个正斜杠分割的字符串,它用来在指定的分类法中识别一个分级位置(hierarchic  location)。处理器可以为分类的识别建立会话。(Processors may establish conventions for the interpretation of categories)下面有两个例子: 
    <category>Grateful Dead</category> 
    <category domain="http://www.fool.com/cusips">MSFT</category>
    你可以根据你的需要为不同的域(domain)包含很多category节点,并且可以在相同域的不同部分拥有一个前后参照的item。 

    <item>子节点<pubDate> 
    <pubDate>是<item>的可选节点。 
    它的值是item发布的日期。如果它是一个没有到达的日期,聚合器在日期到达之前可以选择不显示该item。 
    <pubDate>Sun, 19 May 2002 15:21:36 GMT</pubDate>


    <item>子节点<guid> 
    <guid>是<item>的可选节点。 
    guid是globally unique identifier的缩写。它是一个可以唯一识别item的字符串。当item发布之后,聚合器可以选择使用该字符串判断该item是否是新的。 
    <guid>http://some.server.com/weblogItem3207</guid> 
    guid没有特定的语法规则,聚合器必须将他们看作一个字符串。生成具有唯一性的字符串guid取决于种子的源头。 
    如果guid节点有isPermaLink属性,并且值为真,读取器就会认为它是item的permalink。permalink是一个可在web浏览器中打开的url链接,它指向<item>节点所描述的全部item。 
    <guid isPermaLink="true">http://inessential.com/2002/09/01.php#a2</guid>

    isPermaLink是可选属性,默认值为真。如果值为假,guid将不会被认为是一个url或指向任何对象的url。

    <item>子节点<comment> 
     
    <comment>是<item>的可选节点。 
    如果出现,它指向该item评论的url 
    <comments>http://rateyourmusic.com/yaccs/commentsn/blogId=705245&amp;itemId=271</comments>

    <item>子节点<author> 
     
    <author>是<item>的可选节点。 
    它是item的作者的email。对于通过rss传播的报纸和杂志,作者可能是写该item所描述的文章的人。对于聚集型webblogs,作者可能不是责任编辑或站长。对于个人维护的webblog,忽略<author>节点是有意义的。 
    <author>lawyer@boyer.net (Lawyer Boyer)</author>

    posted @ 2009-01-19 13:30 风 阅读(581) | 评论 (0) | 编辑 收藏

    odbc 连接excel时sql应注意的事情

    查找一个sheet中的数据是用找个语句"SELECT   *   from   [Sheet1$]",如果sheet的名字是aaa应该写成[aaa$]。   语句应该是这样"SELECT   *   from   [aaa$]"。

    posted @ 2009-01-07 16:00 风 阅读(464) | 评论 (0) | 编辑 收藏

    weka使用入门

         摘要: 首先简单介绍一下weka,Weka是基于java,用于数据挖掘和知识分析一个平台。来自世界各地的java爱好者们都可以把自己的算法放在这个平台上,然后从海量数据中发掘其背后 ...  阅读全文

    posted @ 2008-11-14 15:27 风 阅读(2182) | 评论 (0) | 编辑 收藏

    I18N-国际化消息和日志

         摘要: 对于许多软件开发者来说,一提到国际化(亦称为 i18n)支持就会感到害怕。 要使编写的代码能够面向外国使用者,确实需要费一翻思量,因为在现有软件的代码中添加国际化支持可不是一件轻而易举的事。   阅读全文

    posted @ 2008-11-04 17:23 风 阅读(569) | 评论 (0) | 编辑 收藏

    设置正确的Content-Type以解决Ext的中文乱码问题

    设置正确的Content-Type以解决Ext的中文乱码问题


    1、前后台所有文件统一用utf-8编码方式。

    2、在Request Headers中设置Content-Type:application/x-www-form-urlencoded; charset=utf-8,具体方法:将Ext.lib.Ajax.defaultPostHeader += '; charset=utf-8'加在Ext.onReady块里,此方法可以解决用EXT在POST时的中文乱码问题。

    3、在Response Headers中设置Content-Type:text/json;charset=utf-8,在JAVA中实现方法:response.setContentType("text/json; charset=utf-8"),此方法可以解决用EXT在显示后台中文时的乱码问题。

    posted @ 2008-09-03 14:12 风 阅读(1210) | 评论 (0) | 编辑 收藏

    关于JFreechart柱状图 柱上不能显示数值的问题

    今天用jfreechart做图,发现生产的柱状图无法显示数值,经过一段时间摸索终于解决,现给一demo如下:

    test.jsp

    <%@ page contentType="text/html; charset=GBK" %>
    <%@ page import="org.jfree.chart.*"%>
    <%@ page import="org.jfree.chart.axis.AxisLocation"%>
    <%@ page import="org.jfree.chart.plot.*"%>
    <%@ page import="org.jfree.data.*"%>
    <%@ page import ="java.text.DecimalFormat"%>
    <%@ page import ="java.text.NumberFormat"%>
    <%@ page import ="java.awt.Color"%>
    <%@ page import="java.awt.Font"%>
    <%@ page import="org.jfree.chart.renderer.category.*"%>
    <%@ page import="org.jfree.chart.axis.*"%>
    <%@ page import="org.jfree.chart.title.TextTitle"%>
    <%@ page import="org.jfree.chart.labels.*"%>
    <%@page import="org.jfree.data.category.*"%>
    <%@page import="org.jfree.chart.plot.PlotOrientation"%>
    <%@page import="org.jfree.chart.servlet.ServletUtilities"%>
    <%
    CategoryDataset dcd= getDataset();


    JFreeChart chart= ChartFactory.createStackedBarChart3D("各部门参加培训情况", "部门", "人数", dcd, PlotOrientation.VERTICAL, true, false, false);

    // 图例字体清晰
    //chart.setTextAntiAlias(false);
    //chart.setBackgroundPaint(Color.WHITE);
    // 2 .2 主标题对象 主标题对象是 TextTitle 类型
    //chart .setTitle(new TextTitle("ok", new Font("隶书", Font.BOLD, 25)));
    // 2 .2.1:设置中文 // x,y轴坐标字体
    Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
    // 2 .3 Plot 对象 Plot 对象是图形的绘制结构对象
    CategoryPlot plot = (CategoryPlot)chart.getPlot();  

    ValueAxis rangeAxis = plot.getRangeAxis();
    //设置最高的一个 Item 与图片顶端的距离
    rangeAxis.setUpperMargin(0.15);
    //设置最低的一个 Item 与图片底端的距离
    rangeAxis.setLowerMargin(0.15);
    plot.setRangeAxis(rangeAxis);

    StackedBarRenderer3D renderer=new StackedBarRenderer3D();
    //renderer.setBaseOutlinePaint(Color.BLACK);

    //设置 Wall 的颜色
    //renderer.setWallPaint(Color.gray);

    //设置每种柱的颜色
    renderer.setSeriesPaint(0, new Color(153, 153, 255));
    renderer.setSeriesPaint(1, new Color(204, 255, 255));
    renderer.setSeriesPaint(2, Color.GREEN);

    //显示每个柱的数值,并修改该数值的字体属性
    renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
    renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,9));
    renderer.setItemLabelsVisible(true);

    plot.setRenderer(renderer);

     

    String filename=ServletUtilities.saveChartAsPNG(chart,500,300,null,session);
    String url=request.getContextPath()+"/servletDisplayChart?filename="+filename;

    %>
    <p align="center">
     <img src="<%=url%>" width="500" height="300" border="0" usemap="#map0">
    </p>
    <%!

      private static CategoryDataset getDataset()
        {
            DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
            defaultcategorydataset.addValue(10.399999999999999D, "培训人数", "中心机关");
            defaultcategorydataset.addValue(10.800000000000001D, "未培训人数", "中心机关");
            defaultcategorydataset.addValue(43.200000000000003D, "培训人数", "物探部");
            defaultcategorydataset.addValue(15.6D, "未培训人数", "物探部");
            defaultcategorydataset.addValue(23D, "培训人数", "遥感部");
            defaultcategorydataset.addValue(11.300000000000001D, "未培训人数", "遥感部");
            defaultcategorydataset.addValue(13D, "培训人数", "物业部");
            defaultcategorydataset.addValue(11.800000000000001D, "未培训人数", "物业部");
      defaultcategorydataset.addValue(15, "培训人数", "企业部");
            defaultcategorydataset.addValue(12D, "未培训人数", "企业部");
            return defaultcategorydataset;
        }

    %>

    posted @ 2008-07-22 13:55 风 阅读(5839) | 评论 (3) | 编辑 收藏

    快速创建个性化iGoogle主题的3个方法

    相信大多数人对iGoogle(Google 个性化首页)都不会陌生,除了可以定制iGoogle的内容之外,iGoogle的主题外 观都是可以定制的。之前Google官方只提供几个iGoogle主题,如今Google推出 了iGoogle主题API,任何人都可以轻松地创建个性化的主题。

    创建个性    化iGoogle主题

    然而,Google给出的API文档 是相当繁复的,非常考验英文与编程能力。这里介绍3种快速创建iGoogle主 题的方法,你可以不需要看那个复杂的文档,只需鼠标轻点即可完成个性化的主 题。

    1、igThemer

    igThemer是一个在线的主题编辑器,提供下图所示的各种参数的定制,包括 背景颜色、背景图片、选项卡颜色等等。

    创建个性    化iGoogle主题

    制作完成后点击create即可在线生成一个xml文件,文件会存储在igThemer网 站上,方便共享。你无需上传到自己的空间。

    2、Haochi's igthemer

    和igThemer几乎是一样的,目前似乎还在建设中。但依然可用。或许过一段 时间后会更完善。

    3、iGoogle theme API bookmarklet

    这个方法我最喜欢,与前两种相比,这个方法更实时。打 开iGoogle首页,把下面的代码粘贴到地址栏:

    javascript:var s=document.createElement('script');s.id="igteid"; s.type="text/javascript";s.src= "http://igoogle-theme-editor.googlecode.com/svn/" +"trunk/iGoogleThemeEditor/dist/ige.js?lang=en&" +new Date().getTime(); document.body.appendChild(s);void(0);

    浏览器的左侧马上出现了下图所示的编辑栏。

    创建个性    化iGoogle主题

    在编辑栏里你可以轻松地定制各种参数。参数得改变会即时在浏览器里显现 。最后,点击create xml,生成iGoogle主题。和igThemer不同,你需要把这个 xml文件上传到自己的空间上方可使用。

    如何使用iGoogle主题?

    如果你的主题是自用的,把生成的xml文档上传到网上,然后在浏览器里输入 下面的地址即可使用:

    http://www.google.com/ig?skin=主题地址

    当然,你还可以将主题 提交到iGoogle目录,Google采纳后,每个人都可以直接使用。目前iGoogle目录里已经有将近50 个主题。

    posted @ 2008-07-01 12:53 风 阅读(407) | 评论 (0) | 编辑 收藏

    Apache Maven 2 简介(目前最全的技术资料了)

         摘要: Sing Li (westmakaha@yahoo.com), 作家, Wrox Press 2007 年 1 月 08 日 现代软件项目不再是单个本地团队独立开发的产物。随着健壮的企业级开源组件的可用性日益提高,当今的软件项目需要项目团队间的动态协作,往往也需要混合使用在全球范围内创建和维护的组件。如今,Apache Maven 构建系统步入了第二代,它和由 Internet 带来的全球软件...  阅读全文

    posted @ 2008-06-18 14:36 风 阅读(4424) | 评论 (1) | 编辑 收藏

    仅列出标题
    共20页: First 上一页 3 4 5 6 7 8 9 10 11 下一页 Last 
     
    Powered by:
    BlogJava
    Copyright © 风