参数未从Portlet(Liferay)正确传递到公共Web服务(转换温度)

时间:2013-08-25 00:35:44

标签: web-services jsp post liferay portlet

我是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,后者将温度转换为华氏温度到Celcius(参见http://www.webservicex.net/ConvertTemperature.asmx?WSDL)。

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

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 ...

更重要的是,我用“get”替换了“post”,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

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

1 个答案:

答案 0 :(得分:0)

  • 您的portlet的jsps必须没有<html><head><body>部分,这是门户网站的业务。您只在portlet中生成整个页面的片段
  • 当您使用<aui:form><aui:input>时,AlloyUI知道它在门户网站中运行,因此它将portlet命名空间添加到参数名称 - 这就是您在GET URL中看到的内容“再引用。 (如果您确实想从门户网站发布到外部网站,请使用<form><input>
  • 如果您选中http://www.webservicex.net/ConvertTemperature.asmx/ConvertTemp?&Temperature=30&FromUnit=degreeFahrenheit&ToUnit=degreeCelsius,您会看到此回复时会收到类似网络服务的结果,例如<double>-1.1111111111110859</double>,所以很可能你不希望将它作为表单的post目标,而是实现你的portlet来扩展服务并显示嵌入在你的portlet输出中的结果。虽然
  • ,但如何做到这一点超出了这个答案的范围
  • 只是相关:您可以仅从prefs对象获取所有偏好设置,不需要prefs2prefs3,并且您没有使用editGreetingURL,正确?