`
yale
  • 浏览: 356538 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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
出现如下图所示内容表示安装成功:

 

输入
用户名: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

  • lib.rar (4.6 MB)
  • 下载次数: 484
9
1
分享到:
评论
1 楼 四个石头 2011-03-31  

相关推荐

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

    NULL 博文链接:https://soledede.iteye.com/blog/1956295

    spring和hibernate__jar包,详细说明看jar包列表

    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-...

    Spring-Reference_zh_CN(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.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 ...

    Spring API

    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 chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...

    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. 对@...

    Spring攻略(第二版 中文高清版).part2

    2.5 使用Spring表达式语言 64 2.5.1 问题 64 2.5.2 解决方案 64 2.5.3 工作原理 65 2.6 设置Bean作用域 69 2.6.1 问题 69 2.6.2 解决方案 69 2.6.3 工作原理 70 2.7 自定义Bean初始化和析构 72 ...

    Spring攻略(第二版 中文高清版).part1

    2.5 使用Spring表达式语言 64 2.5.1 问题 64 2.5.2 解决方案 64 2.5.3 工作原理 65 2.6 设置Bean作用域 69 2.6.1 问题 69 2.6.2 解决方案 69 2.6.3 工作原理 70 2.7 自定义Bean初始化和析构 72 ...

    LiferayPortal二次开发指南破解版.pdf

    Liferay Portal 作为一个开源的Portal 项目,利用Hibernate、Struts、Spring 等开源框架, 实现了JCP JSR168 规范中提出的Portal 功能,在开源Portal 系统中有比较典型的代表性。 5 本文从Liferay Portal 的架构入手...

Global site tag (gtag.js) - Google Analytics