JavaServer Faces中的页面导航

JavaServer Faces中的页面导航

作者 Budi Kurniawan
10/29/2003

页面导航是Web编程的重要组成部分。程序越复杂管理用户页面调度就越困难。 JavaServer Faces (JSF) 通过把页面导航信息配置在配置文件中来解决这一问题,这使得JSF将来会成文Web开发的首选。你可以在这里现在例子.这些例子使用了JSF Early Access 4。请参考ONJava.com 网站上的"Introducing JavaServer Faces"里提到的“如何部署你的JSF应用”,如果你对JSF还不熟悉,这篇文章是你的首选。

所有的多页面Web程序都需要为用户管理页面之间的导航关系。如果你熟悉Servlet和JSP的Model 1和Model 2开发方式,你肯定了解Model 1方式中页面导航是多么复杂,因为用户进入下一个页面的链接全部都是硬编码,这导致Model 1方式不是和中等规模的应用开发。在Model 2这个问题有所缓解,因为导航信息是在Servlet控制其中定义的。然而,要改变链接就不得不重新编译Servlet。 JSF提供了在应用配置文件中定义页面导航的规则。

页面导航在JSF应用开发中至关重要。所有多页面的JSF都要求用户为用户进行页面导航,用户通过点击一个叫做UICommand的组件进入其他页面,用command_button标签或者command_hyperlink标签代表。点击这个组件将产生出javax.faces.event.ActionEvent的时间对象。通常,要捕获一个ActionEvent,你需要编写一个ActionListener。但是,JSF为页面导航提供了一个默认的 listener。因此你不需要亲自动手去编写。但是这个默认的action listener用户点击UICommand时进入哪个界面?答案是通过在应用程序配置文件中定义的页面导航规则。因为它是一个XML文件,你可以用任何文本编辑起来编写,这意味着它很容易修改。

这篇文章讲述了页面导航规则和如何应用它们。将会伴随一个简单的导航的例子。然后,讨论Action类在导航中扮演的角色。然后用一个比较复杂的例子来说明如何使现有条件的页面导航。开始吧!

导航规则

单击UICommand组件将会发送ActionEvent到一个默认的句柄,这个句柄会被自动注册到每一个组UICommand上。

每个在应用配置文件中定义的导航规则都有一个源页面和一个或多个目标页面。一个页面用它的树型标识符代表,每个可能的目标页面用导航条件(Naviation Case)代表。你需要为每一个页面指定一个导航规则,从这个页面上用户可以跳转到其他的页面。”

为了更好的理解,试想有一个叫login.jsp的页面,它包含一个登录的表单。当用户单击提交按钮登录的时候,程序将重定向到welcome.jsp(如多登录成功)或者返回到login.jsp(如果登录失败),这样,login.jsp就有两个导航条件,登录成功和登录失败。

导航规则在应用配置文件navigation-rule元素中定义,如下

<!ELEMENT navigation-rule (description*, display-name*, icon*, from-tree-id?, navigation-case*)>
     
     

其中的“*”号表示出现0次或0次以上,因此description, display-name, iconnavigation-case都是可选的且出现很多次。标记着“?”号表示元素可以出现0次获1次,navigation-rule最重要的两个子元素就是from-tree-idnavigation-case

from-tree-id子元素的值是源页面的树形标识符。要描述login.jsp的导航规则,如下所示

<from-tree-id>login.jsp</from-tree-id>

navigation-case子元素代表了一个可能的目标。navigation-rule元素可以没有或有多个navigation-case子元素,每个元素为from-tree-id处理定义了一个结果,结果可以从UICommandactionactionRef属性中获取。

navigation-case元素描述如下:

<!ELEMENT navigation-case
     
     
    (description*, display-name*, icon*, from-action-ref?, from-outcome?, to-tree-id)>

display-nameicon很少用到,from-action-ref, from-outcometo-tree-id 的结束如下:

to-tree-id定义了这个导航条件的目标页面;from-outcome定义了处理from-tree-id的结果。它是从触发了ActionEvent事件的UICommand组件的action属性值获得的。

from-action-ref 元素和from-outcome一样,它对应UICommand组件的actionRef

一个简单的例子

下面的例子展示了一个简单的页面导航规则,这个程序由两个页面组成:a.jspb.jsp。从a.jsp,,用户可以单击按钮到b.jsp 反之亦然,下面是它们的导航规则:

<navigation-rule>
     
     
    <from-tree-id>/a.jsp</from-tree-id>
     
     
    <navigation-case>
     
     
        <to-tree-id>/b.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
</navigation-rule>
     
     
<navigation-rule>
     
     
    <from-tree-id>/b.jsp</from-tree-id>
     
     
    <navigation-case>
     
     
        <to-tree-id>/a.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
</navigation-rule>

第一个navigation-rulea.jsp定义了目标,它包含一个带有 to-tree-id子元素的navigation-case元素,没有 from-outcomefrom-action-ref 子元素,不管什么结果都会显示b.jsp。第二个为b.jsp定义了目标,从b.jsp,用户肯定会跳转到a.jsp

注意:如果有错误处理的话源页面还会被显示

a.    jspb.jsp 用到了下面的ValueBean

package jsfArticle;
     
     
 
     
     
public class ValueBean {
     
     
    private String value;
     
     
 
     
     
    public String getValue() {
     
     
        return value;
     
     
    }
     
     
 
     
     
    public void setValue(String value) {
     
     
        this.value = value;
     
     
    }
     
     
}

这个bean的定义必须在应用配置文件中给出:

<managed-bean>
     
     
    <managed-bean-name>ValueBean</managed-bean-name>
     
     
 
     
     
    <managed-bean-class>jsfArticle.ValueBean</managed-bean-class>
     
     
 
     
     
    <managed-bean-scope>session</managed-bean-scope>
     
     
 
     
     
</managed-bean>

a.    jsp 包含一个UIInput组件和一个强迫用户输入4个以上自负的校验器:

a.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
     
     
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
     
     
<html>
     
     
<head>
     
     
<title>First Page</title>
     
     
</head>
     
     
<body>
     
     
<f:use_faces>
     
     
<h:form  formName="myForm">
     
     
Please enter your user id (Your user id must be at least 4
     
     
characters long) :
     
     
  <h:input_text valueRef="ValueBean.value">
     
     
    <f:validate_length minimum="4"/>
     
     
  </h:input_text>
     
     
<br/>
     
     
<h:command_button commandName="submit" label="submit"/>
     
     
<br/>
     
     
<hr/>
     
     
<h:output_errors/>
     
     
</h:form>
     
     
</f:use_faces>
     
     
</body>
     
     
</html>

b.jsp 页面包含一个UIOutput组件,用来显示在a.jsp 页面中的UIInput 组件中输入的字符,b.jsp 也有一个命令按钮用来返回a.jsp

b.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
     
     
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
     
     
<html>
     
     
<head>
     
     
<title>Second Page</title>
     
     
</head>
     
     
<body>
     
     
<f:use_faces>
     
     
<h:form  formName="myForm">
     
     
The user id you have entered is <h:output_text
     
     
valueRef="ValueBean.value"/>
     
     
<br/>
     
     
<h:command_button commandName="back"
     
     
        label="Back to Previous Page"/>
     
     
</h:form>
     
     
</f:use_faces>
     
     
</body>
     
     
</html>

你可以用这个URL来访问a.jsp(假设你的web container用8080端口而且你在本机上运行这个程序)

        http://localhost:8080/jsfPageNav/faces/a.jsp

现在,输入并提交四个以上的字符组成的字符串

如果你单击b.jsp上的按钮就会回到a.jsp。

如果你输入了小于四个的字符串,a.jsp中的校验器就会添加一条消息到FacesContext实例中,取消导航。结果如下:

 

Action

Action是一个执行任务的对象。在JSF中,定义为一个抽象类javax.faces.application.Action

最重要的方法是invoke()这是一个抽象方法,返回值是String类

        public abstract String invoke()

你在这个方法中编写代码,JSF实现会调用你的方法。

Action会通过command_buttoncommand_hyperlink标签的actionRef属性被UICommand 调用为了说明如何使用这个类,请看下面的例子“有条件的页面导航”。

有条件的页面导航

这部分介绍一个例子来师范如何通过导航规则定义多个导航条件。这个例子包含两个页面: login.jspwelcome.jsp. login.jsp 页面包行两个UIInput 组件让用户输入用户名和密码,单击命令按钮登录。登录成功将会进入welcome.jsp 页面,否则用户会看到带有错误消息的login.jsp页面。

有条件的导航页面规则:

<navigation-rule>
     
     
    <from-tree-id>/login.jsp</from-tree-id>
     
     
    <navigation-case>
     
     
        <from-outcome>success</from-outcome>
     
     
        <to-tree-id>/welcome.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
    <navigation-case>
     
     
    <from-outcome>failed</from-outcome>
     
     
    <to-tree-id>/login.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
</navigation-rule>

navigation-rule定义了login.jsp页面的可能目标, from-outcome元素值为success (登录成功), welcome.jsp 页面将会被显示,否则,如果from-outcome 元素的值是failed, login.jsp页面将被重新显示。welcome.jsp没有定义导航规则,你可以自己去做。

login.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
     
     
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
     
     
<html>
     
     
<head>
     
     
<title>Login</title>
     
     
</head>
     
     
<body>
     
     
<f:use_faces>
     
     
<h:form  formName="loginForm">
     
     
<h2>Please enter your user name and password</h2>
     
     
<br>User Name: <h:input_text
     
     
valueRef="LoginBean.userName"/>
     
     
<br>Password: <h:input_secret
     
     
valueRef="LoginBean.password"/>
     
     
<br><h:command_button commandName="login"
     
     
label="login"
     
     
actionRef="LoginBean.login"/>
     
     
<br>
     
     
<h:output_errors/>
     
     
</h:form>
     
     
</f:use_faces>
     
     
</body>
     
     
</html>

welcome.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
     
     
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
     
     
<html>
     
     
<head>
     
     
<title>Welcome</title>
     
     
</head>
     
     
<body>
     
     
You logged in successfully.
     
     
</body>
     
     
</html>

login.jsp 中的command_button签有一个值为LoginBean.login actionRef

<h:command_button commandName="login" label="login"
     
     
        actionRef="LoginBean.login"/>

这意味着command button的输出结果来自LoginBean 的login属性,注意下面的LoginBean 的代码,我们将在后面进行讲解。

package jsfArticle;
     
     
 
     
     
import javax.faces.application.Action;
     
     
import javax.faces.application.Message;
     
     
import javax.faces.application.MessageImpl;
     
     
import javax.faces.context.FacesContext;
     
     
 
     
     
public class LoginBean {
     
     
    private String userName;
     
     
    private String password;
     
     
    private Action login;
     
     
 
     
     
    public String getUserName() {
     
     
        return userName;
     
     
    }
     
     
 
     
     
    public void setUserName(String userName) {
     
     
        this.userName = userName;
     
     
    }
     
     
 
     
     
    public String getPassword() {
     
     
        return password;
     
     
    }
     
     
 
     
     
    public void setPassword(String password) {
     
     
    this.password = password;
     
     
    }
     
     
 
     
     
    public Action getLogin() {
     
     
    if (login==null)
     
     
            login = new LoginAction();
     
     
        return login;
     
     
    }
     
     
 
     
     
    class LoginAction extends Action {
     
     
        public String invoke() {
     
     
            if ("anna".equals(userName) && "honolulu".equals(password))
     
     
                return "success";
     
     
            else {
     
     
                Message loginErrorMessage =
     
     
                    new MessageImpl(1, "<hr>Login failed", null);
     
     
                FacesContext.getCurrentInstance().addMessage(
     
     
                    null, loginErrorMessage);
     
     
                return "failed";
     
     
            }
     
     
        }
     
     
    }
     
     
}
     
     

因为一个bean的属性代表了一个action的输出结果,这个属性必须是javax.faces.application.Action

private Action login;

getLogin返回login Action.

public Action getLogin() {
     
     
    if (login==null)
     
     
        login = new LoginAction();
     
     
    return login;
     
     
}

Action类的实现必须提供invoke方法,根据导航规则,值是successfailed 这就是LoginAction 类中invoke方法的返回值。这样,正确的用户名和密码分别是annablackcombhonolulu

例子用到的LoginBean必须在应用配置文件中注册:

注册LoginBean

<managed-bean>
     
     
    <managed-bean-name>LoginBean</managed-bean-name>
     
     
    <managed-bean-class>jsfArticle.LoginBean</managed-bean-class>
     
     
    <managed-bean-scope>session</managed-bean-scope>
     
     
  </managed-bean>

现在可以在浏览器中输入

http://localhost:8080/JSFCh0jsfPageNav6/faces/login.jsp

你将看到类似下面的画面:

输入正确的用户名和密码,将看到welcome.jsp

输入错误的话将看到有错误信息的login.jsp

注意前面的例子你也可以使用from-action-ref元素来定义:

<navigation-rule>
     
     
<from-tree-id>/login.jsp</from-tree-id>
     
     
    <navigation-case>
     
     
        <from-action-ref>LoginBean.login</from-action-ref>
      
      
        <from-outcome>success</from-outcome>
     
     
        <to-tree-id>/welcome.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
    <navigation-case>
     
     
        <from-action-ref>LoginBean.login</from-action-ref>
      
      
        <from-outcome>failed</from-outcome>
     
     
        <to-tree-id>/login.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
</navigation-rule>

然而, 这不是必需的,因为action的值来自bean,它是唯一的。

使用from-action-ref元素

这个例子既使用了action-ref属性又使用了action 属性,它用到了login2.jsp, 和login.jsp很相似,只是login2.jsp 包含了一个到help.jsp页面的超链接。

注意: 你必须重新启动你的浏览器好让JSF创建一个新的LoginBean实例。

 

<navigation-rule>
     
     
    <from-tree-id>/login2.jsp</from-tree-id>
     
     
    <navigation-case>
     
     
        <from-outcome>success</from-outcome>
     
     
        <to-tree-id>/welcome.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
    <navigation-case>
     
     
        <from-outcome>failed</from-outcome>
     
     
        <to-tree-id>/login2.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
    <navigation-case>
     
     
        <from-outcome>help</from-outcome>
     
     
        <to-tree-id>/help.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
</navigation-rule>

login2.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
     
     
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
     
     
<html>
     
     
<head>
     
     
<title>Login 2</title>
     
     
</head>
     
     
<body>
     
     
<f:use_faces>
     
     
<h:form formName="loginForm">
     
     
<h2>Please enter your user name and password</h2>
     
     
<br>User Name: <h:input_text
     
     
valueRef="LoginBean.userName"/>
     
     
<br>Password: <h:input_secret
     
     
valueRef="LoginBean.password"/>
     
     
<br><h:command_button commandName="login"
     
     
label="login"
     
     
actionRef="LoginBean.login"/>
     
     
<br><h:command_hyperlink commandName="forgottenPassword"
     
     
action="help"
     
     
label="Forgotten your password?"/>
     
     
<h:output_errors/>
     
     
</h:form>
     
     
</f:use_faces>
     
     
</body>
     
     
</html>

 

help.jsp

<html>
     
     
<head>
     
     
<title>Help</title>
     
     
</head>
     
     
<body>
     
     
If you have forgotten your password, please contact the admin
     
     
(admin@brainysoftware.com).
     
     
</body>
     
     
</html>

在浏览器输入http://localhost:8080/JSFCh0jsfPageNav6/faces/login2.jsp

如果你输入正确的用户名和密码,你将看到welcome.jsp页面。输入错误将返回login.jsp。如果点了下面的超链接,你将看到help.jsp

如果你打算用success作为command_hyperlink标签中action属性的值:

<h:command_hyperlink commandName="forgottenPassword"
     
     
    action="success" label="Forgotten your password?"/ >

 navigation-rule元素应当这样写(这次用到了from-action-ref元素):

<navigation-rule>
     
     
    <from-tree-id>/login2.jsp</from-tree-id>
     
     
    <navigation-case>
     
     
        <from-action-ref>LoginBean.login</from-action-ref>
      
      
        <from-outcome>success</from-outcome>
     
     
        <to-tree-id>/welcome.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
    <navigation-case>
     
     
        <from-action-ref>LoginBean.login</from-action-ref>
      
      
        <from-outcome>failed</from-outcome>
     
     
        <to-tree-id>/login2.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
    <navigation-case>
     
     
        <from-outcome>success</from-outcome>
     
     
        <to-tree-id>/help.jsp</to-tree-id>
     
     
    </navigation-case>
     
     
</navigation-rule>

总结

这篇文章示范了页面导航的方法,这是JSF编程中重要的一方面,作者先阐述了页面导航规则,然后给出了很多例子加以说明。

Budi Kurniawan 是一位IT顾问,专攻网络和面向对象编程,讲授过微软和java技术。

这是2个压缩包的第二个,请一并将第一个下载后,随便解压其一个即可。 如果只希望下载其一部分即可阅读,可下载另一个pdf: http://download.csdn.net/detail/oqqsun12345678/5215337 内容简介 出版日期: 2012年1月1日 《JavaServer Faces 2.0完全参考手册》针对javaserver faces(jsf)2.0的变化进行了全面的修订与更新,涵盖了javeee的官方标准web开发架构的每个方面。在这本权威著作,sun microsystems公司jsf合作规范领导者展示了如何创建动态的、跨浏览器的web应用程序,由于保留了较高质量的代码和可扩展性,这些应用程序可以给用户带来极为优秀的体验。 《JavaServer Faces 2.0完全参考手册》提供了一个综合的示例应用程序,可以将其用作您自己的jsf应用程序的模型。该示例应用程序的代码可以从网上下载。《JavaServer Faces 2.0完全参考手册》对所有jsf功能都进行了解释,包括请求处理生命周期、托管bean、页面导航、组件开发、ajax、验证器、国际化和安全。贯穿全书的专家组意见提供了关于jsf设计的内部信息。 推荐编辑 《JavaServer Faces 2.0完全参考手册》主要内容:搭建开发环境并构建JSF应用程序。理解JSF请求处理生命周期。使用Facelets视图声明语言、托管bean和JSF表达式语言(EL)。按照JSF导航模型声明一个页面,包括新的“隐式导航”功能。使用用户界面组件模型和JSF事件模型,包括支持可添加书签的页面以及POST、REDIRECT、GET模式。使用为模型数据验证设立的新的JSR-303bean验证标准。创建可以使用Ajax的定制用户界面组件。使用定制的非用户界面组件来扩展JSF。管理安全、可访问性、国际化和本地化。学会使用Liferay的JSF团队领导开发的JSF和Portlet,Liferay是处于领导地位的JavaPortal开发商。 全面介绍JSF2.0、详述如何使用Ajax,以及按照JSF2.0、的方式构建组件、快速理解众多可以直接运行的代码示例。 作者 作者:(美国)伯恩斯 (Ed Burns) (美国)沙尔克 (Chris Schalk) (美国)格里芬 (Neil Griffin) 译者:陶克 熊淑华 伯恩斯,Ed Burns是Sun Microsystems公司的高级主管工程师,此外还是JavaServer Faces共同规范的领导者。他与其他人合著了JavaServer Faces:The Complete Reference一书,并且是Secrets of the Rock Star Programmers一书的作者。 沙尔克,Chris Schalk是developer advocate,致力于提升Google的API和技术。他当前在国际化Web开发社区工作,主要研究新的Google App Engine和Open Social API。 格里芬,Neil Griffin是Liferay Portal的委员以及JSF开发团队领导者,并且是Portlet Faces项目的合作创始人。 目录 第I部分 javaserver faces框架 第1章 javaserver faces简介 1.1 什么是javaserver faces 1.2 javaserver faces的历史 1.2.1 公共网关接口 1.2.2 servletapi 1.2.3 java服务器页面 1.2.4 apachestruts 1.2.5 spring框架和springmvc 1.2.6 javaserverfaces的诞生 1.3 javaserver faces设计目标 1.4 jsf应用程序架构 1.4.1 jsf请求处理生命周期 1.4.2 jsf导航模型 第2章 构建一个简单的javaserver faces应用程序 2.1 应用程序概述 2.1.1 jsfreg应用程序文件 2.1.2 jsf软件栈 2.1.3 装配jsfreg应用程序 2.1.4 配置文件 2.1.5 facelets页面 2.2 构建和运行应用程序 2.3 应用程序关键部分 回顾 第3章 javaserver faces请求处理生命周期 3.1 jsf请求处理生命周期概述 3.1.1 请求处理生命周期的功能 3.1.2 与其他web技术的区别 3.1.3 服务器端视图的自动管理与同步 3.1.4 请求处理生命周期的各阶段 3.2 观察请求处理生命周期 3.3 与请求处理生命周期有关的高级主题 3.3.1 使用immediate属性 3.3.2 阶段侦听器 3.3.3 异常处理程序 3.4 关键的生命周期概念 第4章 facelets视图声明语言 4.1 jsf使用模板化的威力 4.2 jsp与facelets的异同 4.3 使用facelets执行模板化 4.4 facelets模板化标签使用指南 4.4.1 ui:composition 4.4.2 ui:decorate 4.4.3 ui:define 4.4.4 ui:insert 4.4.5 ui:include 4.4.6 ui:param 4.5 facelets非模板化标签使用指南 4.5.1 ui:component 4.5.2 ui:fragment 4.5.3 ui:remove 4.5.4 ui:debug 第5章 托管bean与JSF表达式语言 5.1 托管bean概念 5.1.1 简单托管bean示例 5.1.2 初始化托管bean属性 5.1.3 把List和Map声明为托管bean 5.1.4 托管bean的相互依赖 5.1.5 使用EL设置托管属性 5.2 控制托管bean生命周期 5.3 JSF表达式语言 5.3.1 JSFl.1 与JSFl.2 之间表达式语言的关键区别 5.3.2 统一EL概念 5.3.3 值表达式 5.3.4 表达式操作符 5.3.5 方法表达式 5.4 托管bean的Web应用程序开发细节 5.4.1 采用编程方式访问托管bean 5.4.2 使用托管bean作为JSF页面的支撑bean 第6章 导航模型 6.1 使用隐式导航 6.2 JSF导航系统概述 6.2.1 回顾MVC-控制器 6.2.2 Navigation HandleI-幕后主管 6.2.3 Faces动作方法说明 6.3 构建导航规则 6.3.1 静态导航示例 6.3.2 动态导航示例 6.4 更复杂的导航示例 6.4.1 使用通配符 6.4.2 使用条件导航 6.4.3 使用重定向 6.4.4 视图参数的XML配置 6.4.5 在Servlet错误页上使用JSF组件 第7章 用户界面组件模型 7.1 什么是用户界面组件 7.1.1 基于组件的Web开发的兴起 7.1.2 Java Server Faces用户界面组件的目标 7.2 JSF用户界面组件架构介绍 7.2.1 用户界面组件树(视图) 7.2.2 用户界面组件和相关的“活动部分 7.3 组件资源 7.4 用户界面组件和Facelets 7.4.1 用编程方式访问用户界面组件 7.4.2 在JSF视图绑定用户界面组件的有用建议 第8章 数据转换与数据验证 8.1 验证和转换的示例 8.2 转换和验证揭秘 8.3 Faces转换器系统 8.3.1 Date Time Converter 8.3.2 Number Converter 8.3.3 关联转换器与UI Component实例 8.3.4 转换器的生命周期 8.3.5 定制转换器 8.4 Faces验证系统 8.4.1 Long Range Validator 8.4.2 Double Range Validator 8.4.3 Length Validator 8.4.4 必需的工具Required Validator 8.4.5 Reg Ex Validator 8.4.6 Bean Validator …… 第9章 jsf事件模型 第II部分 扩展javaserver faces 第10章 应用jsf:虚拟教练应用程序简介 第11章 构建定制用户界面组件 第12章 jsf与ajax 第13章 构建非用户界面定制组件 第14章 保护javaserver faces应用程序 第III部分 javaserver faces工具与库 第15章 配置javaserver faces应用程序 第16章 标准的jsf组件库 附录jsf portlet
【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值