Unable to get values in JSP in Struts2 Liferay6.2 Portlet - struts2

Brief Overview: I am trying to port a webapp based on Struts2 ,into a Struts2 Liferay portlet.
Problem definition: The values are fetched as NULL/Blank even if if the action Class method is setting the values properly in my variables.
I have tried printing out the values when my method is returned in Action Class and also in my jsp. The values are getting properly set as I can see it from the loggers put in place just before returning SUCCESS, but in the jsp I can see all the required set variables are blank!!
Code snippet:
In jsp the code is fetching the values as below:
For instance
<br>
<s:if test="%{xyz!= null}">
<br />
<div style="margin-left:9em;">
<s:property value="xyz" escapeHtml="false"/> //never displayed as xyz is NULL
</div>
<br /><br />
</s:if>
<br>
on printing out xyz: <s:text name="%{xyz}"/> , I get blank values , this happens for all the required values in the jsp.
The options I have tried out:
I have tried using : %{#xyz}, %{xyz}, but didn't helped.
struts.xml
<action name="selectSite" class="com.abc.xyz.LandingPageAction"
method="selectSite">
<interceptor-ref name="abAjaxCallInterceptorStack" />
<result name="success" >/WEB-INF/jsp/portal/LandingContent.jsp</result>
</action>
liferay-portlet.xml:
<liferay-portlet-app>
<portlet>
<portlet-name>xyz-portlet</portlet-name>
<icon>/icon.png</icon>
<private-session-attributes>false</private-session-attributes>
<requires-namespaced-parameters>false</requires-namespaced-parameters>
<header-portlet-css>/css/main.css</header-portlet-css>
<footer-portlet-javascript>/js/main.js</footer-portlet-javascript>
<add-default-resource>true</add-default-resource>
</portlet>
</liferay-portlet-app>
jsp page:
<%# taglib prefix="s" uri="/struts-tags"%>
<%# taglib prefix="sj" uri="/struts-jquery-tags"%>
<br>
<s:if test="%{xyz!= null}">
<br />
<div style="margin-left:9em;">
<s:property value="xyz" escapeHtml="false"/>
</div>
<br /><br />
</s:if>
<br>
<br />
<sj:tabbedpanel id="billTab" >
<sj:tab id="overview" href="%{overviewURL}" label="Overview"
target="overviewDiv" indicator="loadingInd" />
<sj:tab id="invoices" href="%{invoiceURL}" label="Invoices"
target="invoicesDiv" indicator="loadingInd" />
<div id="overviewDiv" ></div>
<div id="invoicesDiv" ></div>
</sj:tabbedpanel>

try
<s:if test="xyz!= null">
if xyz is on the valuestack then you don't need to use %
You can also use Set tag to expose these values such as
<s:set var="varName" value="xyz"/>then just refer to it as varName instead of #varName
If you are accessing vars in a different portlet you will have set the value for the variable as at least request scope like this
<s:set var="varName" value="xyz" scope="request"/>
Then you can access them like this from another portlet in the same page
<s:if test="#request.xyz != null">

Related

how to change target of Struts2 jquery plugin dynamically

I have reportCriteria.jsp as follows:
<s:form action="showPdf" theme="css_xhtml" cssClass="form1small" name="reportgenerationform">
<div id="searchHeaderReport">Generate Report</div>
<div id="searchForm1">
<s:select list="#application.proList" headerValue="Select" headerKey="select" label="Provider" id="providerId" name="providerName"></s:select>
<div id="wwgrp_flightId" class="wwgrp">
<div id="wwerr_showPdf_flightId" class="wwerr">
<div class="errorMessage">
</div>
</div>
<div id="wwlbl_flightId" class="wwlbl">
<label class="label" for="flightId"> Flight ID: </label>
</div>
<div id="wwctrl_flightId" class="wwctrl">
<select id="flightId" name="flightId">
<option selected="selected">select</option>
</select>
</div>
</div>
<div id="wwgrp_scheduleId" class="wwgrp">
<div id="wwerr_showPdf_flightId" class="wwerr">
<div class="errorMessage">
</div>
</div>
<div id="wwlbl_flightId" class="wwlbl">
<label class="label" for="scheduleId"> Schedule ID: </label>
</div>
<div id="wwctrl_flightId" class="wwctrl">
<select id="scheduleId" name="scheduleId">
<option selected="selected">select</option>
</select>
</div>
</div>
</div>
<div id="submitdivid">
<sj:submit value="Generate Report" cssClass="orangebuttonsmall"/>
</div>
</s:form>
The struts.xml mapping is as follows:
<action name="showPdf" class="com.view.ReportAction" method="showReport">
<result name="report" type="stream">
<param name="inputName">fileStream</param>
<param name="contentType">application/pdf</param>
<param name="contentDisposition">attachment;filename="PDF_Report.pdf"</param>
</result>
<result name="input">/reportCriteria.jsp</result>
</action>
<action name="flightMgmt" class="com.view.AdminAction" method="flightMgmt">
<result name="flightMgmtClicked">/flightMgmt.jsp</result>
</action>
<action name="reportGeneration" class="com.view.AdminAction" method="reportGeneration">
<result name="reportGenerationClicked">/reportCriteria.jsp</result>
</action>
Now if the method showReport returns "report", then the pdf content is loaded in encrypted form in div with id as "report_generation".
When the method returns input, then it loads reportCriteria.jsp with errors in the div with id as "report_generation".
What i want to do is that when it returns error then the jsp must be loaded into that div but if the method returns "report" which it returns on success, then the file download box must appear as shown in result type="report" in struts.xml.
The following is "loginSuccessAdmin.jsp" that contains "report_generation" div :*
<%# taglib prefix="sj" uri="/struts-jquery-tags"%>
<%# taglib prefix="s" uri="/struts-tags"%>
<s:url var="remoteurl1" action="flightMgmt"/>
<s:url var="remoteurl2" action="reportGeneration"/>
<s:url var="remoteurl3" action="dealMgmt"/>
<sj:tabbedpanel id="remotetabs" selectedTab="0" collapsible="true">
<sj:tab id="tab1" href="%{remoteurl1}" label="Flight Management"/>
<sj:tab id="tab2" href="%{remoteurl2}" label="Report Generation"/>
<sj:tab id="tab3" href="%{remoteurl3}" label="Deal Management"/>
</sj:tabbedpanel>
</div>
The line <sj:tab id="tab2"> itself creates a div with id as report_generation.
Is there anything possible, that may accomplish my purpose..
Thanks in advance
That's not possible.
Javascript can't download files to a user's computer unless you code some workaround. Like this guy here.
Don't use the same action for fileDownload and error, instead split in two with the first one telling whether the fileDownload will work and then accordingly you can call the second one with sureity of receiving a file or it can show you the errors which you can push in a div like you're doing now.

Displaytag in struts2 checked columns dissappear when changing pages

i have this problem with displaytag...when i check some rows in the table and after go in another page for checking others the checked elements of the previous page disappear.
If i return to the previous page all the rows are unchecked...this is my code:
<%#taglib prefix="s" uri="/struts-tags" %>
<%#taglib prefix="display" uri="http://displaytag.sf.net" %>
…
<s:form action="actionSample" theme="simple">
<display:table
id="row"
name="tableSample"
requestURI="/sample"
sort="list"
pagesize="10"
cellpadding="0"
cellspacing="0"
>
<display:column property="one" title="ONE" sortable="true" />
<display:column property="two" title="TWO" sortable="true" />
<display:column headerClass="sortheader" title="SELECTION" style="text-align:center;">
<s:checkbox theme="simple" name="check" fieldValue='%{#attr.row.idOne}' />
</display:column>
</display:table>
<div>
<br>
</div>
<div align="right">
<s:submit type="button" label="SUBMIT"/>
</div>
How can i resolve this problem?, thank you for the answer...
P.S. i omitted the code of the action class, there is an array of string named "check" that stores the ids of the element selected

how to implement struts2 action error in the jquery grid page

i have a jsp page with struts2 jquery grid. I want to show errors in the jsp page from my action class.
To show error i am adding error messsage using
addActionError("You can not delete this data");
code in my action class. And to display it i am using
<s:if test="hasActionErrors()">
<div class="errors">
<s:actionerror/>
</div>
</s:if>
code in my jsp page. But unfortunately ,I am unable to show error in my jsp page.
Please share your knowladge regarding this issue.
-Thank you
Ashutosh
Full Code:
index.jsp:
.....
.....
<body>
<s:if test="hasActionErrors()">
<div class="errors">
<s:actionerror/>
</div>
</s:if>
<div id="setpage"> <s:url id="editurl" action="nedit"/>
<s:url id="editurl" action="nedit"/>
<s:url id="remoteurl" action="ntable"/>
<sjg:grid
id="gridtable"
caption="List of Subject Details"
dataType="json"
href="%{remoteurl}"
pager="true"
gridModel="gridModel"
rowList="50,100,5000"
rowNum="20"
.....
......
My action.java
.........
.........
else
{
addActionMessage("Unable to delete row");
return ERROR;
}
return SUCCESS;
.........
.........
struts.xml
<package name="gridedition" extends="struts-default,json-default">
<action name="editionntableshow" class="v.esoft.actions.actionfile" >
<result name="success" type="json"/>
<result name="error" type="json"/>
</action>
<action name="editionedit" class="v.esoft.actions.editiondetails.EditiondetailsEditAction">
<result name="success" type="json"></result>
</action>
</package>
This solved my problem...
<s:if test="hasActionErrors()">
<div class="errors">
<s:actionerror theme="jquery"/>
</div>
</s:if>
jqGrid submit the delete row action by ajax, while those hasActionErrors are not ajax operations so they cannot be caught.
In order to catch these action error/messages, that should not be a ajax/json action.

retrieving the value of the included html in struts2

I've included an html in my JSP
< s: include value="test.html" />. this test.html contains radio button. How do i retrieve the value of the radio button and pass it to action?
Add this <s:include /> tag in a form in your main page. e.g.
<s:form action="Welcome">
<s:include value="test.jsp"></s:include>
<s:submit />
</s:form>
test.jsp:
<input type="radio" value="abc" name="test" >abc</input>
<input type="radio" value="def" name="test" >def</input>
And in your Action named Welcome :
HttpServletRequest request = ServletActionContext.getRequest();
System.out.println(request.getParameter("test"));
You can get the value of your radio button. Hope this helps!
<s:form action="sampleAction">
<s:include value="yourjspfile.jsp"/>
<s:submit />
</s:form>
yourjspfile.jsp
<s:textfield name="name" label="Enter your name"/>
You can specify the name property in your action class and can access it directly no need to get it from the request object.

JSF2 ignores empty alt attribute

I have a jsf snippet:
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets">
<!-- Yandex.Metrika -->
<img src="//mc.yandex.ru/watch/xxx" alt=""/>
<!-- /Yandex.Metrika -->
</ui:composition>
But when I use it, web-client get HTML page whithout empty alt attribute in img element:
<!-- Yandex.Metrika -->
<img src="//mc.yandex.ru/watch/xxx" />
<!-- /Yandex.Metrika -->
As result my document has validation error (
How can I solve this problem?
You could use the JSF graphicImage component, which does render the empty alt attribute.
For Example:
<h:graphicImage value="#{resource['images:image1.png']}" alt="" />
or
<h:graphicImage value="http://somedomain.com/somecontext/xxx/image1.png" alt="" />
Not sure if that is a bug in JSF2 (JSF1.2 preserves empty attributes).
To 'workaround' that in JSF2, wrap code by f:verbatim, like this:
<f:verbatim>
<img src="//mc.yandex.ru/watch/xxx" alt=""/>
</f:verbatim>

Resources