`
webee
  • 浏览: 9225 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类

使用Liferay 中 Spring portlet mvc 模式下的Ajax探讨,实例代码分享!

阅读更多

就现在Web框架铺天盖地的局面下,Spring依然还是那么有吸引力,毕竟好的产品总不会被人们忽略的。因最在Portal环境下开发,一点小小经验和大家分享,如有不解,尽可联系本人哦!

首先我们应该有的环境就不多说了,之前写过一篇文章是关于在Liferay下Spring Mvc的开发。本文就是基于这个环境,大体说下:

1、运行的Portal环境为Liferay Portal tomcat 6.0.5;

2、自己的项目是使用Spring MVC搭建的。

其他不多说,在上述环境下使用Ajax返回自己想要的数据是本文需要说明的问题;

 

一、客户端JS

此处客户端JS,即需要发送请求的一段采用的是Jquery 1.4.2,当然你可以使用你自己喜欢的Ajax方式。在Portal模式下最关键的地方是发送Ajax请求的地址,本人开始也很疑惑,但是Liferay的wiki还是给了咱很大的帮助。地址的取法如下:

<portlet:renderURL var="loadDisTagByParentIdUrl"
	windowState="<%= LiferayWindowState.EXCLUSIVE.toString()%>">
	<portlet:param name="action" value="loadDisTagByParentId"></portlet:param>
</portlet:renderURL>

 

最关键的地方是要设置windowState属性,看看属性值就应该明白,当这种状态时,portlet默认的Response是不会输出任何内容的,只是为了在服务端执行一个动作而已。此处采用actionUrl效果一样,注意发送请求是Jquery.ajax 参数类型 type 要设置为 post。客户端就是如此简单,其他的事情就到服务端再说。

 

二、服务端

首先看看Spring的MVC模式:

其实还是很简单的,对于开发者来讲只需要关心两点,第一是将请求转到Controller,这个过程是配置handler完成,第二是将输出交由Resolver完成,无论是Servlet还是Portlet环境都一样,这点Spring做的太好了,这点是由配置viewResolver来完成。明白了要做的事情,不难看出,要想请求输出能够按照你自己的想法来输出,最关键是要搞定Resolver。

 

 1) AjaxViewResolver

我们可以自定义一个自己的Resolver,用来处理我们自己的Ajax请求,大致代码片段如下:

public class AjaxViewResolver extends AbstractCachingViewResolver {
	
	public static final String AJAX_PREFIX = "ajax_";

	protected String ajaxPrefix = AJAX_PREFIX;

	private View ajaxView;

	@Override
	protected View loadView(String viewName, Locale locale) throws Exception {
		View view = null;
		if (viewName.startsWith(this.ajaxPrefix)) {
			view = ajaxView;
		}
		return view;
	}

	public String getAjaxPrefix() {
		return ajaxPrefix;
	}

	public void setAjaxPrefix(String ajaxPrefix) {
		this.ajaxPrefix = ajaxPrefix;
	}

	public View getAjaxView() {
		return ajaxView;
	}

	public void setAjaxView(View ajaxView) {
		this.ajaxView = ajaxView;
	}
}

 此类的作用是将一个特殊的前最View交由AjaxView来处理,功能就如此简单,此处留意我们的View前缀;

2) AjaxView

来个自定的View处理器来处理有AjaxViewResolver转过来的请求,此类代码片段如下:、

public class AjaxView extends AbstractView {

	public static final String JSONCONFIG_ATTRIBUTE = AjaxView.class.getName()+ ".JsonConfig";

	private static final String DEFAULT_AJAX_CONTENT_TYPE = "text/plain; charset=UTF-8";

	@Override
	public String getContentType() {
		String orgiContentType = super.getContentType();
		if (StringUtils.isEmpty(orgiContentType))
			orgiContentType = DEFAULT_AJAX_CONTENT_TYPE;

		return orgiContentType;
	}

	@Override
	public void setContentType(String contentType) {
		super.setContentType(contentType);
	}

	// TODO filter and log
	@Override
	protected void renderMergedOutputModel(Map<String, Object> map,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		if (map == null || map.isEmpty()) {
			JSONObject.fromObject("{}").write(response.getWriter());
			return;
		}
		Object result = null;
		for (Map.Entry<String, Object> entry : map.entrySet()) {
			result = entry.getValue();
			break;
		}

		JSON json = this.createJson(request, result);
		json.write(response.getWriter());
	}

	private JSON createJson(HttpServletRequest request, Object obj) {
		JsonConfig jsonConfig = (JsonConfig) request.getAttribute(JSONCONFIG_ATTRIBUTE);
		if (jsonConfig == null)
			return JSONSerializer.toJSON(obj);
		else
			return JSONSerializer.toJSON(obj, jsonConfig);
	}
}

 此类也很简单,注意两点,应为我们Ajax通常返回Json数据,所以此类就返回Json,其他的你可以自己重载了,第二注意重载的方法renderMergedOutputModel。方法最后一段所写出的东西就是最终返回到客户端的东西了。json.write(response.getWriter());也很简单,继续。

 

3)MyController

Controller 是Spring最最普通的Controller,正如前面地址所写,我们要执行一个action=loadDisTagByParentId的渲染,所以在Controller中有了如下的方法:

@RenderMapping(params = "action=loadDisTagByParentId")
	public String loadDisTagByParentId(
			@RequestParam(value = "tagId", required = false) Long tagId,
			ModelMap map, PortletRequest req, PortletResponse response) {

		List<Tag> tags = tagSvc.getTagsByParentId(tagId);
		List<TreeNode> nodes = new ArrayList<TreeNode>();
		for (Tag tag : tags) {
			TreeNode node = new TreeNode();

			node.setData(tag.getName());
			JSONObject jsonAttrs = new JSONObject();
			jsonAttrs.put("id", "tagid_" + tag.getId());
			node.setAttr(jsonAttrs);

			node.setState("closed");
			
			nodes.add(node);
		}

		map.clear();
		map.addAttribute("tags", nodes);
		return AjaxViewResolver.AJAX_PREFIX;
	}

 此方法没什么特殊,唯一不同的是注意了,方法返回的View是 AjaxViewResolver.AJAX_PREFIX,即在AjaxViewResolver中指定的视图前缀,此时就明白了,当执行完此方法之后,就交由AjaxView去处理了。此方法中我们可以准备一下我们要放回到客户端的数据。依然放在ModelMap中,在AjaxView中可以通过Map取出来。是不是很简单呢。

到此我们客户端发送的请求已经经过我们的Resolver和AjaxView处理完毕,当然我们要感谢Liferay给了我们一个很好的模式,这个模式就是Portal默认不输出任何数据。返回到客户端的数据你可以通过自定义AjaxView来达到各种格式的效果。再次不再衍生。

 

三、总结下好处

1、在使用这种模式下的好处是不依赖任何Ajax框架,你可以使用最普通的XMLHttpRequest来发送请求,只需将发送请求的地址给对即可;

2、不跑出Portlet之外,此点和DWR+SPRING在Portlet模式有所不同,Dwr是通过一个单独的Servlet来处理他的Ajax请求。

3、原生的地址,无需构建其他地址。

4、Spring注入毫不影响,我们依然使用的是Spring的Controller方法,方法签名依然可以保持为Spring原有的模式,参数依然可以注入;

5、标准的Spring配置,无需其他文件的配置,如web,dwr.xml等。

 

也许你在使用Portlet,也许你在使用Liferay,希望此文能给你帮助,顶吧!谢谢!

 

 

 

  • 大小: 51.2 KB
分享到:
评论
2 楼 webee 2010-09-17  
真liuyake 写道
可惜我现在还没研究那么深。。。

加油啊!
1 楼 真liuyake 2010-09-15  
可惜我现在还没研究那么深。。。

相关推荐

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

    使用 Maven 的 Liferay Spring Portlet MVC 项目模板。 Liferay EE 6.2.10.11 (GA1, SP710) Java 1.7 小门户 2.0 弹簧框架 4.1.5 基于注解的控制器配置 用法 $ git clone ...

    spring+portlet+mvc

    Spring Portlet MVC是一种在portlet应用中实现模型-视图-控制器(MVC)设计模式的框架,它结合了Spring框架的灵活性和portlet技术的强大功能。本文将深入探讨Spring Portlet MVC的相关知识点,帮助读者理解其核心...

    spring2.0MVC+spring2.5MVC+portletMVC

    本主题将深入探讨Spring 2.0、2.5版本的MVC特性和Portlet MVC的相关知识。 首先,Spring 2.0在MVC方面引入了显著的改进,包括: 1. **依赖注入(DI)**:Spring 2.0增强了对MVC组件的依赖注入支持,允许开发者更...

    liferay-spring-portlet

    通过深入学习和理解这个项目,开发者可以掌握如何在Liferay中创建和部署Spring Portlet,了解portlet的生命周期和交互方式,以及Spring框架在portlet开发中的应用。同时,如果进一步集成Hibernate,还可以学习到如何...

    spring portletMVC

    spring portletMVC

    Liferay跨页面Portlet之间的调用与数据传递.docx

    在Liferay中,跨页面Portlet之间的调用与数据传递是一项关键任务,因为这涉及到不同Portlet间的协作和信息共享。Liferay提供了多种通信机制,包括PortletSession、Public Render Parameters以及Portlet事件,但这些...

    spring-webmvc-portlet.rar

    在Java企业级开发中,Spring Web MVC和Portlet框架的应用广泛且深入,它们各自在不同的场景下发挥着重要作用。Spring Web MVC是Spring框架的重要组成部分,用于构建高性能、灵活的Web应用程序,而Portlet则是portlet...

    Liferay portlet 工程示例代码

    - **MVCPortlet**:Liferay提供的一种基于Model-View-Controller设计模式的portlet基类,简化了portlet的开发。 - **JSP和JSF**:通常用于创建portlet的视图层,JSP是Java服务器页面,JSF是JavaServer Faces,更...

    liferay portlet 开发实例

    在IT领域,特别是企业级应用开发中,Liferay作为一个强大的企业门户平台,提供了丰富的功能和服务,其中Liferay Portlet的开发是构建定制化企业应用的关键技术之一。本文将基于提供的文件信息,深入解析Liferay ...

    Liferay_Control-Panel_Portlet DTD-5.2_MVC-Portlet

    在Liferay中,MVC Portlet是最常见的portlet类型,它通过分离业务逻辑(Model)、用户界面(View)和控制流程(Controller)来实现代码的清晰组织。开发者可以使用Java Servlet和JSP来编写MVC Portlets,它们在...

    Liferay-Portlet-SDK5.2.3.rar_liferay_liferay sdk_portlet

    Liferay Portlet SDK 5.2.3是该系列的一个特定版本,专为Liferay Portal 5.2.3版本设计,它包含了开发portlet所需的类库、文档和示例代码,使得开发者能够高效地集成自定义功能到Liferay Portal环境中。 **portlet...

    liferay-spring-mvc-freemarker-portlet-archetype

    liferay-spring-mvc-freemarker-portlet-archetype 这是用于创建 Liferay Spring MVC Freemarker portlet 的 maven 原型。 由于 Liferay 不正式支持这种类型的 portlet,因此当前不存在原型。 这个原型修正了这一点...

    liferay_portlet对象详解

    在 Liferay 平台中,Portlet 是核心组件,它负责呈现内容和提供互动功能。Portlet 技术的理解和应用是开发 Liferay 应用程序的关键。本文将深入解析 Portlet 的关键概念,包括 Portlet 请求与 URL、Portlet 模式和...

    liferay portlet例子

    liferay portlet例子 liferay portlet例子

    Liferay5.2.3 样例Portlet

    Liferay5.2.3的样例,通过war.bat打包后发布到相应的liferay环境即可。 另外,需要配置context,tomcat中的代码如下: &lt;/Context&gt;

    CAS, Liferay和Alfresco portlet三者的整合

    在整个过程中,开发者可能需要熟悉Java、Spring框架、portlet开发以及Alfresco和Liferay的API。同时,理解和调试各种集成问题也是必不可少的。对于源码的深入理解可以帮助定制化需求,而工具的熟练运用则能提高开发...

    liferay portal 开发实例

    在这个开发实例中,我们将深入探讨四个Liferay Portal MVC(Model-View-Controller)应用的实践案例,这些实例可以帮助开发者更好地理解如何在Liferay环境中进行portlet开发。 首先,让我们了解MVC模式在Liferay中...

    struts2_spring_json.rar_liferay struts2 json_portlet json_spring

    Struts2和Spring框架在Java Web开发中是广泛使用的,它们提供了强大的MVC(Model-View-Controller)架构支持。Liferay是一个流行的开源企业级门户平台,它允许开发者创建和集成portlet来构建复杂的Web应用程序。在...

    liferay相关的代码

    Liferay使用Java语言编写,基于Spring框架,采用了MVC(Model-View-Controller)架构模式。通过深入源码,我们可以学习到如何在Liferay中创建portlet、theme、布局、服务等组件,以及如何处理权限、国际化和缓存等...

    Liferay porta 清理不需要的Portlet 代码

    随着时间的推移,项目中可能会积累许多不再使用的Portlet代码,这不仅会占用服务器资源,还可能影响系统的性能和维护效率。因此,定期清理不必要的Portlet代码对保持Liferay Portal的高效运行至关重要。 一、为什么...

Global site tag (gtag.js) - Google Analytics