你好社區我有以下問題,我正在使用 JSP 和 Struts 技術進行專案,我真的很新,因為它是一項舊技術,但這是我必須使用的技術。
我有一個問題,即重繪 頁面時正在呼叫該操作,我明白這是因為在我的 URL 中是我發送給呼叫的最后一個操作,所以它正在回呼該操作,我有更多我的 JSP 中的一種形式具有不同的動作,我不知道這是否正確或必須將它們更改為 ajax 或有什么方法可以解決它?
我已經為這些操作添加了一個 POST 方法,但它仍然沒有作業。
我在組態檔中的操作:
<action name="plantillasAction_*" method="{1}" class="com.xxx.action.ActionPlantillas">
<result name="success">/jsp/plantillas/ResultTemplates.jsp</result>
<result name="templateUpload">/jsp/plantillas/CreateCoordinates.jsp</result>
<result name="saveCoordinates">/jsp/plantillas/SaveCoordinates.jsp</result>
<result name="updateCoordinates">/jsp/plantillas/UpdateCoordinatesTemplate.jsp</result>
<interceptor-ref name="defaultSecurityStack">
<param name="tokenSession.excludeMethods">init,templateFileUpload,processNavigator,
addCoordinateTemplate,deleteCoordinateToSave,saveTemplate,
deleteTemplate,viewUpdateTemplate,addCoordinatesTemplateUpdate,
searchTemplates,processUpdateNavigator</param>
</interceptor-ref>
<allowed-methods>
templateFileUpload,
processNavigator,
addCoordinateTemplate,
deleteCoordinateToSave,
saveTemplate,
deleteTemplate,
viewUpdateTemplate,
addCoordinatesTemplateUpdate,
processUpdateNavigator,
init,
searchTemplates
</allowed-methods>
</action>
我的CreateCoordinates.jsp:
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/struts-tags.tld" prefix="s" %>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
<%@ taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
<!DOCTYPE html>
<html>
<head>
<meta name="decorator" content="contentLayout"/>
</head>
<body>
<script src="${pageContext.request.contextPath}/html/js/jquery/alerts/jquery.alerts.js" type="text/javascript"></script>
<link rel="stylesheet" href="${pageContext.request.contextPath}/html/js/jquery/alerts/jquery.alerts.css">
<script src="${pageContext.request.contextPath}/html/js/coordinatesTemplate.js" type="text/javascript"></script>
<script src="${pageContext.request.contextPath}/html/js/templates.js" type="text/javascript"></script>
<script language="javascript">
function update(value){
var url="myAction?someVariable=value";
window.open(url,"_blank","directories=no, status=no,width=1400, height=870,top=0,left=0");
}
</script>
<div id="content">
<div class="wrap">
<h1 style="margin-left:15px">
<s:text name="label.module.template.header.update"/>
</h1>
<s:form action="plantillasAction_processUpdateNavigator" method="post" >
<s:token />
<hr style="border:15px;">
<hr style="border:2px;">
<div id="navigator" align="center">
<table align="center">
<tr>
<s:if test="currentPosition==imagePDFs.size() ">
<script type="text/javascript"> disableFirstButtons()</script>
</s:if>
<s:if test="currentPosition== 1 && imagePDFs.size() != 1">
<script type="text/javascript"> enableFirstButtons()</script>
</s:if>
<s:if test="currentPosition==1 && imagePDFs.size()==1 ">
<script type="text/javascript"> enableAllButtons()</script>
</s:if>
<td>
<button id="firstPage" name="buttonAction" type="submit" value="3" ><<</button>
</td>
<td>
<button id="backPage" name="buttonAction" class="previous" type="submit" value="2" ><</button>
</td>
<td align="center">
<li>${currentPosition}/${imagePDFs.size()}</li>
</td>
<td align="right">
<button id="nextPage" name="buttonAction" class="next" type="submit" value="1">></button>
</td>
<td align="right">
<button id="endPage" name="buttonAction" type="submit" value="4">>></button>
</td>
</tr>
</table>
</div>
<div class="wrapper">
<div id="content">
<div id="pdf-container" >
<div id="signers-list">
</div>
<img id="pdf-page" src="data:image/png;base64,${image}" />
</div>
<!-- .\pdf-container -->
</div>
<!-- .\content -->
</div>
<!-- .\wrapper -->
<div id="navigator" align="center">
<table align="center">
<tr>
<td align="center">
<button id="firstPage2" name="buttonAction" type="submit" value="3"><<</button>
</td>
<td align="center">
<button id="backPage2" name="buttonAction" class="previous" type="submit" value="2"><</button>
</td>
<td align="center">
<li>${currentPosition}/${imagePDFs.size()}</li>
</td>
<td align="rigth">
<button id="nextPage2" name="buttonAction" class="next" type="submit" value="1">></button>
</td>
<td align="rigth">
<button id="endPage2" name="buttonAction" type="submit" value="4">>></button>
</td>
</tr>
</table>
</div>
</s:form>
<s:form action="routeAction_updateRoute" method="post" validate="false" namespace="/plantilla" theme="simple" onsubmit="return false;">
<s:token />
<table width="100%" cellspacing="0" cellpadding="0">
<tr height="10px">
</tr>
<tr height="40px" valign="middle" class="tablecells">
<td width="25%" class="negritas">
<s:text name ="label.module.template.info.plantilla" />
</td>
</tr>
<tr height="40px" valign="middle" class="tablecells">
<td width="14%">
<s:text name="label.module.template.add.nombre.plantilla"/>
</td>
<td>
<s:textfield id="idTemplateName" maxlength="80" size="40"
value="%{currentTemplateView}" cssClass="inputbox"/>
</td>
</tr>
<tr height="5px">
</tr>
</table>
</table>
<!-- TABLA CON BOTONES PARA BUSCAR INTEGRANTES A LA NUEVA RUTA (GRID)-->
<table width="100%" cellspacing="0" cellpadding="0">
<tr height="40px" valign="middle" align="center" class="tablecells">
<td colspan="2" class="leftElement">
<button id="agregarFirma" class="action green" style="float:none" name="buttonActionCoordiante" type="submit" value="2">
<span id="fisnish" class="label" onClick='createDragDropElement()'>Agregar</span>
</button>
<button class="action green" style="float:none" id="btnCancelar" onClick="regresar('${pageContext.request.contextPath}')">
<span id="iniciar" class="label">
<s:text name="boton.cancelar"/>
</span>
</button>
</td>
</tr>
<tr height="15px">
</tr>
</table>
</s:form>
</div>
<script src="${pageContext.request.contextPath}/html/plugins/fontawesome/js/fontawesome-all.min.js" type="text/javascript"></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/js/bootstrap.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.0.943/pdf.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/interact.js/1.10.11/interact.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.0.943/pdf.worker.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/TweenMax.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/utils/Draggable.min.js'></script>
<script src="${pageContext.request.contextPath}/html/js/mainPdfUpdate.js" type="text/javascript"></script>
</body>
</html>
當我輸入我的 JSP 時,這是 URL:

當我按下第一個表單的任何按鈕時,它會將 URL 更改為

If I refresh my page there, the action name is plantillasAction_processUpdateNavigator ,what I want in this case is to execute the action plantillasAction_viewUpdateTemplate.
My ActionPlantillas.java:
public class ActionPlantillas extends ActionSupport implements ServletRequestAware {
private static Logger logger = LogManager.getLogger(ActionPlantillas.class);
private HttpServletRequest request;
public String viewUpdateTemplate() {
//OPERATIONS
return "updateCoordinates";
}
public String processUpdateNavigator() {
//OPERATIONS
return "updateCoordinates";
}
}
uj5u.com熱心網友回復:
使用 redirectAction 類創建 SuccessAction。
<action name="plantillasAction_*" method="{1}" class="com.xxx.action.ActionPlantillas">
<result name="success">/jsp/plantillas/ResultTemplates.jsp</result>
</action>
<action name="SuccessAction" class="SuccessPage">
<result name="success">/jsp/plantillas/success.jsp</result>
<action name="manual_order" class="materialTypeMasterAction" method="enquiry_process">
<result type="redirectAction">SuccessAction</result>
</action>
像這樣: 防止動作重新提交
請注意,如果您不更改 URL,它將始終重新提交表單。因此,如果您在上面實施此解決方案,則 url 將在成功時更改 (redirectSuccess)。
您不必真正創建新的成功頁面,您可以重定向到加載表單的原始 url/操作(干凈)。
我希望這有幫助。
uj5u.com熱心網友回復:
如果您使用 Struts 應用程式,那么動作的概念比您在 JSP 表單中使用的更廣泛。帶著請求進入 Struts 的一切都是一個動作。因此,重繪 頁面意味著呼叫由 URL 映射的操作。
如果您首先遵循操作模式,那么當 Struts 執行dispatcher結果時,servlet 調度程式會轉發 JSP 。它是結果配置使用的默認結果型別。執行后的操作通常會回傳一些帶有名稱的結果。實際上它是一個結果代碼,它允許動作呼叫停止處理動作并立即執行結果。
正如我所說,在執行結果后,JSP 被轉發到瀏覽器,URL 不是該 JSP 的位置,而是作為結果回傳該 JSP 的操作。如果請求被轉發,則 URL 不會改變。如果您想更改 URL,您應該使用帶有更新 URL 的新請求。
在您的場景中,您使用 viewUpdateTemplate()操作呈現 JSP 。并且您希望在執行processUpdateNavigator()操作后顯示相同的 JSP 。因為updateCoordinates回傳相同的結果。
您應該知道不同的動作由不同的請求、不同的請求方法、不同的執行緒執行,并且每個請求使用新的動作實體。這意味著如果第一個操作通過 OGNL 或 JSTL 呈現的所有內容可能無法用于第二個操作,如果它們不prepare()通過實作相同的Prepareable介面共享相同的方法。因此,JSP 可能無法完全呈現。
另一方面,您不想停留在執行 POST 請求的操作的 URL 上。在這種情況下,您應該回傳重定向回應。它由 Strutsredirect或reditectAction結果型別完成。它們都更改了瀏覽器 URL 中的位置,并遵循新的 GET 請求。
在您的情況下,您應該將此結果型別配置為操作并指定它被重定向的操作。應該是第一個action,因為它回傳了上面的JSP。第二個動作不會回傳 JSP,而是將reditectAction結果回傳 給第一個動作。
請注意,您通過第二個操作在 JSP 中使用的任何屬性都應限定為會話或共享通過,prepare()因為重定向的回應會丟失其屬性。
編碼:
在 struts.xml:
<action name="plantillasAction_*" method="{1}" class="com.xxx.action.ActionPlantillas">
<result name="success">/jsp/plantillas/ResultTemplates.jsp</result>
<result name="templateUpload">/jsp/plantillas/CreateCoordinates.jsp</result>
<result name="saveCoordinates">/jsp/plantillas/SaveCoordinates.jsp</result>
<result name="updateCoordinates">/jsp/plantillas/UpdateCoordinatesTemplate.jsp</result>
<result name="viewUpdateTemplate" type="redirectAction">plantillasAction_viewUpdateTemplate</result>
<interceptor-ref name="defaultSecurityStack">
<param name="tokenSession.excludeMethods">init,templateFileUpload,processNavigator,
addCoordinateTemplate,deleteCoordinateToSave,saveTemplate,
deleteTemplate,viewUpdateTemplate,addCoordinatesTemplateUpdate,
searchTemplates,processUpdateNavigator</param>
</interceptor-ref>
<allowed-methods>
templateFileUpload,
processNavigator,
addCoordinateTemplate,
deleteCoordinateToSave,
saveTemplate,
deleteTemplate,
viewUpdateTemplate,
addCoordinatesTemplateUpdate,
processUpdateNavigator,
init,
searchTemplates
</allowed-methods>
</action>
在Action課堂上:
public String viewUpdateTemplate() {
//OPERATIONS
return "updateCoordinates";
}
public String processUpdateNavigator() {
//OPERATIONS
return "viewUpdateTemplate";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/329438.html
