Pretty Faces EL Injection не работает

Я создаю онлайн-приложение в JSF 2 с Primefaces и Spring. Я хочу использовать Pretty Faces, чтобы сделать наши поисковые URL закладками.

Вот мой довольно-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<pretty-config xmlns="http://ocpsoft.org/prettyfaces/3.3.3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://ocpsoft.org/xml/ns/prettyfaces/ocpsoft-pretty-faces-3.3.3.xsd">

    <url-mapping id="index">
        <pattern value="/" />
        <view-id value="/sites/public/template/index.xhtml" />
    </url-mapping>

    <url-mapping id="searchWithParams">
        <pattern value="/search/#{searchView.searchQuery}/#{searchView.searchTags}/#{searchView.searchOrder}" />
        <view-id value="/sites/public/product/productSearch.xhtml" />
    </url-mapping>

    <url-mapping id="searchWithoutParams">
        <pattern value="/search" />
        <view-id value="/sites/public/product/productSearch.xhtml" />
    </url-mapping>

</pretty-config>

Вот мой Bean, в который я хочу ввести:

@Component
@Scope("request")
public class SearchView {

    private String searchQuery = "";

    private String searchTags = "";

    private String searchOrder = "";


    public SearchView() {
        // void
    }

    public void navigate() {
        String url = "";
        try {
            url =  "/search" + 
                    "/" + URLEncoder.encode(searchQuery, "UTF-8") + 
                    "/" + URLEncoder.encode(searchTags, "UTF-8") + 
                    "/" + URLEncoder.encode(searchOrder, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            url = "/search";
        }

        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect(url);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    // Getters and Setters ...

}

Только "/search" работает отлично. Я также попытался изменить порядок сопоставлений в pretty-config.xml и использовать фиктивные значения для двух других параметров и использовать только один параметр. Еще одна вещь, которую я пробовал, - это изменить выражения "#{bean.param}" на "#{getParam : bean.param}". Изменение области действия моего компонента тоже не помогает.

На веб-странице я использую ссылку на команду Primefaces, которая имеет «searchView.navigate» в качестве параметра действия.

Я всегда получаю следующее сообщение об ошибке:

HTTP-статус 404 — /search/a/b/c

тип Отчет о состоянии

сообщение /поиск/a/b/c

описание Запрошенный ресурс (/search/a/b/c) недоступен.


person xgb84j    schedule 12.08.2013    source источник
comment
Кажется, теперь я знаю, что не так: В ссылке я забыл /sitename в начале   -  person xgb84j    schedule 12.08.2013
comment
Так ты решил эту проблему? Было ли это вызвано отсутствующим контекстным путем?   -  person chkal    schedule 13.08.2013


Ответы (1)


Определенно иметь такой шаблон, как /search/#{searchView.searchQuery}/#{searchView.searchTags}/#{searchView.searchOrder}, — плохая идея.

Вот цитата из моего разговора с @Lincon, Руководитель команды Prettyfaces:

  • Я: И еще, можно ли добавить в шаблон два параметра? Например, /detail/#{appId}/#{navigationIndex}.
  • Lincon: вы, безусловно, можете создать вторичное сопоставление URL-адресов, которое также будет отображать тот же идентификатор представления, если параметры будут разными, например: одно сопоставление — «/detail», а другое — "/detail/#{appId}", все будет в порядке. Но если они имеют один и тот же шаблон, у вас будут проблемы.

Лично я даже не использую выражения EL в шаблонах URL. Я начал их использовать, но у них есть большой недостаток: они заставляют вас указывать url так, как он написан в шаблоне.

Например, наличие /students/#{studentId} всегда будет заставлять вас указывать идентификатор учащегося, чтобы попасть на эту страницу. В противном случае вам нужно объявить второй шаблон для того же идентификатора представления. Помимо этого, второй параметр в запросе GET всегда будет заставлять вас использовать стандартный http-способ передачи параметров (представьте, что вы хотите добавить второй, вам понадобится /students/detail/#{studentId} ?viewMode=2, передавая их другим способом).

Для меня гораздо проще объявить что-то вроде /students/detail и после передать параметры классическим (не таким красивым) способом http: /students/detail?studentId=1&viewMode=2< /эм>.

person Xtreme Biker    schedule 02.09.2013