Переписывание URL-адресов в стиле REST с естественной концепцией диалога

Раньше существовало понятие естественного разговора в шве. в основном идентификатор разговора может быть пользовательским, т.е. someAction: 100, и это может быть связано с URL-адресом для разговора. следовательно, URL-адрес будет примерно таким:

http:localhost:8080/some_context/someAction:100

Я не могу найти альтернативу в стандартном JSF. Как ты делаешь это?

Помогите, пожалуйста, я в безвыходной ситуации. по крайней мере, дайте мне знать, есть ли какая-либо литература, или можно ли это сделать с помощью deltaspike.

Огромное спасибо


person Ikthiander    schedule 05.10.2015    source источник
comment
Можно использовать bean-компонент с областью диалога, но вам потребуются некоторые правила перезаписи URL-адресов, которые преобразуют параметр пути в параметр запроса: cid=conversionid и наоборот.   -  person maress    schedule 06.10.2015
comment
@maress спасибо за ваш комментарий, не могли бы вы привести пример?   -  person Ikthiander    schedule 08.10.2015
comment
К вашему сведению: если бы вы спросили в списке рассылки о DeltaSpike, вы бы увидели ответ в течение нескольких часов.   -  person Dar Whi    schedule 09.10.2015
comment
Спасибо @DarWhi, теперь я обязательно подпишусь на него.   -  person Ikthiander    schedule 09.10.2015
comment
Для дальнейшего использования, пожалуйста, избегайте использования таких слов, как «отчаянно» или «срочно», эти слова вызывают у людей стресс и будут контрпродуктивны для ваших нужд catb.org/esr/faqs/smart-questions.html#urgent   -  person jpangamarca    schedule 01.12.2015


Ответы (1)


Вы можете сделать это с помощью DeltaSpike - просто введите WindowContext и используйте/восстановите любой идентификатор окна, который вам нравится, с помощью метода activeWindow. После этого область диалога, предоставляемая DeltaSpike (@GroupedConversationScoped), может использоваться без дальнейшей инициализации, как описано в документации.

Если у вас есть, например. приложение JSF в сочетании с JSF-модулем DeltaSpike, который отображает идентификатор окна как «dswid», вы можете использовать следующий Servlet-Filter для восстановления и активации того же окна для любой технологии на основе сервлетов, такой как JAX-RS. .. (не забудьте сопоставление для Servlet-Filter).

С JSF не забудьте добавить тег в шаблон страницы (как описано в документации). Если вам нужно создать ссылку вручную, вы можете получить текущий идентификатор окна через:

dswid=#{dsWindowContext.currentWindowId}

Если вам не нравится использовать «dswid», просто используйте и извлекайте информацию, как и любой другой настраиваемый параметр (или используйте библиотеку, например, prettyfaces/rewrite).

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

В вашем коде, который, наконец, обрабатывает запрос, вы можете просто внедрить любой bean-компонент с групповой беседой (или выполнить поиск через BeanProvider).

public class WindowIdFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        String windowId = request.getParameter("dswid");

        if (windowId != null) {
            WindowContext windowContext = BeanProvider.getContextualReference(WindowContext.class);
            windowContext.activateWindow(windowId);
        }

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }
}
person Dar Whi    schedule 09.10.2015
comment
спасибо @DarWhi, 1. можно ли поделиться некоторыми примерами кодов или даже ссылкой на пример, чтобы я мог принять ваш ответ как правильный? - person Ikthiander; 09.10.2015
comment
спасибо @DarWhi, но как добавить имя беседы, например editAction:100, а также обобщить его, так как оно может использоваться для других. я пробовал urlrewrite, но он не позволяет общему идентификатору разговора быть более 9 символов. Я должен признать, что ваше решение очень близко к тому, что я хочу, но не точно. размышляя над вашим советом, теперь я начинаю разговор с класса действий, которым я не доволен, но переписывание URL не позволяет мне использовать более 9 символов. - person Ikthiander; 13.10.2015
comment
По умолчанию макс. длина идентификатора окна в DeltaSpike равна 10. Однако вы можете уменьшить его до 9 с помощью ключа конфигурации «deltaspike.window-id.max_length». При этом DeltaSpike не будет использовать ключи длиннее 9 символов, и у вас вообще не будет проблем. Если вам нужно больше 10, вы можете столкнуться с потенциальными проблемами безопасности... Я бы выбрал 100 в качестве идентификатора окна и решил остальные с помощью групп для каждого варианта использования - это намного мощнее. - person Dar Whi; 13.10.2015
comment
Вы уверены в максимальной длине идентификатора deltaspike? извините, что не бросаю вам вызов, но я только что попробовал editAction: 100, и это сработало. я получаю что-то неправильно здесь? я даже пробовал очень большие идентификаторы, и они работали. - person Ikthiander; 13.10.2015
comment
Это отрежет остальные за кадром. См. конфигурацию по адресу: git-wip-us.apache.org/repos / - person Dar Whi; 14.10.2015