When we work with liferay 6.2 portlet development some time we may get null or empty values when we access request parameters or form input values in the portlet action class.
The reason is from Liferay 6.2 Portlet Action class only consider the request parameters which should append with portlet name space value. This is default behavior of Liferay 6.2 Portlet Action Class.
Example:
ParamUtil.getString(uploadPortletRequest, "paramName") ===> empty value
actionRequest.getParameter("paramName") ===> null
Same behavior you can see for renderRequst, resourceRequestobjects too while accessing request parameters or form inputs in the portlet action class respective methods.
What is Portlet Name Space?
Portlet Name Space will give unique name to the elements in the page and these elements are associated to respective portlet. This will avoid name conflicts in the page.
We may use many portlets within one page and there may be chance to get name collision among elements in the page. portlet name space will avoid those name conflicts in the page.
Each portlet have its own portlet name space value so that we need to append these portlet name space value to each element in the portlet like HTML tag names or ids and we can use this for request parameters.
How can i get Portlet Namespace Value?
We can use following two ways
- Using <portlet:namespace/> Tag.
- Using renderResponse Object
Using <portlet:namespace/> Tag.
We can use <portlet:namespace/> Tag so that we can append portlet name space value for element names,ids and request parameters.
Note :
we need to import respective tag library in the jsp page to use above tag.
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
Example Code Snippets:
<input type="text" name="<portlet:namespace/>employeeName" id="<portlet:namespace/>employeeName"/>
<div id="<portlet:namespace/>testDiv">this is div</div>
Using renderResponse Object
We can also use renderResponse object to get portet Name space value. renderResponse is liferay implicit object and these Objects will be available in JSP page.
We need to use following tag to get portlet implicit objects and it will be available to JSP page.
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
<portlet:defineObjects />
Example Code Snippets:
<input type="text" name="<%=renderResponse.getNamespace()%>employeeName" id="<%=renderResponse.getNamespace()%>employeeName"/>
<div id="<%=renderResponse.getNamespace()%>testDiv">this is div</div>
To avoid name conflicts among portlets element names and ids its recommended portlet name space for each element.
Liferay Requires Namespaced Parameters
Liferay 6.2 we have to append portlet Name space for every name of input element i.e. form input elements or request parameters names otherwise portlet action class ignore the parameters which does not have portlet name space to names. Due to this we will get NULL/Empty values in the portlet action class when we get parameters values from request objects.
Solutions
We must Use Portlet Name Space Value for Every form Inputs/Request parameters
Use <requires-namespaced-parameters> tag value “false” in liferay-portlet.xml
We must Use Portlet Name Space Value for Every form Inputs/Request parameters
When use forms in development we must use portlet name space for each form inputs. We need append portlet name space value to form input name attribute.
Example Code Snippets:
<input type="text" name="<portlet:namespace/>employeeName" id="<portlet:namespace/>employeeName"/>
OR
<input type="text" name="<%=renderResponse.getNamespace()%>employeeName" id="<%=renderResponse.getNamespace()%>employeeName"/>
OR
<aui:input name="employeeName" id="employeeName" label="Emplyee Name"/>
Note:
When we use aui form tags then portlet name space will be appended automatically and we need not required to append explicitly.
Use Request Parameters in Ajax
When we want to send request data using Ajax then we have to append portlet name space value to each request parameter then only portlet action class consider those request parameters and we can access request parameter values.
Liferay AUI Ajax Call
AUI().use('aui-base','aui-io-request', function(A){
//aui ajax call to get updated content
A.io.request('<%=updaContentURL%>',{
dataType: 'json',
method: 'GET',
data: {
<portlet:namespace/>employeeName:employeeName,
<%=renderResponse.getNamespace()%>employeeId:employeeId
},
on: {
success: function() {
// response data will be received here
}
}
});
});
jQuery Ajax Call
$(document).on('ready',function(){
//jquey aja methos to call server side content
$.ajax({
url: '<%=updaContentURL%>',
dataType: "json",
data:{
<portlet:namespace/>employeeName:employeeName,
<%=renderResponse.getNamespace()%>employeeId:employeeId
},
type: "get",
success: function(data){
//here response data will come and we need to update in the page.
},
beforeSend: function(){
// it will execute before Ajax call start
},
complete: function(){
// this method will execute after success method is completed.
},
error: function(){
}
});
});
Use '<requires-namespaced-parameters>' tag value “false” in liferay-portlet.xml
Instead of adding portlet name space value to each request parameters we can make false value to <requires-namespaced-parameters> in liferay-portlet.xml then portlet action class consider request parameters even it don't have portlet name space.
The following configuration we need to do in liferay-portlet.xml file
<requires-namespaced-parameters>false</requires-namespaced-parameters>
Finally you can access form inputs or request parameters in portlet action class so that we can get values
ParamUtil.getString(actionRequest, "paramName") ===>Some Value
actionRequest.getParameter("paramName") ===> Some Value
ParamUtil.getString(renderRequest, "paramName") ===>Some Value
renderRequest.getParameter("paramName") ===> Some Value
ParamUtil.getString(resourceRequest, "paramName") ===>Some Value
resourceRequest.getParameter("paramName") ===> Some Value
Author
0 comments:
Post a Comment