2013-08-12 4 views
0

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

Вот мой довольно-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 ... 

} 

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

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

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

HTTP Status 404 -/поиск/A/B/C

Тип Статус отчета

сообщение/поиск/A/B/C

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

+0

Я думаю, что теперь я знаю, что не так: по ссылке я забыл «/ sitename» в начале – xgb84j

+0

Так вы исправили эту проблему? Было ли это вызвано отсутствующим контекстом? – chkal

ответ

0

Определенно, имеющая рисунок как /search/#{searchView.searchQuery}/#{searchView.searchTags}/#{searchView.searchOrder} это плохая идея.

Вот цитата из my conversation с @Lincon, Prettyfaces team lead:

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

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

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

Для меня гораздо проще объявить что-то вроде /студентов/подробно и после того, как передать Params в классическом (не так хороша) HTTP образом: /студентов/подробно studentId = 1 & ViewMode = 2.

Смежные вопросы