- 浏览: 360928 次
- 性别:
- 来自: 武汉
-
文章分类
最新评论
-
missfmaster:
这框架好特么底层。
Terracotta设计原理分析--(部分内容来自官方描述) -
小黄牛:
很好不错!分享一个在电商购物支付流程中,在各大参与者系统中可能 ...
分布式事务设计-两段式提交 -
zhglhy:
学习了,感谢分享
JAVA垃圾回收分析 -
talentluke:
如果在事务一中出现故障,数据库是可以回滚但消息队列不能回滚,队 ...
用消息队列和消息应用状态表来消除分布式事务(转载) -
langmanxingkong123:
谁说jedis不能存集合类的数据。乱说。。。
redis jredis jedis 使用
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> <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> <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> <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> </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> <portlet-name>sshPortletDemo</portlet-name> <display-name xml:lang="EN">>sshPortletDemo</display-name> <portlet-class> org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher </portlet-class> <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> <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"> <display-name>sshPortlet</display-name> <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> <init-param><!--portlet的名字必须和portlet.xml中portlet的名字一致--> <param-name>portlet-name</param-name> <param-value>sshPortletDemo</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>sshPortletDemo</servlet-name> <url-pattern>/PlutoInvoker/*</url-pattern> </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
- endorsed.rar (947.3 KB)
- 下载次数: 338
- lib.rar (4.6 MB)
- 下载次数: 484
- shared-lib.rar (1.8 MB)
- 下载次数: 384
- ssh-lib1.rar (3.5 MB)
- 下载次数: 463
- ssh-lib2.rar (9.4 MB)
- 下载次数: 853
- plutoportletssh.rar (33.9 KB)
- 下载次数: 341
发表评论
-
王者荣耀是用什么语言开发的!
2020-10-29 19:24 12292017年什么最火? 不用问,肯定是人人都“ ... -
王者荣耀是用什么语言开发的!
2020-10-29 19:04 02017年什么最火? 不用问,肯定是人人都在撸的“王 ... -
用消息队列和消息应用状态表来消除分布式事务(转载)
2012-11-21 11:12 3351由于数据量的巨大,大 ... -
CA认证原理以及实现(下)
2012-09-10 20:38 17124在上述的文章后了解到原理之后,我们这篇文章来进行CA的搭建。 ... -
CA认证原理以及实现(上)
2012-09-10 20:00 49536原理基础数字证书为发 ... -
企业追逐的--网络热点(云、海量数据、虚拟化)(下)
2012-06-28 21:58 1498云管理平台云是IT实现,是造出来的,不是买来的。我们可以买服务 ... -
企业追逐的--网络热点(云、海量数据、虚拟化)(上)
2012-06-28 21:08 1708云之所以热,是因为现在以及未来市场的业务推动力(回报率),现在 ... -
Terracotta Server[兵马俑]集群
2012-06-14 01:23 10843Terracotta的介绍以及原理在我之前的文章中已经做了相关 ... -
Local Cache + Server Cache
2012-05-27 00:01 785其实下面说的一些设计思路来源于一些开源的缓存软件,比如Ehca ... -
Web请求-异步模式
2012-05-26 22:45 268Comet技术已经不算是 ... -
分布式事务设计-三段式提交
2012-05-25 20:24 5562前面的文章提到的两段 ... -
分布式事务设计-两段式提交
2012-02-08 17:16 14286事务是一个很重要的概念,它必须满足ACID特性,在单机的数据库 ... -
架构设计要“注意点”
2011-09-08 14:24 370资源有限注意点:系统设计的时候总是估摸不到会有大数据量从远端传 ... -
替代分布式事务策略
2011-06-10 19:59 2263由于数据量的巨大,现 ... -
你符合成为一个架构设计师的特征吗?
2011-03-30 12:28 557其实想写这篇文章也是 ... -
缓存客户端集群
2011-03-18 17:12 1697Memcached Cache是集中式Cach ... -
Netlog中数据库演变过程
2011-03-18 15:45 476Netlog拥有4000万活跃用户,每个月有超过5000万的独 ... -
如何检测一台机器是否宕机?(转载)
2011-03-15 20:19 1777检测一台机器是否宕机 ... -
淘宝OceanBase设计(转载)
2011-03-14 16:26 1380OceanBase有什么特点 ... -
EhCache辅助spring Acegi
2010-09-14 16:36 2174因为在项目中想通过缓存来acegi的整合,因此选用了Ehcac ...
相关推荐
【标题】"jsr168 portlet(struts2+spring2.5+hibernate3.3)" 是一个基于Java技术栈的Web应用程序开发示例,它利用JSR168规范来创建portlet,同时结合了Struts2、Spring2.5和Hibernate3.3这三大框架,为构建可重用、...
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中自动搜索组件...
六、支持JSR-168/JSR-286 Portlet API Spring 2.0引入了对portlet开发的支持,可以与portlet容器(如Liferay、Pluto)无缝集成,为构建portlet应用程序提供便利。 七、国际化和本地化支持 Spring 2.0提供了对国际化...
Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...
19. `org.springframework.web.struts-3.0.0.RELEASE`:为整合Struts框架提供了支持,允许在Struts应用中无缝集成Spring的功能。 20. `org.springframework.web-3.0.0.RELEASE`:包含Spring Web下的各种工具类和...