掌控视图的力量!深入解析 JSF 视图管理,揭秘视图生命周期的秘密,让你的应用更高效!

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的框架,用于管理 Web 应用程序的视图。本文通过具体案例介绍 JSF 视图管理的基础知识,包括创建、管理和销毁视图的过程。首先,在 Eclipse 中创建一个新 JSF 项目,并配置 Maven 依赖。接着,在 `WEB-INF` 目录下配置 `web.xml` 文件,设置 JSF servlet。

JavaServer Faces (JSF) 框架提供了丰富的工具来管理 Web 应用程序中的视图。理解 JSF 视图的生命周期对于开发高质量的应用程序至关重要。本文将通过一个具体的案例来探讨 JSF 视图管理的基本概念,并通过示例代码来展示视图的创建、管理和销毁过程。

首先,创建一个新的 JSF 项目。在 Eclipse 中,选择 "File" > "New" > "Dynamic Web Project",命名为 "MyJSFViewManagement",并确保选择了支持 JSF 的服务器版本。

接下来,需要添加 JSF 依赖。如果使用 Maven,可以在 pom.xml 文件中添加如下依赖:

<dependencies>
    <dependency>
        <groupId>javax.faces</groupId>
        <artifactId>javax.faces-api</artifactId>
        <version>2.3.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.faces</artifactId>
        <version>2.3.2</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.1-b09</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.1-b09</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>11.0</version>
    </dependency>
</dependencies>

如果你不使用 Maven,可以直接下载 JSF 和 EL 的 JAR 文件,并将它们添加到项目的 classpath 中。

WEB-INF 目录下创建 web.xml 文件,配置 JSF servlet。

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>

</web-app>

上述配置指定了一个名为 Faces Servlet 的 servlet,该 servlet 处理所有扩展名为 .jsf 的请求,并设置了默认欢迎页面为 index.xhtml

接下来,创建一个简单的 Managed Bean。这个 bean 将会包含一些简单的属性和方法。

package com.example.bean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

@ManagedBean(name = "viewBean")
@ViewScoped
public class ViewBean {
   

    private String message;

    public String getMessage() {
   
        return message;
    }

    public void setMessage(String message) {
   
        this.message = message;
    }

    public void initializeView() {
   
        message = "Welcome to the view!";
    }

    public void updateMessage(ActionEvent event) {
   
        message = "Message updated by an action!";
    }
}

在上述代码中,@ManagedBean 注解表示这是一个 Managed Bean,@ViewScoped 注解指定了它的作用域为视图范围。initializeView 方法用于初始化视图,而 updateMessage 方法用于更新 message 属性的值。

接下来,创建一个 Facelets 页面 index.xhtml,展示来自 bean 的信息,并使用 JSF 标签来实现视图管理。

<!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://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">

<h:head>
    <title>JSF View Management Example</title>
</h:head>
<h:body>
    <h:form>
        <h:outputText value="#{viewBean.message}" />

        <h:commandButton value="Update Message" action="#{viewBean.updateMessage}">
            <f:event type="preRenderView" listener="#{viewBean.initializeView}" />
        </h:commandButton>
    </h:form>
</h:body>
</html>

index.xhtml 页面中,<h:outputText> 标签用于显示 viewBean 中的 message 属性值。<h:commandButton> 标签用于创建一个按钮,当用户点击该按钮时,会触发 updateMessage 方法的执行。<f:event> 标签指定了在 preRenderView 事件发生时调用 initializeView 方法,以确保每次进入视图时都重新初始化视图数据。

为了更好地理解视图的生命周期,我们还可以在 viewBean 中添加一些日志记录。

package com.example.bean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import java.util.logging.Logger;

@ManagedBean(name = "viewBean")
@ViewScoped
public class ViewBean {
   

    private static final Logger LOG = Logger.getLogger(ViewBean.class.getName());

    private String message;

    public String getMessage() {
   
        return message;
    }

    public void setMessage(String message) {
   
        this.message = message;
    }

    public void initializeView() {
   
        message = "Welcome to the view!";
        LOG.info("View initialized.");
    }

    public void updateMessage(ActionEvent event) {
   
        message = "Message updated by an action!";
        LOG.info("Message updated.");
    }

    public void destroyView() {
   
        LOG.info("View destroyed.");
    }
}

在上述代码中,我们添加了一个 destroyView 方法,并在其中记录日志。为了触发视图销毁,我们需要手动销毁视图。这可以通过在 web.xml 中添加一个 view-param 参数来实现。

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <init-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Production</param-value>
    </init-param>
    <init-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

index.xhtml 页面中,我们可以添加一个链接来触发视图销毁。

<h:body>
    <h:form>
        <h:outputText value="#{viewBean.message}" />

        <h:commandButton value="Update Message" action="#{viewBean.updateMessage}">
            <f:event type="preRenderView" listener="#{viewBean.initializeView}" />
        </h:commandButton>

        <h:commandLink value="Destroy View" action="#{null}" immediate="true">
            <f:viewParam name="viewDestroyed" value="true" />
        </h:commandLink>
    </h:form>
</h:body>

在上述代码中,<h:commandLink> 标签用于创建一个链接,当用户点击该链接时,会触发视图销毁。通过 immediate="true" 属性,我们确保在执行任何其他操作之前立即处理视图参数。

最后,部署并运行你的应用程序。启动应用服务器,并在浏览器中访问 http://localhost:8080/MyJSFViewManagement/index.jsf。你应该看到一个带有 "Update Message" 按钮的页面。点击按钮后,页面会显示更新后的信息。点击 "Destroy View" 链接后,视图会被销毁,并记录相应的日志信息。

通过上述步骤,你已经成功地创建了一个简单的 JSF 应用程序,并展示了如何管理视图的生命周期。这个示例不仅介绍了如何配置 JSF 环境以支持视图管理,还包括了如何编写 Managed Bean 和 Facelets 页面,以及如何使用 JSF 标签来控制视图的生命周期。掌握了这些基础知识后,你可以进一步探索 JSF 的更多高级功能,如导航规则、状态保存方法等,逐步提高你的开发技能。

相关文章
|
6天前
|
应用服务中间件 Docker 容器
docker应用部署---Tomcat的部署配置
这篇文章介绍了如何使用Docker部署Tomcat服务器,包括搜索和拉取Tomcat镜像、创建容器并设置端口映射和目录映射,以及如何创建一个HTML页面并使用外部机器访问Tomcat服务器。
docker应用部署---Tomcat的部署配置
|
6天前
|
Kubernetes Linux 开发者
深入探索Docker容器化技术的奥秘
深入探索Docker容器化技术的奥秘
15 1
|
6天前
|
应用服务中间件 nginx Docker
docker应用部署---nginx部署的配置
这篇文章介绍了如何使用Docker部署Nginx服务器,包括搜索和拉取Nginx镜像、创建容器并设置端口映射和目录映射,以及如何创建一个测试页面并使用外部机器访问Nginx服务器。
|
4天前
|
Cloud Native 持续交付 Docker
深入解析Docker容器化技术及其在生产环境中的应用
深入解析Docker容器化技术及其在生产环境中的应用
10 0
|
6天前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
16 0
|
2月前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
2月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
56 6
|
19天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
23天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
19天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
174 37
下一篇
无影云桌面