`
daoger
  • 浏览: 528020 次
  • 性别: Icon_minigender_1
  • 来自: 山东济南
社区版块
存档分类
最新评论

liferay开发小记---Struts,Spring,Hibernate架构

阅读更多

liferay有自己的struts和spring扩展,有兴趣的朋友可以看一下它对spring的扩展和使用。这里说一下使用liferay的对struts框架的支持下的开发;我用的是struts1.*,liferay现在也有对struts2.*的支持桥,暂不讨论,以后用到的时候再说。

 

对于用惯了SSH开发的人来说,刚开始在liferay中使用struts还是有些不适应的,我的不适应来自于请求的发送。由于我使用的是集成了liferay环境的tomcat:liferay-portal-tomcat-5.5-5.1.2,所以有很多jar文件的冲突;

 

struts配置介绍:

 

先说一下配置文件的构造。在你自己的portlet下的WEB-INF中需要有这几个配置文件:liferay-display.xml,liferay-portlet.xml,portlet.xml,tiles-defs.xml,struts-config.xml,web.xml;我们一个一个的看看,哈!

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 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/web-app_2_4.xsd">
	<servlet>
		<servlet-name>PortletActionServlet</servlet-name>
		<servlet-class>
			com.liferay.portal.struts.PortletActionServlet
		</servlet-class>
		<init-param>
			<param-name>config</param-name>
			<param-value>/WEB-INF/struts-config.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>PortletActionServlet</servlet-name>
		<url-pattern>/portlet_action/*</url-pattern>
	</servlet-mapping>
</web-app>

 这里把对struts的action的请求都通过portlet用桥接做了处理后再交由struts自己的action进行处理;

再看struts-config.xml,这个和我们一般用的也没啥区别:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
	<action-mappings>
		<action path="/library/view"
			type="exam.ssha.webapp.action.GoodAction">
			<forward name="library.view" path="library.view" />
		</action>
		<action path="/library/edit_entry"
			type="exam.ssha.webapp.action.GoodAction">
			<forward name="library.edit_entry"
				path="library.edit_entry" />
			<forward name="library.view" path="library.view" />
		</action>
	</action-mappings>
	<message-resources parameter="content.Language" />
	<plug-in className="org.apache.struts.tiles.TilesPlugin">
		<set-property property="definitions-config"
			value="/WEB-INF/tiles-defs.xml" />
		<set-property property="moduleAware" value="true" />
		<set-property property="definitions-parser-validate"
			value="true" />
	</plug-in>
</struts-config>

 处理后的跳转映射是在tiles-defs.xml中定义的:

<?xml version="1.0"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">

<tiles-definitions>
	<definition name="library.view" path="/library/view.jsp" />
	<definition name="library.edit_entry" path="/library/edit_entry.jsp" />
</tiles-definitions>

 这是portlet.xml:

<?xml version="1.0" encoding="UTF-8"?>

<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" 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">
	<portlet>
		<portlet-name>myExam</portlet-name>
		<display-name>MyExam</display-name>
		<portlet-class>com.liferay.portlet.StrutsPortlet</portlet-class>
		<init-param>
			<name>view-action</name>
			<value>/library/view</value>
		</init-param>
		<expiration-cache>0</expiration-cache>
		<supports>
			<mime-type>text/html</mime-type>
		</supports>
		<resource-bundle>content.Language</resource-bundle>
		<portlet-info>
			<title>MyExam</title>
			<short-title>MyExam</short-title>
			<keywords>myExam</keywords>
		</portlet-info>
		<security-role-ref>
			<role-name>user</role-name>
		</security-role-ref>
	</portlet>
</portlet-app>

 如果你看了前面关于portletl的介绍,这个也能很容易看懂,这个只是在启动参数上有区别,不用struts的时候是jsp页面,现在是struts的请求映射;

接下来是liferay-portlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 4.4.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_4_4_0.dtd">

<liferay-portlet-app>
	<portlet>
		<portlet-name>myExam</portlet-name>
		<struts-path>library</struts-path>
		<restore-current-view>false</restore-current-view>
		<header-portlet-css>/html/library/css.jsp</header-portlet-css>
		<header-portlet-javascript>/html/js/util.js</header-portlet-javascript>
		<css-class-wrapper>portlet-library</css-class-wrapper>
	</portlet>
	<role-mapper>
		<role-name>user</role-name>
		<role-link>User</role-link>
	</role-mapper>
</liferay-portlet-app>

 liferay-display.xml:

<?xml version="1.0"?>
<!DOCTYPE display PUBLIC "-//Liferay//DTD Display 4.0.0//EN" "http://www.liferay.com/dtd/liferay-display_4_0_0.dtd">

<display>
	<category name="category.exam">
		<portlet id="myExam" />
	</category>
</display>

 注意id的对应就好了。

 

Spring配置:

 

我的spring配置文件放到了Classes_HOME/META-INF/下,有两个文件:init.properties和jdbcContext.xml;

用过spring的人一看都知道的,一个是数据源方面的属性配置文件,一个是数据源加载和各种bean的配置文件。

这是加载spring的配置文件的代码:

this.appContext = new ClassPathXmlApplicationContext(
				"/META-INF/jdbcContext.xml");
 

jar文件冲突

 

liferay本身的开发和运行环境提供了对struts和spring的支持,在集成了liferay的环境的tomcat中运行测试时难免会有jar文件的冲突;在你自己的项目lib目录中struts相关的jar文件是不能有的,还有就是liferay对spring做扩展了的一些jar也不能引入,有spring-core.jar spring-bean.jar;还有liferay本身就扩展了log4j的一些东西,你的lib中也不能有log4j的jar。当然这不是绝对的,这只是我测试多次以后发现的,根据不同的应用jar文件的引用应该根据具体需要来定,哈!这是我应用中的一个jar文件清单:

 

Struts中action

 

在使用liferay对struts扩展之后,action需要继承com.liferay.portal.struts.PortletAction类,这时Action中主要有两个方法:

public void processAction(ActionMapping mapping, ActionForm form,
			PortletConfig config, ActionRequest request, ActionResponse response)
public ActionForward render(ActionMapping mapping, ActionForm form,
			PortletConfig config, RenderRequest request, RenderResponse response)

 processAction方法只有当页面中是form的POST请求时才会调用,而render方法是所有请求都会调用,也就是说当时form的POST请求时是先调用processAction方法,之后调用render方法的。在processAction方法中用setForward(request, "url");方法设定跳转,在render方法中会生效的。

 

页面中的注意事项

 

开始时我在页面中使用jstl总是不起作用,还以为是liferay对jstl标签有什么限制,其实不然;页面中没有什么特别的,和一般我们的页面开发没有多少区别;不能使用jstl的原因是因为我做例子的时候是基于一个别人的例子做的,结果例子中web.xml配置的servlet是2.3版本,而我本身的jsp环境是2.0,使得在页面中无法应用表达式语言,把web.xml中的配置改为2.4就都OK了。还有一点是,portlet的页面不是一个完整的页面,所以html代码用到什么就写啥。

struts请求的发送,简便的方式还是只用标签,如:

<portlet:renderURL><portlet:param name="struts_action" value="/library/edit_entry"/></portlet:renderURL>

 这里的参数名称struts_action就是标识着映射名称,如果你想在这个请求后面用js动态添加参数,直接<portlet:namespace />参数名=参数值  这样添加到这个请求后面就可以了。页面form中的每一项属性都需要用<portlet:namespace />区分,因为每一个portlet都是一个独立的web应用。

 

Ajax的使用

 

我试过用ajax向liferay的struts的action类发送请求,但是在action中不能正确返回xml数据,查了不少资料:一种说是,portlet中的数据返回只能是txt/html格式的,这个已经在配置文件中写死了,不能返回 txt/xml格式的数据;还有一种说是和liferay本身或者是portal本身的页面加载机制有关系。在com.liferay.portlet.documentlibrary.action下有一个GetFileAction类,这是一个文件下载的处理类,我试过里面的ServletResponseUtil中的几个方法,在客户端还是得不到xml数据;试了几种方式,返回的都是整个页面的html代码。最后我采用了不少人的建议,就是不使用action处理ajax请求,改用jsp或者servlet处理,这样发送请求的时候需要加上应用目录名称,指明具体的请求地址;或者使用单独的struts action处理,不使用portlet action。

 

 

如有疏漏或问题,欢迎回复交流,例子代码请发邮件索取。

11
1
分享到:
评论
2 楼 madbird 2010-02-01  
请问能否将例子放出来??谢谢
1 楼 weiqiulai 2009-09-09  
在processAction方法中用setForward(request, "url");方法设定跳转,在render方法中会生效的。
不知道这句话是什么意思?请指教

相关推荐

    liferay开发小记---开发环境的搭建

    本文将详述“liferay开发小记——开发环境的搭建”这一主题,旨在帮助开发者们快速有效地设置自己的开发环境,从而顺利进行Liferay插件或portlet的开发。 首先,我们需要了解Liferay开发的基础。Liferay提供了多种...

    liferay-portal-sql-6.1.1-ce-ga2-20120731132656558

    标题 "liferay-portal-sql-6.1.1-ce-ga2-20120731132656558" 暗示了这是一个关于Liferay Portal 6.1.1社区版(CE GA2)的SQL相关资源,发布日期为2012年7月31日。Liferay Portal是一个开源的企业级内容管理平台,它...

    liferay-plugins-sdk-6.1.1-20130816114619181.zip

    `liferay-eclipse`是Liferay为Eclipse IDE定制的插件,使得开发者能够在Eclipse环境中无缝地开发Liferay插件。这个插件提供了项目向导、自动构建支持、部署工具以及对Liferay API的智能感知等功能,极大地提高了开发...

    liferay-ide-eclipse-updatesite-1.6.2

    本文将详细介绍“liferay-ide-eclipse-updatesite-1.6.2”这一更新站点及其相关知识点。 一、Liferay IDE Liferay IDE是由Liferay公司开发的,它是基于Eclipse平台的插件,专门用于简化Liferay Portal的开发工作。...

    liferay-ide-eclipse-updatesite-1.1.0.zip

    在IT行业中,Liferay IDE是一款专为Liferay Portal开发设计的强大工具,而"Liferay-ide-eclipse-updatesite-1.1.0.zip"正是这个工具的更新站点包,它提供了针对Liferay 6.0版本的定制化集成开发环境。Liferay IDE是...

    liferay-portal-src-6.0.6-20110225.part2

    liferay-portal-src-6.0.6-20110225.part2

    liferay-faces-bridge-impl-3.0.0-ga1.zip

    总之,"liferay-faces-bridge-impl-3.0.0-ga1.zip"和"duckapter.zip"代表了Java开发领域中的两个关键点:portlet和JSF的集成以及静态语言中的鸭子类型实现。通过了解和使用这些工具,开发者能够更好地利用开源资源,...

    liferay-developer-guide-6.0_liferay_

    《Liferay Developer Guide 6.0》是一本深入讲解Liferay Portal开发的指南,由Liferay公司官方发布,旨在帮助开发者充分利用Liferay平台构建企业级的Web应用。这本书详细介绍了如何利用Liferay的API、服务和插件进行...

    liferay-6.2-sdk

    SDK 提供了必要的工具和库,使得开发者能够遵循Liferay的开发规范,编写符合其架构的代码。 **1. 开发环境设置** 在开始使用Liferay 6.2 SDK之前,你需要配置Java开发环境,确保安装了JDK 1.7或更高版本,因为...

    liferay-struts2-spring3-hibernate3

    liferay集成struts2 spring hibernate的完整示例,下载后将项目放入lifeRay的SDK下的portalet 目录,然后在本地数据库中创建BOOK表(bookId、bookName、BookType),修改portal.properties中JDBC连接属性,在Eclipse...

    liferay-plugins-sdk-5.1.2

    Liferay Plugins SDK 5.1.2 是一个用于开发Liferay Portal插件的软件开发工具包,它为开发者提供了一套完整的框架和工具,以便于创建Portlets、Themes以及其他定制功能。Liferay Portal是一个开源的企业级内容管理和...

    liferay-ide-eclipse插件

    Liferay IDE Eclipse插件是专为开发者设计的一款强大的工具,旨在提升在Eclipse集成开发环境中的Liferay Portal项目开发效率。这款插件提供了丰富的特性,使得开发者能够在Eclipse内无缝地进行Liferay相关的代码调试...

    liferay-spring-portlet

    【标题】"liferay-spring-portlet"是一个基于Spring框架构建的portlet应用,适用于Liferay门户平台。这个项目展示了如何将Spring与Liferay Portal结合,创建一个可直接部署到Liferay中的WAR包。作者提到他们已经花费...

    liferay-spring-mvc-portlet:Liferay Spring MVC portlet 的项目模板

    Liferay Spring Portlet MVC 使用 Maven 的 Liferay Spring Portlet MVC 项目模板。 Liferay EE 6.2.10.11 (GA1, SP... $ cp target/liferay-spring-mvc-portlet.war $LIFERAY_HOME/deploy/ 配置 默认设置为 Liferay

    liferay-development-zh.rar_liferay

    这个“liferay-development-zh.rar”压缩包显然包含了关于Liferay开发的中文详细指南,特别适合那些希望在中国语境下学习和实践Liferay开发的个人或团队。本文将深入探讨Liferay开发的关键知识点,基于提供的...

    liferay-portal-tomcat-5.5-5.1.1.part4.rar

    liferay-portal-tomcat-5.5-5.1.1.part4.rar

    liferay-portal-tomcat-5.5-5.1.1.part1.rar

    liferay-portal-tomcat-5.5-5.1.1.part1.rar

    liferay-portal-tomcat-5.5-5.1.1.part2.rar

    liferay-portal-tomcat-5.5-5.1.1.part2.rar

    liferay-portal-tomcat-5.5-5.1.1.part3.rar

    liferay-portal-tomcat-5.5-5.1.1.part3.rar

Global site tag (gtag.js) - Google Analytics