how to implement struts2 action error in the jquery grid page - struts2

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.

Related

struts2 - struts.action.extension not working

I am trying to change default url in my application using below code,
struts.xml :
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.action.extension" value="htm"/>
<package name="default" namespace="/" extends="struts-default" >
<action name="LoginClass" class="com.struts2.LoginCheckingClass" method="execute">
<result name="input">/Home.jsp</result>
<result name="success" type="dispatcher">/LoginSuccessPage.jsp</result>
<result name="error">/Home.jsp</result>
</action>
</package>
</struts>
Home.jsp :
<s:actionerror/><s:fielderror />
<br>
<s:form action="LoginClass" method="post" validate="true">
<s:textfield name="Uname" label="User Name" />
<s:textfield name="Pwd" label="Password" />
<s:submit validate="true" type="image" src="button-login2.png"/>
</s:form>
But when submit in Home.jsp the page always goes to 404 error page.I saw all tutorials and doing that same way but still i am getting same error.
If i remove the <constant name="struts.action.extension" value="htm"/> from struts.xml then page redirecting to represented page correctly.
someone help me out where am i doing wrong?

unable to include token in jsp struts2

I am a beginner to struts2. i am using struts2 token interceptor to prevent CSRF. the token interceptor in working for the login page, but it is not working for the second page. the second page is just a JSP with hyperlinks, and when i change the token value it says "Could not find token name in params" . this is my code
Jsp
<div style="margin: 0 auto; font-size: 16px;">
<s:token />
<a href="<s:url value="view" />" >Click Here to View and Search Data</a>
<br/><br/>
<a href="<s:url value="Upload.jsp" />" >Click here to Upload Data (CSV format)</a>
<br/><br/>
<a href="<s:url value="Register.jsp" />" >Click here to Upload Data (FORM)</a>
</div>
Struts.xml
<package name="default" extends="struts-default, json-default">
<!-- CREATING INTERCEPTOR -->
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="tokenSession" />
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
<interceptor-ref name="fileUpload" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<global-results>
<result name="invalid.token">/error.jsp</result>
</global-results>
<action name="login" class="action.loginAction">
<result name="input">/Login.jsp</result>
<result name="success">/Main.jsp</result>
<result name="error">/error.jsp</result>
</action>
how do i implement token intercepto for this jsp.
please suggest
Try changing order of interceptors , keep defaultStack in last.
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="tokenSession" />
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
<interceptor-ref name="fileUpload" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
Try using token instead of tokenSession.
<interceptor-ref name="token" />
Also post the struts mapping for second page submit.

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

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

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.

Liferay + Struts2 There is no Action mapped for action name default.

I am using Liferay6 with Struts2 .
This is the LOgin.jsp
<%# taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Struts 2 Login Application!</title>
</head>
<body>
<s:form action="login" method="POST" validate="true">
<tr>
<td colspan="2">
Login
</td>
</tr>
<s:actionerror />
<s:fielderror />
<s:textfield name="username" label="Login name"/>
<s:password name="password" label="Password"/>
<s:submit value="Login" align="center"/>
</s:form>
</body>
</html>
This is struts.xml file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default" namespace="/view">
<action name="login"
class="net.LoginAction">
<result name="success">/Welcome.jsp</result>
<result name="error">/view.jsp</result>
</action>
</package>
</struts>
This is exception stacktrace
9:51:52,109 ERROR [Jsr168Dispatcher:27] Could not find action
There is no Action mapped for action name default. - [unknown location]
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:177)
at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:36)
at org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher.serviceAction(Jsr168Dispatcher.java:446)
at org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher.render(Jsr168Dispatcher.java:323)
at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:100)
at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:64)
at com.liferay.portal.kernel.servlet.PortletServlet.service(PortletServlet.java:93)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:72)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:68)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:593)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:530)
at com.liferay.portlet.InvokerPortletImpl.invoke(InvokerPortletImpl.java:639)
There is no Action mapped for action name default.
But your action name login
<action name="login" class="net.LoginAction">
Your actions url must be sitename/youapp/view/login.action
In addition for loggining your hava two actions.
<action name="prepareLogin" class="net.LoginAction" method="input">
<result name="success">/login.jsp</result>
</action>
prepareLogin - this action only view login page
<action name="login" class="net.LoginAction" method="execute">
<result name="success">/Welcome.jsp</result>
<result name="error">/login.jsp</result>
</action>
login - this action get loggining

Resources