Все мои ссылки проходят через одно действие, которое ищет параметр menuId (конечно, идентификатор меню, которое должно быть показано).
Из этого действия перед возвратом ответа я установил одну функцию javascript для вызова:
setBackMenuId(menuId,sometext)
MenuId - это идентификатор, 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', которая считывает параметры из хэша, и, если они в порядке, сначала я устанавливаю куки, чтобы я мог прочитать его из HttpServletRequest и выяснить, для какой ссылки на идентификатор меню. Если я здесь означает, что я должен также публиковать контент, созданный с помощью publishLayoutContent.
В классе действий (это MenuAction, представление метода, такое же, как опубликовано в), важно только это:
Integer menuId = null;
if(request.getParameter("menuId") != null) {
menuId = Integer.valueOf(request.getParameter("menuId"));
} else {
menuId = getIntCookie("hiddenMenuId");
}
Итак, если я не получаю идентификатор меню из параметра (ссылка нажата), я получаю из файла 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>
ПРИМЕЧАНИЕ. Это особый случай, если у вас есть все, что связано через один параметр, но его можно легко расширить с помощью других параметров, которые публикуют другие цели. Я постараюсь сделать его достаточно общим, чтобы опубликовать его где-нибудь, но это (я думаю) далеко впереди:)
Если у вас есть какие-либо вопросы, пожалуйста, напишите их.