我正在为 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分配中手动替换“<
”的所有“<
”和“>
”的所有“>
” {1}}“在连接之前,然后执行以下操作:
var valorAction = valorAction.replace(/</g,"<").replace(/>/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>
不可能 找到。
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('"
答案 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 值就可以了。
所以,我最终跳过了重新分配的动作,因为字段值被设置为请求参数,应该是这样。
感谢您的帮助。