0

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

这是我的漂亮配置.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 的范围也无济于事。

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

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

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

类型状态报告

消息/搜索/a/b/c

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

4

1 回答 1

0

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

以下是我与Prettyfaces 团队负责人 @Lincon 的对话

  • :还有一个,是否可以在模式中添加两个参数?像/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方式传递参数:/students/detail?studentId=1&viewMode=2

于 2013-09-02T21:30:31.243 回答