Pretty Faces EL Injection不起作用

时间:2013-08-12 17:51:04

标签: jsf primefaces el friendly-url prettyfaces

我正在使用Primefaces和Spring在JSF 2中构建一个在线应用程序。 我想使用Pretty Faces使我们的搜索网址可收藏。

这是我的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 ...

}

只有“/搜索”才能完美运行。我还尝试在pretty-config.xml中更改映射的顺序,并使用其他两个参数的虚拟值,并且只使用一个参数。我尝试的另一件事是将表达式“#{bean.param}”改为“#{getParam:bean.param}”。改变我的bean的范围也无济于事。

在网页上我使用了一个以“searchView.navigate”作为动作参数的primefaces命令链接。

我总是收到以下错误消息:

  

HTTP状态404 - / search / a / b / c

     

输入状态报告

     

message / search / a / b / c

     

说明请求的资源(/ search / a / b / c)不可用。

1 个答案:

答案 0 :(得分:0)

绝对有像 / search /#{searchView.searchQuery} /#{searchView.searchTags} /#{searchView.searchOrder} 这样的模式是一个坏主意。

这里引用my conversation与@Lincon,Prettyfaces team lead

  
      
  • :另外一个,是否有可能在模式中添加两个参数?喜欢 / detail /#{appId} /#{navigationIndex}
  •   
  • Lincon :你当然可以创建一个辅助URL映射,它也会显示相同的视图ID,只要参数不同,例如:一个映射是“/ detail”和另一个是“/ detail /#{appId}”,你会没事的。但如果它们具有相同的模式,那么你就会遇到问题。
  •   

就我个人而言,我甚至不将EL表达式用于url模式。我开始使用它们但它们有一个很大的缺点:它们强制你指定在模式中写入的url。

例如,拥有 / students /#{studentId} 将始终强制您指定学生ID以访问该页面。否则,您需要为相同的view-id声明第二个模式。从那里开始,GET请求中的第二个参数将始终强制您使用http标准方式传递参数(想象您想要添加第二个参数,您需要 / students / detail /#{studentId} ?viewMode = 2 ,以不同的方式传递它们。)

对我而言更容易宣布像 / students / detail 这样的东西,然后在经典(不那么漂亮)的http方式中传递params: / students / detail?studentId = 1&amp; ; VIEWMODE = 2