1. 程式人生 > >Jaxb 完全手冊

Jaxb 完全手冊

Jaxb是JavaEE的規範.全稱Java Architecture for XML Binding. 
可以根據XML Schema產生Java類的技術.JAXB也提供了將XML例項文件反向生成Java物件樹的方法,並能將Java物件樹的內容重新寫到XML例項文件. 
JAXB 2.0是JDK 1.6的組成部分。JAXB 2.2.3是JDK 1.7的組成部分。在實際使用不需要引入新的jar. 
我一般使用都是配合JPA使用,下面例子也是按JPA+JAXB來說明. 
因此我需要引入jpa的實現包.hibernate-validator隨便.做驗證用的.

<dependency>
    <
groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId
> <version>5.0.1.Final</version> </dependency>

1. JDK中JAXB相關的重要Class和Interface:

  • JAXBContext類,是應用的入口,用於管理XML/Java繫結資訊。
  • Marshaller介面,將Java物件序列化為XML資料。
  • Unmarshaller介面,將XML資料反序列化為Java物件。

http://my.oschina.net/zhaoqian/blog/89763 這個是簡單的入門demo.可以先執行試試,對JAXB有個大概的使用方法.下面例子將是系統正常做的.並對併發性進行處理的一個例子.

2. 常用註解說明

常用的annotation有:
@XmlType
@XmlElement
@XmlRootElement
@XmlAttribute
@XmlAccessorType
@XmlAccessorOrder
@XmlTransient
@XmlJavaTypeAdapter
@Temporal(TemporalType.XXXX) -->JPA中的時間處理註解,非JAXB
@XmlElementWrapper

[email protected]
  @XmlType用在class類的註解,常與@XmlRootElement,@XmlAccessorType一起使用。它有三個屬性:name、propOrder、namespace,經常使用的只有前兩個屬性。如:
同時使用了@XmlType(propOrder={})和@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)的時候,生成的xml只按照propOrder定義的順序生成元素
@XmlType(name = "basicStruct", propOrder = {
    "intValue",
    "stringArray",
    "stringValue"
)
在使用@XmlType的propOrder 屬性時,必須列出JavaBean物件中的所有屬性,否則會報錯。

[email protected]
  @XmlRootElement用於類級別的註解,對應xml的跟元素,常與 @XmlType 和 @XmlAccessorType一起使用。如:
  @XmlType
  @XmlAccessorType(XmlAccessType.FIELD)
  @XmlRootElement
  public class Address {}

[email protected]
  @XmlElement將java物件的屬性對映為xml的節點,在使用@XmlElement時,可通過name屬性改變java物件屬性在xml中顯示的名稱。如:
  @XmlElement(name="Address")  
  private String yourAddress;

[email protected]
  @XmlAttribute用於把java物件的屬性對映為xml的屬性,並可通過name屬性為生成的xml屬性指定別名。如:
  @XmlAttribute(name="Country")
  private String state;
 
[email protected]
  @XmlAccessorType用於指定由java物件生成xml檔案時對java物件屬性的訪問方式。常與@XmlRootElement、@XmlType一起使用。它的屬性值是XmlAccessType的4個列舉值,分別為:

  • XmlAccessType.FIELD:java物件中的所有成員變數
  • XmlAccessType.PROPERTY:java物件中所有通過getter/setter方式訪問的成員變數
  • XmlAccessType.PUBLIC_MEMBER:java物件中所有的public訪問許可權的成員變數和通過getter/setter方式訪問的成員變數
  • XmlAccessType.NONE:java物件的所有屬性都不對映為xml的元素

注意:@XmlAccessorType的預設訪問級別是XmlAccessType.PUBLIC_MEMBER,因此,如果java物件中的private成員變數設定了public許可權的getter/setter方法,就不要在private變數上使用@XmlElement和@XmlAttribute註解,否則在由java物件生成xml時會報同一個屬性在java類裡存在兩次的錯誤。同理,如果@XmlAccessorType的訪問許可權為XmlAccessType.NONE,如果在java的成員變數上使用了@XmlElement或@XmlAttribute註解,這些成員變數依然可以對映到xml檔案。

注意:雖然@XmlAccessorType為XmlAccessType.NONE,但是在java類的私有屬性上加了@XmlAttribute和@XmlElement註解後,這些私有成員會對映生成xml的元素

[email protected]
  @XmlAccessorOrder用於對java物件生成的xml元素進行排序。它有兩個屬性值:
  AccessorOrder.ALPHABETICAL:對生成的xml元素按字母書序排序
  XmlAccessOrder.UNDEFINED:不排序

[email protected]
  @XmlTransient用於標示在由java物件對映xml時,忽略此屬性。即,在生成的xml檔案中不出現此元素。

[email protected]
  @XmlJavaTypeAdapter常用在轉換比較複雜的物件時,如map型別或者格式化日期等。使用此註解時,需要自己寫一個adapter類繼承XmlAdapter抽象類,並實現裡面的方法。
  @XmlJavaTypeAdapter(value=xxx.class),value為自己定義的adapter類
  XmlAdapter 抽象介面如下:

public abstract class XmlAdapter<ValueType,BoundType> {    // Do-nothing constructor for the derived classes.
    protected XmlAdapter() {}
    // Convert a value type to a bound type.
    public abstract BoundType unmarshal(ValueType v);
    // Convert a bound type to a value type.
    public abstract ValueType marshal(BoundType v);
 }

實際案例:

<i>package jaxb.shop;
  
import java.util.Date;
import java.text.SimpleDateFormat;
  
import javax.xml.bind.annotation.adapters.XmlAdapter;
  
public class DateAdapter extends XmlAdapter<String, Date> {
  
    private String pattern = "yyyy-MM-dd HH:mm:ss";
    SimpleDateFormat fmt = new SimpleDateFormat(pattern);
      
    @Override
    public Date unmarshal(String dateStr) throws Exception {
          
        return fmt.parse(dateStr);
    }
  
    @Override
    public String marshal(Date date) throws Exception {
          
        return fmt.format(date);
    }
  
}
//用於格式化日期在xml中的顯示格式,並且由xml unmarshal為java物件時,將字串解析為Date物件</i>

在某個類中如下使用,解析出對應的時間格式.必須過載那2個方法,用於JAXB marshal xml,xml unmarshal object時候使用.

   @XmlJavaTypeAdapter(value=DateAdapter.class)
    private Date purDate;

9.但如果是和JPA一起使用的話,可以使用@Temporal(TemporalType.DATE)來格式時間,預設為TemporalType.TIMESTAMP型別.TemporalType屬性如下:
public enum TemporalType {
    DATE, //java.sql.Date
    TIME, //java.sql.Time
    TIMESTAMP //java.sql.Timestamp
}
java.sql.Date
日期型,精確到年月日,例如“2008-08-08”
java.sql.Time
時間型,精確到時分秒,例如“20:00:00”
java.sql.Timestamp
時間戳,精確到納秒,例如“2008-08-08 20:00:00.000000001”

10.在JAXB標準中,@XmlElementWrapper註解表示生成一個包裝 XML 表示形式的包裝器元素。 此元素主要用於生成一個包裝集合的包裝器 XML 元素。
注:@XmlElementWrapper僅允許出現在集合屬性上。最後的案例將使用這個註解.

3. 最終案例(模擬XML--系統 --DB)

例子XML示例.

<?xml version="1.0" encoding="utf-8"?>
<userinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <id>110</id>
    <name>Credo</name>
    <address>China BeiJing</address>
    <job>programmer</job>
    <overinfos>
        <overinfo>
            <hobby>Accompany my girlfriend.</hobby>
            <!--開始日期 dateTime-->
            <beginDate>2009-06-02T12:00:00</beginDate>
            <!--結束日期 dateTime-->
            <endDate>2109-06-02T12:00:00</endDate>
        </overinfo>
        <overinfo>
            <hobby>Write some code.</hobby>
            <!--開始日期 dateTime-->
            <beginDate>2009-06-02T12:00:00</beginDate>
            <!--結束日期 dateTime-->
            <endDate>2029-06-02T12:00:00</endDate>
        </overinfo>
    </overinfos>
</userinfo>

Model層(JAXB+JPA):

package org.credo.jaxb.model;
import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import org.hibernate.validator.constraints.Length;
/**
 * @author Credo
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name = "USERINFO")
public class Userinfo implements Serializable{
     
    private static final long serialVersionUID = 7870351249722416047L;
     
    @Id
    @Column(name = "ID", nullable = false)
    private Long id;
     
    @Column(name = "NAME", length = 50)
    @Length(max = 50)
    private String name;
     
    @Column(name = "ADDRESS", length = 50)
    @Length(max = 50)
    private String address;
     
    @Column(name = "JOB", length = 50)
    @Length(max = 50)
    private String job;
     
    @XmlElementWrapper(name = "overinfos")
    @OneToMany(cascade = CascadeType.ALL)
    @XmlElements(value = { @XmlElement(name = "overinfo", type = Overinfo.class) })
    private List<Overinfo> overinfos;
     
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    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 String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public List<Overinfo> getOverinfos() {
        return overinfos;
    }
    public void setOverinfos(List<Overinfo> overinfos) {
        this.overinfos = overinfos;
    }
     
}

Overinfo.class

package org.credo.jaxb.model;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "overinfo")
@Entity
@Table(name = "OVERINFO")
public class Overinfo implements Serializable {
    private static final long serialVersionUID = 2579971237985854291L;
    @XmlTransient
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;
     
    @XmlTransient
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "UserinfoId")
    private Userinfo userinfo;
     
    @Column(name = "hobby", length = 20)
    private String hobby;
     
    @Temporal(TemporalType.DATE)
    @Column(name = "beginDate", length = 20)
    private Date beginDate;
     
    @Temporal(TemporalType.DATE)
    @Column(name = "endDate", length = 20)
    private Date endDate;
    public String getHobby() {
        return hobby;
    }
    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
    public Date getBeginDate() {
        return beginDate;
    }
    public void setBeginDate(Date beginDate) {
        this.beginDate = beginDate;
    }
    public Date getEndDate() {
        return endDate;
    }
    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Userinfo getUserinfo() {
        return userinfo;
    }
    public void setUserinfo(Userinfo userinfo) {
        this.userinfo = userinfo;
    }
}

JAXB併發處理:

package org.credo.jaxb;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
public final class JAXBCache {
    private static final JAXBCache instance = new JAXBCache();
    private final ConcurrentMap<String, JAXBContext> contextCache = new ConcurrentHashMap<String, JAXBContext>();
    private JAXBCache() {
    }
    public static JAXBCache instance() {
        return instance;
    }
    JAXBContext getJAXBContext(Class<?> clazz) throws JAXBException {
        JAXBContext context = contextCache.get(clazz.getName());
        if ( context == null )
        {
            context = JAXBContext.newInstance(clazz);
            contextCache.putIfAbsent(clazz.getName(), context);
        }
        return context;
    }
}

JAXBExportSchema 匯出JAXB的 class的 結構

package org.credo.jaxb;
import java.io.File;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
import org.credo.jaxb.model.Userinfo;
/**
 * JAXB 匯出Schema。
 *
 * @author: Credo
 * @date: 2013-6-25
 */
public class JAXBExportSchema {
    public static void main(String[] args) {
        JAXBContext jct;
        try
        {
            jct = JAXBContext.newInstance(Userinfo.class);
            jct.generateSchema(new Resolver());
        }
        catch ( Exception ex )
        {
            ex.printStackTrace();
        }
    }
}
class Resolver extends SchemaOutputResolver {
    @Override
    public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
        File file = new File("d:\\", suggestedFileName);
        StreamResult result = new StreamResult(file);
        result.setSystemId(file.toURI().toURL().toString());
        return result;
    }
}

JAXBUtil以及main方法測試:

package org.credo.jaxb;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.apache.commons.io.IOUtils;
import org.credo.jaxb.model.Overinfo;
import org.credo.jaxb.model.Userinfo;
/**
 * marshal物件和unmarshal物件都是由JAXBContext建立.所以一開始需要初始化JAXBContext.
 * @author Credo
 */
public class JAXBUtil {
    /**
     * 生成xml檔案的二進位制資料
     * @param obj 物件
     */
    public static byte[] marshal(Object obj) throws JAXBException {
        JAXBContext context = JAXBCache.instance().getJAXBContext(obj.getClass());
        Marshaller m = context.createMarshaller();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        m.marshal(obj, outputStream);
        byte[] result = outputStream.toByteArray();
        return result;
    }
    /**
     * @param data xml stream
     * @param classe 類
     * @return jaxb生成xml的java 類物件
     */
    public static Object unmarshal(byte[] data, Class<?> classe) throws JAXBException {
        JAXBContext context = JAXBCache.instance().getJAXBContext(classe);
        Unmarshaller m = context.createUnmarshaller();
        ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
        Object obj = m.unmarshal(inputStream);
        return obj;
    }
    /**
     * @param data xml stream
     * @param classe 類
     * @return jaxb生成xml的java 類物件
     */
    public static Object unmarshal(InputStream in, Class<?> classe) throws JAXBException, IOException {
        JAXBContext context = JAXBCache.instance().getJAXBContext(classe);
        byte[] data = IOUtils.toByteArray(in);
        Unmarshaller m = context.createUnmarshaller();
        ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
        Object obj = m.unmarshal(inputStream);
        return obj;
    }
    public static void main(String[] args) throws JAXBException {
        Userinfo userinfo = new Userinfo();
        userinfo.setId(Long.valueOf(11));
        List<Overinfo> list = new ArrayList<Overinfo>();
        Overinfo e = new Overinfo();
        e.setHobby("陪女友");
        list.add(e);
        Overinfo e1 = new Overinfo();
        e1.setHobby("寫程式碼");
        list.add(e1);
        userinfo.setOverinfos(list);
        byte[] b = JAXBUtil.marshal(userinfo);
        System.out.println(new String(b));
        userinfo = (Userinfo) JAXBUtil.unmarshal(b, Userinfo.class);
        System.out.println(userinfo.getOverinfos().get(0).getHobby());
    }
}

就不說明了,仔細看程式碼的,一會就明白了.不看的執行下也明白了.下面是上面main方法測試的輸出結果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<userinfo>
    <id>11</id>
    <overinfos>
        <overinfo>
            <hobby>陪女友</hobby>
        </overinfo>
        <overinfo>
            <hobby>寫程式碼</hobby>
        </overinfo>
    </overinfos>
</userinfo>

陪女友

下面是使用JAXBExportSchema 匯出JAXB的 class的 結構

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="userinfo" type="userinfo"/>
  <xs:complexType name="userinfo">
    <xs:sequence>
      <xs:element name="id" type="xs:long" minOccurs="0"/>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="address" type="xs:string" minOccurs="0"/>
      <xs:element name="job" type="xs:string" minOccurs="0"/>
      <xs:element name="overinfos" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="overinfo" type="overinfo" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="overinfo">
    <xs:sequence>
      <xs:element name="hobby" type="xs:string" minOccurs="0"/>
      <xs:element name="beginDate" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="endDate" type="xs:dateTime" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

相關推薦

Jaxb 完全手冊

Jaxb是JavaEE的規範.全稱Java Architecture for XML Binding. 可以根據XML Schema產生Java類的技術.JAXB也提供了將XML例項文件反向生成Java物件樹的方法,並能將Java物件樹的內容重新寫到XML例項文件. JAXB 2.0是JDK 1.6的組成部分

資料結構實戰完全手冊-夏曹俊-專題視訊課程

資料結構實戰完全手冊—85人已學習 課程介紹         資料結構是程式設計的必修知識,它是程式設計的基本功,並且在企業面試、日常工作、研究生入學考試中都佔有重要的地位。不同於其他課程,本課程從

嵌入式Linux應用開發完全手冊(二)GPIO

5 GPIO介面 5.1 GPIO硬體介面介紹 GPIO General Purpose I/O Port,通用輸入、輸出埠。簡單說就是這個埠可以配成輸入的(讀電平訊號),也可以配成輸出的(設定電平訊號) 無論是輸入還是輸出都是通過暫存器來實現的

嵌入式Linux應用開發完全手冊(一)嵌入式Linux基礎知識

嵌入式Linux應用開發完全手冊 3 嵌入式Linux基礎知識 3.1 交叉編譯工具 編譯工具鏈,編譯工作由幾個步驟完成,分別用到了不同的工具 PC端應用 gcc ld objcopy

嵌入式Linux應用開發完全手冊(四)UART

11. 通用非同步收發器 UART 11.1 UART原理,部件使用方法 11.1.1UART原理 UART是Universal Asynchronous Receiver Transmitter的縮寫,即通用非同步收發器 UART用來傳輸序列資料: - 傳送時,CPU將

嵌入式Linux應用開發完全手冊(三)中斷

9 中斷體系結構 9.1 ARM中斷體系 ARM CPU工作模式和狀態 工作模式,7種,1種使用者模式,其他6選中特權模式 usr 使用者模式,ARM處理器正常的工作模式 fiq 快速中斷模式,高速資料傳輸或者通道處理 irq

嵌入式linux應用開發完全手冊(二) 第六章 儲存控制器

第二篇 ARM9 嵌入式系統基礎例項篇 第五章 GPIO介面 5.1 GPIO硬體介紹 GPIO(General Purpose I/O Ports)意思為通用輸入/輸出埠,通俗的說,就是一些引腳,可以通過它們輸出高低電平或者通過它們讀入引腳的狀態——是高電平還是低電平。 5.1.1 通

嵌入式linux應用開發完全手冊(一)

第一篇 嵌入式Linux開發環境構建 1.1.2 嵌入式發展 SCM(Single Chip Microcomputer)微控制器; MCU(Micro Controller Unit)微控制器; SoC(System on a Chip):系統級晶片,在一個晶片上由於廣泛使用

基於公鑰認證方式的 OpenSSH Server 自動登入完全手冊

Linux/Windows 下的 SSH 自動登入指南 假設要以使用者 rainux 的身份登入執行 OpenSSH Server 的遠端主機 www.rainux.org(現在幾乎所有的 Linux 伺服器都使用 OpenSSH Server 作為 SSH Server)

【VSCode】配置完全手冊(編寫中)

前言 VSCode是一個開源的強大程式碼編寫器,但是如果沒有好好的配置使用,會適得其反。 這裡總結VSCode的一些配置,方便自己查詢,也方便網友。 1. 編輯器配置 1.1 功能 為特定型別檔案指定縮排大小、縮排型別(空格,或tab),是否自動插

《嵌入式linux應用程式開發完全手冊》NAND FLASH硬體程式設計學習筆記

1.先看一下Flash的引腳圖,它與S3C2440連線比較少(相對nor flash),地址資料和命令都是在如圖示的一些使能訊號的配合下,通過8個I/O引腳傳輸。寫地址,資料,命令時,nCE,nWE訊號

《Cisco路由器配置與管理完全手冊》(第二版)前言和目錄

下面是其中《Cisco路由器配置與管理完全手冊》(第二版)一書的前言和目錄:前言本書的寫作動機自《路由器配置與管理完全手冊——Cisco篇》於2011年上市以來,得到了非常廣泛的讀者支援和高度評價。隨著這幾年與讀者朋友的交流,更加充分地瞭解了讀者的普遍需求,再加上這幾年本人自身的不斷學習和研究也積累了比較多的

《嵌入式linux應用開發完全手冊》核心筆記(全)

** 本文未附任何例項程式碼,基於目標板的不同操作不盡相同,網路資源針對比較成熟的開發板均可找到對應的成套例項程式碼【開發環境構建】 1. 開發環境搭建:作業系統或虛擬機器Ubuntu安裝、網路服務配置、工具安裝等     工具資源<雲盤>:https://pa

oracle11g dataguard 完全手冊

一、前言:    網路上關於dataguard的配置文章很多,但是很多打著oracle11g的文章實際都是隻能在9 10 上執行,比如FAL_CLIENT在11g中已經廢棄,但是現在網路上的文章都是沒有標註這一點。而且對於具體含義語焉不詳對於新手只能知其然而不知其所

window.open引數完全手冊

           【1、最基本的彈出視窗程式碼】         <SCRIPT LANGUAGE="javascript">     <!--     window.open ('page.html')     -->     </SC

linux下搭建SVN伺服器完全手冊

系統環境        RHEL5.4最小化安裝(關iptables,關selinux) + ssh + yum一,安裝必須的軟體包.        yum install subversion (SVN伺服器)                    mysql-serve

lnmp環境搭建完全手冊(四)——lnmp搭建(原始碼安裝)

首先來介紹一下Nginx.Nginx是一個高效能的 HTTP 和 反向代理 伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器。Nginx不僅可以作為web伺服器,也可以作為負載均衡器,之前也有文章介紹,大家可以看一下. MySQL是一款開源免費的資料軟體,My

AAA oracle11g dataguard 完全手冊(這種方法只適應oracle,沒有golden gate好)(資料庫開啟總閃回)

      這個時候,可以給資料庫增加臨時資料檔案(這個在熱備份的時候是沒有備份過來的)       如alter tablespace temp add tempfile '/u02/oradata/test/temp01.dbf' size 100M;      <4>.從只讀方式

Android學習筆記——OAuth完全手冊

1 public void getRenrenSessionKey(Context context, String accessToken) { 2 if (accessToken == null || accessToken.length() < 1) { 3

樹莓派配置完全手冊(三)開發環境的安裝及配置

3.1和OpenCV環境的構建 在嵌入式開發過程中,由於樹莓派的機能限制,以及操作習慣的差異,我們首先需要在PC端進行初步的編寫及測試,待編譯通過後再將程式碼移植到樹莓派端進行適配,所以PC端開發環