fs_jin

导航

 

一、准备

liferay IDE :6.1.2

javaJDK :JDK1.6

需要的lib:

image

 

二、原理

客户端:在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 上

实现结果:image

firebug:image

posted on 2014-01-07 16:54  fs_jin  阅读(608)  评论(0)    收藏  举报