代码之家  ›  专栏  ›  技术社区  ›  user697911

等效于JSF中的JSP scriptlet方法调用

  •  1
  • user697911  · 技术社区  · 9 年前

    我需要将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();  %>
    

    步骤3:然后引用此变量:

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

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

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

    1 回复  |  直到 9 年前
        1
  •  2
  •   Community CDub    8 年前

    您不能在JSF中直接调用方法或创建变量,因此不需要导入。 唯一的方法是使用EL表达式。 由于使用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>
    

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

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

    你可以使用

    #{myBean.name}
    

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

    这个 <%@ page session="false" %> 也不需要也不可能。 在JSF中,Bean有一个Scope,这个例子 RequestScoped 应该很适合 <%@页面会话=“false”%> -请求范围Bean只对一个请求有效,之后Bean被释放。还有许多其他范围,例如。 @SessionScoped (来自 javax.enterprise.context )对于只要会话处于活动状态的Bean。

    如另一位用户所述,这些作用域存在于CDI变体(包 javax.enterprise.context )和JSF变体(包 javax.faces.bean ). 您应该使用CDI变体,因为JSF变体可能很快就会被弃用(请参见 here ).

    范围说明请参见 here .