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
出现如下图所示内容表示安装成功:
输入
用户名: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,如下图:
添加一个portal Page,本例为My Portlet,然后指定自己的portlet添加后的效果:
图一:
图二:
图三:
上述就是一个简单的struts2+spring2.5+hibernate3.3 jsr168 portlet的CRUD的例子,下面就源代码讲解一下。
本例jdk版本为1.6,利用注解的方式进行事务的和注入的配置,本例并没有很规范的对接口和实现进行存放包的分离,本例主要展示的是如何来利用struts2+spring2.5+hibernate3.3实现portlet的,望大家见谅。
对于以上框架加入portlet主要是对配置文件改动较大,对代码本身编写变化不大,下面就几个关键的文件解释一下:
1) struts.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <span style="color: #ff0000;"> <package name="view" namespace="/view" extends="struts-portlet-default">
- <action name="view" class="com.opensymphony.xwork2.ActionSupport">
- <result>/WEB-INF/jsp/input.jsp</result>
- </action></span>
- <action name="login-*" class="loginAction" method="{1}">
- <result name="success" type="redirectAction">login-listUsers</result>
- <result name="listUsers">/WEB-INF/jsp/list-users.jsp</result>
- <result name="prepareUpdate">/WEB-INF/jsp/modify-user.jsp</result>
- <result name="updateSuccess" type="redirectAction">login-listUsers</result>
- <result name="deleteSuccess" type="redirectAction">login-listUsers</result>
- <result name="addSuccess" type="redirectAction">login-listUsers</result>
- <result name="fail">/WEB-INF/jsp/fail.jsp</result>
- </action>
- </package>
- <span style="color: #ff0000;"> <package name="edit" namespace="/edit" extends="struts-portlet-default">
- <action name="edit" class="com.opensymphony.xwork2.ActionSupport">
- <result>/WEB-INF/jsp/edit.jsp</result>
- </action>
- </package>
- <package name="help" namespace="/help" extends="struts-portlet-default">
- <action name="help" class="com.opensymphony.xwork2.ActionSupport">
- <result>/WEB-INF/jsp/help.jsp</result>
- </action>
- </package></span>
- </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 version="1.0" encoding="UTF-8"?>
- <portlet-app
- version="1.0"
- xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 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"
- id="ssh-portlet">
- <portlet id="ssh-portlet">
- <description xml:lang="EN">sshPortletDemo</description>
- <span style="color: #ff0000;"> </span><span style="color: #3366ff;"><portlet-name>sshPortletDemo</portlet-name></span>
- <display-name xml:lang="EN">>sshPortletDemo</display-name>
- <span style="color: #3366ff;"> <portlet-class>
- org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher
- </portlet-class></span>
- <span style="color: #ff0000;"> <init-param>
- <name>viewNamespace</name>
- <value>/view</value>
- </init-param>
- <init-param>
- <name>editNamespace</name>
- <value>/edit</value>
- </init-param>
- <init-param>
- <name>helpNamespace</name>
- <value>/help</value>
- </init-param>
- <init-param>
- <name>defaultViewAction</name>
- <value>view</value>
- </init-param>
- <init-param>
- <name>defaultEditAction</name>
- <value>edit</value>
- </init-param>
- <init-param>
- <name>defaultHelpAction</name>
- <value>help</value>
- </init-param></span>
- <expiration-cache>0</expiration-cache>
- <supports>
- <mime-type>text/html</mime-type>
- <portlet-mode>view</portlet-mode>
- <portlet-mode>edit</portlet-mode>
- <portlet-mode>help</portlet-mode>
- </supports>
- <supported-locale>en</supported-locale>
- <portlet-info>
- <title>sshPortletDemo</title>
- <short-title>sshPortletDemo</short-title>
- <keywords>sshPortletDemo</keywords>
- </portlet-info>
- </portlet>
- </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 version="1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- id="WebApp_ID" version="2.5">
- <span style="color: #000000;"><display-name>sshPortlet</display-name></span>
- <filter>
- <filter-name>struts</filter-name>
- <filter-class>
- org.apache.struts2.dispatcher.FilterDispatcher
- </filter-class>
- </filter>
- <filter>
- <filter-name>hibernateFilter</filter-name>
- <filter-class>
- com.yale.sshpluto.service.conf.MyOpenSessionInViewFilter
- </filter-class>
- <init-param>
- <param-name>singleSession</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>hibernateFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!-- 所有文件都可以使用struts标签 -->
- <!-- -->
- <filter-mapping>
- <filter-name>struts</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!-- struts config end -->
- <context-param>
- <param-name>servletmapping</param-name>
- <param-value>/*</param-value>
- </context-param>
- <!-- 解决中文输入问题,我们在web.xml中加入过滤器 -->
- <filter>
- <filter-name>CharacterEncodingFilter</filter-name>
- <filter-class>com.yale.sshpluto.service.conf.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>GB2312</param-value>
- </init-param>
- <init-param>
- <param-name>ignore</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CharacterEncodingFilter</filter-name>
- <url-pattern>/CharacterEncodingFilter</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>CharacterEncodingFilter</filter-name>
- <servlet-name>action</servlet-name>
- </filter-mapping>
- <!-- log4j start -->
- <context-param>
- <param-name>webAppRootKey</param-name>
- <param-value>webApp.root</param-value>
- </context-param>
- <context-param>
- <param-name>log4jConfigLocation</param-name>
- <param-value>/WEB-INF/log4j.properties</param-value>
- </context-param>
- <context-param>
- <param-name>log4jRefreshInterval</param-name>
- <param-value>600000</param-value>
- </context-param>
- <listener>
- <listener-class>
- org.springframework.web.util.Log4jConfigListener
- </listener-class>
- </listener>
- <!-- log4j end -->
- <!--
- 通过这样的配置,程序在启动的时候,会首先初始化Spring框架自带的ContextLoaderServlet,
- 这个Servlet的作用就是读取由contextConfigLocation指定的Spring配置文件的位置,
- 初始化Spring框架的Context对象,并将这个对象保存在ServletContext中,留待Action调用。
- -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/applicationContext-*.xml,/WEB-INF/action-servlet.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <servlet id="sshPortletDemo">
- <servlet-name>sshPortletDemo</servlet-name>
- <servlet-class>org.apache.pluto.core.PortletServlet</servlet-class>
- <init-param>
- <param-name>portlet-class</param-name>
- <param-value>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</param-value>
- </init-param>
- <span style="color: #ff0000;"> <init-param><!--portlet的名字必须和portlet.xml中portlet的名字一致-->
- <param-name>portlet-name</param-name>
- <param-value>sshPortletDemo</param-value>
- </init-param></span>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>sshPortletDemo</servlet-name>
- <span style="color: #008080;"> <url-pattern>/PlutoInvoker/*</url-pattern></span>
- </servlet-mapping>
- <!-- spring end -->
- </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
相关推荐
【标题】"jsr168portlet(struts2+spring2.5+hibernate3.3)" 是一个基于Java的Web开发项目,它利用了JSR 168规范来实现portlet的功能,并结合了Struts2、Spring2.5和Hibernate3.3这三个框架的强大功能。JSR 168是Java...
Struts2.1+Hibernate3.1+Spring2.0是一个经典的Java企业级开发框架组合,也被称为SSH2。这个项目实例提供了全面的功能,包括基本的CRUD(创建、读取、更新、删除)操作,文件和图片上传,以及JavaScript表单验证。...
12. **Spring与其他框架的整合**:Spring 2.5加强了与其他流行框架的整合,如Hibernate、iBatis、Struts等,使得这些框架能更好地融入Spring应用中。 通过阅读"spring-framework-2.5.6.SEC01-docs.zip"中的文档,你...
Spring2.0引入了许多增强功能,如AOP代理的统一、声明式事务管理以及对JSR-168portlet的支持。 2. "hibernate_reference.pdf":这可能是Hibernate ORM框架的参考指南,Hibernate是一个流行的Java持久层解决方案,...
《spring2.5_zh.pdf》可能专注于Spring 2.5版本,这是一个重要的里程碑,引入了对JSR-303(Java Bean Validation)的支持,增强了对JSF和Portlet的集成,以及对AspectJ注解驱动的AOP的增强。此文档可能详细解析了...
Spring 2.1 版本包含了对JSR-168 Portlet的支持,增强了事务管理,以及对JMS和EJB的改进。Spring的主要模块包括核心容器、数据访问/集成、Web、AOP、工具和支持,它们可以帮助开发者构建松耦合、可测试的Java应用。 ...
org.springframework.web.portlet-3.1.1.RELEASE.jar org.springframework.web.servlet-3.1.1.RELEASE.jar org.springframework.web.struts-3.1.1.RELEASE.jar slf4j-api-1.5.8.jar slf4j-log4j12-1.5.8.jar spring-...
2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的...
Spring 2.0还加强了对JSR-168(portlet API)的支持,使得Spring应用能够部署在portlet容器中,如Portal服务器。此外,Spring 2.0还引入了数据访问抽象层,包括JDBC模板和ORM框架的集成,如Hibernate、JPA,简化了...
5. **JSR-168 Portlet支持**:Spring 2.0开始支持portlet开发,允许在portlet容器中部署和运行Spring应用。 6. **Spring Expression Language (SpEL)**:Spring 2.0引入了SpEL,一种强大的表达式语言,用于在运行时...
2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1. 容器 3.2.2. 实例化容器 3.2.3. 多种bean ...
2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...
Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...
六、支持JSR-168/JSR-286 Portlet API Spring 2.0引入了对portlet开发的支持,可以与portlet容器(如Liferay、Pluto)无缝集成,为构建portlet应用程序提供便利。 七、国际化和本地化支持 Spring 2.0提供了对国际化...
2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@...