等效于 JSF 中的 JSP scriptlet 方法调用
Equivalent of JSP scriptlet method call in JSF
我需要将 JSP 文件转换为等效的 JSF 文件。 JSP如下:
第 1 步:Class导入:
<%@ 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 中直接调用方法或创建变量,因此不需要导入。
唯一的方法是使用 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 的首选方法是使用 getters 和设置器
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
你可以直接使用
#{myBean.name}
JSF 将调用 getter 如果它需要值(用于输出)或调用 Setter 如果有要设置的值(来自 input-fields)
<%@ page session="false" %>
也不需要也不可能。
在 JSF 中,Bean 有一个作用域,这个带有 RequestScoped
的示例应该与 <%@ page session="false" %>
很好地匹配 - 一个 Request Scoped Bean 仅存在于一个 Request 中,之后 Bean 被释放。还有许多其他范围,例如@SessionScoped
(来自 javax.enterprise.context
)对于只要 Session 处于活动状态就存在的 Bean。
正如另一位用户所提到的,这些作用域存在于 CDI-Variant(包 javax.enterprise.context
)和 JSF-variant(包 javax.faces.bean
)中。您应该使用 CDI-Variant,因为 JSF-Variant 可能很快就会被弃用(请参阅 here)。
作用域的解释见here。
我需要将 JSP 文件转换为等效的 JSF 文件。 JSP如下:
第 1 步:Class导入:
<%@ 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 中直接调用方法或创建变量,因此不需要导入。
唯一的方法是使用 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 的首选方法是使用 getters 和设置器private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
你可以直接使用
#{myBean.name}
JSF 将调用 getter 如果它需要值(用于输出)或调用 Setter 如果有要设置的值(来自 input-fields)
<%@ page session="false" %>
也不需要也不可能。
在 JSF 中,Bean 有一个作用域,这个带有 RequestScoped
的示例应该与 <%@ page session="false" %>
很好地匹配 - 一个 Request Scoped Bean 仅存在于一个 Request 中,之后 Bean 被释放。还有许多其他范围,例如@SessionScoped
(来自 javax.enterprise.context
)对于只要 Session 处于活动状态就存在的 Bean。
正如另一位用户所提到的,这些作用域存在于 CDI-Variant(包 javax.enterprise.context
)和 JSF-variant(包 javax.faces.bean
)中。您应该使用 CDI-Variant,因为 JSF-Variant 可能很快就会被弃用(请参阅 here)。
作用域的解释见here。