jsr168 portlet(struts2+spring2.5+hibernate3.3)

jsr168? portal? portlet? 这些概念大家翻翻资料随处可见,我在这里就不多说了。
通过一些资料收集,发现现在国内开发人员用的比较多的portal有:liferay,jetspeed,pluto potal,websphere portal ,lightportal,openportal等.
通过现有资料得出结论:
1.liferay,jetspeed
现在商业项目还没有人成功在此基础上进行过二次开发,因为liferay二次开发难度很大,运用技术太多,没有文档说明,源代码中的注释很少,不方便二次开发,而jetspeed2目前好像还不能集成其他开源框

架(ssh)这样的案例。
2.websphere portal
很多政府门户的成功案例,包括武烟的门户也是采用此portal,能够独立出自己写的符合jsr168标准的portlet程序,开发难度较小,能够结合ssh框架,但是该portal的所有版本产品属于商业产品。
3.pluto
该portal提供一个portlet的容器,但不是一个完整的portal,但是能够运行符合portlet的程序,二次开发难度较小,有成功的非商业性的案例。
4.lightportal
采用ajax前台web的开源portal,但是发现加载速度极其缓慢。
其他的就不在这里一一介绍了。

在网上搜索随处可见无框架集成的portlet程序,随处可见websphere portal下struts2 portlet程序,但是就是没有一个网站详细给出pluto下框架(ssh)实现portlet,导致很多开发人员在网上
提出这样的疑问:

能否在pluto portal中运行 编写的struts2 portlet?
我尝试写了一个struts2的portlet在pluto portal下运行,为何不成功,是不是pluto下不支持struts2 portlet? 等等这样一系列的问题,

struts官方给出了一个struts2 portlet的程序,采用的pluto portal运行portlet,地址:http://struts.apache.org/2.0.11.1/docs/struts-2-portlet-tutorial.html
IBM developerworks 给出了一个使用 Spring 2 Portlet MVC 框架构建 Portlet 应用,地址:http://www.ibm.com/developerworks/cn/java/j-lo-spring2-portal/

下面我就apatch的pluto portal来实现一个portlet,框架采用struts2.1+spring2.5+hibernate3.3,这也是网上独一无二的例子。

pluto2容器的安装和配置

首页
http://portals.apache.org/pluto/
下载得到文件
pluto-2.0.0-src.zip

1.解压缩到指定目录下(本例以E:\source\pluto目录),那么在E:\source\pluto目录下含有pluto-2.0.0文件夹

2.tomcat5以上版本下载,并配置环境变量(如:tomcat5存放在D:\tool\tomcat5)

3.下载maven2(利用构建配置文件进行编译),解压缩得到apache-maven-2.2.1文件夹(比如解压到E:\tool\apache-maven-2.2.1),相应配置环境变量。

4.修改maven2的配置
路径E:\tool\apache-maven-2.2.1\conf上的settings.xml
增加 <pluginGroups> 元素: 
<settings>
...
<pluginGroups>
    <pluginGroup>org.apache.portals.pluto</pluginGroup>
</pluginGroups>
...
</settings>

并保存。

 

5.命令行进去pluto-2.0.0所在目录,如下图:

 


6.分别执行以下命令(把编译好的文件发布到tomcat5下,提示build successful 安装成功):
mvn clean
mvn install
mvn pluto2:install -DinstallDir=D:\tool\tomcat5  

pluto2 的相关文件就被发布到tomcat5 相应目录下了。

 

7.成功发布后,tomcat根目录下自动添加了PlutoDomain文件夹,该文件夹下是pluto两个例子的war包,common文件夹、shared文件夹下会添加相应的jar包,因为使用到了struts2,spring,hibernate,因此
在shared的lib目录下,common下的lib目录下,common的endorsed目录下,需要手动添加一些jar包,相应目录下的jar包,可在下方指定下载处进行下载。

8.编辑 D:\tool\tomca5\conf\tomcat-users.xml 文件,
添加角色 pluto,并在该角色下新增一个用户,以下为示例文件:
<tomcat-users>
<role rolename="pluto"/>
<role rolename="tomcat"/>
<role rolename="manager"/>
<user username="pluto" password="pluto" roles="pluto,tomcat,manager"/>
</tomcat-users>

修改tomcat的端口(本例为:8088),启动tomcat,访问http://localhost:8088/pluto/portal
出现如下图所示内容表示安装成功:

 

jsr168 portlet(struts2+spring2.5+hibernate3.3)_第1张图片

输入
用户名:pluto 
密码:pluto

进入主界面,主界面中的所有其他portal页都是pluto提供的portlet例子,只有Pluto Admin的portal页下    是对你自己编写的portlet程序进行发布操作的入口,如果自己编写的portlet程序有任何一点

错误,在Pluto Admin页下的portlet Application的下拉菜单下是看不到你编写发布的portlet程序,下图是我删除了pluto 中自带的所有portal 页,除了Pluto Admin portal页,然后添加了自己的portal页,并在自己portal页中添加了自己的两个portlet程序的效果(左侧是没有采用框架实现的,右侧是采用了struts2+spring2.5+hibernate3.3 实现的):

 

首先添加自己发布到tomcat下自己写的两个portlet,默认情况下,Portlet Application中只有两个portlet(Pluto Testsuite、Apach Pluto Portal Driver ),如果自己编写的portlet无错误的话,发布到tomcat下后,在pluto的Portlet Application 的下拉菜单下会出现自己编写的portlet,如下图:

jsr168 portlet(struts2+spring2.5+hibernate3.3)_第2张图片

 

 

 

添加一个portal Page,本例为My Portlet,然后指定自己的portlet添加后的效果:

图一: 

jsr168 portlet(struts2+spring2.5+hibernate3.3)_第3张图片

 图二:

 

jsr168 portlet(struts2+spring2.5+hibernate3.3)_第4张图片

图三:

jsr168 portlet(struts2+spring2.5+hibernate3.3)_第5张图片

上述就是一个简单的struts2+spring2.5+hibernate3.3 jsr168 portlet的CRUD的例子,下面就源代码讲解一下。

 

本例jdk版本为1.6,利用注解的方式进行事务的和注入的配置,本例并没有很规范的对接口和实现进行存放包的分离,本例主要展示的是如何来利用struts2+spring2.5+hibernate3.3实现portlet的,望大家见谅。

 

对于以上框架加入portlet主要是对配置文件改动较大,对代码本身编写变化不大,下面就几个关键的文件解释一下:

1) struts.xml

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC                                                    
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6. <span style="color: #ff0000;">      <package name="view" namespace="/view" extends="struts-portlet-default">  
  7.             <action name="view" class="com.opensymphony.xwork2.ActionSupport">  
  8.                 <result>/WEB-INF/jsp/input.jsp</result>  
  9.             </action></span>    
  10.             <action name="login-*" class="loginAction" method="{1}">  
  11.                 <result name="success" type="redirectAction">login-listUsers</result>  
  12.                 <result name="listUsers">/WEB-INF/jsp/list-users.jsp</result>  
  13.                 <result name="prepareUpdate">/WEB-INF/jsp/modify-user.jsp</result>  
  14.                 <result name="updateSuccess" type="redirectAction">login-listUsers</result>  
  15.                 <result name="deleteSuccess" type="redirectAction">login-listUsers</result>  
  16.                 <result name="addSuccess" type="redirectAction">login-listUsers</result>  
  17.                 <result name="fail">/WEB-INF/jsp/fail.jsp</result>  
  18.             </action>           
  19.         </package>      
  20. <span style="color: #ff0000;">      <package name="edit" namespace="/edit" extends="struts-portlet-default">  
  21.             <action name="edit" class="com.opensymphony.xwork2.ActionSupport">  
  22.                 <result>/WEB-INF/jsp/edit.jsp</result>  
  23.             </action>           
  24.         </package>       
  25.         <package name="help" namespace="/help" extends="struts-portlet-default">  
  26.             <action name="help" class="com.opensymphony.xwork2.ActionSupport">  
  27.                 <result>/WEB-INF/jsp/help.jsp</result>  
  28.             </action>           
  29.         </package></span>    
  30. </struts>  

 1.红色部分代表portlet的三种模式,查看、编辑、帮助,点击每种模式后,会返回相关的页面,参数名称与portlet.xml中红色部分相关。

2.因为要实现portlet,因此继承采用"struts-portlet-default","struts-portlet-default"本身也是继承"struts-default","struts-portlet-default"来源于struts2-portlet-plugin-2.1.3-SNAPSHOTjar包,查看该jar包中struts-plugin.xml一目了然。

 

2) portlet.xml

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <portlet-app  
  3. version="1.0"  
  4. xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"  
  5.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.    xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"  
  7.    id="ssh-portlet">  
  8.     <portlet id="ssh-portlet">  
  9.     <description xml:lang="EN">sshPortletDemo</description>  
  10. <span style="color: #ff0000;">      </span><span style="color: #3366ff;"><portlet-name>sshPortletDemo</portlet-name></span>  
  11.         <display-name xml:lang="EN">>sshPortletDemo</display-name>  
  12. <span style="color: #3366ff;">      <portlet-class>  
  13.             org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher  
  14.         </portlet-class></span>  
  15. <span style="color: #ff0000;">      <init-param>  
  16.             <name>viewNamespace</name>  
  17.             <value>/view</value>  
  18.         </init-param>  
  19.         <init-param>  
  20.             <name>editNamespace</name>  
  21.             <value>/edit</value>  
  22.         </init-param>  
  23.         <init-param>  
  24.             <name>helpNamespace</name>  
  25.             <value>/help</value>  
  26.         </init-param>  
  27.         <init-param>  
  28.             <name>defaultViewAction</name>  
  29.             <value>view</value>  
  30.         </init-param>  
  31.         <init-param>  
  32.             <name>defaultEditAction</name>  
  33.             <value>edit</value>  
  34.         </init-param>  
  35.         <init-param>  
  36.             <name>defaultHelpAction</name>  
  37.             <value>help</value>  
  38.         </init-param></span>  
  39.         <expiration-cache>0</expiration-cache>  
  40.         <supports>  
  41.             <mime-type>text/html</mime-type>  
  42.             <portlet-mode>view</portlet-mode>  
  43.             <portlet-mode>edit</portlet-mode>  
  44.             <portlet-mode>help</portlet-mode>  
  45.         </supports>  
  46.         <supported-locale>en</supported-locale>  
  47.         <portlet-info>  
  48.             <title>sshPortletDemo</title>  
  49.             <short-title>sshPortletDemo</short-title>  
  50.             <keywords>sshPortletDemo</keywords>  
  51.         </portlet-info>  
  52.     </portlet>  
  53. </portlet-app>  

1.<portlet-name>XXX<portlet-name>指定自己编写的portlet程序的名称,该属性的名称于web.xml中红色部分保持一致(基本概念)。

2.类“org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher”在将 Struts2 
集成到 Portlet 中起到了关键作用,该类将 Portlet 操作分发给 Struts2。

3.红色部分指定初始化portlet模式的命名,与struts.xml内容相关。

3) web.xml

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  7.     id="WebApp_ID" version="2.5">  
  8. <span style="color: #000000;"><display-name>sshPortlet</display-name></span>  
  9.   <filter>  
  10.     <filter-name>struts</filter-name>  
  11.     <filter-class>  
  12.         org.apache.struts2.dispatcher.FilterDispatcher  
  13.     </filter-class>  
  14.   </filter>  
  15.     <filter>  
  16.         <filter-name>hibernateFilter</filter-name>  
  17.         <filter-class>  
  18.             com.yale.sshpluto.service.conf.MyOpenSessionInViewFilter  
  19.         </filter-class>  
  20.         <init-param>  
  21.             <param-name>singleSession</param-name>  
  22.             <param-value>true</param-value>  
  23.         </init-param>  
  24.     </filter>  
  25.     <filter-mapping>  
  26.         <filter-name>hibernateFilter</filter-name>  
  27.         <url-pattern>/*</url-pattern>  
  28.     </filter-mapping>  
  29.   <!-- 所有文件都可以使用struts标签 -->  
  30.   <!--  -->  
  31.   <filter-mapping>  
  32.     <filter-name>struts</filter-name>  
  33.     <url-pattern>/*</url-pattern>  
  34.   </filter-mapping>  
  35.     
  36. <!-- struts config end -->    
  37.     <context-param>  
  38.         <param-name>servletmapping</param-name>  
  39.         <param-value>/*</param-value>  
  40.     </context-param>    
  41.   
  42. <!-- 解决中文输入问题,我们在web.xml中加入过滤器 -->  
  43.     <filter>  
  44.         <filter-name>CharacterEncodingFilter</filter-name>  
  45.         <filter-class>com.yale.sshpluto.service.conf.CharacterEncodingFilter</filter-class>  
  46.         <init-param>  
  47.             <param-name>encoding</param-name>  
  48.             <param-value>GB2312</param-value>  
  49.         </init-param>  
  50.         <init-param>  
  51.             <param-name>ignore</param-name>  
  52.             <param-value>true</param-value>  
  53.         </init-param>  
  54.     </filter>  
  55.     <filter-mapping>  
  56.         <filter-name>CharacterEncodingFilter</filter-name>  
  57.         <url-pattern>/CharacterEncodingFilter</url-pattern>  
  58.     </filter-mapping>   
  59.     <filter-mapping>  
  60.         <filter-name>CharacterEncodingFilter</filter-name>  
  61.         <servlet-name>action</servlet-name>  
  62.     </filter-mapping>  
  63.       
  64. <!-- log4j start -->  
  65.     <context-param>  
  66.         <param-name>webAppRootKey</param-name>  
  67.         <param-value>webApp.root</param-value>  
  68.     </context-param>  
  69.   
  70.     <context-param>  
  71.         <param-name>log4jConfigLocation</param-name>  
  72.         <param-value>/WEB-INF/log4j.properties</param-value>  
  73.     </context-param>  
  74.   
  75.     <context-param>  
  76.         <param-name>log4jRefreshInterval</param-name>  
  77.         <param-value>600000</param-value>  
  78.     </context-param>  
  79.     <listener>  
  80.         <listener-class>  
  81.             org.springframework.web.util.Log4jConfigListener  
  82.         </listener-class>  
  83.     </listener>     
  84. <!-- log4j end -->      
  85. <!--   
  86. 通过这样的配置,程序在启动的时候,会首先初始化Spring框架自带的ContextLoaderServlet,  
  87. 这个Servlet的作用就是读取由contextConfigLocation指定的Spring配置文件的位置,  
  88. 初始化Spring框架的Context对象,并将这个对象保存在ServletContext中,留待Action调用。  
  89.  -->  
  90. <context-param>  
  91.     <param-name>contextConfigLocation</param-name>  
  92.     <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/applicationContext-*.xml,/WEB-INF/action-servlet.xml</param-value>  
  93. </context-param>  
  94.     <listener>  
  95.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  96.     </listener>  
  97.     <servlet id="sshPortletDemo">  
  98.         <servlet-name>sshPortletDemo</servlet-name>   
  99.         <servlet-class>org.apache.pluto.core.PortletServlet</servlet-class>  
  100.             <init-param>   
  101.               <param-name>portlet-class</param-name>   
  102.               <param-value>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</param-value>   
  103.             </init-param>       
  104. <span style="color: #ff0000;">           <init-param><!--portlet的名字必须和portlet.xml中portlet的名字一致-->  
  105.               <param-name>portlet-name</param-name>  
  106.               <param-value>sshPortletDemo</param-value>  
  107.              </init-param></span>     
  108.             <load-on-startup>1</load-on-startup>  
  109.     </servlet>      
  110.     <servlet-mapping>  
  111.         <servlet-name>sshPortletDemo</servlet-name>  
  112. <span style="color: #008080;">      <url-pattern>/PlutoInvoker/*</url-pattern></span>  
  113.     </servlet-mapping>      
  114. <!-- spring end -->  
  115. </web-app>  

 

上述文件的配置在文件中都有相应的注释,写的非常详细,<url-pattern>/PlutoInvoker/*</url-pattern>这种方式是pluto特定的写法,不能进行修改。

4) list-users.jsp

<s:url id="deleteUrl" action="login-delete" portletUrlType="action">
 <s:param name="userId"><s:property value="userId"/></s:param>
</s:url>

增加了红色部分的属性,该属性指明请求的方式是采用portlet还是action,我们这里指明采用action,如果指明portlet,将出现呈现错误(和portlet的请求、呈现方式有关系,这个是portlet的基础知识,这里就不敷衍,网上搜的一下就出来了解释)。

 

上述就是几个重要文件的内容解释,其他文件有基础的开发人员,一看便知,这里就不说明了,对pluto本身的jsp、xml、java文件,可以根据自己的需要进行相应的修改,源代码比较简单,修改也很方便。

 

 

源代码下载:

 

 1)jar包存放目录:

  endorsed.rar中的jar包存放在tomcat下的endorsed目录下

  lib.rar中的jar包存放在tomcat下的lib目录下

  shared-lib中的jar包存放在tomcat\shared\lib目录下

  ssh-lib1、ssh-lib2中的jar包存放在工程的lib目录下

2)工程源代码:plutoportletssh.rar

你可能感兴趣的:(java,二次开发,jsr168)