一、准备
liferay IDE :6.1.2
javaJDK :JDK1.6
需要的lib:
二、原理
客户端:在Portal模式下最关键的地方是发送Ajax请求的地址,最关键的地方是要设置windowState属性,看看属性值就应该明白,
windowState="<%= LiferayWindowState.EXCLUSIVE.toString()%>当这种状态时,portlet默认的Response是不会输出任何内容的,只是为了在服务端执行一个动作而已。此处采用actionUrl效果一样,注意发送请求是Jquery.ajax 参数类型 type 要设置为 post。客户端就是如此简单,其他的事情就到服务端再说。
服务端:首先看看Spring的MVC模式:
其实还是很简单的,对于开发者来讲只需要关心两点,第一是将请求转到Controller,这个过程是配置handler完成,第二是将输出交由Resolver完成,无论是Servlet还是Portlet环境都一样,这点Spring做的太好了,这点是由配置viewResolver来完成。明白了要做的事情,不难看出,要想请求输出能够按照你自己的想法来输出,最关键是要搞定Resolver。
三、代码编写
(1)编写ViewResolver
package com.victop.ExampleSpringMVC.ViewResolver; import java.util.Locale; import org.springframework.web.servlet.View; import org.springframework.web.servlet.view.AbstractCachingViewResolver; import com.victop.ExampleSpringMVC.View.AjaxView; public class AjaxViewResolver extends AbstractCachingViewResolver { public static final String AJAX_PREFIX = "ajax_"; protected String ajaxPrefix = AJAX_PREFIX; private View ajaxView = new 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
package com.victop.ExampleSpringMVC.View; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSON; import net.sf.json.JSONObject; import net.sf.json.JSONSerializer; import net.sf.json.JsonConfig; import org.apache.commons.lang.StringUtils; import org.springframework.web.servlet.view.AbstractView; 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)编写SpringMVC controller
package com.victop.ExampleSpringMVCPortlet; import java.util.ArrayList; import java.util.Map; import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import org.apache.commons.collections.map.HashedMap; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.portlet.bind.annotation.RenderMapping; import org.springframework.web.servlet.ModelAndView; import com.victop.ExampleSpringMVC.ViewResolver.AjaxViewResolver; @Controller @RequestMapping(value = "VIEW") public class SpringMVC { @RenderMapping public String view(Model model){ model.addAttribute("username", "huqiwen"); return "view"; } @RenderMapping(params = "action=edit") public String paramedit(Model model,RenderRequest request, RenderResponse response){ model.addAttribute("edit", "action=edit"); return "edit"; } @RenderMapping(params = "action=loadDisTagByParentId") public ModelAndView loadDisTagByParentId( @RequestParam(value = "tagId", required = false) Long tagId, ModelMap map, PortletRequest req, PortletResponse response) { String ontJson = "oneJsonJson"; String twoJson = "twoJsonJson"; String threeJson = "threeJson"; ArrayList<String> list = new ArrayList<String>(); list.add(ontJson); list.add(twoJson); list.add(threeJson); Map<String,Object> maptemp = new HashedMap(); maptemp.put("ontJson", ontJson); maptemp.put("twoJson", twoJson); maptemp.put("threeJson", threeJson); map.clear(); map.addAttribute("ontJson", ontJson); map.addAttribute("twoJson", twoJson); map.addAttribute("threeJson", threeJson); map.addAttribute("list",list); map.addAttribute("maptemp",maptemp); ModelAndView mav = new ModelAndView (AjaxViewResolver.AJAX_PREFIX); mav.addObject ("result", "somevalue"); mav.addAllObjects(map); return mav; } }这里返回的是ModelAndView对象,新建ModelAndView时指定了对应的ViewResolver.
(4)配置文件
SpringMVC-portlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <context:component-scan base-package="com.victop.ExampleSpringMVCPortlet" /> <bean id="ajaxviewResolver" class="com.victop.ExampleSpringMVC.ViewResolver.AjaxViewResolver"> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" 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"> <display-name>ExampleSpringMVCPro-portlet</display-name> <jsp-config> <taglib> <taglib-uri>http://java.sun.com/portlet_2_0</taglib-uri> <taglib-location>/WEB-INF/tld/liferay-portlet.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://liferay.com/tld/aui</taglib-uri> <taglib-location>/WEB-INF/tld/aui.tld</taglib-location> </taglib> </jsp-config> <servlet> <servlet-name>ViewRendererServlet</servlet-name> <servlet-class>org.springframework.web.servlet.ViewRendererServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ViewRendererServlet</servlet-name> <url-pattern>/WEB-INF/servlet/view</url-pattern> </servlet-mapping> </web-app>
liferay-portlet.xml
<?xml version="1.0"?> <!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.1.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_1_0.dtd"> <liferay-portlet-app> <portlet> <portlet-name>SpringMVC</portlet-name> <icon>/icon.png</icon> <header-portlet-css>/css/main.css</header-portlet-css> <footer-portlet-javascript>/js/main.js</footer-portlet-javascript> <css-class-wrapper>ExampleSpringMVCPro-portlet</css-class-wrapper> </portlet> <role-mapper> <role-name>administrator</role-name> <role-link>Administrator</role-link> </role-mapper> <role-mapper> <role-name>guest</role-name> <role-link>Guest</role-link> </role-mapper> <role-mapper> <role-name>power-user</role-name> <role-link>Power User</role-link> </role-mapper> <role-mapper> <role-name>user</role-name> <role-link>User</role-link> </role-mapper> </liferay-portlet-app>
其他配置文件默认设置.
(5)编写页面
view.jsp
<%@page import="com.liferay.portal.util.PortalUtil"%> <%@ page language="java" contentType="text/html; charset=UTF-8"%> <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %> <portlet:defineObjects /> <% long userId = PortalUtil.getUserId(request); %> <% String rootPaht = renderRequest.getContextPath(); %> <portlet:renderURL var="ajaxurl" windowState="exclusive" > <portlet:param name="action" value="loadDisTagByParentId"/> </portlet:renderURL> <script type="text/javascript" src="<%=rootPaht%>/js/jquery-1.8.2.min.js"></script> <script type="text/javascript"> function ajaxTest(){ $.post('<%=ajaxurl%>',{p_p_resource_id:"test1",name: "John", time: "2pm"},function(data){ $('#message').html(data); }) } </script> <portlet:renderURL var="edit"> <portlet:param name="action" value="edit"/> </portlet:renderURL> <div>跳转到编辑页面<a href="${edit}">编辑dddddddd</a><br>这是SpringMVC Ajax测试,从点击下面的按钮从服务端获取数据。 <input type="button" value="ajax请求1" onclick="ajaxTest();"></div>
(6)加载到 liferay server 上




浙公网安备 33010602011771号