日记记录工具管理

1、JSF中的三大基本组件:

  • log4net
  • NLog
  • log4j
  • SLF4J

2.4、<f:view>标签的常用属性:

在软件开发、测试以及生育环境中,日志记录是那么些关键的,拔取合适的日志记录工具、设计合理的日记输出格式,有利于帮忙开发人员明确程序的推行流程以及错误的飞跃稳定和改进。日志记录作为软件开发周期中的主要组成部分,本文介绍两种常用的日志记录工具: 

与地点多个复选框差距,它的value属性必须绑定到托管Bean中boolean类型的性格,不须要与<f:selectItem>标签一起使用。

log4j

log for java(log4j)是 Apache 的开源项目成效强大的日记组件,Java
编写的笃定、神速和灵活的日志框架(API),首要运用于 Java 项目。

一个密切编辑的日志代码提供快速的调节、维护方便、应用程序的运作时新闻结构化存储。

当下流行的 Generation 是 Apache log4j 2,最新的 Release 是 Log4j
2.8.2,相关代码:

在编译前,最好应正确安装 PATH 和
CLASSPATH ,项目中最好在 /src/ 目录下存放 log4j.properties
文件。

特性特点

  • 线程安全
  • 参数配置化
  • 二种日志等级,五种输出介质

log4j 包含多个关键组件

  • loggers:记录日志音讯
  • appenders:日志记录方式、输出介质等新闻
  • layouts:日志新闻格式化

下边是 log4j 组件虚拟图

管理 1

输出介质:援救控制台、文件、数据库等

  • ConsoleAppender:控制台
  • FileAppender:文件
  • RollingFileAppender:文件大小滚动生成日志,达到指定尺寸时生成一个新的日记文件
  • DailyRollingFileAppender:时间滚动生成日志文件
  • WriterAppender:将日志新闻以流格式发送到任意指定的地点,eg.
    数据库

中央拔取

log4j 的过多音讯可以参照
log4net,此部分略过,往事不要再提。

Log4j
襄助二种配备文件格式,一种是XML格式的文书,一种是Java天性文件(键=值)

log4j 通过 log4j.properties
文件(key-value情势)保存属性配置。暗中同意景况下,日志管理在 CLASSPATH
查找一个名为 log4j.properties 的文本。基本格式如下:

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE = org.apache.log4j.FileAppender
log4j.appender.FILE.File = ${log}/log.out
log4j.appender.FILE.Append = true
log4j.appender.FILE.Threshold= INFO

# Define the layout for file appender 
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.conversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

能够将上述格式转换为 xml 格局,两者如出一辙

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

    <appender name="FILE" class="org.apache.log4j.FileAppender">
       <param name="file" value="${log}/log.out" />
       <param name="append" value="true" />
       <layout class="org.apache.log4j.PatternLayout">
          <param name="conversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n" />
       </layout>
    </appender>

    <logger name="log4j.rootLogger" additivity="false">
       <level value="ALL"/>
       <appender-ref ref="FILE"/>
    </logger>

</log4j:configuration>

在 Java 程序中调用如下:

import org.apache.log4j.Logger;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class log4jExample
{
   public static void main(String[] args) throws IOException,SQLException
   {     
       PropertyConfigurator.configure("log4j.properties"); // 入参为配置文件的路径
       Logger logger = Logger.getLogger( log4jExample.class.getName() );
       logger.debug("DEBUG");
       logger.info("INFO");
   }
}

关于配置文件有几个须要小心的标题:

[1].
log4j.properties 文件中根节点配置格式

log4j.rootLogger = [ level ] , appenderName1, appenderName2, …

[2].
关于 appender 结点属性配置

// 为不同的 appender 配置日志输出级别
log4j.appender.AppenderName.Threshold = DEBUG
// 所有的消息都会被立即输出,默认 true
log4j.appender.AppenderName.ImmediateFlush = true 

[3].
对于项目中 log4j.xml 和 log4j.properties 不在 CLASSPATH
路径的,在项目先后中必要直接加载七个文件

DOMConfigurator.configure(log4j_xml_Path);  
PropertyConfigurator.configure(log4j_properties_Path);

除此上述基本配备外,可以伸张 FileAppender,协助 Date 和 Size
滚动日志,详情消息参见:log4j
日志配置教学

1Date:按日期滚动,支持多样DatePattern

# Define the file appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender

# Set the DatePattern
log4j.appender.FILE.DatePattern='.' yyyy-MM-dd'.log'

2Size:按文件大小滚动

# Define the file appender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender

# Set the maximum file size before rollover
log4j.appender.FILE.MaxFileSize=10MB
# Set the the backup index
log4j.appender.FILE.MaxBackupIndex=10

关于 log4j 的详细新闻,参考官网:log4j
官网

<h1>UICommand组件的使用</h1>
<h:form>
    <!-- 生成一个可以提交表单的按钮 -->
    <h:commandButton value="点击" />
    <!-- 生成一个图片按钮 -->
    <h:commandButton image="images/01.jpg" />
    <!-- 生成一个可以提交表单的超链接 -->
    <h:commandLink value="提交表单" />
    <!-- 生成一个可以提交表单的图片链接 -->
    <h:commandLink shape="circle" coords="20,20,10">
        <img src="images/01.jpg" />
    </h:commandLink>
</h:form>

NLog

免费的 .NET 开源日志框架,NLog
允许自定义从跟踪音信的来源于(source)到记录跟踪音信的靶子(target)的规则。

至于 NLog
的详细信息,参考官网:NLogCodeProject –
Introduction to
NLog

天性特点

  • Easy-to-configure:configuration file or programmatically
  • Templatable:layout renders
  • Extensible:write custom targets or pass custom values
  • 字符串延迟加载
  • 协理异步日志记录

NLog 与 log4net 比较,具体细节可参见:[日志框架相比 NLog VS

下边我们就来介绍UI标签:

SLF4J

Commons Logging
通用日志接口,用户可以自由选拔第三方日志组件作为具体完毕。通过动态查找体制,在程序运行时自动找出真正使用的日志框架。代码倚重的是
common-logging 而非具体的日记组件,
幸免与现实的日志方案一贯耦合,必要时可更改日志完结的第三方组件。

import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  

public class A {  
    private static Log logger = LogFactory.getLog(this.getClass());  
}  

Commons Logging + log4j
作为Java日志的经典组合,可是 Commons Logging 存在

  • ClassLoader 问题
  • 为了避免多余的字符串拼接,必须 isDebugEnabled() 判断逻辑

的难点,log4j 团队开发出日记门面框架SLF4J。

Simple Logging Facade for
Java(SLF4J,不难日志门面),不是现实的日志化解方案,用于服务各个日志系统,为区其他日志框架提供统一的日志接口,在编译时绑定相应的日记框架(静态绑定)。关于
SLF4J 的详细音信,参见:SLF4J 官网

好像 JDBC,然而比 JDBC 更简明,无需加载驱动、只需加上特定的包。

面向 Java,推荐 SLF4J,而不是 log4j

参见:干什么选取SLF4J而不是Log4J来做Java日志怎么要动用SLF4J而不是Log4J

质量特点

  • 单身于各类日志系统
  • Parameterized Logging,提供基于占位符(place
    holder)的日记记录方式,可读性高
  • 日志音讯(String)延迟打造,减弱 String 池过多损耗堆内存

骨干使用

SLF4J 只是一个日志外壳,要求在档次中投入
slf4j-jdk14.jar、slf4j-log4j12.jar 或
logback.jar,将日志调用转载到骨子里的日记框架。SLF4J 是一个抽象层(
Abstraction Layer),使你的代码独立于自由一个一定的日志API,具体地:

SLF4J 应用 Facade(门面)设计情势,SLF4J 所提供的着力 API
是提供部分对外的接口以及一个 LoggerFactory 工厂类

SLF4J
提供联合的日记记录接口,只要根据其提供的法门记录即可,最后日志格式、日志级别、输出格局等由具体的日记系统的安插来兑现,因而在运用中得以灵活切换来差其他日记系统,用户使用本身梦想的日志系统
loging APIs。

以 log4j 为例,SLF4J 的绑定操作落成如下

管理 2

  • slf4j-api 作为日志接入的接口,编译时 slf4j-api 的 public final class
    LoggerFactor 类中 private final static void bind()
    方法会寻找并绑定具体的日记已毕类,首要透过调用
    StaticLoggerBinder.getSingleton() 方法
  • slf4j-log4j12 是链接 slf4j-api 和 log4j 的中间适配器,该类实现slf4j-api 中 LoggerFactoryBinder 接口,从而在编译时绑定
    slf4j-log4j12 的 getSingleton() 方法
  • log4j 是有血有肉的日记系统,通过 slf4j-log4j12 初阶化 log4j

中间,SLF4J 的核心是 slf4j api(slf4j-api.jar包),该 .jar
包只提供日志记录接口。有关对 SLF4J 基本认识,参见:初识
SLF4J

SLF4J 不借助于于其它尤其的 class loader 机制。实际上,SLF4J
与已有日记落成的绑定是在编译时静态执行的,具体绑定工作是透过一个 .jar包
完毕的,使用时只要把相应的jar包(唯有一个)放到类路径上即可,SLF4J 通过
.jar包 来告诉使用哪类日志系统贯彻。

管理 3

在 Java 程序中调用如下,通过工厂类 LoggerFactory 创设日志目标

import org.apache.SLF4J.Logger;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestSlf4j 
{
    private static final Logger logger = LoggerFactory.getLogger(TestSlf4j.class);

    public static void main(String[] args) 
    {
        logger.info("Hello {}", "SLF4J");
    }
} 

只顾,在类型中 Maven 依赖应如下设置

<!-- slf4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.12</version>
</dependency>

<!-- slf4j-log4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.12</version>
</dependency>

<!-- log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

切实贯彻进度讲解加入:SLF4J+log4j
原理已毕和源码分析
SLF4J
源码剖析

深深切磋

目前 Latest STABLE version 是
slf4j-1.7.25.zip;其中,SLF4J
的骨干包为

// 核心包
slf4j-api-1.7.25.jar
// 核心包源码
slf4j-api-1.7.25-sources.jar

学学 SLF4J 的源码,可以从以下多少个包开端

slf4j-api,slf4j-log4j12

SLF4J 有七个重点组件,分别是:

  • ILoggerFactory:工厂接口
  • LoggerFactory:工厂类
  • LoggerFactoryBinder:日志框架绑定接口
  • Logger:日志接口
  • StaticLoggerBinder:日志框架绑定落成类

这里先提交全部的流水线:LoggerFactory 调用 getILoggerFactory()
方法,该方法会初步化 LoggerFactory,即由此在 bind() 方法中加载 classpath
中的 StaticLoggerBinder 类,并依照加载结果设置当前 LoggerFactory
的早先化状态,从而在 getILoggerFactory() 方法中通过当前 LoggerFactory
的情况判断再次回到的 ILoggerFactory 实例。上面分别介绍种种相关组件:

1ILoggerFactory

该接口仅提供一个 getLogger() 方法,用于获取日志实例。

public interface ILoggerFactory {
    // 所有日志框架均通过该方法获取Logger实例
    public Logger getLogger(String name);
}

不无的日志框架均须要贯彻该接口。

2LoggerFactory

担当寻找系统里日志的贯彻,提供 getLogger() 创设日志实例。

public static Logger getLogger(String name) {
    ILoggerFactory iLoggerFactory = getILoggerFactory();
    return iLoggerFactory.getLogger(name);
}

此类的 getLogger()
方法通过调用该类的 getILoggerFactory()
方法赢得日志工厂接口的实例,再调用接口提供的 getLogger()
方法得到具体的日记实例。首先看下该类的 getILoggerFactory() 方法

public static ILoggerFactory getILoggerFactory() 
{
    if (INITIALIZATION_STATE == UNINITIALIZED) {
        synchronized (LoggerFactory.class) {
            if (INITIALIZATION_STATE == UNINITIALIZED) {
                INITIALIZATION_STATE = ONGOING_INITIALIZATION;
                performInitialization();  // 初始化
            }
        }
    }
    switch (INITIALIZATION_STATE) {
    case SUCCESSFUL_INITIALIZATION:
        return StaticLoggerBinder.getSingleton().getLoggerFactory();
    case NOP_FALLBACK_INITIALIZATION:
        ... ...
}

率先步工厂先河化,第二步调用 StaticLoggerBinder.getSingleton().getLoggerFactory()
重返日志工厂接口的实例,具体查看上面的(5)StaticLoggerBinder
部分。

此间看下 performInitialization() 方法,用于 绑定日志框架+校验日志框架版本号,代码如下

private final static void performInitialization() 
{
    bind();  // 绑定日志框架
    if (INITIALIZATION_STATE == SUCCESSFUL_INITIALIZATION) {
        versionSanityCheck();  // 校验日志框架版本号
    }
}

其中,bind() 方法是 SLF4J 最中央的代码,完成日志框架绑定,具体地

private final static void bind() {
    try {
        Set<URL> staticLoggerBinderPathSet = null;
        // skip check under android, see also
        // http://jira.qos.ch/browse/SLF4J-328
        if (!isAndroid()) {
            staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();  // 寻找可能的日志框架
            reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);  // 输出搜索到的所有StaticLoggerBinder日志
        }

        // the next line does the binding:实现绑定
        StaticLoggerBinder.getSingleton(); 
        INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;
        reportActualBinding(staticLoggerBinderPathSet);  // 输出最终实际绑定的StaticLoggerBinder日志
        fixSubstituteLoggers();
        replayEvents();
        // release all resources in SUBST_FACTORY
        SUBST_FACTORY.clear();
    } 
    catch () {
        ... ...
    }
}

该方法会加载并绑定找见的首先个 StaticLoggerBinder
类,并调用该类的 getSingleton() 方法,已毕日志框架的绑定。其中,

private static String STATIC_LOGGER_BINDER_PATH = "org/slf4j/impl/StaticLoggerBinder.class";

static Set<URL> findPossibleStaticLoggerBinderPathSet() 
{
    Set<URL> staticLoggerBinderPathSet = new LinkedHashSet<URL>();
    try 
    {
        ClassLoader loggerFactoryClassLoader = LoggerFactory.class.getClassLoader();

        Enumeration<URL> paths;
        if (loggerFactoryClassLoader == null) {
            paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);
        } 
        else {
            paths = loggerFactoryClassLoader.getResources(STATIC_LOGGER_BINDER_PATH);
        }

        while (paths.hasMoreElements()) {
            URL path = paths.nextElement();
            staticLoggerBinderPathSet.add(path);
        }
    } 
    catch (IOException ioe) {
        Util.report("Error getting resources from path", ioe);
    }
    return staticLoggerBinderPathSet;
}

findPossibleStaticLoggerBinderPathSet() 方法会查找项目根路径下的 “org/slf4j/impl/StaticLoggerBinder.class”
文件。然后 reportMultipleBindingAmbiguity() 方法会报告文本查找的结果音讯

private static void reportMultipleBindingAmbiguity(Set<URL> binderPathSet) {
    if (binderPathSet.size() > 1) 
    {
        Util.report("Class path contains multiple SLF4J bindings.");
        for (URL path : binderPathSet) {
            Util.report("Found binding in [" + path + "]");
        }
        Util.report("See " + MULTIPLE_BINDINGS_URL + " for an explanation.");
    }
}

比方找到三个,则输出 “Class path contains
multiple SLF4J bindings” 提醒消息,表示有三个日志框架绑定了
SLF4J。

3Logger

该接口提供不一致层级日志音信记录的顺序艺术。

public interface Logger {
    public void debug(String msg);
    public void debug(String format, Object... arguments);
    ... ...
    info, warn, error
}

4LoggerFactoryBinder

日志框架绑定接口,仅且提供 2 个方法

public interface LoggerFactoryBinder {
    public ILoggerFactory getLoggerFactory();
    public String getLoggerFactoryClassStr();
}

逐个扶助 SLF4J 的日记框架必须存在一个落成该接口的 StaticLoggerBinder
类。

5StaticLoggerBinder

兑现 LoggerFactoryBinder 接口,类 LoggerFactory 调用该类的
getSingleton() 和 getLoggerFactory() 方法再次来到具体日志框架的接口实例,以
slf4j-log4j12.jar 为例

// 单例模式
public class StaticLoggerBinder implements LoggerFactoryBinder 
{
    private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();
    public static final StaticLoggerBinder getSingleton() {  // 静态方法
        return SINGLETON;
    }

    private static final String loggerFactoryClassStr = Log4jLoggerFactory.class.getName();
    public String getLoggerFactoryClassStr() {
        return loggerFactoryClassStr;
    }

    private final ILoggerFactory iloggerFactory;
    public ILoggerFactory getLoggerFactory() {
        return iloggerFactory;
    }
    private StaticLoggerBinder() {
        iloggerFactory = new Log4jLoggerFactory();  // 日志框架log4j的工厂类
        ... ...
    }

    public static String REQUESTED_API_VERSION = "1.6.99"; // !final
}

此类的构造函数中新建一个 log4j 的日记工厂接口实例,并经过
getLoggerFactory() 方法重临。再深入地,查看 log4j的厂子类
Log4jLoggerFactory

public class Log4jLoggerFactory implements ILoggerFactory 
{ 
    ConcurrentMap<String, Logger> loggerMap;  // key: name (String), value: a Log4jLoggerAdapter;
    public Log4jLoggerFactory() {
        loggerMap = new ConcurrentHashMap<String, Logger>();  // 线程安全的HashMap类
        org.apache.log4j.LogManager.getRootLogger();  // force log4j to initialize
    }

    // 实现接口 ILoggerFactory 的 getLogger() 方法
    public Logger getLogger(String name) {
        Logger slf4jLogger = loggerMap.get(name);
        ... ...
    }
}

个中,ConcurrentHashMap 用于缓存所有之前成立的 Log4jLoggerAdapter
类实例,日志框架 log4j 的工厂类完结了接口 ILoggerFactory,调用 org.apache.log4j.LogManager.getRootLogger()
达成对 log4j 的绑定,通过调用 getLogger()
方法再次回到一个 Log4jLoggerAdapter 类实例,那是因为 Log4j 的 Logger 接口与
slf4j 的 Logger 接口齐头并进,必要在 Log4j 的 Logger
对象上举行一层封装。该类维护一个 org.apache.log4j.Logger
logger 对象,用于日志记录

public final class Log4jLoggerAdapter extends MarkerIgnoringBase 
                                      implements LocationAwareLogger, Serializable
{
    final transient org.apache.log4j.Logger logger;

    Log4jLoggerAdapter(org.apache.log4j.Logger logger) {
        this.logger = logger;
        this.name = logger.getName();
    }
}

里头,接口 LocationAwareLogger 继承了 Logger 接口,是对 Logger
接口的包装

public interface LocationAwareLogger extends Logger { ... }

切实详细音信参见:slf4j源码剖析 –
xingoo

管理,概括,要兑现一个合作 SLF4J 的日志系统,最宗旨必要三个类:

  • StaticLoggerBinder 类,实现 LoggerFactoryBinder 接口
  • XxxLoggerFactory 类,实现 ILoggerFactory 接口
  • XxxLogger 类,实现 Logger 接口
public class BookInfo {

    private String name;
    private String url;
    private String bookClass;

    public BookInfo(String name, String bookClass, String url){
        this.name = name;
        this.bookClass = bookClass;
        this.url = url;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getBookClass() {
        return bookClass;
    }
    public void setBookClass(String bookClass) {
        this.bookClass = bookClass;
    }
}

内部,log4net 和 NLog 主要用来 C#/.net 平台,log4j 和 SLF4J 紧要用来
Java 开发。

2.1、JSF宗旨标签库:

log4net

参考:Apache log4net
官网

免费的开源日志记录组件,log4net 库是基于 Apache log4j 框架在 Microsoft
.NET 平台的兑现。

至于 log4net 的骨干介绍,可以瞻仰:log4net Tutorial –
CodeProject

特点

  •  Distinct Goals: speed and flexibility
  •  多种门路输出:日志音信输出到:[1]. 控制台;[2]. 文件;[3].
    数据库;
  •  扶助各种 .Net 框架,帮忙多样日记音讯等级,帮忙多样格式输出
  •  XML Configuration + Dynamic Configuration

大旨选拔

log4net.dll 引用 + 配置文件 log4net.xml

此时此刻,最新版本的 .dll 文件是:log4net
2.0.8

本有的重大研讨 log4net 的布局文件:log4net.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" />
  </configSections>

  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
      <appender-ref ref="ColoredLogConsoleAppender" />
    </root>

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
      <param name="File" value="Log\" />
      <param name= "AppendToFile" value= "true" />
      <param name= "DatePattern" value= "yyyyMMdd".log"" />
      <param name= "RollingStyle" value= "Date" />
      <param name="StaticLogFileName" value="false" />
      <lockingModel type="log4net.Appender.FileAppender.MinimalLock" />
      <layout type="log4net.Layout.XMLLayout,log4net">
        <param name="Header" value="" />
        <param name="Footer" value="" />
        <param name="ConversionPattern" value="[%d] [%t] %-5p %c-(%line)  %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
         <param name="LevelMin" value="ALL" />
         <param name="LevelMax" value="OFF" />
      </filter>
    </appender>

    <appender name="ColoredLogConsoleAppender" type="log4net.Appender.ColoredConsoleAppender,log4net">      
      <mapping>
        <level value="INFO" />
        <foreColor value="Grey" />
      </mapping>
      <mapping>
        <level value="WARN" />
        <foreColor value="Green" />
      </mapping>
      <mapping>
        <level value="ERROR" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout,log4net">
         <param name="ConversionPattern" value="[%d] [%t] %-5p %c-(%line) %m%n" />
      </layout>
    </appender>
  </log4net>
</configuration>

首先对 log4net 配置文件的格式作注明,以下三种办法是等价的:

<param name="keyName" value="valueName" />
<keyName value="valueName" />

上边对 .xml 文件中多少个关键标签作表明:

[0.1].RollingFileAppender

RollingFileAppender 基于 FileAppender,FileAppender 和
RollingFileAppender 都以用来将日志写入到文本文件中,RollingFileAppender
提供越多的决定选项

[0.2].ColoredConsoleAppender

ColoredConsoleAppender 基于
ConsoleAppender,ConsoleAppender
和 ColoredConsoleAppender 都以用来将日志写入到控制台,ColoredConsoleAppender 提供越多的决定选项 

[1].level

日志消息控制级别,由低到高 ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF,默认DEBUG,只记录 >=level 的日志消息

内部,ALL表示同意具备的日记请求,OFF表示拒绝所有的伸手

[2].appender-ref

概念日志对象所采纳的 Appender

[3].RollingStyle

日记文件滚动格局,接济 Date、Size、Composite 两种样式,具体地:

  •  Date:日期滚动,天天一个日记文件
  •  Size:文件大小滚动,匹配如下 2 个参数:
    •  MaximumFileSize:日志文件大小限制,支持 KB|MB|GB
    •  MaxSizeRollBackups:日志文件个数限制,默认 ``-1 表示无限制
  •  Composite:Date + Size 的合体版,适于日志量相比大的情状

[4].layout

日记新闻输出格式,扶助 XMLLayout、PatternLayout,具体地:

  •  PatternLayout:经典格式
  •  XMLLayout:XML格式

至于 Layout 的详细信息,参见上面的 深远了然 – Layout 部分。

[5].lockingModel

文件锁类型,允许多少个经过可以写入同一个文本,RollingFileAppender
本身不是线程安全的,若在先后中没有展开线程安全范围,可在此处配置、确保写入安全。接济二种档次:

  •  ExclusiveLock:排它锁
  •  MinimalLock:最小锁定

任何,必要留意的多少个难点

// 如果是网站项目,须在项目中的 AssemblyInfo.cs 文件的最后一行中添加
[assembly: log4net.Config.DOMConfigurator(ConfigFile = "Web.config", Watch = true)] 

在 log4net 中,最常用的是 RollingFileAppender,各样常用的不等安插参见:Log4net中的RollingFileAppender解析

上边是 log4net 的骨干调用方法:读取 log4net.xml 文件,日志音信记录。

using log4net;

namespace log4net_sqh
{
    public class Program
    {
        static void Main(string[] args)
        {
            string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
            string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
            string configFilePath = assemblyDirPath + " \\log4net.xml";
            log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(configFilePath));

            ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

            Logger.Fatal("fatal, 严重错误");
            Logger.Error("error, 错误");
            Logger.Warn("warn, 警告");
            Logger.Info("info, 信息");
            Logger.Debug("debug, 调试");           

            Console.Read();
        }
    }
}

连锁内容可参见:C#运用Log4Net记录日志

内部,MethodBase.GetCurrentMethod().DeclaringType
用于获取阐明该成员的类。ConfigureAndWatch 方法读取配置文件
log4net.xml,相比较 Configure
方法,当配置文件有变动时会重新加载。分歧阶段的日记消息记录辅助多样重载方法:

void Info(object message);
void Info(object message, Exception exception);
void InfoFormat(string format, params object[] args);

上边提供如下链接,可以参见:

而外独立选择 log4net.xml 文件作为 log4net
的布署文件外,亦可径直利用项目自带的 app.config(CS程序)或
web.config(BS程序) 文件,只要将 <log4net> 结点放在 <configuration>
结点中,但 <log4net> 结点必须在 <configSections>
结点的上边,否则不会记日志。

style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: blue;”> style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: blue;”> style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: blue;”> style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”font-size: 14px; color: #000000;”>直接用配备文件 app.Config 或
web.Config 配置利用连串的周转参数,比单独做一个 .xml
配置文件,简洁方便:

  • style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: blue;”> style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: blue;”> style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: blue;”> style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”font-size: 14px; color: #000000;”>提供广泛的
    connectionStrings 和 appSettings,给出 数据库连接 和
    常见的键/值表的概念访问方法
  • style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: blue;”> style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: blue;”> style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”color: blue;”> style=”font-family: Consolas; font-size: 9pt;”> style=”color: #a31515;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: red;”> style=”color: black;”> style=”color: black;”> style=”color: #a31515;”> style=”color: #a31515;”> style=”font-size: 14px; color: #000000;”>提供自定义段configSections,可以自行定义段成分,eg.
    log4net、assembly

下边给出一个 app.config 文件的模板代码:

管理 4

采纳并读取 app.config 文件的安插信息,项目应小心:

[1]. 添加引用程序集 System.configuration
[2]. 名称空间添加 using System.Configuration; 

关于加载 log4net.config
配置
文件,可以行使区其他形式,相关音信参考:log4net
配置文件配置形式

(1)Configuration Attributes

该措施通过添加 Assembly
Attribute,在品种的 AssemblyInfo.cs 文件中添加如下代码,提示程序从 app.config
中读取配置

[assembly: log4net.Config.XmlConfigurator(Watch=true)]

(2)appSettings

该情势在布局文件中添加如下配置

<appSettings>
  <add key="log4net.Config" value="log4net.config"/>
  <add key="log4net.Config.Watch" value="True"/>
</appSettings>

(3)Configuration Files

该措施可以透过如下三种艺术已毕

  • Using the .NET System.Configuration API
  • Reading the file contents directly

引进第一种办法,在先后入口采用如下代码

log4net.Config.XmlConfigurator.Configure(new FileInfo("app.config")); 或 
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo("app.config"));

第两种方法就是前方说的独立接纳一个 log4net.xml 文件作为配置文件的法子

Only one log4net element can be specified in the xml file, but it may/can be located anywhere in the XML hierarchy. 

那三种办法,Configuration Files 拥有相对控制权,appSettings
次之,assembly-level attributes 最弱。

一个微细的增加知识

app.configexe.configvshost.exe.config

  • app.config是自定义的配置文件,vshost.exe.config和exe.config是程序运行时自动创制的情节跟app.config一样的文件
  • vshost.exe.config是程序运行时利用的布局文件,exe.config是程序运行后会复制到vshost.exe.config
  • 从app.config复制到exe.config再复制到vshost.exe.config
  • 对 .config 文件的读写操作,实际是对准 exe.config,该文件必不可少

至于 app.config
文件配置难点,可参看:至于自定义配置结点

深刻通晓

新式版本的源码文件:log4net-2.0.8-src.zip

log4net 有七个关键组件,分别是:

  • Logger(记录器)
  • Appender(附着器)
  • Layout(布局)
  • Repository(库)

下边分别实际介绍种种零部件:

1
Logger

应用程序交互的显要组件,发生日志音讯,日志消息经过 Layout
的格式化处理才会输出。

Log4net 框架定义一个 ILog 接口,所有的 logger
类(包涵自定义的logger类)都无法不已毕那么些接口。

public interface ILog
{
   // 基本方法
   void Debug(object message);
   void Info(object message);
   void Warn(object message);
   void Error(object message);
   void Fatal(object message);

   // 以上的每一个方法都有多个重载的方法,用来支持异常处理及格式化处理
   void Debug(object message, Exception ex);
   void DebugFormat(...);
        ...

   //属性用来检查Logger的日志级别
   bool isDebugEnabled;
        ...
}

Log4net 框架定义一个 LogManager 类,管理所有的 logger 对象。该类的
GetLogger() 静态方法,用大家提供的名字创办 Logger 对象或探寻已经存在的
Logger 对象

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");

办法 GetLogger() 的入参可以使用自定义的日志名字
“logger-name”,也可以应用如下参数作为入参

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType

在应用程序中得以创立多少个 Logger,每一种实例化的 Logger 对象都被 log4net
框架作为命名实体(named entity)来分别维护。 

2
Appender

概念输出介质,log4net 援助各个方式的日记消息输出。

一个 Appender 对象缺省地将兼具的日记新闻传递到输出流,能够选择 Appender Filters 根据区其他正式过滤日志事件。

3Layout

用来控制 Appender 的输出格式,可以是线性的或XML,然而一个 Appender
只可以有一个 Layout。log4net 协助各种 layout:

  • PatternLayout:经典格式,最常用
  • SimpleLayout:不难格式,只输出日志级别与音信内容
  • XMLLayout:XML格式
  • RawTimeStampLayout:可格式化时间,常用于出口到数据库

有关 layout 结点的配备表达:

  • %d:datetime,当前说话的日期时间,%d{HH:mm:ss,fff} 可以只突显时间

  • %p:priority,日志级别

  • %m:message,输出的日记信息
  • %n:newline,换行
  • %t:threadid,当前讲话所在线程ID
  • %c:class,当前几天记对象的名称
  • %L:输出语句所在的行号
  • %F:输出语句所在的文本名
  • %-数字:表示该项的微小长度,假使不够,则用空格填充

4
Repository

负责日志对象协会结构的保障。

增加应用

在攻读 log4net 的最后,达成 log4net 输出 xml 格式的日志:

  • 使用 log4net 自带的 XmlLayout
  • 自定义 XmlLayout

动用自定义 XmlLayout 格式,务必如下:

  • write a class deriving from XmlLayoutBase,override the FormatXml method
  • instruct your appender with yourXmlLayout

率先付诸配置文件 app.config,基本同上,layout 使用自定义的 XmlLayout

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>

  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" value="log\" />
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Date" />
      <param name="datePattern" value="yyyyMMdd'.txt'" />
      <param name="staticLogFileName" value="false" />
      <layout type="MyNamespace.MyXmlLayout">
        <param name="Header" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&#13;&#10;&lt;Root&gt;&#13;&#10;" />
        <param name="Footer" value="&lt;/Root&gt;&#13;&#10;" />
      </layout>
    </appender>    
  </log4net>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

其中, 表示 \r\n
换行。

接下来,自定义类 MyXmlLayout 继承自 XmlLayoutBase,重写 FormatXml 方法:

namespace MyNamespace {
    public class MyXmlLayout : XmlLayoutBase
    {
        protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
        {
            // 自定义 XML 文档格式
            ... ...
        }
    }
}

该形式中能够自定义突显的 xml 文件内容。其中,类 XmlLayoutBase 定义如下

public abstract class XmlLayoutBase : LayoutSkeleton
{
    protected XmlLayoutBase();

    public override void ActivateOptions() { }
    public override void Format(TextWriter writer, LoggingEvent loggingEvent);
    {
        XmlTextWriter xmlTextWriter = new XmlTextWriter(new ProtectCloseTextWriter(writer));
        xmlTextWriter.Formatting = Formatting.None;
        xmlTextWriter.Namespaces = false;
        this.FormatXml(xmlTextWriter, loggingEvent);
        xmlTextWriter.WriteWhitespace(SystemInfo.NewLine); // 换行
        xmlTextWriter.Close(); // 关闭流
    }

    protected abstract void FormatXml(XmlWriter writer, LoggingEvent loggingEvent);
}

除去,主函数调用格局保险不变。

时至后天,xml
格式日志文件核心可正常输出。但是该公文只怕存在缩进、中文格式、xml读取的难题,需做如下核查:

[1].
缩进 XML

在 log4net 的源码 src\Layout\XMLLayoutbase.cs 中,在
Format 方法中添加如下代码

// 注意是使用 XmlTextWriter,而不是 XmlWriter
xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.Indentation = 2;

为了打响编译,还索要修改 src\AssemblyInfo.cs 文件,添加 false 关闭
log4net 的强签名

#if fasle && STRONG && (CLI_1_0 || NET_1_0 || NET_1_1 || NETCF_1_0 || SSCLI)
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(@"..\..\..\log4net.snk")]
#endif

将转变的 log4net.dll 文件替换项目中的 .dll 文件即可。

参考:修改 log4net,生成缩进
XML

[2].
粤语格式

在 log4net 的源码 src\Util\Transform.cs 中,更新如下代码

private static Regex INVALIDCHARS = 
    new Regex(@"[^\x09\x0A\x0D\x20-\xFF\u00FF-\u07FF\uE000-\uFFFD\u4e00-\u9fa5]",RegexOptions.Compiled); 

[3].
XML 读取小题目

在 log4net 的源码 src\Layout\XMLLayout.cs 中,方法 ActivateOptions 修正如下

将 ":" 全部改成 "_" 

参考:修改
log4net,协助中文格式

[4].
<Root> 结点难点

当前变化的 xml 文件,根结点唯有 <Root>,没有 </Root>

至于怎么化解,有待于进一步研商。

现阶段,在选择的时候要专门处理一下,为 xml 文档添加 </Root>

2.3、UI标签的通用属性:

Log4net](http://www.cnblogs.com/qinjin/p/DonetLogCompare.html);[两者比较

逗比版](http://www.cnblogs.com/wanglee/archive/2013/05/22/3092474.html);

布署文件

NLog 同 log4net 一样,不过比 log4net 更简便易行,NLog 使用路由表(routing
table)举办陈设,log4net 使用层次性的 appender
配置,同样支撑二种样式的陈设方式

  • 独自的 NLog.Config 配置文件,直接以 <nlog> 作为根结点
  • 在 App.config/Web.config
    文件中添加 NLog 的安插结点

无论选用哪种配备格局,配置内容和选拔方法是相同的。配置消息结点包含两部分

  • targets:输出目标,协理 File、Mail、Console、DataBase等,每个target 代表一个出口目的,包蕴2个特性
    • name:输出模板名称,在 <rules> 中应用
    • type:输出类型,NLog can dynamically write to one of multiple
      targets for each log message
  • rules:路由规则,将日志和出口目的匹配起来
    • name:日志记录者的名字 (允许使用通配符*)
    • minlevel/maxlevel:日志范围的最低/高级别
    • level/levels:单一日志级别/一多重日志级别,逗号分隔
    • writeTo:规则匹配时日志音信应该被写入的一多元目的,由逗号分隔

先是种方法,尤其注意不要包涵中文!

其次种格局,尤其注意在 App.config/Web.config 中必须保险 <configSections>
结点存在并且是根结点 <configuration>
的率先个结点,否则程序会报错:配置种类不可能开头化,文件结构格局如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, nLog"/>
  </configSections>

  <nlog>
    <targets>
      <target />
    </targets>

    <rules>
      <logger />
    </rules>  
  </nlog>
</configuration>

主导采纳

NLog.dll 引用 + 配置文件

此时此刻 NLog 的源码最新版本是:NLog 4.4.10 –
Source

1)添加引用

添加对 NLog 的引用,有 2 种方法

  • 通过 Nuget,添加 NLog 和 NLog Configuration 七个文件
  • 工具-Nuget程序包管理器-程序包管理器控制台,输入 Install-Package NLog
    和 Install-Package NLog.config 

如故直接在程序中添加 NLog.dll 引用,并 using NLog; 

2)配置结点 <nlog>

布局文件 <nlog>
结点接济八个路由规则和出口目的,格外灵活,上面直接提交结点配置信息

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, nLog"/>
  </configSections>

  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        autoReload="true" 
      throwExceptions="false">
    <targets>
      <!-- 控制台 -->
      <target name="myLogConsole" xsi:type="ColoredConsole"
              layout="${date:format=HH\:mm\:ss}> ${level:padding=-5} ${message}"/>
      <!-- 文件(每天一个日志文件) -->
      <target name="myRollingLogFile" xsi:type="File"
              fileName="${basedir}/Log/${date:format=yyyyMMdd}.txt" keepFileOpen="false"
              layout="${date:format=HH\:mm\:ss} ${level:uppercase=true:padding=-5} ${message}" />
    </targets>

    <rules>
      <logger name="*" minlevel="Debug" writeTo="myLogConsole" />
      <logger name="*" minlevel="Info" WriteTo="myRollingLogFile" />
    </rules>  
  </nlog>
</configuration>

里头,autoReload=”true”
表示自动再安排,无需重启程序、更新配备音信。

特意提示,在 源码文件\examples\targets\Configuration
File 下有各类种种的 NLog 配置文件可以参照。

关于对配置文件的恢宏使用

[1]. 根结点 <nlog>
配置属性 internalLogLevel 和 internalLogFile

用于查看 NLog
输出日志时的其中新闻,比如配置文件音信错误等,不过会有效能影响。

[2]. File Archival Based on
Time or Size

Log files can be automatically archived by moving them to another
location after reaching certain size or time.

// 按时间滚动归档
<targets>
    <target name="onTimeFile" xsi:type="File"
        layout="${longdate} ${level:padding=-5} ${message}" 
        fileName="${basedir}/Log/logfile.txt" 
        archiveFileName="${basedir}/Archives/log.{#}.txt"
        archiveEvery="Day"
        archiveNumbering="Rolling"
        maxArchiveFiles="30"
        concurrentWrites="true"
        keepFileOpen="false"
        encoding="iso-8859-2" />
</targets>    

// 按大小滚动归档
<targets>
    <target name="file" xsi:type="File"
        layout="${longdate} ${level:padding=-5} ${message}" 
        fileName="${basedir}/Log/logfile.txt" 
        archiveFileName="${basedir}/Archives/log.{#####}.txt"
        archiveAboveSize="102400" // unit:Byte
        archiveNumbering="Sequence"
        concurrentWrites="true"
        keepFileOpen="false"
        encoding="iso-8859-2" />
</targets>

Archive Numbering 的诠释以及其余配置音信可参见:File target
Configuration

[3].
Layout:格式化输出(CSV/XML

Layouts provide a way to format the contents of the logs as it is
written to a file. There are 2 main kinds of layouts:

  • simple layout – just a string,which is composed of Layout
    Renderers
  • structural layouts – which can output XML, CSV, and other complex
    formats

首先,CSV 格式的结点配置

<target name="myCsv" xsi:type="File" fileName="${basedir}/file.csv">
  <layout xsi:type="CSVLayout">
     <column name="Time" layout="${longdate}" /> 
     <column name="Level" layout="${level}"/>
     <column name="Message" layout="${message}" />
  </layout>
</target>

上边给出 XML 格式的结点配置

结点如何配置,暂时不明确
仅有的信息可参见:
[1]. Configuring NLog to log exceptions in an XML output?

在程序中调用方法:

namespace NLogSqh {
    public class Program {

        public static NLog.Logger logger = null;        
        public static void Main(string[] args)
        {
            logger = NLog.LogManager.GetCurrentClassLogger();

            logger.Trace("Trace");
            logger.Debug("Debug");
            logger.Info("Info");
            logger.Warn("Warn");
            logger.Error("Error");
            logger.Fatal("Fatal");                                 
        }
    }
}

参考:NLog
学习种类
NLog
小说种类

那两个标签和前面介绍的多个标签的听从宗旨相似,只是这里的只好单选。

 

3.1、<h:form>和主导输入标签的施用:

选拔方面的三个标签必须与<f:selectItem>恐怕<f:selectItems>标签结合使用,其中的<f:selectItem>3脾本性的含义:

JSF包含两组标签库:jsf_core.tld宗旨标签库和html_basic。tld
HTML标签库。

3、UI标签的应用举例:

<h1>dataTable的使用</h1>
<h:dataTable width="600px" border="1" value="showbook.bookList" var="book" rowClasses="odd,even">

    <!-- 使用facet生成caption -->
    <f:facet name="caption">
        <h:outputText value="book list" />
    </f:facet>

    <!-- 定义第一列 -->
    <h:column>
        <f:facet name="header">
            <h:outputText>图书名</h:outputText>
        </f:facet>
        <h:inputText value="#{book.name }" size="3" />
    </h:column>
    <!-- 定义第二列 -->
    <h:column>
        <f:facet name="header">
            <h:outputText>图书分类</h:outputText>
        </f:facet>
        <h:outputLink value="#{book.url }">
            <h:inputText value="#{book.bookClass }" />
        </h:outputLink>
    </h:column>

    <!-- 生成表格底部 -->
    <f:facet name="footer">
        <h:panelGroup>
            <h:outputText value="计算机书籍" />
        </h:panelGroup>
    </f:facet>
</h:dataTable>

JSF的UI大都会变卦一个或七个HTML标签,所以利用这几个UI标签有时一些脾性是通用的:

a、 JSF容器管理的托管Bean
b、 JSF提供的UI标签,应用界面的UI标签直接绑定到托管Bean
c、 页面导航规则

<h1>panelGrid标签的使用</h1>
    <h:panelGrid columns="3" width="300px" border="1">
        <!-- 生成表格标题 -->
        <f:facet name="caption">
            <h:outputText value="表格标题" />
        </f:facet>
        <!-- 生成表格头 -->
        <f:facet name="header">
            <h:outputText value="表格头" />
        </f:facet>
        <h:outputText value="1" />
        <h:outputText value="2" />
        <h:outputText value="3" />
        <!-- panelGroup的使用 -->
        <h:panelGroup layout="block" style="color:#cfcfff">
            <h:outputText value="4" />
            <h:outputText value="5" />
        </h:panelGroup>
        <h:outputText value="6" />
        <h:outputText value="7" />
    </h:panelGrid>

在页面上生成一个复选框,用于勾选只怕撤回勾选该复选框

JSF解压目录\tlddocs\index.html

3.3、单选标签的利用:

<h1>单选标签的使用</h1>
<h:form>
    <!-- 生成一组单选按钮 -->
    <h:selectOneRadio value="userbean.booklist">
        <f:selectItem itemLabel="Core Java" itemValue="Java" />
        <f:selectItem itemLabel="Thinking in C++" itemValue="C++" />
        <f:selectItem itemLabel="Spring Internals" itemValue="Spring" />
    </h:selectOneRadio>
    <!-- 生成一个只允许单选的列表框 -->
    <h:selectOneListbox value="userbean.booklist" size="5">
        <f:selectItem itemLabel="Core Java" itemValue="Java" />
        <f:selectItem itemLabel="Thinking in C++" itemValue="C++" />
        <f:selectItem itemLabel="Spring Internals" itemValue="Spring" />
    </h:selectOneListbox>
    <!-- 生成一个只允许单选的下来菜单 -->
    <h:selectOneMenu value="#{userbean.booklist }">
        <f:selectItem itemLabel="Core Java" itemValue="Java" />
        <f:selectItem itemLabel="Thinking in C++" itemValue="C++" />
        <f:selectItem itemLabel="Spring Internals" itemValue="Spring" />
    </h:selectOneMenu>
</h:form>

3.5、UICommand组件的施用:

其一标签将生成HTML的img标签。

<h1>多选标签的使用</h1>
<h:form>
    <!-- 复选框 -->
    <h:selectManyCheckbox value="#{userbean.booklist }">
        <f:selectItem itemLabel="Core Java" itemValue="Java" />
        <f:selectItem itemLabel="Thinking in C++" itemValue="C++" />
        <f:selectItem itemLabel="Spring Internals" itemValue="Spring" />
    </h:selectManyCheckbox>

    <!-- 生成一个允许多选的列表框 -->
    <h:selectManyListbox value="#{userbean.booklist }" size="5">
        <f:selectItem itemLabel="Core Java" itemValue="Java" />
        <f:selectItem itemLabel="Thinking in C++" itemValue="C++" />
        <f:selectItem itemLabel="Spring Internals" itemValue="Spring" />
    </h:selectManyListbox>

    <!-- 生成一个允许多选的复合框 -->
    <h:selectManyMenu value="#{userbean.booklist }">
        <f:selectItem itemLabel="Core Java" itemValue="Java" />
        <f:selectItem itemLabel="Thinking in C++" itemValue="C++" />
        <f:selectItem itemLabel="Spring Internals" itemValue="Spring" />
    </h:selectManyMenu>
</h:form>

JSF提供了大气的UI标签来简化创立视图。那几个UI标签类似于ASP.NET中的服务器组件。使用那么些标签,可以经过其value,binding,action,actionListener等属性直接绑定到托管Bean的性格,实例大概措施上。

2.2、JSF的HTML标签:

h:commandButton
h:commandLink
h:dataTable
h:form
h:graphicImage
h:inputHidden
h:inputSecret
h:inputText
h:inputTextarea
h:message
h:messages
h:outputFormat
h:outputLabel
h:outputLink
h:outputText
h:panelGrid
h:panelGroup
h:selectBooleanCheckbox
h:selectManyCheckbox
h:selectManyListbox
h:selectManyMenu
h:selectOneListbox
h:selectOneMenu
h:selectOneRadio
h:column
JSF解压目录\tlddocs\index.html

3.2、多选标签的利用:

locale:指定国家语言
renderKitId:JSF依照该属性值接纳相应的绘制器工具箱来绘制该页面
beforePhase:绑定生命周期监听器(必须有public void
beforePhase(Java.faces.event.Phase伊夫nt)方式的签署),JSF会在各种生命周期阶段(除了回复视图)之前调用该方法。
afterPhase:绑定生命周期监听器(必须有public void
afterPhase(java.faces.event.Phase伊芙nt)格局的签署),JSF会在种种生命周期阶段(除了回复视图)之后调用该办法。

下边须要在名为showbook的托管Bean中提供一个bookList数据源,可以在他的get方法中提供数据:

个中<h:inputText>和<h:inputSecret>可以指定一个size属性用于指定输入框的最大尺寸。

<h:graphicImage value="images/01.jpg" alt="图像01" />

3.9、图像组件的施用:

username="arthinking"
message=用户名:{0}
public List<BookInfo> getBookList(){
    List<BookInfo> books = new ArrayList<BookInfo>();
    books.add(new BookInfo("Core Java", "Java", "www.itzhai.com"));
    books.add(new BookInfo("Core Java", "Java", "www.itzhai.com"));
    books.add(new BookInfo("Core Java", "Java", "www.itzhai.com"));
    return books;
}

那多少个标签的value属性值必须是一个List只怕数组。

<h1>UIOutput对应的输出组件的使用</h1>
<!-- 使用outputText标签输出国际化资源 -->
<h:outputText value="#{userInfo.username }" />
<!-- 使用outputText标签输出Bean属性 -->
<h:outputText value="#{userbean.username }" />
<!-- 生成Label标签 -->
<h:outputLabel value="#{userbean.username }" />
<!-- 生成超链接 -->
<h:outputLink value="http://www.itzhai.com">IT宅</h:outputLink>
<!-- 输出带占位符的国际化消息 -->
<h:outputFormat value="#{userInfo.message }">
    <f:param value="arthinking" />
</h:outputFormat>
<h:selectBooleanCheckbox />

panelGrid用于转移表格,panelGroup用于把两个因素构成一个要素。

JSF与JSP的价签的不相同在于,JSF的价签可以动用value,binding,action和actionListener等性能直接绑定到托管Bean上边去。

关于个标签的详实介绍,可以参照JSF自带的援救文档:

itemLabel:可视化标签值
itemValue:点名生成列表项大概复选框的值
value:与其他的UI标签的value属性分歧,不是将该零件的值绑定到托管Bean,而是将该器件本人绑定到托管Bean

3.8、使用UIData迭代输出从数据源中获取的数目:

3.6、UIOutput对应的输出组件的使用:

有关个标签的详实介绍,可以参考JSF自带的帮扶文档:

接下来在com.itzhai目录下创建一个国际化资源文件的basename为user:

<f:view>
    <h1>表单标签</h1>
    <h:form>
        单行文本框:<h:inputText value="#{userbean.username }" /><br />
        密码框:<h:inputSecret value="#{userbean.password }" /><br />
        多行文本区:<h:inputTextarea rows="3" cols="20" /><br />
        隐藏域:<h:inputHidden value="#{userbean.message }" /><br />
    </h:form>
</f:view>

此地运用到了国际化资源,要求创造:

在faces-config.xml问价中加载国际化资源的布局:

3.7、panelGrid和panelGroup的使用:

2、JSF中的UI标签:

id
immediate:是否立即处理UIInput组件和实现了ActionSource接口的UI组件上事件
rendered:指定条件表达式,当条件表达式为true时才会绘制组件
required:指定用户是否必须为组件输入值
requeredMessage:与requered一起使用,如果没有输入时提示信息
value:该组件的值绑定到托管对象上
onblur
onchange
onclick
ondblclick
onfocus
onkeydown
onkeypress
onkeyup
onmousedown
onmousemove
onmouseout
onmouseover
onmouseup
style
styleClass
binding:将组件本身绑定到托管Bean

其中的BookInfo类如下:

<application>
    <resource-bundle>
        <base-name>com.itzhai.user</base-name>
        <var>userInfo</var>
    </resource-bundle>
</application>
f:actionListener
f:attribute
f:convertDateTime
f:convertNumber
f:converter
f:facet
f:loadBundle
f:param
f:phaseListener
f:selectItem
f:selectItems
f:setPropertyActionListener
f:subview
f:validateDoubleRange
f:validateLength
f:validateLongRange
f:validator
f:valueChangeListener
f:verbatim
f:view

3.4、UISelectBoolean组件的运用:

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注