Struts2 кнопка возврата и связывания - PullRequest
1 голос
/ 03 декабря 2009

Я использую Struts 2.1.6 с плагином Dojo, все приложение имеет ссылки ajax (sx: a).

Удалось ли кому-нибудь реализовать функцию кнопки "Назад" и ссылки на определенный контент?

У кого-нибудь есть опыт реализации? Я планирую реализовать (если уже нет хорошего решения) что-то вроде этого:

  • изменение ссылки в адресной строке (добавление параметров) с помощью js, после чего я могу прочитать и получить нужный контент, а затем опубликовать его с помощью notifyTopics.

Или мне просто поменять все приложение на плагин jQuery? Есть ли у jQuery хорошие решения для кнопок возврата и ссылок на страницах ajax?

Ответы [ 4 ]

1 голос
/ 08 декабря 2009

Я могу подумать о 2 простых способах макушки головы:

<s:form action="actionName">
    <input type="hidden" value="<s:property value="someProperty"/>" name="someProperty"/>
    <input type="hidden" value="<s:property value="someProperty2"/>" name="someProperty2"/>
    <s:submit value="Back" />
</s:form>

или

<s:url name="backURL" action="actionName">
    <s:param name="someProperty" value="someProperty"/>
    <s:param name="someProperty2" value="someProperty2"/>
</s:url>
<a href="<s:property value="#backURL"/>">Back</a>

Если у вас уже есть параметры строки запроса:

<a href="#" onclick="javascript.window=document.referrer;">Back</a>

или

<input type="button" value="Back" onclick="javascript.window=document.referrer;"/>
1 голос
/ 08 декабря 2009

Я попытался использовать Struts 2 с dojo и реализовать кнопку возврата. Вы уже прошли через реализацию ajax в Struts 2. Они в основном использовали и писали его для написания простых и быстрых вызовов функций ajax и не очень хорошо подходят для более широкого использования. Плюс, когда вы делаете тег s: head theme = 'ajax'; Struts импортирует каждый файл AJAX JS, который вам может понадобиться, что убивает время загрузки.

Я бы предложил: 1. Изучить dojo и использовать библиотеку независимо от стоек 2. Или 2. Получить jQuery, я смог реализовать функциональность кнопки «назад» относительно просто (более того, в Struts 2 theme = 'ajax').

0 голосов
/ 15 декабря 2009

Все мои ссылки проходят через одно действие, которое ищет параметр 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>

ПРИМЕЧАНИЕ. Это особый случай, если у вас есть все, что связано через один параметр, но его можно легко расширить с помощью других параметров, которые публикуют другие цели. Я постараюсь сделать его достаточно общим, чтобы опубликовать его где-нибудь, но это (я думаю) далеко впереди:)

Если у вас есть какие-либо вопросы, пожалуйста, напишите их.

0 голосов
/ 07 декабря 2009

Не знаю, Struts, но вы смотрели на dojo.undo (0.4.3)?

...