【问题标题】:Pretty Faces EL Injection does not workPretty Faces EL 注射不起作用
【发布时间】:2013-08-14 03:28:57
【问题描述】:

我正在使用 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 ...

}

只有“/search”可以正常工作。我还尝试更改 pretty-config.xml 中的映射顺序,并对其他两个参数使用虚拟值,并且只使用一个参数。我尝试的另一件事是将表达式“#{bean.param}”更改为“#{getParam : bean.param}”。更改我的 bean 的范围也无济于事。

在网页上,我使用 primefaces 命令链接,其中包含“searchView.navigate”作为操作参数。

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

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

输入状态报告

消息/搜索/a/b/c

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

【问题讨论】:

  • 我想我现在知道出了什么问题:在链接中我忘记了开头的“/sitename”
  • 那么你解决了这个问题吗?是因为缺少上下文路径造成的吗?

标签: jsf primefaces el friendly-url prettyfaces


【解决方案1】:

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

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

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

就我个人而言,我什至不会在 url 模式中使用 EL 表达式。我开始使用它们,但它们有一个很大的缺点:它们强制您指定 url,因为它是在模式中写入的。

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

对我来说,声明类似 /students/detail 之类的内容要容易得多,然后以经典(不那么漂亮)http 方式传递参数:/students/detail?studentId=1&viewMode =2.

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 2020-03-02
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2011-12-26
    • 2016-12-03
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多