不在 Struts 中的 execAndWait 拦截器中的 wait.jsp 页面上重定向 2
Not Redirecting on wait.jsp page in execAndWait intercepter in Struts 2
当请求花费太多时间写入 html 文件时,我想在我的页面上放置处理栏。所以我在 Strust2 中使用了 execAndWait
拦截器,但是页面无法在 wait.jsp 上重定向。
Struts.xml
<action name="htmlUtility"
class="com.support.action.ActivityAction" method="htmlUtility">
<interceptor-ref name="execAndWait">
<param name="delay">1000</param>
<param name="delaySleepInterval">500</param>
</interceptor-ref>
<result name="wait">/pages/reportingview/ftl/wait.jsp</result>
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="bufferSize">1024</param>
</result>
</action>
Wait.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>wait</title>
<meta http-equiv="refresh" content="0.5;url='<s:url includeParams="all" />'">
</head>
<body>
<p>your request is processing...</p>
<img src="ajax-loader.gif"/>
</body>
</html>
ActivityAction-
private InputStream saveAsHTML() {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PrintStream printhtml = new PrintStream(buffer);
String htmlheader="<html><style type='text/css'>.dataTable "
+ "{width:100%; font-family:Verdana, Geneva, sans-serif;border-top:1px solid #ccc; border-right:1px solid #ccc;+}"
+ ".dataTable th {background:#f1f1f1; text-align:left;padding:5px;font-weight:normal; border-bottom:1px solid #ccc;"
+ " border-left:1px solid #ccc;}.dataTable tr {}.dataTable td { padding:5px;border-bottom:1px solid #ccc;border-left:1px solid #ccc;}.txtCenterAlign "
+ "{text-align:center !important;}.transparentBg{ background:transparent !important;}</style><head>";
if(activityType.equalsIgnoreCase(SupportWebConstants.ACCESSPOINT_CONSTANT)){
htmlheader+="<title>Access Point Activity Report</title></head><body> <table width='100%' border='0' cellpadding='0' cellspacing='0' class='dataTable'><thead> <tr>"
+ "<th colspan='9' class='txtCenterAlign'>Access Point Activity Report</th></tr><tr>";
}
else
{
htmlheader+="<title>Credential Holder Activity Report</title></head><body> <table width='100%' border='0' cellpadding='0' cellspacing='0' class='dataTable'><thead> <tr>"
+ "<th colspan='9' class='txtCenterAlign'>Credential Holder Activity Report</th></tr><tr>";
}
for (String columnName : ReportHeaderMapper.getColumnList(activityType)) {
htmlheader+= "<th class='transparentBg'><b>"+columnName+"</b></th>";
}
htmlheader+="</tr></thead> <tbody>";
String tableData="";
String htmlfooter=" </tbody></body></html>";
activityList = activityDTOList.getActivityDTOs();
ReportHeaderMapper.setData(activityList);
for (List<String> activityDTO : ReportHeaderMapper.getAccessPointAllRows(activityType)) {
tableData= tableData+"<tr>";
for (String data : activityDTO) {
tableData+= "<td>"+data+"</td>";
}
tableData=tableData+"</tr>";
}
printhtml.println(htmlheader+tableData+htmlfooter);
printhtml.close();
LOGGER.info("HTML file created successfully.");
LOGGER.info("HTML activityList size" + activityList.size());
return new ByteArrayInputStream(buffer.toByteArray());
}
当我生成请求时出现以下错误
HTTP Status 404 - No result defined for action
com.narendra.stg.Sdg.support.action.ActivityAction and result error
type Status report
message No result defined for action
om.narendra.stg.Sdg.support.action.ActivityAction and result error
description The requested resource is not available.
由于某种原因,您的操作 returning "error" 作为结果类型。
检查其 returning 错误的原因,可能是它在 return 成功之前在方法执行期间失败。
同时添加 return 名称作为错误并重定向到某些 error.jsp 页面,这就是您的错误所说
No result defined for action
com.narendra.stg.Sdg.support.action.ActivityAction and result error
执行操作所需的默认拦截器堆栈。覆盖拦截器时,您没有包含 defaultStack
。试试下面的动作配置
<action name="htmlUtility"
class="com.assaabloy.stg.support.ActivityAction" method="htmlUtility">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="execAndWait">
<param name="delay">1000</param>
<param name="delaySleepInterval">500</param>
</interceptor-ref>
<result name="wait">/pages/reportingview/ftl/wait.jsp</result>
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="bufferSize">1024</param>
</result>
</action>
应该有一个 returns 一个 error
结果的拦截器,这个结果可以像 this 答案中那样全局配置。
当请求花费太多时间写入 html 文件时,我想在我的页面上放置处理栏。所以我在 Strust2 中使用了 execAndWait
拦截器,但是页面无法在 wait.jsp 上重定向。
Struts.xml
<action name="htmlUtility"
class="com.support.action.ActivityAction" method="htmlUtility">
<interceptor-ref name="execAndWait">
<param name="delay">1000</param>
<param name="delaySleepInterval">500</param>
</interceptor-ref>
<result name="wait">/pages/reportingview/ftl/wait.jsp</result>
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="bufferSize">1024</param>
</result>
</action>
Wait.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>wait</title>
<meta http-equiv="refresh" content="0.5;url='<s:url includeParams="all" />'">
</head>
<body>
<p>your request is processing...</p>
<img src="ajax-loader.gif"/>
</body>
</html>
ActivityAction-
private InputStream saveAsHTML() {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PrintStream printhtml = new PrintStream(buffer);
String htmlheader="<html><style type='text/css'>.dataTable "
+ "{width:100%; font-family:Verdana, Geneva, sans-serif;border-top:1px solid #ccc; border-right:1px solid #ccc;+}"
+ ".dataTable th {background:#f1f1f1; text-align:left;padding:5px;font-weight:normal; border-bottom:1px solid #ccc;"
+ " border-left:1px solid #ccc;}.dataTable tr {}.dataTable td { padding:5px;border-bottom:1px solid #ccc;border-left:1px solid #ccc;}.txtCenterAlign "
+ "{text-align:center !important;}.transparentBg{ background:transparent !important;}</style><head>";
if(activityType.equalsIgnoreCase(SupportWebConstants.ACCESSPOINT_CONSTANT)){
htmlheader+="<title>Access Point Activity Report</title></head><body> <table width='100%' border='0' cellpadding='0' cellspacing='0' class='dataTable'><thead> <tr>"
+ "<th colspan='9' class='txtCenterAlign'>Access Point Activity Report</th></tr><tr>";
}
else
{
htmlheader+="<title>Credential Holder Activity Report</title></head><body> <table width='100%' border='0' cellpadding='0' cellspacing='0' class='dataTable'><thead> <tr>"
+ "<th colspan='9' class='txtCenterAlign'>Credential Holder Activity Report</th></tr><tr>";
}
for (String columnName : ReportHeaderMapper.getColumnList(activityType)) {
htmlheader+= "<th class='transparentBg'><b>"+columnName+"</b></th>";
}
htmlheader+="</tr></thead> <tbody>";
String tableData="";
String htmlfooter=" </tbody></body></html>";
activityList = activityDTOList.getActivityDTOs();
ReportHeaderMapper.setData(activityList);
for (List<String> activityDTO : ReportHeaderMapper.getAccessPointAllRows(activityType)) {
tableData= tableData+"<tr>";
for (String data : activityDTO) {
tableData+= "<td>"+data+"</td>";
}
tableData=tableData+"</tr>";
}
printhtml.println(htmlheader+tableData+htmlfooter);
printhtml.close();
LOGGER.info("HTML file created successfully.");
LOGGER.info("HTML activityList size" + activityList.size());
return new ByteArrayInputStream(buffer.toByteArray());
}
当我生成请求时出现以下错误
HTTP Status 404 - No result defined for action com.narendra.stg.Sdg.support.action.ActivityAction and result error
type Status report
message No result defined for action om.narendra.stg.Sdg.support.action.ActivityAction and result error
description The requested resource is not available.
由于某种原因,您的操作 returning "error" 作为结果类型。
检查其 returning 错误的原因,可能是它在 return 成功之前在方法执行期间失败。
同时添加 return 名称作为错误并重定向到某些 error.jsp 页面,这就是您的错误所说
No result defined for action com.narendra.stg.Sdg.support.action.ActivityAction and result error
执行操作所需的默认拦截器堆栈。覆盖拦截器时,您没有包含 defaultStack
。试试下面的动作配置
<action name="htmlUtility"
class="com.assaabloy.stg.support.ActivityAction" method="htmlUtility">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="execAndWait">
<param name="delay">1000</param>
<param name="delaySleepInterval">500</param>
</interceptor-ref>
<result name="wait">/pages/reportingview/ftl/wait.jsp</result>
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="bufferSize">1024</param>
</result>
</action>
应该有一个 returns 一个 error
结果的拦截器,这个结果可以像 this 答案中那样全局配置。