JSF 2:outputLink,其参数取决于用户输入

时间:2010-08-12 14:15:25

标签: jsf jsf-2 java-ee-6

这是我的问题:我需要为报告创建一个(看似简单的)简单的前端。用户输入一组数字,用空格或逗号分隔,这些是将在报告中显示的ID。

我使用转换器将其从字符串更改为List,然后从那里返回到以逗号分隔数字的表单:

@FacesConverter(value="multiProdConverter")
public class MultiProdConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        StringTokenizer splitter = new StringTokenizer(value, " \t\n\r\f,");

        List<Integer> ret = new ArrayList<Integer>();
        while (splitter.hasMoreTokens()) {
            String token = splitter.nextToken();
            ret.add(Integer.parseInt(token));
        }

        return ret;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return implode((List<Integer>)value);
    }

    private String implode(List<Integer> sdaList) {
        StringBuilder sb = new StringBuilder();
        if (!sdaList.isEmpty()) {
            sb.append(sdaList.get(0));
            for (int i = 1; i < sdaList.size(); i++) {
                sb.append(",");
                sb.append(sdaList.get(i));
            }
        }
        return sb.toString();
    }
}

然而,将这种格式化的数字版本实际上放到外部页面的请求参数中的最佳方法是什么?

我希望用户在给出数字后点击提交,然后页面转到此报告。使用javascript这很容易,但是“JSF”的方法是什么?

谢谢, 扎克

2 个答案:

答案 0 :(得分:1)

我会在ExternalContext#redirect()的帮助下重定向到外部资源。

<h:form>
    <h:inputText value="#{bean.field}" />
    <h:commandLink value="click" action="#{bean.submit}" />
</h:form>

public void submit() {
    String url = "http://external.com";
    String query = "name=" + URLEncoder.encode(field.replaceAll("\\s+", ","), "UTF-8");
    FacesContext.getCurrentInstance().getExternalContext().redirect(url + "?" + query);
}

答案 1 :(得分:0)

这是一个很好的方法,您也可以禁用提交按钮或命令链接,直到输入所有报告参数,例如。

<h:outputLink  id="reportURL" value="#{reportBean.url}" rendered="#{reportBean.enableUrl}">
       <h:outputText value="Go To Report" styleClass="someClass"/>   
</h:outputLink>

但是,在您的逻辑中,您必须确定何时适合呈现网址。

希望这对你有所帮助。

问候。