Java教程 第65页

JSF 条件导航示例

JSF教程 – JSF条件导航示例 使用托管bean,我们可以基于条件控制导航。 例如,以下代码显示如何为不同的pageId值返回不同的页面名称。 @ManagedBean(name = "navigationController", eager = true) @RequestScoped public class NavigationController implements Serializable { //read value from request parameter pageId @ManagedProperty(value="#{param.pageId}") private String pageId; //if pageId is 1 show page1.xhtml, //if pageId is 2 show page2.xhtml //else show default.xhtml public String showPage(){ if(pageId == null){ return "default"; } if(pageId.equals("1")){ return "page1"; }else if(pageId.equals("2")){ return "page2"; }else{ return "default"; } } } 在JSF UI组件中将pageId作为请求参数。 <h:form> <h:commandLink action="#{navigationController.showPage}" value="Page1"> <f:param name="pageId" value="1" /> </h:commandLink> <h:commandLink action="#{navigationController.showPage}" value="Page2"> <f:param name="pageId" value="2" /> </h:commandLink> <h:commandLink action="#{navigationController.showPage}" value="Home"> <f:param name="pageId" value="3" /> </h:commandLink> </h:form> 这里点击“Page1″按钮 JSF将创建一个参数为pageId = 1的请求。然后,JSF将这个参数传递给navigationController的managed属性pageId。 之后, navigationController.showPage()被调用,将检查pageId后返回view作为page1 。 JSF然后将视图名称 page1 解析为 page1.xhtml 扩展名,并在当前目录中找到相应的视图文件 page1.xhtml 。 例子 以下代码来自register.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">...

JSF 复合组件示例

JSF教程 – JSF复合组件示例 JSF可以定义自定义组件来渲染自定义内容。 为了创建一个自定义组件,我们需要创建一个资源文件夹。并将一个xhtml文件放在resources文件夹中与复合命名空间。 我们需要使用复合标签composite:interface,composite:attribute和composite:implementation,来定义复合组件的内容。 然后在composite:implementation中使用cc.attrs来获取在composite:interface中使用composite:attribute定义的变量。 以下代码显示如何使用composite:interface和composite:implementation。 <composite:interface> <composite:attribute name="nameLable" /> <composite:attribute name="nameValue" /> <composite:attribute name="emailLable" /> <composite:attribute name="emailValue" /> <composite:attribute name="registerButtonText" /> <composite:attribute name="registerButtonAction" method-signature="java.lang.String action()" /> </composite:interface> <composite:implementation> <h:form> <h:message for="textPanel" /> <h:panelGrid columns="2" id="textPanel"> #{cc.attrs.nameLable} : <h:inputText id="name" value="#{cc.attrs.nameValue}" /> #{cc.attrs.emailLable} : <h:inputText id="email" value="#{cc.attrs.emailValue}" /> </h:panelGrid> <h:commandButton action="#{cc.attrs.registerButtonAction}" value="#{cc.attrs.registerButtonText}"/> </h:form> </composite:implementation> 例子 以下代码来自result.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" > <h:body> <h1>Composite Components in JSF 2.0</h1> Name : #{user.name} <br /> E-mail : #{user.email} </h:body> </html> 以下代码来自demo.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:w3cschool="http://java.sun.com/jsf/composite/w3cschool" > <h:body> <w3cschool:register nameLable="Name" nameValue="#{user.name}" emailLable="E-mail" emailValue="#{user.email}" registerButtonText="Register" registerButtonAction="#{user.registerAction}" /> </h:body> </html> 下面的代码来自UserBean.java。 package cn.w3cschool.common;...

JSF 自定义标签示例

JSF教程 – JSF自定义标签示例 在JSF 2.0中,我们可以创建自定义标签来渲染预定义的内容。 自定义标记看起来像一个普通的JSF标记,并使用“ui:composition”将内容插入页面。 以下列表是我们在JSF 2.0中创建自定义标记时可以遵循的步骤。 在标记库描述符中声明自定义标签。 在web.xml中注册标记库描述符。 用途:ui:compisition标签,用于在XHTML页面中创建预定义内容。 以下部分如何为JSF创建自定义标签。 例子 下面的代码来自UserBean.java。 package cn.w3cschool.common; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import java.io.Serializable; @ManagedBean @SessionScoped public class UserBean implements Serializable { private static final long serialVersionUID = 1L; } 以下代码来自button.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" > <h:body> <ui:composition> <h:commandButton type="submit" value="#{buttonSubmitLabel}" /> <h:commandButton type="reset" value="#{buttonResetLabel}" /> </ui:composition> </h:body> </html> 以下代码来自demo.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:w3cschool="//www.w3cschool.cn/facelets" > <h:body> <w3cschool:button buttonSubmitLabel="Submit" buttonResetLabel="Reset" /> </h:body> </html> 以下代码来自w3cschool.taglib.xml。 <?xml version="1.0"?> <!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd"> <facelet-taglib> <namespace>//www.w3cschool.cn/facelets</namespace> <tag> <tag-name>button</tag-name> <source>tags/com/w3cschool/button.xhtml</source> </tag> </facelet-taglib> 下载 Custom-Tag.zip Web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app...

JSF 角色示例

JSF教程 – JSF角色示例 以下代码显示了如何在JSF应用程序中检查用户角色。 例子 以下代码来自demo.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" > <f:event listener="#{user.isAdmin}" type="preRenderView" /> <h:body> <h1>JSF 2 protected page example</h1> </h:body> </html> 下面的代码来自UserBean.java。 package cn.w3cschool.common; import javax.faces.application.ConfigurableNavigationHandler; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.context.FacesContext; import javax.faces.event.ComponentSystemEvent; @ManagedBean(name="user") @SessionScoped public class UserBean{ public void isAdmin(ComponentSystemEvent event){ FacesContext fc = FacesContext.getCurrentInstance(); if (!"admin".equals(fc.getExternalContext().getSessionMap().get("role"))){ ConfigurableNavigationHandler nav = (ConfigurableNavigationHandler) fc.getApplication().getNavigationHandler(); nav.performNavigation("access-denied"); } } } 以下代码来自access-denied.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" > <h:body> <h1>Access Denied!</h1> </h:body> </html> 下载 Role.zip 运行 将生成的WAR文件从目标文件夹复制到Tomcat部署文件夹,并运行Tomcat-Install-folder/bin/startup.bat。 Tomcat完成启动后,在浏览器地址栏中键入以下URL。 http://localhost:8080/simple-webapp/demo.xhtml

JSF JDBC设置示例

JSF教程 – JSF JDBC设置示例 以下代码显示如何从后端数据库加载数据并使用JSF显示数据。 例子 以下代码来自Customer.java。 package cn.w3cschool.common; import java.util.Date; public class Customer{ public long customerID; public String name; public String address; public Date created_date; public long getCustomerID() { return customerID; } public void setCustomerID(long customerID) { this.customerID = customerID; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Date getCreated_date() { return created_date; } public void setCreated_date(Date created_date) { this.created_date = created_date; } } 以下代码来自table-style.css。 .order-table{ border-collapse:collapse; } .order-table-header{ text-align:center; background:none repeat scroll 0 0 #E5E5E5; border-bottom:1px solid #BBBBBB; padding:16px; } .order-table-odd-row{ text-align:center; background:none repeat scroll 0 0 #FFFFFFF; border-top:1px solid #BBBBBB; }...

JSF JSF_Spring示例

JSF教程 – JSF JSF_Spring示例 下面的代码显示了如何使用Spring来使用JSF。 例子 以下代码来自PrinterImpl.java。 package cn.w3cschool.common; import javax.inject.Named; @Named public class PrinterImpl implements Printer{ public String print() { return "JSF 2 + Spring Integration"; } } 下面的代码来自Printer.java。 package cn.w3cschool.common; public interface Printer{ public String print(); } 以下代码来自default.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:body>#{userBean.printMsgFromSpring()}</h:body> </html> 下面的代码来自UserBean.java。 package cn.w3cschool.common; import javax.inject.Inject; import javax.inject.Named; import org.springframework.context.annotation.Scope; @Named @Scope("session") public class UserBean { @Inject Printer printer; public void setPrinter(Printer p) { this.printer = p; } public String printMsgFromSpring() { return printer.print(); } } 下载 JSF_Spring.zip POM <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.w3cschool.jsf</groupId> <version>1.0-SNAPSHOT</version> <artifactId>simple-webapp</artifactId> <packaging>war</packaging> <name>Simple Web Application</name> <dependencies> <!-- Spring framework --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.1.2.RELEASE</version> </dependency>...

JSF 资源包示例

JSF教程 – JSF资源包示例 以下代码显示如何从资源文件加载预定义的消息。 例子 以下代码来自messages.properties。 message = This is "message" message.test1 = This is "message.test1" message.test2 = This is "<h2>message.test3</h2>" message.test3 = This is "&lt;h2&gt;message.test4&lt;/h2&gt;" message.param1 = This is "message.param1" - {0} message.param2 = This is "message.param2" - {0} and {1} 下面的代码来自UserBean.java。 package cn.w3cschool.common; import java.io.Serializable; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean(name="user") @SessionScoped public class UserBean implements Serializable{ private static final long serialVersionUID = 1L; } 以下代码来自demo.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <!-- load resource bundle for this page only <f:loadBundle basename="com.w3cschool.messages" var="msg"/> --> <h:body> <h:outputText value="#{msg.message}" /> <br/> <h:outputText value="#{msg["message.test1"]}" /> <br/> <h:outputText value="#{msg["message.test2"]}" /> <br/> <h:outputText value="#{msg["message.test2"]}" escape="false" /> <br/> <h:outputText value="#{msg["message.test3"]}" /> <br/> <h:outputText value="#{msg["message.test3"]}" escape="false" />...

JSF 国际化示例

JSF教程 – JSF国际化示例 以下部分显示如何在JSF中使用国际化。 国际化是一种我们可以用来显示状态消息,GUI组件标签,货币,日期用不同语言的技术。 显示的文本不是在程序中硬编码,而是存储在资源束中的源代码之外并动态加载。 使用国际化的步骤 首先,我们需要创建一个包含消息的属性文件。为每个区域设置创建属性文件。通常一个语言环境用于一种语言。 属性文件的名称应为<file-name> _ <locale> .properties格式。 默认区域设置可以在文件名中省略。 以下是来自messages.properties文件。 greeting=Hello World! 以下是来自messages_fr.properties文件。 fr是法语。 greeting=Bonjour tout le monde! 然后,更新faces-config.xml <application> <locale-config> <default-locale>en</default-locale> <supported-locale>fr</supported-locale> </locale-config> <resource-bundle> <base-name>com.w3cschool.messages</base-name> <var>msg</var> </resource-bundle> </application> 最后,我们可以使用resource-bundle var。 <h:outputText value="#{msg["greeting"]}" /> 例子 以下代码来自welcome_zh_CN.properties。 welcome.jsf = \u5feb\u4e50\u5b66\u4e60 JSF 2.0 以下代码来自demo.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" > <h:body> <h:form> <h3> <h:outputText value="#{msg["welcome.jsf"]}" /> </h3> <h:panelGrid columns="2"> Language : <h:selectOneMenu value="#{language.localeCode}" onchange="submit()" valueChangeListener="#{language.countryLocaleCodeChanged}"> <f:selectItems value="#{language.countriesInMap}" /> </h:selectOneMenu> </h:panelGrid> </h:form> </h:body> </html> 下面的代码来自UserBean.java。 package cn.w3cschool.common; import java.io.Serializable; import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.context.FacesContext; import javax.faces.event.ValueChangeEvent; @ManagedBean(name="language") @SessionScoped public class UserBean implements Serializable{ private static final long serialVersionUID = 1L; private...

JSF ActionListener示例

JSF教程 – JSF ActionListener示例 我们可以处理用户点击事件为h:commandButton或h:link。 要注册事件处理程序,我们可以传递UI Component的actionListener属性中的托管bean方法的名称。 或者我们可以选择实现ActionListener接口,并将实现类名称传递给UI Component的actionListener属性。 以下代码显示了如何从h:commandButton向actionListener属性添加用户定义的方法。 public void updateData(ActionEvent e){ data="Hello World"; } 使用上面的方法 <h:commandButton id="submitButton" value="Submit" action="#{userData.showResult}" actionListener="#{userData.updateData}" /> </h:commandButton> 以下代码显示了如何实现ActionListener和使用f:actionListener标签。 public class UserActionListener implements ActionListener{ @Override public void processAction(ActionEvent arg0) throws AbortProcessingException { //access userData bean directly UserData userData = (UserData) FacesContext.getCurrentInstance(). getExternalContext().getSessionMap().get("userData"); userData.setData("Hello World"); } } 使用侦听器方法 <h:commandButton id="submitButton1" value="Submit" action="#{userData.showResult}" > <f:actionListener type="com.tutorialspoint.test.UserActionListener" /> </h:commandButton> 例子 以下代码来自ActionListener.java。 package cn.w3cschool.common; import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; import javax.faces.event.ActionListener; public class MyActionListener implements ActionListener{ @Override public void processAction(ActionEvent event) throws AbortProcessingException { System.out.println("Any use case here?"); } } 以下代码来自result.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" > <h:body> #{normal.buttonId} </h:body> </html> 以下代码来自demo.xhtml。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD...

JSF 预构建应用程序事件示例

JSF教程 – JSF预构建应用程序事件示例 以下代码显示如何处理应用程序级事件。 JSF在JSF应用程序生命周期中有处理应用程序特定任务的系统事件侦听器。 应用程序启动时触发PostConstructApplicationEvent。它可以用于在应用程序启动后执行初始化任务。 应用程序即将关闭时,PreDestroyApplicationEvent触发。它可以用于在应用程序即将关闭之前执行清除任务。 PreRenderViewEvent在显示JSF页面之前触发。它可用于验证用户并提供对JSF View的受限访问。 我们可以通过实现SystemEventListener接口来处理系统级事件,并在faces-config.xml中注册system-event-listener类。 我们还可以通过传递f:event的监听器属性中的托管bean方法的名称来使用方法绑定来处理系统级事件。 以下代码显示了如何实现SystemEventListener接口。 public class CustomSystemEventListener implements SystemEventListener { @Override public void processEvent(SystemEvent event) throws AbortProcessingException { if(event instanceof PostConstructApplicationEvent){ System.out.println("Application Started. PostConstructApplicationEvent occurred!"); } } } 然后我们可以在faces-config.xml中注册系统事件的自定义系统事件侦听器 <system-event-listener> <system-event-listener-class> cn.w3cschool.common.CustomSystemEventListener </system-event-listener-class> <system-event-class> javax.faces.event.PostConstructApplicationEvent </system-event-class> </system-event-listener> 下面的代码显示了处理系统级事件的方法绑定方式。 public void handleEvent(ComponentSystemEvent event){ data="Hello World"; } 使用上面的方法 <f:event listener="#{user.handleEvent}" type="preRenderView" /> 例子 以下代码来自MyListener.java。 package cn.w3cschool.common; import javax.faces.application.Application; import javax.faces.event.AbortProcessingException; import javax.faces.event.PostConstructApplicationEvent; import javax.faces.event.PreDestroyApplicationEvent; import javax.faces.event.SystemEvent; import javax.faces.event.SystemEventListener; public class MyListener implements SystemEventListener{ @Override public void processEvent(SystemEvent event) throws AbortProcessingException { if(event instanceof PostConstructApplicationEvent){ System.out.println("PostConstructApplicationEvent is Called"); } if(event instanceof PreDestroyApplicationEvent){ System.out.println("PreDestroyApplicationEvent is Called"); } } @Override public boolean isListenerForSource(Object source) { //only for Application return (source instanceof Application); } } 以下代码来自demo.xhtml。 <?xml version="1.0"...