Как передавать значения из ajax на страницу портлета

#servlets #liferay #liferay-6 #portlet #liferay-7

#сервлеты #liferay #liferay-6 #портлет #liferay-7

Вопрос:

Я создал портлет liferay, в котором я просто получаю данные о погоде из Api и получаю данные через ajax, как указано ниже, теперь я хочу передать эти данные json из ajax на страницу портлета и сохранить некоторые переменные в файле портлета. Я новичок в liferay, пожалуйста, кто-нибудь подскажет, как это сделать.

init.jsp

 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %><%@
taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
<%@
taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>
<%@
taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>
<liferay-theme:defineObjects />
<portlet:defineObjects />
<select id="list" >
<option>Pakistan</option>
<option>India</option>
<option>America</option>
<option>China</option>
<option>Canda</option>
</select >
<br><br>
<button onClick="setup()" id="btnSubmit">Submit</button>
<div id='demo'></div>
  
<script>
var country
function setup()
{   
    selectElement=document.querySelector('#list');
    var country=selectElement.value;    
    $.ajax({
        dataType: 'json',
        success: function(data) 
        {
            document.getElementById("demo").innerHTML = 
                '<br>country : ' data.name  
                '<br>temprature : ' data.main.temp  
                ' °F<br>Percipitation : ' data.clouds.all  
                ' %<br>wind speed : ' data.wind.speed  
            '<br>humidity : ' data.main.humidity 
            
        },
        url: 'http://api.openweathermap.org/data/2.5/weather?q=' country 'amp;appid=e53a861b8514a25b48d943fec2b4fcd7amp;units=imperial'
    });
}
</script>
  

вот файл портлета

 package assignment1.portlet;
import assignment1.constants.Assignment1PortletKeys;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;
import java.io.IOException;
import javax.portlet.Portlet;
import javax.portlet.PortletException;
import javax.portlet.PortletSession;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import org.osgi.service.component.annotations.Component;
@Component(
    immediate = true,
    property = {
        "com.liferay.portlet.display-category=category.sample",
        "com.liferay.portlet.header-portlet-css=/css/main.css",
        "com.liferay.portlet.instanceable=true",
        "javax.portlet.display-name=Assignment1",
        "javax.portlet.init-param.template-path=/",
        "javax.portlet.init-param.view-template=/view.jsp",
        "javax.portlet.name="   Assignment1PortletKeys.ASSIGNMENT1,
        "javax.portlet.resource-bundle=content.Language",
        "javax.portlet.security-role-ref=power-user,user",
        "com.liferay.portlet.private-session-attributes=false"
    },
    service = Portlet.class
)
public class Assignment1Portlet extends MVCPortlet

{
    @Override
    public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
            throws IOException, PortletException {
        // TODO Auto-generated method stub
        PortletSession session=renderRequest.getPortletSession();
        session.setAttribute("LIFERAY_SHARED_sessionMessage", "Sent Data From First Portlet",PortletSession.APPLICATION_SCOPE);
        super.doView(renderRequest, renderResponse);
    }
    
}
  

Ответ №1:

Поскольку вы используете JSP для создания своего вывода HTML: для обратной связи с портлетом вы должны использовать <portlet:actionURL/> тег с его различными атрибутами и отправлять запросы POST или GET на результирующий URL. Вы также можете добавить параметры (конечно), и они обычно оформляются <portlet:namespace/> . На стороне портлета вы реализуете обработчик действий (например, метод с именем processAction , но MVCPortlet (который вы используете как суперкласс) предлагает более приятные способы — я бы рекомендовал ознакомиться с руководством Liferay, поскольку полное описание этих параметров выходит далеко за рамки одного ответа здесь.

Еще один вариант — просто использовать независимые от портлета службы REST.

И комментарий: Вы не должны хранить данные в сеансе, достаточно сохранить их как атрибут запроса / ответа, чтобы они были доступны в JSP во время рендеринга. Он не используется позже.