【问题标题】:Parameters not passed correctly from Portlet (Liferay) to public WebService (ConvertTemperature)参数未正确从 Portlet (Liferay) 传递到公共 WebService (ConvertTemperature)
【发布时间】:2013-08-25 00:35:43
【问题描述】:

我是 Portlet 开发的新手,在 Liferay 上遇到了一个烦人的问题。

我玩了一会儿,并根据“My-Greeting”教程中的“edit.jsp”创建了以下 portlet (.jsp) 页面:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>

<%@ page import="javax.portlet.PortletPreferences" %>

<portlet:defineObjects />

<%

PortletPreferences prefs = renderRequest.getPreferences();
String Temperature = (String)prefs.getValue("Temperature","Temperature");

PortletPreferences prefs2 = renderRequest.getPreferences();
String FromUnit = (String)prefs2.getValue("FromUnit", "FromUnit");

PortletPreferences prefs3 = renderRequest.getPreferences();
String ToUnit = (String)prefs3.getValue("ToUnit","ToUnit");



%>



<portlet:renderURL var="editGreetingURL">

    <portlet:param name="jspPage" value="/edit.jsp" />

</portlet:renderURL>

<aui:form action="http://www.webservicex.net/ConvertTemperature.asmx/ConvertTemp" method="post">

    <aui:input label="Temperature" name="Temperature" type="text" value="<%= Temperature %>" />
    <aui:input label="FromUnit" name="FromUnit" type="text" value="<%= FromUnit %>" />
    <aui:input label="ToUnit" name="ToUnit" type="text" value="<%= ToUnit %>" />
    <aui:button label="submit" type="submit" value="Submit" />

</aui:form>

<portlet:renderURL var="viewGreetingURL">

    <portlet:param name="jspPage" value="/view.jsp" />

</portlet:renderURL>

<p><a href="<%= viewGreetingURL %>">Back</a></p>

</body>
</html>

这个 portlet 应该接受 3 个输入参数:Temperature、FromUnit 和 ToUnit,然后将它们传递给公共 WebService,该 WebService 将温度例如从华氏温度转换为摄氏度(参见 http://www.webservicex.net/ConvertTemperature.asmx?WSDL)。

portlet 正确呈现输入字段,当我单击提交按钮时,它也尝试执行 Web 服务,但实际上并没有传递参数,因为我从 Web 服务本身收到以下错误响应:

System.InvalidOperationException:缺少参数:温度。 在 System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection 集合) 在 System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest 请求) 在 System.Web.Services.Protocols.HttpServerProtocol.ReadParameters() 在 System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

因此,即使我的 portlet 具有输入字段 Temperature,它似乎并没有真正传递它并将其附加到帖子中的操作 URL ...

还有一点,我将“post”替换为“get”,URL 字符串如下所示:

http://www.webservicex.net/ConvertTemperature.asmx/ConvertTemp?_mygreeting_WAR_mygreetingportlet_formDate=1377389917227&_mygreeting_WAR_mygreetingportlet_Temperature=30&_mygreeting_WAR_mygreetingportlet_FromUnit=degreeFahrenheit&_mygreeting_WAR_mygreetingportlet_ToUnit=degreeCelsius

我在这里做错了什么?显然它似乎传递了错误的参数...

【问题讨论】:

    标签: web-services jsp post liferay portlet


    【解决方案1】:
    • 您的portlet 的jsps 不能有&lt;html&gt;&lt;head&gt;&lt;body&gt; 部分,这是门户的业务。您只在您的 portlet 中生成整个页面的片段
    • 当您使用&lt;aui:form&gt;&lt;aui:input&gt; 时,AlloyUI 知道它正在门户中运行,因此它会将portlet 名称空间添加到参数名称中——这就是您在引用的GET URL 中看到的内容。 (如果您确实想从门户发布到外部站点,只需使用 &lt;form&gt;&lt;input&gt;
    • 如果您检查http://www.webservicex.net/ConvertTemperature.asmx/ConvertTemp?&Temperature=30&FromUnit=degreeFahrenheit&ToUnit=degreeCelsius,您将看到它以类似 Web 服务的结果回复,例如&lt;double&gt;-1.1111111111110859&lt;/double&gt;,因此您很可能不希望将此作为表单的发布目标,而是实现您的 portlet 以访问服务并显示嵌入在您的 portlet 输出中的结果。但是,如何做到这一点超出了此答案的范围
    • 只是相关:您可以仅从您的prefs 对象中获取所有首选项,不需要prefs2prefs3,而且您没有使用editGreetingURL,对吧?

    【讨论】:

    • 嘿,感谢您的回答,非常感谢! jsp 中的 HTML 代码来自 Liferay 自己的示例(My Greeting Portlet 示例)……我不知道它不应该在那里。所以你是说我根本不能使用 aui:form 将参数发布到外部 Web 服务?出于好奇,您将如何实现它以便将结果嵌入到 portlet 中?
    • 您可能想要回发到您的 portlet 的 actionURL,让您的 portlet 联系外部 Web 服务(或缓存),然后生成一个包含主 portlet 输出结果的输出 - 而不是发送到一个外部站点,完全移动到该站点。您在哪里找到“我的问候门户”?我猜这个结果只是来自 eclipse 在创建新 jsp 时添加的标准 jsp 样板,但在门户世界中不能有提到的标签 - 你只是生成该页面的片段。
    • 好的,找到“我的问候”portlet。实际上,它不包含标签,但包含创建文件的说明。所以你很可能最终在页面上看到了 eclipse 的样板文件。
    • 嗨奥拉夫,是的,这正是我想做的。我做了一些更多的研究,看起来我将不得不使用 AJAX 和 jquery,我添加了另一个答案,但我对该解决方案的问题是,虽然它会阻止重定向到外部站点,但我仍然没有不知道如何实际发布我正在调用的 Web 服务的响应......此解决方案会发布一条定制消息,如您所见。如何嵌入服务的实际响应?
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2012-07-30
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多