就现在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
分享到:
相关推荐
使用 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是一种在portlet应用中实现模型-视图-控制器(MVC)设计模式的框架,它结合了Spring框架的灵活性和portlet技术的强大功能。本文将深入探讨Spring Portlet MVC的相关知识点,帮助读者理解其核心...
本主题将深入探讨Spring 2.0、2.5版本的MVC特性和Portlet MVC的相关知识。 首先,Spring 2.0在MVC方面引入了显著的改进,包括: 1. **依赖注入(DI)**:Spring 2.0增强了对MVC组件的依赖注入支持,允许开发者更...
通过深入学习和理解这个项目,开发者可以掌握如何在Liferay中创建和部署Spring Portlet,了解portlet的生命周期和交互方式,以及Spring框架在portlet开发中的应用。同时,如果进一步集成Hibernate,还可以学习到如何...
spring portletMVC
在Liferay中,跨页面Portlet之间的调用与数据传递是一项关键任务,因为这涉及到不同Portlet间的协作和信息共享。Liferay提供了多种通信机制,包括PortletSession、Public Render Parameters以及Portlet事件,但这些...
在Java企业级开发中,Spring Web MVC和Portlet框架的应用广泛且深入,它们各自在不同的场景下发挥着重要作用。Spring Web MVC是Spring框架的重要组成部分,用于构建高性能、灵活的Web应用程序,而Portlet则是portlet...
- **MVCPortlet**:Liferay提供的一种基于Model-View-Controller设计模式的portlet基类,简化了portlet的开发。 - **JSP和JSF**:通常用于创建portlet的视图层,JSP是Java服务器页面,JSF是JavaServer Faces,更...
在IT领域,特别是企业级应用开发中,Liferay作为一个强大的企业门户平台,提供了丰富的功能和服务,其中Liferay Portlet的开发是构建定制化企业应用的关键技术之一。本文将基于提供的文件信息,深入解析Liferay ...
在Liferay中,MVC Portlet是最常见的portlet类型,它通过分离业务逻辑(Model)、用户界面(View)和控制流程(Controller)来实现代码的清晰组织。开发者可以使用Java Servlet和JSP来编写MVC Portlets,它们在...
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 的 maven 原型。 由于 Liferay 不正式支持这种类型的 portlet,因此当前不存在原型。 这个原型修正了这一点...
在 Liferay 平台中,Portlet 是核心组件,它负责呈现内容和提供互动功能。Portlet 技术的理解和应用是开发 Liferay 应用程序的关键。本文将深入解析 Portlet 的关键概念,包括 Portlet 请求与 URL、Portlet 模式和...
liferay portlet例子 liferay portlet例子
Liferay5.2.3的样例,通过war.bat打包后发布到相应的liferay环境即可。 另外,需要配置context,tomcat中的代码如下: </Context>
在整个过程中,开发者可能需要熟悉Java、Spring框架、portlet开发以及Alfresco和Liferay的API。同时,理解和调试各种集成问题也是必不可少的。对于源码的深入理解可以帮助定制化需求,而工具的熟练运用则能提高开发...
在这个开发实例中,我们将深入探讨四个Liferay Portal MVC(Model-View-Controller)应用的实践案例,这些实例可以帮助开发者更好地理解如何在Liferay环境中进行portlet开发。 首先,让我们了解MVC模式在Liferay中...
Struts2和Spring框架在Java Web开发中是广泛使用的,它们提供了强大的MVC(Model-View-Controller)架构支持。Liferay是一个流行的开源企业级门户平台,它允许开发者创建和集成portlet来构建复杂的Web应用程序。在...
Liferay使用Java语言编写,基于Spring框架,采用了MVC(Model-View-Controller)架构模式。通过深入源码,我们可以学习到如何在Liferay中创建portlet、theme、布局、服务等组件,以及如何处理权限、国际化和缓存等...
随着时间的推移,项目中可能会积累许多不再使用的Portlet代码,这不仅会占用服务器资源,还可能影响系统的性能和维护效率。因此,定期清理不必要的Portlet代码对保持Liferay Portal的高效运行至关重要。 一、为什么...