【问题标题】:Equivalent of JSP scriptlet method call in JSFJSF 中 JSP scriptlet 方法调用的等价物
【发布时间】:2016-01-21 07:25:19
【问题描述】:

我需要将 JSP 文件转换为等效的 JSF 文件。 JSP如下:

第 1 步:类导入:

<%@ page import="org.keycloak.constants.ServiceUrlConstants" %>
<%@ page import="org.keycloak.common.util.KeycloakUriBuilder" %>
<%@ page session="false" %>
<html>

第 2 步:定义变量:

<%
        String logoutUri = KeycloakUriBuilder.fromUri("/auth").path(ServiceUrlConstants.TOKEN_SERVICE_LOGOUT_PATH).queryParam("redirect_uri", "/customer-portal").build("demo").toString();  %>

第三步:然后引用这个变量:

<a href="<%=logoutUri%>">logout</a>

导入的库是项目中的外部库。在 JSF 中,我知道如何执行第 3 步。但我不知道如何在第 1 步中导入类以及如何定义变量,如 JSF 中的第 2 步所示。

是否有在 JSF 中执行步骤 1-3 的等效方法?谢谢。

【问题讨论】:

    标签: jsf jsf-2 facelets scriptlet


    【解决方案1】:

    您不能直接在 JSF 中调用方法或创建变量,因此您不需要导入。 唯一的方法是使用 EL-Expressions。 由于 EL 无法调用静态方法,因此您必须自己创建一个 Bean,以便调用 KeycloakUriBuilder.fromUri... 使用命名 Bean,您可以调用它的方法:

    例子:

    import java.io.Serializable;
    import javax.enterprise.context.RequestScoped;
    import javax.inject.Named;
    //This Bean is available by default under the Name 'myBean', you can change it in the @Named Annotation if desired
    @Named
    @RequestScoped
    public class MyBean implements Serializable { 
    
        public String myMethod(String inupt){
            return "Hello " + input;
        }
    }
    

    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
        xmlns:f="http://java.sun.com/jsf/core" >
    <head></head>
    <body>
    <h:outputText value ="#{myBean.myMethod('world')}"/>
    </body>
    </html>
    

    会给你这个 HTML:

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head></head>
    <body>Hello world
    </body>
    </html>
    

    如果您有一个包含 getter 和 Setter 的字段,则在页面上显示 Something 的首选方式是使用 getter 和 setter

    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    

    你可以使用

    #{myBean.name}
    

    JSF 将在需要值时调用 getter(用于输出),如果需要设置值(来自输入字段)则调用 Setter

    &lt;%@ page session="false" %&gt; 既不需要也不可能。 在 JSF 中,Bean 有一个 Scope,这个带有 RequestScoped 的示例应该很好地匹配 &lt;%@ page session="false" %&gt; - 一个 Request Scoped Bean 仅适用于一个请求,之后 Bean 被释放。还有许多其他范围,例如@SessionScoped(来自 javax.enterprise.context)表示只要 Session 处于活动状态,Bean 就会一直存在。

    正如另一位用户所提到的,这些范围存在于 CDI 变体(包javax.enterprise.context)和 JSF 变体(包javax.faces.bean)中。您应该使用 CDI-Variant,因为 JSF-Variant 可能很快就会被弃用(请参阅 here)。

    作用域的解释见here

    【讨论】:

    • @hinneLins,知道了。那么JSP中的“”呢?如何在 JSF 中实现这一点?
    • 请在新问题中提出新问题。
    • 太棒了。感谢您的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多