??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲日韩精品无码专区加勒比 ,国产精品亚洲一区二区三区在线,亚洲精品天天影视综合网http://www.tkk7.com/kingwell/category/8835.htmlAspire to Professionalismzh-cnWed, 28 Feb 2007 07:46:05 GMTWed, 28 Feb 2007 07:46:05 GMT60开放源代码的全文检索引擎Lucene(转蝲Q?http://www.tkk7.com/kingwell/articles/49510.htmlKingWellKingWellThu, 01 Jun 2006 03:45:00 GMThttp://www.tkk7.com/kingwell/articles/49510.htmlhttp://www.tkk7.com/kingwell/comments/49510.htmlhttp://www.tkk7.com/kingwell/articles/49510.html#Feedback0http://www.tkk7.com/kingwell/comments/commentRss/49510.htmlhttp://www.tkk7.com/kingwell/services/trackbacks/49510.html阅读全文

KingWell 2006-06-01 11:45 发表评论
]]>
什么是Portlet ?http://www.tkk7.com/kingwell/articles/48559.htmlKingWellKingWellSun, 28 May 2006 01:01:00 GMThttp://www.tkk7.com/kingwell/articles/48559.htmlhttp://www.tkk7.com/kingwell/comments/48559.htmlhttp://www.tkk7.com/kingwell/articles/48559.html#Feedback0http://www.tkk7.com/kingwell/comments/commentRss/48559.htmlhttp://www.tkk7.com/kingwell/services/trackbacks/48559.htmlobserver
原文地址:http://www.onjava.com/pub/a/onjava/2005/10/19/challenging-java-dominance.html
中文地址:http://www.matrix.org.cn/resource/article/44/44029_Portlet.html
关键词:(x) Portlet Java


Portlets
“Portlets是一UWeblgQ就像servletsQ是专ؓ(f)合成页面里的内容聚集在一赯设计的。通常h一个portal面?x)引发多个portlets被调用。每个portlet都会(x)生成标记D,q与别的portlets生成的标记段l合在一起嵌入到portal面的标记内。”(摘自Portlet规范QJSR 168Q?br />
本文探讨了以下内容:(x)
1.        Portal面的元?
2.        Portal是什么?
3.        Portlets是什么?
4.        开发“Hello World?Portlet
5.        在Pluto上部|HelloWorld Portlet
6.        如何创徏Portal面
7.        l束?
8.        资源


  Portlet规范?yu)portlet定义ZU“基于Java技术的weblgQ由处理h和生成动态内容的portlet容器理”。这D话听v来是不是有些费解Q本文将说明portlets是什么以?qing)能用它们做什么?br />

?昄了在讉K一个portal服务器时览器中面的样子?br />
image
? 典型的portal服务器的面Q点?yn)L看原图)

  如果仔细查看览器里的页面,׃(x)看到面是由不同的“窗口”组成的。一个窗口用于刷新天气,另一个用于新闻,q有一个用于刷新股P{等。这里的每一个窗口都代表了一个portlets。如果看得再仔细些,q会(x)发现每个H口都有一个标题条和一些按钮,包括最化和最大化按钮?br />
  在系l里Q这些窗口是怺独立开发、各不同的应用。新闻portlet的开发者创建应用ƈ打包成war格式的文?随后portal服务器的理员在服务器上部v该war文gq创建页面,接下来每个用户会(x)选择在他的页面里有哪些应用。例如,如果用户对股价不感兴而对体育感兴,他可以用“体肜y窗口替换“股价”窗口?br />
  Portlet技术需要学?fn)许多新概念Q本文不可能全都늛Q因此本文分Z部分。在W一部分里我们详l说明portals和portletsQƈ开发一个简单的“Hello World”portletQ在W二部分我们探讨一些高U主题?br />
  我们用Apache的Pluto服务器(Portlet API 1.0规范的参考实玎ͼ来测试我们的CZportletsQ我们还?x)花些时间探讨如何安装和使用Pluto服务器?br />
Portal面的元?/span>

?昄了Portal面的各U元素?br />
image
? portal面的元?br />
  每个portlet面׃个或多个portletH口l成Q每个portletH口又分Z部分Q一个是外观Q它军_了portletH口的标题条、控制和边界的样式;另一个是portletD,它由portlet应用填充?br />
  Portal服务器决定了portal面的整体观感,像标识、标题条颜色、控制图标等。通过修改几个JSP和css模板文g可以改变portal的整个观感。我们将在“如何创建portal面”部分对此做深入讨论?br />
Portal是什么?

  在了解portlet之前有必要先了解portal。在Portlet规范里是q样讲的Q“portal是一Uweb应用Q通常用来提供个性化、单ơ登录、聚集各个信息源的内容,q作Z息系l表现层的宿丅R聚集是指将来自各个信息源的内容集成C个web面里的zd”?br />
  Portal的功能可以分Z个主要方面:(x)
1.        Portlet容器QPortlet容器与servlet容器非常cMQ所有的portlet都部|在portlet容器里,portlet容器控制portlet的生命周期ƈ为其提供必要的资源和环境信息。Portlet容器负责初始化和销毁portletsQ向portlets传送用戯求ƈ合成响应?br />2.        内容聚集QPortlet规范中规定portal的主要工作之一是聚集由各种portlet应用生成的内容,我们在“如何创建Portal面”部分对此做q一步讨论?br />3.        公共服务Qportlet服务器的一个强Ҏ(gu)它所提供的一套公共服务。这些服务ƈ不是portlet规范所要求的,但portal的商业实现版本提供了丰富的公共服务以有别于它们的竞争者。在大部分实C都有望找到的几个公共服务有:(x)
         o 单次dQ只需dportal服务器一ơ就可以讉K所有其它的应用Q这意味着你无需再分别登录每一个应用。例如一旦我d了我的intranet|站Q我p讉Kmail应用、IM消息应用和其它的intranet应用Q不必再分别dq些应用?br />  Portal服务器会(x)Z分配一个通行证库。你只需要在mail应用里设定一ơ用户名和密码,q些信息以加密的方式存储在通行证库中。在你已d到intranet|站q要讉Kmail应用的时候,portal服务器会(x)从通行证库中读取你的通行证替你登录到mail服务器上。你对其它应用的讉K也将照此处理?br />          o个性化Q个性化服务的基本实C用户能从两方面个性化她的面Q第一Q用户可以根据她的自w喜好决定标题条的颜色和控制图标。第二,用户可以军_在她的页面上有哪些portlets。例如,如果我是个体育迷Q我可能?x)用一个能提供我钟q队最C息的portlet来取代股和新闻portlets?br />        一些在个性化服务斚w领先的商业实现版本允怽建立为用hCZ么样的应用所依据的标准(如收入和兴趣Q。在q种情况下,可以讑֮一些像“对M收入为X的用hC馈赠商品的portlet”和“对M收入为X的用hC打折商品的portlet”这L(fng)商业规则?br />
        此外q有一些公共服务,比如机器译Q是由portal服务器将portlet生成的内容翻译ؓ(f)用户要求的语a。大部分的商业portal服务器都支持手持讑֤讉Kq具有针对不同的览l端生成不同内容的能力?br />
Portlets是什么?

  与servletscMQportlets是部|在容器内用来生成动态内容的weblg。从技术角度讲portlet是一个实Cjavax.portlet.Portlet接口的类Q它被打包成war文g格式部v到portlet容器里?br />
  Portlets在以下方面与servlets怼Q?br />1.        portletsq定的容器理?br />2.        portlets生成动态内宏V?br />3.        portlet的生命周期由容器理?br />4.        portlets通过h/响应模式与web客户端交互?br />
  Portlets在以下方面与servlets相异Q?br />1.        portlets只能生成标记D,而不是整个文档?br />2.        portlets没有可供直接讉K的URL地址。不q你q是能够让别人通过URL讉K到portletQ你可以把包含该portlet的页面的URL发给他?br />3.        portlets不能随意地生成内容,q是因ؓ(f)portlet生成的内Ҏ(gu)l要成ؓ(f)portal面的一部分。如果portal服务器要求的是html/textcdQ那么所有的portlets都应生成html/textcd的内宏V再比方_(d)如果portal服务器要求的是WMLcdQ那么所有的portlets都应生成WMLcd的内宏V?br />
  portletsq提供了一些附加的功能Q?br />1.        讄参数的持久化存储Qportlets提供了一个PortletPreferences对象用来保存用户的设|参数。这些参数被存入一个持久化数据库,q样服务器重启后数据依然有效。开发者不必关心这些数据存储的具体实现机制?br />2.        h处理Qportlets提供了更为细_度的请求处理。对于用户在portlet上动作时向该portlet发出的请?一U称为活跃期的状?Q或者因用户在其它portlet上动作而引发的h面hQPortal服务器提供了两种不同的回调方法来处理?br />3.        Portlet模式Qportlets用模式的概念来表C用户在做什么。在使用mail应用的时候,你可能会(x)用它来读信、写信或查信件――这些都是mail应用的预定功能,Portlets通常以VIEW模式提供q些功能。但q有一些活动,像指定刷新时间或Q重斎ͼ讄用户名和密码Q这些活动允许用户定制应用的行ؓ(f)Q因此它们用的是EDIT模式。Mail应用的帮助功能用的是HELP模式?br />
  如果仔细x其实q里面ƈ没有什么新东西Q它们反而大部分都是普通的业务需求。Portlet规范的作用在于它提供了一个抽象层Q这才是它对所有与之相关的人-最l用戗开发者和理员-的h(hun)值所在?br />
  作ؓ(f)一个开发者,我会(x)所有与VIEW模式有关的业务逻辑攑օdoView()Ҏ(gu)Q将与应用配|有关的业务逻辑攑օdoEdit()Ҏ(gu)Q将与帮助有关的逻辑攑օdoHelp()Ҏ(gu)

  q就化了理员对portlet应用的访问控制管理,因ؓ(f)他只需改变portlet的访问权限就能决定用戯做什么。例如,如果mail应用的一个用戯够在EDIT模式下设定用户名和密码,那么可以断定他hEDIT模式讉K权限?br />
  不妨考虑q样一U情形:(x)我是一个intranet|站的管理员Q我的公怹了一个能昄新闻信息的第三方portlet应用Q该应用允许用户指定跟踪新闻更新的URL地址Q我惛_助它ؓ(f)用户昄公司的内部新闅R另一个需求是我不惌用户通过该应用来跟踪M其它的新M息来源。作为管理员Q我可以为所有的用户指定一个用于内部新L新的URL地址Q同旉过改变portlet应用的部|描q符来取消其它h修改该地址的权限?br />
  ׃所有的portlet应用都具有相似的UI界面Q因此采用portlets可ɾ|站Ҏ(gu)l用h具吸引力。如果她想阅MQ何一个应用的帮助信息Q她可以点击帮助按钮Q她也知道点ȝ辑按钮能让她q入应用的配|屏。标准化的用L(fng)面你的portlet应用更引人?br />
4.        H口状态:(x)H口状态决定了portal面上留lportlet生成内容的空间。如果点?yn)L大化按钮Qportlet占据整个屏q,成ؓ(f)用户唯一可用的portletQ而在最化状态,portlet只显CZؓ(f)标题条。作为开发者应当根据可用空间的大小来定做内宏V?br />
5.        用户信息Q通常portlets向发求的用户提供个性化的内容,Z能更加行之有效,portlets需要访问用L(fng)属性信息,如姓名、email、电(sh)话等。Portlet API为此提供了用户属性的概念Q开发者能够用标准的方式访问这些属性,q由理员负责在q些属性与真实的用户信息数据库Q通常是LDAP服务器)之间建立映射关系?br />
  我们在本文的第二部分深入讨些特点-h处理、用户信息和portlet模式?br />
开?Hello World" Portlet

  现在我们来开发一个简单的HelloWorld portlet?br />1.        创徏一个名为HelloWorld的web目Q它与通常的servlet目cMQ有一?WEB-INF/web.xml文g作ؓ(f)目的部|描q符?br />
2.        在build path里加入portlet-api-1.0.jar文gQ该jar文g是Pluto发行包的一部分?br />
3.        在Source文g夹中按如下内容创建HelloWorld.java文gQ?br />
public class HelloWorld extends GenericPortlet{
  protected void doView(RenderRequest request,
  RenderResponse response) throws
  PortletException, IOException {
        response.setContentType("text/html");
        response.getWriter().println("Hello Portlet");
        }
}


  每个portlet都要实现Portlet接口Q该接口为portlet定义了生命周期方法。由于不惌盖所有这些方法,我们只对GenericPortletc进行扩展,它是一个实CPortlet接口的适配器类。GenericPortletcL供了所有生命周期方法的默认实现Q所以我们只需实现我们所需要的Ҏ(gu)?br />
  我们?HelloWorld portlet里要做的只是昄“Hello Portlet”,所以我们将覆盖GenericPortletcȝdoView()Ҏ(gu)Q该Ҏ(gu)以PortletRequest ?PortletResponse作ؓ(f)参数。在doView()Ҏ(gu)中首先调用response.setContentType()以通知portlet容器该portlet要生成何种cd的内容-如果不这样做׃(x)DIllegalStateException异常。一旦设|了内容的类型,可以从response对象中获得PrintWriterq开始写入?br />
4.        每个portlet应用?WEB-INF文g夹中都有一个portlet.xml文gQ它是portlet应用的部|描q符。按以下内容创徏portlet.xml文gQ?br />
<portlet>
  <description>HelloWorldDescription
        </description>
    <portlet-name>HelloWorld
        </portlet-name>
    <display-name>Hello World
        </display-name>

    <portlet-class>com.test.HelloWorld
        </portlet-class>
    <expiration-cache>-1
        </expiration-cache>
        <supports>
          <mime-type>text/html</mime-type>
      <portlet-mode>VIEW
          </portlet-mode>
        </supports>
    <supported-locale>en
        </supported-locale>

        <portlet-info>
          <title>Hello World</title>
          <short-title>Hello World
          </short-title>
          <keywords>Hello,pluto</keywords>
      </portlet-info>
</portlet>


  <portlet-name>元素声明了portlet的名字,<portlet-class>元素指定了portlet的全限定cdQ?lt;expiration-cache>元素以秒为单位指定了内容期的时间。这里面有一炚w要注意:(x)你在portlet上的某些动作可能?x)导致内容刷斎ͼq与~存旉无关?br />  <supports>元素指定对于l定?lt;mime-type>有哪些模式可供支持。在CZ中我们假定HelloWorld只能生成text/htmlcd的内容,且只有view模式可支持该内容cd。如果要增加对其它内容类型的支持Q需要添加新?lt;support>元素q指定支持该MIMEcd的模式有哪些。通常portlet对于text/htmlcd有VIEW、EDIT和HELP模式可供支持Q而对于WML MIMEcd则只有VIEW模式?br />  q可以用<supported-locale>元素来指定portlet支持哪些本地化?lt;title>元素用来指定portlet的标题。如果要Ҏ(gu)题做国际化处理,可以用元?lt;resource-bundle>指定资源Q比例properties文gQ的文g名。在q种情况下,容器根据用h在的地区从适当的properties文g中选择标题?br />
5.        每个portlet应用都是一个web应用Q因此除了portlet.xml文g之外q需要有web.xml文g?br />
<web-app>
  <display-name>Hello World Portlet
  </display-name>
  <welcome-file-list
    <welcome-file>index.jsp
        </welcome-file>
  </welcome-file-list>
</web-app>


6.        接下来将q些文gq行~译q打包ؓ(f)war文g。你可以自己完成q些工作Q或者下载带有build.xml 的示例代码(参见“资源”部分)来创建war文g?br />在Pluto上部|HelloWorld Portlet

  Pluto处于开发阶D늚早期Q因此还没有一套易于用的理工具。ؓ(f)了能使用Pluto服务器,需要将~译和源代码两个版本都下载。需要注意的是以下说明是针对Windowsq_的,Unix用户通过修改斜杠W号和执行sh shell脚本Q不是bat批命令文Ӟ?x)得到类似的l果?br />
1.        创徏一个文件夹Q比如C:\PlutoInstallation?br />2.        从Pluto的网站下载pluto-1.0.1-rc1.zip和pluto-src-1.0.1-rc1.zip?br />3.        pluto-1.0.1-rc1.zip解压到C:\PlutoInstallation.文g夹,它应被解压到C:\PlutoInstallation\pluto-1.0.1-rc1文g夹下?br />4.        执行C:\PlutoInstallation\pluto-1.0.1-rc1\bin\startup.bat启动PlutoQ现在可以通过地址http://localhost:8080/pluto/portal讉KPluto服务器?br />5.        pluto-src-1.0.1-rc1.zip解压到C:\PlutoInstallation\PlutoSrc文g夏V?br />6.        q入C:\PlutoInstallation\PlutoSrc文g夹,执行maven distribute:all.Q编译ƈ下蝲q行常规理d所必需的相兌源文件。现在可以将HelloWorldPortlet.war作ؓ(f)portletq行安装了?br />7.        首先HelloWorldPortlet.war文g拯到C:\PlutoInstallation\portlets目录Q如果没q个目录创建它?br />8.        C:\PlutoInstallation\plutosrc\build.properties.sample更名为build.properties?br />9.        ~辑build.propertiesQ将maven.tomcat.home指向Pluto~译版的安装位置Q在本例中应改ؓ(f)maven.tomcat.home=C:/PlutoInstallation/pluto-1.0.1-rc1?br />10.        Z安装portletQ进入C:\plutoInstallation\plutosrc\deploy文g夹,执行maven deploy -Ddeploy=c:\PlutoInstallation\portlets\HelloWorldPortlet.warQ应能看到“build successful”信息?br />11.        在C:\PlutoInstallation\pluto-1.0.1-rc1\webapps文g夹下Q应该有一个HelloWorldPortlet文g夏V?br />12.        现在q入C:\PlutoInstallation\pluto-1.0.1-rc1\webapps\HelloWorld\WEB-INF\ folder文g夹,打开portlet的web.xml文gQ你?x)发现里面自动多了几行,如下所C:(x)
<servlet>
  <servlet-name>HelloWorld</servlet-name>
     <display-name>HelloWorld Wrapper</display-name>
      <description>Automated generated
      Portlet Wrapper</description>
      <servlet-class>org.apache.pluto.core.PortletServlet
      </servlet-class>
      <init-param>
         <param-name>portlet-class</param-name>
         <param-value>com.test.HelloWorld
         </param-value>
      </init-param>
      <init-param>
         <param-name>portlet-guid</param-name>
         <param-value>HelloPluto.HelloWorld
         </param-value>
      </init-param>
</servlet>

13.        接下来我们将该portlet加到面里。进入C:\PlutoInstallation\pluto-1.0.1-rc1\webapps\pluto\WEB-INF\data文g夹,可以看到有两个XML文gQpageregistry.xml和portletentityregistry.xml?br />14.        portletentityregistry.xml包含了portlet的定义,在该文g中加入以下几行:(x)
 <application id="5">
   <definition-id>HelloWorld</definition-id>
     <portlet id="1">
       <definition-id>HelloWorld.HelloWorld</definition-id>
     </portlet>
</application>

  应用?lt;definition-id>应ؓ(f)web应用所在文件夹的名字,portlet?lt;definition-id>应与web.xml中生成的portlet-guid怸致?br />15.        pageregistry.xml定义了页面中包含了哪些portletsQ对该文件做如下改动Q?br />
  <fragment name="p2" type="portlet">
    <property name="portlet" value="5.1"/>
</fragment>

16.        执行shutdown命o(h)和startup命o(h)重启Pluto服务器,q回到地址http://localhost:8080/pluto/portalq点几ZTest Link”-此时面中将出现我们?br />
HelloWorld portlet?/span>

?的右侧显CZHelloWorld portlet看上ȝ样子?br />
image
? portlet的屏q截?br />
如何创徏Portal面

?昄了portal容器如何分ȝportletsl装为页面?br />
image
? 创徏Portal面

  大部分的portal服务器基本上都是部v于应用服务器上的web应用Q通过servlet来处理访问portal服务器的h。查看一下Pluto的安装目录就?x)发现Pluto不过是一个部|于Tomcat服务器上的一个普通web应用Q再看看C:\PlutoInstallation\pluto-1.0.1-rc1\webapps\pluto\WEB-INF\web.xml?x)发现所有发往Pluto服务器的h都被映射到org.apache.pluto.portalImpl.Servlet上?br />
  在本文开始部分“Portal面的元素”中Q我们提到portal面׃部分l成。一部分是由面中的portlets生成的内容,另一部分是由portal服务器生成的内容?br />
  在Pluto里,只要用户发出hQ就?x)由servletq行控制Q根据用hh的页面来定需要显C的portlets的列表。一旦生成了列表Qservlet将控制转给q些portletsU程q收集由它们生成的内宏V?br />
  对于由portal服务器生成的内容Q像portal|站的观感及(qing)每个portlet的外观和控制之类Q则取决于C:\PlutoInstallation\pluto-1.0.1-rc1\webapps\pluto\WEB-INF\aggregation文g夹下的JSP文g。RootFragment.jsp是主JSP文gQ它军_了整体的观感和对齐方式;它还包含了Heads以定义在生成的页面中?lt;HEAD>标签里的内容。TabNavigation.jsp用来选择在banner中该昄什么(默认情况下在banner昄列表中也包扩了pluto.png囄Q。TabNavigation.jsp用来定portal|站的导航方案。这意味着只需改动该文件夹下少量的几个JSP文gQ就能改变整个portal|站的观感?br />
  PlutoҎ(gu)pageregistry.xml中的讄定面中有多少行,q用RowFragment.jspd充。ColumnFragment.jsp用来填充每个栏目。PortletFragmentHeader.jsp用来填充每个portlet的页_(d)像标题条?qing)最大化和最化控制。footer.jsp用来填充JSP的页脚。如果去看一下portal面的HTML代码׃(x)发现每个portletH口无非都是嵌入<TD>标签的内容块?br />
l束?/span>

  M一U新技术要惌得成功都应具备以下条Ӟ(x)首先Q它能提升现有技术;其次Q它能解决现有技术遇到的普遍问题Q再ơ,它能提供多于一个的抽象层(有h_(d)每抽象出一层,问题p决一半)?br />
  ׃portlet与现有的应用服务器架构兼容,q对Portlet API来说是一ơ发展servlet技术的好机?x)。你可以从portlet里调用EJBQ或者用它启动和参与由应用服务器控制的全局性事务。换句话_(d)在以商业逻辑为核心的领域里,portlet完全可以做得和servlet一样好?br />
  Portlets提供了一个抽象层Q现在你不必再担心客L(fng)使用了什么样的HTTPҎ(gu)Q也不必自己~写E序L获像点击按钮q样的客L(fng)事g。最后但l不是最ơ要的一Ҏ(gu)Qportlets以提供像单次d、个性化{服务的方式解决了servlets不能解决的大部分问题?br />
资源
·本文的示例代?/a>
·JSR 168的首?http://www.jcp.org/en/jsr/detail?id=168
·Pluto的首?http://portals.apache.org/pluto/
·onjava.com:
onjava.com
·Matrix-Java开发者社?http://www.matrix.org.cn

KingWell 2006-05-28 09:01 发表评论
]]>
单点d的简单实?/title><link>http://www.tkk7.com/kingwell/articles/46696.html</link><dc:creator>KingWell</dc:creator><author>KingWell</author><pubDate>Wed, 17 May 2006 14:08:00 GMT</pubDate><guid>http://www.tkk7.com/kingwell/articles/46696.html</guid><wfw:comment>http://www.tkk7.com/kingwell/comments/46696.html</wfw:comment><comments>http://www.tkk7.com/kingwell/articles/46696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kingwell/comments/commentRss/46696.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kingwell/services/trackbacks/46696.html</trackback:ping><description><![CDATA[ <p>  在门户项目中Q经怼(x)遇到如何实现单点d的问题,下面本人的l验做个ȝ。欢q大家进行补充讨论?/p> <h3>单点d的具体实现有很多U选择Q包括:(x)</h3> <ol> <li>采用专门的SSO商业软gQ?主要有:(x)Netgrity的SiteminderQ已l被CA收购。Novell 公司的iChain。RSA公司的ClearTrust{? </li> <li>采用门户产品供应商自qSSO产品Q如QBEA的WLESQIBM 的Tivoli Access ManagerQSun 公司的identity ServerQOracle公司的OID{? </li> <li>q些商业软g一般适用于客户对SSO的需求很高,q且企业内部采用COTS软g如:(x)Domino,SAP,Sieble的系l比较多的情况下采用。ƈl合w䆾理。统一认证{项目采用。采用这些Y件一般都要对要集成的pȝ做些攚w,如在要集成的pȝ上安装AGENT。现在一般只提供常见软g如:(x)Domino,SAP,SiebleQ常见应用服务器Qweblogic,websphere{的AGENT。要先统一q些pȝ的认证。一般采用LDAP或数据库。然后才能实现SSO。比较麻烦? </li> <li>另外Q如果不x银子Q也有OPEN SOURCE的SSO软g可选:(x)主要有:(x)<a target="_blank">http://www.josso.org/</a><a target="_blank">https://opensso.dev.java.net/</a><a target="_blank">http://www.sourceid.org</a> {。具体怎么样就不清楚了?</li> </ol> <p>  如果目对SSO的要求比较低Q又不想对要被集成的pȝ做Q何改动,可采用下面介l的方式单实玎ͼ(x)下面我们通过一个例子来说明。假如一个门户项目要对下面的几个pȝ做SSO?/p> <p align="center"> <img height="351" alt="图一" src="http://dev2dev.bea.com.cn/images/image060228002.gif" width="554" border="0" /> </p> <p>  用户在这些系l中的用户名Q密码各不相同,如:(x)员工号ؓ(f)001的员工在q些pȝ中的用户名,密码分别如下Q?/p> <table class="tabel-general" cellspacing="0" cellpadding="0" width="100%" align="center"> <tbody> <tr> <th class="left">用户</th> <th class="center">pȝ</th> <th class="center">用户?/th> <th class="right">密码</th> </tr> <tr> <td>001</td> <td>Portalpȝ</td> <td>A</td> <td class="right">1234</td> </tr> <tr> <td>001</td> <td>邮gpȝ</td> <td>B</td> <td class="right">2345</td> </tr> <tr> <td>001</td> <td>DOMINOpȝ</td> <td>C</td> <td class="right">AAAA</td> </tr> <tr> <td>001</td> <td>报销pȝ</td> <td>D</td> <td class="right">CCCC</td> </tr> <tr> <td>001</td> <td>工资pȝ</td> <td>E</td> <td class="right">BBBB</td> </tr> </tbody> </table> <h4>首先Q徏立员工在PORTALpȝ中的用户名和其他pȝ中的用户名之间的对应关系 </h4> <p>  首先Q要建立员工在PORTALpȝ中的用户名和其他pȝ中的用户名之间的对应关系q保存。可保存在表中或LDAP中或文gpȝ中。当然要考虑q些pȝ之间的数据同步问题。比较好的方式是扑ֈ用户在这些系l中的都存在的唯一信息Q如员工PMAIL地址Q姓名等Q。通过唯一信息实时到各个系l中d认证所需要的信息。就不需要考虑数据同步问题。比较实用。可以徏立类g面的表:(x)密码可采用加密保存。如果是采用BEA的Weblogic Portal,可采用UUP来保存这些信息?/p> <pre class="code"> ( user varchar2(20), /*用户?/ app_name varchar2(20), /*应用pȝ*/ architect varchar2(4), /*应用pȝ的架构BS或CS*/ app_company varchar2(50), /*用户所属分公司*/ app_department varchar2(50), /*用户所在的部门*/ app_user varchar2(15), /*在该pȝ中的用户?/ app_passwd varchar2(15), /*在该pȝ中的密码*/ app_cookie varchar2(30), /*COOKIE名称*/ form_user varchar2(20), /*认证面中FORM的用户名字段*/ form_passwd varchar2(20), /*认证面中FORM的密码字D?/ app_special varchar2(20) /*其他*/ ); </pre> <h4>通过IFRAME或超q接方式集成目标pȝQƈq行SSO</h4> <p>  通过IFRAME或超q接方式集成目标pȝ,q在URL中带上用户名和密码。如集成DOMINO可采用如下方式:(x)</p> <p>  <IFRAME src=<a href="http://host1/names.nsf?Login&Username=admin&Password=pass&RedirectTo=/names.nsf" target="_parent">http://host1/names.nsf?Login&Username=admin&Password=pass&RedirectTo=/names.nsf</a><br />width="100%" frameborder="0" align="middle" height="100%" hspace="0" marginheight="0" marginwidth="0" scrolling="yes" style="background-color:#f7f7ff;"><br /></IFRAME></p> <p>  或:(x) <br />Href src=?a href="http://localhost/names.nsf?Login&Username=admin&Password=password&RedirectTo=/names.nsf" target="_parent">http:// </a><a href="http://host1/names.nsf?Login&Username=admin&Password=password&RedirectTo=/names.nsf" target="_parent">host1</a><a href="http://localhost/names.nsf?Login&Username=admin&Password=password&RedirectTo=/names.nsf" target="_parent">/names.nsf?Login&Username=admin&Password=pass&RedirectTo=/names.nsf</a>?<br />以上采用的是在HTTP中直接传递明码,为提高安全性,可采用HTTPS来传递用户名和密码。另外采用这U方式被集成的系l必L持FORM方式认证。J2EE应用QDOMINO{都支持FORM认证?/p> <p>  q两U方式如果SSO成功Q就自动q入目标pȝ的界面,如果实现?x)显C目标系l的d界面。其效果囑֦下:(x)</p> <p align="center"> <img height="355" alt="d界面" src="http://dev2dev.bea.com.cn/images/image060228004.jpg" width="552" /> </p> <p>  q种方式Q必ȝ护对应关p表Q如上面的sso_info。更好的方式是提供界面,让最l用戯q护这U对应关p,可模仿Compoze portlets for lotus的做法,在用L(fng)一ơ进入要与之做SSO的系l时Q如DOMINOpȝQ显CZ个界面,让用戯p入他在该pȝ中的用户?密码{信息。ƈ保存到表中或LDAP{其他数据源中。以后用戯q入q些pȝӞq接从表中或其他数据源中取用户的用户名/密码{信息,帮助用户做认证。徏议采用这U方式。如下图所C。如果用h变了自己在DOMINOpȝ中的用户名,密码。从门户pȝq入DOMINOpȝӞ认证?x)失败,重新显C类g面的界面。让用户重新输入他在DOMINOpȝ中新的用户名Q密码ƈ保存?/p> <p align="center"> <img height="354" alt="认证p|" src="http://dev2dev.bea.com.cn/images/image060228006.jpg" width="575" /> </p> <p>  以上q种实现方式Q一般需要浏览器支持COOKIEQ所以要注意览器的配置Q在开发阶D,为方便调试,可设|IEQ让它显CCOOKIE的名U。如下所C:(x)</p> <p align="center"> <img height="285" alt="览器的配置" src="http://dev2dev.bea.com.cn/images/image060228008.gif" width="553" border="0" /> </p> <p>  采用q种方式Q对要集成的pȝ不需要做M的改动。如果PORTALpȝ中的用户在被集成的系l中的权限都一P可采用徏立一个通用用户的做法。也是所有在PORTALpȝ中的用户都采用这个通用用户q入目标pȝ。这U方式等于是采用面集成方式做集成。比较方便用。另外,有时候需要采用调用APIQ或配置Adapter{应用集成方式来集成其他pȝQ一般也是通过定义一个连接专用的用户。在API中或在配|Adapter的时候写歅R如采用JAVA API方式集成DOMINOQ?/p> <p>  <b>lotus.domino.Session dominoSession = NotesFactory.createSession(dominoServer, “admin? “password?;</b></p> <h4>CSl构实现方式</h4> <p>  l常有h问CSl构的应用如何实现SSOQ本人的是对q种pȝ不要自己d现SSO。很ȝQ其实输个用户名Q密码没什么大不了的。如果要实现Q一是采用商业Y件。另外也可以采用以下方式Q在PORTAL的PORTLET上徏立超q接。ƈ通过APPLET方式启动CSl构的应用系l的d界面。然后通过如下的方式把用户?密码传递过厅R?/p> <p>  <b>-不能做Q何改动的客户?/b> - WIN消息Q给dH口发送用户名Q密码等d所需要的信息Q?模拟键盘Qjava有模拟键盘输入的APIQ?/p> <p>  -<b>可以做改动的客户?/b> - 参数传递,q让d的EXE文gd参数q行认证?/p> <p>  因ؓ(f)要让APPLET执行本地的EXE文gQ所以必dIE中的JRE的安全进行设|?/p> <p align="center"> <img height="213" alt="对IE中的JRE的安全进行设|? src="http://dev2dev.bea.com.cn/images/image060228010.gif" width="554" border="0" /> </p> <h4>其他Q?/h4> <p>  在采用以上方式实CSSO后,要注意LOGOUTQ可采用与LOGIN相同的方式。也可以通过被集成系l的时讄来实现?/p> <h4>单点dSSO技术资料收?/h4> <ul> <li> <a target="_blank">l一用户认证和单点登录解x? </a> 计算Z界网上的文章,比较全面的介l统一用户认证和单点登录解x? </li> <li> <a target="_blank">惠普灵动单点d(SSO)解决Ҏ(gu):</a>  包括C/Sl构的系l单点登录解x? </li> <li> <a target="_blank">|站用户单点dpȝ解决Ҏ(gu):</a>  通过令牌方式实现|站用户单点d </li> <li> <a target="_blank">WebLogicq_的Web SSOQSAMLQ解x?</a>  在WebLogic 8.1SP4中,提供了用于和Microsoft Windows客户端进行SSO的Single Pass Negotiate Identity Assertion Provider。本文对其做了详l的介绍? </li> <li> <a target="_blank">http://blog.beijingnet.com/index.php?blogId=4:  </a>收录了一些SSO斚w的文? </li> <li> <a target="_blank">应用整合中SSO的技术实?  </a>作者介l了南京地税q行应用整合SSO的技术实现方?</li> </ul> <!--文章其他信息--> <div id="t9hjhv7" class="dot001"> <img height="1" alt="" src="http://dev2dev.bea.com.cn/images/_.gif" width="100%" /> </div> <table cellspacing="0" cellpadding="3" width="100%" border="0"> <tbody> <tr valign="bottom"> <td colspan="2" height="20"> <span id="vhz7tv1" class="h2b">作者简?/span></td> </tr> <tr> <td valign="top" align="middle" width="0"> </td> <td>dev2dev ID: <a >xcjing</a>QBEA 资深技术顾问,加入BEA中国多年Q在门户技术、RFID解决Ҏ(gu)上有着丰富的经验?/td> </tr> </tbody> </table> <div id="nzlxfrp" class="dot001"> <img height="1" alt="" src="http://dev2dev.bea.com.cn/images/_.gif" width="100%" /> </div> <table cellspacing="1" cellpadding="0" width="100%" border="0"> <tbody> <tr valign="center" align="middle"> <td class="colC1C1C1"> <img height="1" alt="dot" src="http://dev2dev.bea.com.cn/images/_.gif" width="1" /> </td> <td class="colC1C1C1"> <img height="1" alt="dot" src="http://dev2dev.bea.com.cn/images/_.gif" width="1" /> </td> <td class="colC1C1C1"> <img height="1" alt="dot" src="http://dev2dev.bea.com.cn/images/_.gif" width="1" /> </td> </tr> </tbody> </table> <br /> <div id="ldt79xp" class="dot001"> <img height="1" alt="dot" src="http://dev2dev.bea.com.cn/images/_.gif" width="100%" /> </div>  <span id="t9nddjf" class="h2b">作者其它文?/span><ul><li><a >WebLogic 6.1使用技?/a></li><li><a >WebLogic6.0的一些用经?/a></li><li><a >~写U程安全的JSPE序</a></li><li><a >JSP学习(fn)心得</a></li><li><a >WebLogic Server8.1新功能介l?/a></li><li><a >WLI81使用l验</a></li><li><a >Weblogic Server7.0学习(fn)W记</a></li><li><a >WLI81 pȝ理功能说明</a></li><li><a >WLP8.1中的权限理</a></li><li><a >WLP81中用visitorTools</a></li><li><a >BEA WebLogic Portal 8.1 使用技?/a></li><li><a >企业门户的发展方?/a></li><li><a >WLP8.1 CMS 使用l验</a></li><li><a >WLP81 Portlet之间的通信方式ȝ</a></li><li><a >客户端调用WLI81 JPD的方法ȝ W一部分</a></li><li><a >客户端调用WLI81 JPD的方法ȝ W二部分</a></li><li><a >RFID-企业软g的下一座金?/a></li></ul><img src ="http://www.tkk7.com/kingwell/aggbug/46696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kingwell/" target="_blank">KingWell</a> 2006-05-17 22:08 <a href="http://www.tkk7.com/kingwell/articles/46696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单的stateful session bean实例http://www.tkk7.com/kingwell/articles/37051.htmlKingWellKingWellThu, 23 Mar 2006 07:35:00 GMThttp://www.tkk7.com/kingwell/articles/37051.htmlhttp://www.tkk7.com/kingwell/comments/37051.htmlhttp://www.tkk7.com/kingwell/articles/37051.html#Feedback0http://www.tkk7.com/kingwell/comments/commentRss/37051.htmlhttp://www.tkk7.com/kingwell/services/trackbacks/37051.html
开发及(qing)调试环境?JBOSS4.0+ECLIPSE3.1QY件下载配|安装我׃多说了,怿大家都会(x)很轻易搞定?br />
开发流E,写一个简单的stateful session beanQ进行远E调?计算出某一特定正整数的Fibonacci倹{?br />
所创徏的project下引入jbossall-client.jarQ在JBOSS_HOME/client目录?br />分别用eclipse写出EJBq程调用的home接口Qremote接口和相对应的Bean
——?. home接口——?br />package com.terry.ejbsample;

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

/**
 * @author terry
 *
 */
public interface FibonacciHome extends EJBHome
{
    Fibonacci create() throws RemoteException, CreateException;

}
——?. remote 接口——?br />package com.terry.ejbsample;

import java.rmi.RemoteException;
import javax.ejb.EJBObject;
/**
 * @author terry
 *
 */
public interface Fibonacci extends EJBObject
{
    public long getFibonacci(int n) throws RemoteException;
}
——?. FibonacciBean——?br />package com.terry.ejbsample;

import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
/**
 * @author terry
 *
 */
public class FibonacciBean implements SessionBean
{
    public long getFibonacci(int n)
    {
        if (n==0) return 1;
        else if (n==1) return 1;
        else
            return getFibonacci(n - 1) + getFibonacci(n - 2);
    }
    public void ejbCreate() throws CreateException
{
System.out.println(“Bean created?;
}
    public void ejbRemove(){}    
    public void ejbActivate(){}    
    public void ejbPassivate(){}
    public void setSessionContext(SessionContext ctx){}
}

配置相对应的ejb-jar.xml和jboss.xml文g
——?. ejb-jar.xml——?br /><?xml version="1.0"?>

<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
                         http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
    version="2.1">
    <enterprise-beans>
        <session>
            <ejb-name>Fibonacci</ejb-name>
            <home>com.terry.ejbsample.FibonacciHome</home>
            <remote>com.terry.ejbsample.Fibonacci</remote>
            <ejb-class>com.terry.ejbsample.FibonacciBean</ejb-class>
            <session-type>Stateful</session-type>
            <transaction-type>Container</transaction-type>
        </session>
    </enterprise-beans>
</ejb-jar>
——?. jboss.xml——?br /><?xml version="1.0"?>

<jboss>
    <enterprise-beans>
        <session>
            <ejb-name>Fibonacci</ejb-name>
            <jndi-name>FibonacciHome</jndi-name>
        </session>
    </enterprise-beans>
</jboss>
在Eclipse中配|所需package的jar包,class文g以及(qing)xml描述文g分别dq去Q注意正的前缀Qxml文g必须在根目录下的META-INF文g夹中。或者你可以在consoleH口使用jar命o(h)q行打包Q如 jar cf ff.jar *Q?br />
刚刚打包的ff.jar攑օJBOSS_HOME/server/default/deployQ启动jboss的默认服务器Q如果一切顺利的话,你会(x)在consoleH口中看C刚刚所写的FibonacciBean已经被成功部|到jboss中了?br />
写一个简单的试E序
———FibonacciClient.java——?br />package com.terry.ejbsample;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
/**
 * @author terry
 * 
 */
public class FibonacciClient
{
    public static void main(String[] args)
    {
        try
        {
            java.util.Properties p = new java.util.Properties();
            p.put(Context.INITIAL_CONTEXT_FACTORY,
                    "org.jnp.interfaces.NamingContextFactory");
            p.put(Context.URL_PKG_PREFIXES, "jboss.naming:org.jnp.interfaces");
            p.put(Context.PROVIDER_URL, "localhost:1099");
            
            Context jndiContext = new InitialContext(p);
            Object ref = jndiContext.lookup("FibonacciHome");
            FibonacciHome home = (FibonacciHome) PortableRemoteObject.narrow(
                    ref, FibonacciHome.class);
            Fibonacci ff = home.create();
            long result;
            for (int i = 40; i >= 0; i--)
            {
                result = ff.getFibonacci(i);
                System.out.println("Fibonacci of" + i + " is " + result);
            }
        } catch (java.rmi.RemoteException re)
        {
            re.printStackTrace();
        } catch (Throwable t)
        {
            t.printStackTrace();
        }
    }
}

解析此例
J2EE应用说白了其实原理也很简单,J2EE是分布式pȝQ意味着server与client是通过RMI-IIOP和JNDIq行交互的。简单来说就是提供给client一U可以远E调用server端程序的Ҏ(gu)Q当然其中的l节?x)比较复杂,不过q些都是你深入之后才?x)接触到的东ѝ?br />本文CZQ客L(fng)通过JNDI利用Home接口创徏Z个Remote objectQ再通过调用Remote object 中的Ҏ(gu)与FibonacciBeanq行交互Q处理逻辑。客L(fng)q不是直接与Beanq行交互?br />E序中的ejb-jar.xml是用来描qEJB属性的Qjboss.xml是用来定义ejb-jar.xml中Bean所对应的JNDI信息?img src ="http://www.tkk7.com/kingwell/aggbug/37051.html" width = "1" height = "1" />

KingWell 2006-03-23 15:35 发表评论
]]>
վ֩ģ壺 ޾Ʒ | AV߹ۿ| պһƵ | һƵ| ձ˻ʿxxxxƵ| aëƬëƬѹۿ| һëƬƵ| ճˮþ޾Ʒtv| վѹۿ| av| ͼͼԴۺվ| ձվۿ| պһѸ| ߹ۿ| ޹Ʒav| ҹëƬ| պӰ߹ۿվ| ɫ͵͵͵ۺ| AVһլɫӰ| һɫþ88ۺ| վѹۿ| һëƬȫ| AVר| ޹ƷAAAƬ| ޹Ʒyw | պƷһ| Ӱ߹ۿѸ| ޾Ʒɫվ| Ů˳Ժ˾޸| ĻþþƷˮ| ĻѲ| 57paoһ| ĻѾþ9һ9| ޾Һ| Ļ| žžۺAVһ| AëƬþð| ҹ18ѿ| һëƬ| þþƷƵѲ| ƵַѲ|