すべてのリンクは、パラメータ menuId (もちろん、表示する必要があるメニューの ID) を探す 1 つのアクションを通過します。
このアクションから、応答を返す前に、1 つの JavaScript 関数を呼び出すように設定しました。
setBackMenuId(menuId,sometext)
MenuId は ID であり、sometext はそのメニューの名前であるため、ブラウザのログ履歴が改善されます。
function setBackMenuId(id,subtekst) {
window.location.hash = "menuId="+id;
document.title = subtekst;
selectedHash = document.location.hash;
if(intervalHashSearch == '') {
initializeHashSearch();
}
}
次に、他の必要な js 関数:
function publishLinkTarget() {
var param = window.location.hash;
if(param) {
if(param.indexOf("menuId") > 0) {
var id = param.split("=", 2);
if(id[1]) {
setCookie('backMenuId',id[1],1,false);
setTimeout('publishLayoutContent()', 100);
}
}
}
}
var selectedHash = '';
var intervalHashSearch = '';
function initializeHashSearch() {
intervalHashSearch = window.setInterval('checkHash()', 500);
}
function stopHashSearch() {
window.clearInterval(intervalHashSearch);
intervalHashSearch = '';
}
function checkHash() {
var currentHash = document.location.hash;
if(selectedHash != currentHash) {
selectedHash = currentHash;
publishLinkTarget();
}
}
function publishLayoutContent() {
dojo.event.topic.publish("layoutContentTarget");
}
見てみると、まず「setBackMenuId」という名前で、アドレスバーにハッシュとパラメータを追加してタイトルを変更し、このハッシュを記憶しているので、区間ハッシュ検索で違いがわかります。次に、このハッシュ検索を初期化します。
「checkHash」は 500 ミリ秒ごとに実行され、ハッシュが変更されたかどうかをチェックしています (つまり、戻るボタンが押され、新しいリンクがクリックされたわけではありません (setBackMenuId が selectedHash を設定します)。true の場合 (戻る/進むボタンが押された) 関数publishLinkTarget' が呼び出され、ハッシュからパラメーターが読み取られ、問題がなければ、まず Cookie を設定して、HttpServletRequest から読み取って、どのメニュー ID リンクのメニュー ID かを調べることができます。 「publishLayoutContent」で作成したコンテンツも公開する必要があります。
アクション クラス (これは MenuAction、メソッド ビューであり、 で公開されているものと同じです) では、これだけが重要です。
Integer menuId = null;
if(request.getParameter("menuId") != null) {
menuId = Integer.valueOf(request.getParameter("menuId"));
} else {
menuId = getIntCookie("hiddenMenuId");
}
そのため、パラメーターからメニュー ID を取得しない場合 (リンクをクリック)、Cookie (戻る/進むボタン) から取得します。
そして、このターゲットを持つ JSP:
<s:url var="layoutContentUrl" action="Menu-view" namespace="/public" />
<sx:div showLoadingText="false" indicator="ajaxIndicator"
id="layout-content" href="%{layoutContentUrl}" theme="ajax"
listenTopics="layoutContentTarget" preload="false"
afterNotifyTopics="/ajaxAfter">
</sx:div>
注: これは、すべてが 1 つのパラメーターを介して接続されている場合の特殊なケースですが、他のターゲットを発行する他のパラメーターを使用して簡単に拡張できます。私はそれをどこかで公開するのに十分な一般的なものにしようとしますが、これは(私が推測する)長い道のりです:)
ご不明な点がございましたら、投稿してください。