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

Създавам онлайн приложение в JSF 2 с Primefaces и Spring. Искам да използвам Pretty Faces, за да направя URL адресите ни за търсене с възможност за отметка.

Ето моя pretty-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}". Промяната на обхвата на моя bean също не помага.

На уеб страницата използвам командна връзка primefaces, която има "searchView.navigate" като параметър за действие.

Винаги получавам следното съобщение за грешка:

HTTP Състояние 404 - /търсене/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 адрес, което също ще показва същия ID на изгледа и стига параметрите да са различни, напр.: едното съпоставяне е „/detail“, а другото е "/detail/#{appId}", ще се оправиш. Но ако имат същия модел, ще имате проблеми.

Лично аз дори не използвам EL изрази в url модели. Започнах да ги използвам, но те имат голям недостатък: принуждават ви да посочите url, както е написано в шаблона.

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

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

person Xtreme Biker    schedule 02.09.2013