将表单字段值传递给WebSphere Portal 6.1中的portlet:renderURL标记的参数

时间:2011-12-01 21:02:11

标签: javascript jsp encoding websphere-6.1 websphere-portal

我正在为 WebSphere Portal 6.1开发一个portlet,使用JSP / JSTL,纯javascript,没有AJAX框架,使用JSP显示发送反馈表单,并在提交时重定向到另一个JSP向用户显示操作的成功。

我使用javascript通过document.getElementById()函数获取表单字段的值。例如:

var valorAsunto = document.getElementById("asunto").value;

其中“asunto”是表单中文本字段的ID。我的表格也有以下结构:

<form name="formularioCorreo" id="formularioCorreo" method="post" action="<portlet:renderURL><portlet:param name="nextTask" value="sendFeedback"/></portlet:renderURL>">

这样可行,但是我在尝试从javascript值构建<portlet:renderURL>标记时遇到了麻烦:当我尝试连接renderURL的字符串然后重新分配以形成这样的动作时:

var valorAction = '<portlet:renderURL><portlet:param name="nextTask" value="sendFeedback"/><portlet:param name="asunto" value="'+valorAsunto+'"/></portlet:renderURL>';
document.formularioCorreo.action = valorAction; 
document.formularioCorreo.submit();

部署应用程序时,生成的字符串具有以下结构:

  

/ WPS / myportal / <portletpath> /!UT / P / C5 / <a very long random sequence of numbers and letters> /

因此无法弄清楚参数值的位置,但是如果我打印指定的值,它会显示如下内容:

  

asunto:'+ valorAsunto +'

而不是

  

asunto:这是一个样本主题

我一直在尝试使用其他方法来连接字符串;例如,使用StringBuffer,如http://www.java2s.com/Tutorial/JavaScript/0120__String/StringBufferbasedonarray.htm

所示

以及encodeURI() / decodeURI()replace()等javascript函数,但我无法获取具有正确参数值的URL或结构中编码的URL如上所示(具有长序列的字符)。

有时我设法获得正确的参数值,方法是在valorAction分配中手动替换“<”的所有“&lt;”和“>”的所有“&gt;” {1}}“在连接之前,然后执行以下操作:

var valorAction = valorAction.replace(/&lt;/g,"<").replace(/&gt;/g,">");

然后我得到以下字符串:

<portlet:renderURL><portlet:param name="nextTask" value="sendFeedback"/><portlet:param name="asunto" value="this is a sample subject"/></portlet:renderURL>

这没关系,但是当它必须重定向到结果页面时,它会显示如下错误

  

错误404:EJPEI0088E:资源<portlet:renderURL><portlet:param name="nextTask" value="sendFeedback"/><portlet:param name="asunto" value="this is a sample subject"/></portlet:renderURL>不可能   找到。

  • 有人知道如何将该字符串转换为要呈现的正确格式吗?
  • 有人知道将这些参数值“注入”renderURL的其他方法吗?
  • 我还想知道是否可以将参数值从javascript传递给JSP,这样我就可以将这些值放在HashMap参数中,以便与PortletURLHelper.generateSinglePortletRenderURL()方法一起使用,情况前者是不可能的。

谢谢。


更新1:

在我的doView()我使用以下内容,以便进行重定向:

String targetJsp = "/_Feedback/jsp/html/FeedbackPortletView.jsp";
String nextTask = request.getParameter("nextTask");
//(... I have omitted code to conditionally select targetJsp value, according to nextTask value ...)
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(targetJsp);
rd.include(request, response);

这只是我的portlet中的一个新JSP,而不是一个不同的门户页面。我使用request.getParameter()doview()

获取表单字段的值
String subjectFeedback = request.getParameter("asunto");
String bodyFeedback = request.getParameter("mensaje");
String emailFeedback = request.getParameter("emailFeedback");

如果我的表单包含上面指定的字段,我认为不需要包含隐藏字段。事实上,我要做的是将用户在这些字段中输入的值作为请求参数传递,但我通过这种方式得到的值如下:

subjectFeedback: "'+valorAsunto+'"
bodyFeedback: "'+valorMensaje+'"
emailFeedback: "'+valorEmailFeedback+'"

使用“+”连接时,我得到上述值;当我使用StringBuffer时,我得到以下值:

subjectFeedback: "'); buffer.append(valorAsunto); buffer.append('"
bodyFeedback: "'); buffer.append(valorMensaje); buffer.append('"
emailFeedback: "'); buffer.append(valorEmailFeedback); buffer.append('"

3 个答案:

答案 0 :(得分:0)

  

有人知道将这些参数值“注入”renderURL的其他方法吗?

关于该主题,有两个IBM指南。

Portal 6.1 and 7.0 Advanced URL Generation Helper classes

How to create a link to a portlet (Standard API) that passes parameters to that portlet

答案 1 :(得分:0)

你如何重定向到另一页?它是一个不同的门户页面还是只是一个新的JSP页面? 您不需要将任何参数注入渲染URL。有一个表单,其行为针对renderURL。现在要将信息传递给portlet的doView()方法,您可以在表单中隐藏字段,然后使用JavaScript填充它们,然后提交表单。在doView()方法中,您可以使用request.getParameter()来获取参数。

答案 2 :(得分:0)

嗯,有时最明显的事情恰好是解决方案的方式。

我太忙于试图找到这种情况的详细原因,我根本没有检查过这个:

我的表单字段由不同的 id 正确识别,但未设置其名称属性。

在工作伙伴的帮助下,我们可以弄清楚这一点,因此在每个表单字段上为名称分配相同的 id 值就可以了。

所以,我最终跳过了重新分配的动作,因为字段值被设置为请求参数,应该是这样。

感谢您的帮助。