私は struts2 liferay ポートレットを持っていますが、1 列のレイアウト ページになるまで問題なく動作します。view.jsp (ポートレットの最初のページ) には、goToPrivilege アクションにマップする Struts フォームがあります。
<s:form id="privilegeForm" action="goToPrivilege" namespace="/view">
struts.xml で、goToPrivilege を使用して、privilegeAction にリダイレクトします。
<action name="goToPrivilege" class="defaultAdmin" method="goToPrivilege">
<result type="redirectAction">
<param name="actionName">privilegeAction</param>
<param name="needAssessmentId">${needAssessmentId}</param>
</result>
</action>
<action name="privilegeAction" class="privilegeAction">
<result>/html/needAssessmentAdmin/privilege.jsp</result>
<result name="error">/html/needAssessmentAdmin/error.jsp</result>
</action>
結果は次のとおりです。ユーザーは、privileged.jsp ページにリダイレクトされます。1 列のレイアウトでは問題なく動作しますが、このポートレットを 2 列のレイアウトとユーザー送信フォームのページに配置すると、privilege.jsp のコンテンツがページの下部に表示され、ポートレット領域の外に表示されます 。ポートレットはポートレットと同じように機能します (ポータルのどこでも使用できます)。
詳細については、liferay 5.2.3 Struts2 と Spring を使用しています。
編集: view.jsp には特別なことは何もありません。それはただの形です。privileged.jspには、目に見えないdiv(jquery popUpとして機能)があり、jquery Girdがロードされたテーブルがあります
...
<portlet:resourceURL var="privilegeurl" >
<portlet:param name="struts.portlet.action"
value="/grid/privilegeGrid" />
</portlet:resourceURL>
<portlet:resourceURL var="privilegeediturl">
<portlet:param name="struts.portlet.action"
value="/grid/privilegeEdit"/>
</portlet:resourceURL>
...
<!-- Add Dialog -->
<div id="adddialog" title='<%= res.getString("needAssessment.add")%>'>
<s:form id="addPrivilegeForm">
<s:hidden id="needAssessmentId" name="needAssessmentId"/>
<table>
...
</table>
<s:submit onclick="closeAddDialog();" key="submit" id="submitaddPrivilege" />
</s:form>
</div>
<script type="text/javascript">
...
j.query('#addPrivilegeForm').submit(function(event){
// fire off the request to actionEditUrl
j.query.ajax({
url: "<%=privilegeediturl%>",
type: "post",
data: {
'needAssessmentId':j.query('#needAssessmentId').val(),
'roleId': j.query('#addRoleId').val(),
'startDuration': j.query('#addStartDuration').val(),
'endDuration': j.query('#addEndDuration').val()
},
// callback handler that will be called on success
success: function(response, textStatus, jqXHR){
j.query('#privilegeGrid').trigger( 'reloadGrid' );
},
// callback handler that will be called on error
error: function(jqXHR, textStatus, errorThrown){
// log the error to the console
alert(
"The following error occured: "+
textStatus, errorThrown
);
}
});
// prevent default posting of form
event.preventDefault();
});
</script>
<!-- Back Button -->
<%if(!isPersian){ %>
<div style="text-align :right;direction: rtl">
<%}else { %>
<div style="text-align: left; direction: ltr">
<%} %>
<button onclick="goBack();" id="backButton"><%=res.getString("back")%></button>
<s:form id="backForm" cssStyle="display:none" action="defaultAdminView" namespace="/view">
</s:form>
</div>
<script type="text/javascript">
function goBack(){
document.forms["backForm"].submit();
}
j.query('#backButton').button();
</script>
<%if(isPersian){ %>
<div style="text-align :right;direction: rtl ">
<%}else { %>
<div style="text-align: left;direction: ltr">
<%} %>
<button id="addPrivilegeButton"><%=res.getString("needAssessment.add") %></button>
</div>
<script type="text/javascript">
j.query('#addPrivilegeButton').button().click(function(event){
addPrivilege();
return false;
});
</script>
<br/>
<!-- Privilege grid -->
<table id="privilegeGrid" style="width: 100%"></table>
<div id="pager2"></div>
そして、このグリッドをajaxでロードします
j.query("#privilegeGrid").jqGrid({
url:'<%=privilegeurl.toString()%>&' + '&needAssessmentId=' + needId ,
datatype : "json",
colNames : [
...
],
colModel : [
...
],
rowNum : 10,
rowList : [ 10, 20, 30 ],
pager : '#pager2',
sortname : 'id',
viewrecords : true,
jsonReader : {
repeatitems : false,
id : "0"
},
height : '100%',
width : 900,
caption : '<%=res.getString("privileges")%>',
...
});
j.query("#privilegeGrid").jqGrid('navGrid', '#pager2', {edit : false,add : false,del : false});