??xml version="1.0" encoding="utf-8" standalone="yes"?>91精品国产综合久久久蜜臀粉嫩 ,亚洲一区视频,蜜芽视频在线观看http://www.aygfsteel.com/kapok/category/900.html垃圾?嘿嘿Q我藏的q么׃们还能找到啊Q真牛!zh-cnTue, 27 Feb 2007 15:57:44 GMTTue, 27 Feb 2007 15:57:44 GMT60单记录以下。论文用http://www.aygfsteel.com/kapok/archive/2005/04/13/3134.htmlW笨W笨Wed, 13 Apr 2005 05:40:00 GMThttp://www.aygfsteel.com/kapok/archive/2005/04/13/3134.htmlhttp://www.aygfsteel.com/kapok/comments/3134.htmlhttp://www.aygfsteel.com/kapok/archive/2005/04/13/3134.html#Feedback0http://www.aygfsteel.com/kapok/comments/commentRss/3134.htmlhttp://www.aygfsteel.com/kapok/services/trackbacks/3134.htmlhttp://www.cnblogs.com/William_Fire/articles/125108.html

http://www.cnblogs.com/William_Fire/articles/125819.html



http://www.cnblogs.com/william_fire/articles/126665.html
http://www.cnblogs.com/tintown/archive/2005/03/23/124395.html


http://www.cnblogs.com/tintown/category/12787.html
http://www.cnblogs.com/tintown/archive/2005/04/04/131784.html


http://www.cnblogs.com/tintown/archive/2005/04/04/131784.html?Pending=true#PostPost


http://www.cnblogs.com/tintown/archive/2005/04/07/132876.html

http://blog.sunmast.com/sunmast/articles/816.aspx

ADO.NET对象模型Q?BR>http://www.phome.net/document/net/200504/net111246243813950.html


http://www.phome.net/document/net/200504/net111246243713949.html



 


ADO.NET--什么是关系型数据库

http://www.phome.net/document/net/200504/net111246244913952.html


ADO.NET对象模型
http://blog.csdn.net/jabby12/archive/2004/08/02/59221.aspx

      ADO.NET是专门ؓ帮助开发h员开发高效的多层数据库应用程序设计的。ADO.NET对象模型可分Zc:一cMؓ“连接的”,一cMؓ“断开q接的”对象,后者允许将查询l果保存在内存中q行处理?/P>

”连接的“对象模型顾名思义Q它是直接与数据库进行连接操?“断开q接”的对象模型可以说是建立在“连接的”对象模型的基础上进行的Q因为它必须先进行一ơ“连接的”操作,才能得到所需的结果?/P>

      举个?Q?nbsp;                       

SqlConnection con=new SqlConnection("server=localhost;database=db,uid=sa,pwd=;");

SqlDataAdapter ad=new SqlDataAdapter("select * from table",con);

DataSet ds=new Dataset();

ad.Fill(ds,"table");

//注意q里已经从数据库里查询出来的结果放C个Dataset对象里,从此d始,你就开始用“断开q接”的对象模型来对数据库进行操作,DataSet对象是一个在内存中的”虚数据表“,你可以对它进行Q何操作而不影响数据库,可以对它q行排序Q修改,查询Q增加,删除。而如果你xҎ据库内容的话Q也可以通过DataSet对象来操作,很简单,调用它的update()Ҏ卛_完成更新数据库。也可以使用它的GetChanges()Ҏ来获取只更改q的行,它返回一个DataSetQ这个Dataset不同于调用GetChanges()Ҏ的那个,q回的这个只是它的一张子表,也就是更改过的数据,利用此方法可以大大地提高多层ADO.NET应用E序的性能。DataSetc还有一个MergeҎ用来合ƈ两个DataSet对象的数据,ADO.NET默认覆盖被调用Merge()Ҏ的DataSet中的行?/P>

ADO.NETq提供了一U强cd的DATASET对象Q它可以帮助你简化徏立数据访问应用程序的q程。例如:有个表叫table,其中有一列叫column你可以这h讉K此列Q?/P>

vb.net:    Dim ds as DataSet

            Console.WriteLine(ds.table(0).column);   (table(0).表示table表中的第1行)

c#:         DataSet ds;

             Console.WriteLine(ds.table[0].column);  (table[0].表示table表中的第1行)

是不是很z? ^_^

关于DataSet里面q有好多东西方便用如QDataTable,DataView,DataRow,DataColumn,DataRelation,Constraint一大堆的好东西Q在以后的日志中会提刎ͼ



  可见Q在分层的时候,我们会增加一个实体层Q它的作用如下:
  ?显C数据和实际的存储区域隔,保证了业务的独立性,提高了可重用性?
  ?在业务层和表现层之间传递数据。(如果没有实体层的话,我们需要把表的每个字段作ؓ一个参数在它们之间传递,如果修改的话Q将需要媄响到E序的各个层Q?
  ?提供更大的可收羃性?
  
  2Q?业务实体层的几种选择Ҏ及其优缺炏V?
  ?NET环境下实C务实体有下面的几U选择Q?
  ?DataReader BE h最快的d速度Q用于只ȝ场合Q不hOO的概c?
  ?XML BE 可以与XML Reader和DataSet转换。缺点:性能低,验证、解析、显C、排序等都很复杂?
  ?Generic DataSet BE 优点Q数据绑定等。缺点:客户端必通过集合来获取数据,没有cdQ实例化开销大,调度性能低?
  ?Typed DataSet BE 优点Q由cdQ可以进行类型检查。缺点:只能从DataSetl承Q部|不方便Q可扩展性差Q实例化开销大,调度性能低?
  ?Custom BE 优点Q性能调优Q代码更h可读性,用自定义实体cd义一个良好的接口Q将复杂问题隐藏在其中。缺点:设计开发都很复杂,需要自己去实现CURD操作Q自己去实现数据l定Q工作量很大?
  ?O/R Mapping的实?它具有自定义cȝ所有优点,同时实现了CRUDQ数据绑定等操作?

关于ObjectSpaces ?U>llblgen
http://www.llblgen.com/defaultgeneric.aspx
http://www.sinzy.net/blog/Read.asp?ID=44&BID=931


http://www.csdn.net/develop/author/NetAuthor/sun2bin/

W笨 2005-04-13 13:40 发表评论
]]>
Implementing Data Transfer Object in .NET with a Typed DataSethttp://www.aygfsteel.com/kapok/archive/2005/04/12/3173.htmlW笨W笨Tue, 12 Apr 2005 04:49:00 GMThttp://www.aygfsteel.com/kapok/archive/2005/04/12/3173.htmlhttp://www.aygfsteel.com/kapok/comments/3173.htmlhttp://www.aygfsteel.com/kapok/archive/2005/04/12/3173.html#Feedback0http://www.aygfsteel.com/kapok/comments/commentRss/3173.htmlhttp://www.aygfsteel.com/kapok/services/trackbacks/3173.htmlhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpatterns/html/ImpDTOtypedDataSet.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconworkingwithtypeddataset.asp

Implementing Data Transfer Object in .NET with a Typed DataSet

? Data Column: select for more on pattern organization Application Column: select for more on pattern organization Deployment Column: select for more on pattern organization Infrastructure Column: select for more on pattern organization
Architecture Row: select for more on pattern organization Data Architecture: select for more on pattern organization Application Architecture: select for more on pattern organization Deployment Architecture: select for more on pattern organization Infrastructure Architecture: select for more on pattern organization
Design Row: select for more on pattern organization Data Design: select for more on pattern organization Application Design: select for more on pattern organization Deployment Design: select for more on pattern organization Infrastructure Design: select for more on pattern organization
Implementation Row Data Implementation: select for more on pattern organization Application Implementation: select for more on pattern organization Deployment Implementation: select for more on pattern organization Infrastructure Implementation: select for more on pattern organization
? Complete List of patterns & practices Complete List of patterns & practices Complete List of patterns & practices Complete List of patterns & practices

Version 1.0.0

GotDotNet community for collaboration on this pattern

Complete List of patterns & practices

Context

You are implementing a distributed application with the .NET Framework. The client application displays a form that requires making multiple calls to an ASP.NET Web service to satisfy a single user request. Based on performance measurements you have found that making multiple calls degrades application performance. To increase performance, you would like to retrieve all the data that the user request requires in a single call to the Web service.

Background

Note: The following is the same sample application that is described in Implementing Data Transfer Object in .NET with a DataSet.

The following is a simplified Web application that communicates with an ASP.NET Web service to deliver recording and track information to the user. The Web service in turn calls a database to provide the data that the client requests. The following sequence diagram depicts the interaction among the application, the Web service, and the database for a typical page.

Figure 1: Behavior of a typical user request

Figure 1 illustrates the sequence of calls needed to fulfill the entire user request. The first call retrieves the recording information, and the second call retrieves the track information for the specified recording. In addition, the Web service must make separate calls to the database to retrieve the required information.

Database Schema

The schema that is used in the example shown in Figure 2 depicts a recording record that has a one-to-many relationship with a track record.

Figure 2: Schema for sample application

Implementing a DTO

One way to improve the performance of this user request is to package all the required data into a data transfer object (DTO) that can be sent with a single call to the Web service. This reduces the overhead associated with two separate calls and allows you to use a single connection with the database to retrieve both the recording and the track information. For a detailed description of how this improves performance, see the Data Transfer Object pattern.

Implementation Strategy

A typed DataSet is a generated subclass of System.Data.DataSet. You provide an XML schema file which is then used to generate a strongly-typed wrapper around the DataSet. The following two code samples illustrate the differences. The first sample is implemented with an ordinary DataSet:

 

DataTable dataTable = dataSet.Tables["recording"];
DataRow row = dataTable.Rows[0];
string artist = (string)row["artist"];
 

This sample indicates that you need to know the table and column names to access the tables and fields contained in the DataSet. You also have to know the return type of the Artist field to ensure that the correct cast is done. If you do not use the correct type, you will get a runtime error. The following is the same example implemented with a typed DataSet:

 

   Recording recording = typedDataSet.Recordings[0];
   string artist = recording.Artist; 
 

This example demonstrates the benefits that the typed interface provides. You no longer have to refer to table or column by name and you do not have to know that the return type of the Artist column is a string. A typed DataSet defines a much more explicit interface that is verifiable at compile time instead of at runtime. In addition to the strongly-typed interface a typed DataSet also can be used in all places a DataSet can be used; therefore, it also can be used as a DTO. It is loaded in a similar fashion as a DataSet and it can be serialized to and from XML. In comparison to an ordinary DataSet you do have to write and maintain an XML schema that describes the typed interface. The Microsoft Visual Studio .NET development system provides a number of tools that simplify the creation and maintenance of the schema.The rest of this implementation strategy outlines the steps required in creating a typed DataSet for the sample application just described.

Creating a Typed DataSet

A typed DataSet is generated from an XML schema. Visual Studio .NET provides a drag-and-drop tool which automates the creation of the schema (see Figure 3) and the generation of the typed DataSet classes. If you do not use Visual Studio.NET, you can write the XML schema and use a command-line tool called XSD.exe to generate the typed DataSet. For detailed instructions on both of these methods, see "Typed DataSets in ADO.NET" from the May 2001 issue of .NET Developer [Wildermuth02].

Figure 3: Visual Studio .NET DataSet file type

RecordingDto.xsd

The following is the XML schema for the DTO to be used in this example. It combines both the recording table along with its associated track records in a single typed DataSet named RecordingDto:

 

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="RecordingDto" targetNamespace="http://msdn.microsoft.com/practices/RecordingDto.xsd"
   elementFormDefault="qualified" attributeFormDefault="qualified" xmlns="http://tempuri.org/RecordingDTO.xsd"
   xmlns:mstns="http://msdn.microsoft.com/practices/RecordingDto.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:codegen="urn:schemas-microsoft-com:xml-msprop">
   <xs:element name="RecordingDto" msdata:IsDataSet="true">
      <xs:complexType>
         <xs:choice maxOccurs="unbounded">
            <xs:element name="recording" codegen:typedName="Recording" codegen:typedPlural="Recordings"
               codegen:typedChildren="Track">
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name="id" type="xs:long" codegen:typedName="Id" />
                     <xs:element name="title" type="xs:string" codegen:typedName="Title" />
                     <xs:element name="artist" type="xs:string" codegen:typedName="Artist" />
                  </xs:sequence>
               </xs:complexType>
            </xs:element>
            <xs:element name="track" codegen:typedName="Track" codegen:typedPlural="Tracks" codegen:typedParent="Recording">
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name="id" type="xs:long" codegen:typedName="Id" />
                     <xs:element name="title" type="xs:string" codegen:typedName="Title" />
                     <xs:element name="duration" type="xs:string" codegen:typedName="Duration" />
                     <xs:element name="recordingId" type="xs:long" codegen:typedName="RecordingId" />
                  </xs:sequence>
               </xs:complexType>
            </xs:element>
         </xs:choice>
      </xs:complexType>
      <xs:unique name="RecordingDTOKey1" msdata:PrimaryKey="true">
         <xs:selector xpath=".//mstns:recording" />
         <xs:field xpath="mstns:id" />
      </xs:unique>
      <xs:unique name="RecordingDTOKey2" msdata:PrimaryKey="true">
         <xs:selector xpath=".//mstns:track" />
         <xs:field xpath="mstns:id" />
      </xs:unique>
      <xs:keyref name="recordingtrack" refer="mstns:RecordingDTOKey1">
         <xs:selector xpath=".//mstns:track" />
         <xs:field xpath="mstns:recordingId" />
      </xs:keyref>
   </xs:element>
</xs:schema>
 

This schema is not the exact file produced by Visual Studio .NET. It is annotated with a number of attributes that are prefixed from the codegen namespace. This modification is desirable because the code that is generated does not adhere to the .NET naming conventions. For example, without the modification, Visual Studio .NET would generate a track class that corresponds to the track table, whereas according to conventions used in the .NET Framework the class should be named Track. To change the name of the class that is generated, you must add the codegen:typedName attribute to the element definition in the XML schema:

 

<xs:element name="track" codegen:typedName="Track">
   
</element>
 

There are a number of other attributes besides codegen:typedName. For a detailed description of all the attributes, see "Typed DataSets in ADO.NET" from the May 2001 issue of .NET Developer [Wildermuth02].

Filling a Typed DataSet from the Database

The following code example demonstrates how to fill a typed DataSet with the data that the sample application requires. This includes the specific recording record and all of its associated track records. The difference between this code and filling an ordinary DataSet is that you do not need to explicitly define the relationship between the recording and track records.

Assembler.cs

Just as in Implementing a Data Transfer Object in .NET with a DataSet, an Assembler class maps the actual database calls into the typed DataSet:

 

using System;
using System.Data;
using System.Data.SqlClient;

using Recording;

public class Assembler
{
   public static RecordingDto CreateRecordingDto(long id)
   {
      string selectCmd = 
         String.Format(
         "select * from recording where id = {0}",
         id);

      SqlConnection myConnection = 
         new SqlConnection(
         "server=(local);database=recordings;Trusted_Connection=yes;");
      SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, 
         myConnection);

      RecordingDto dto = new RecordingDto();
      myCommand.Fill(dto, "recording");

      String trackSelect = 
         String.Format(
         "select * from Track where recordingId = {0} order by Id",
         id);

      SqlDataAdapter trackCommand = 
         new SqlDataAdapter(trackSelect, myConnection);
      trackCommand.Fill(dto, "track");

      return dto;
   }
}
 

Note: The example shown here is not meant to describe the only way to fill the typed DataSet. There are many ways to retrieve this data from the database. For example, you could use a stored procedure.

Using a Typed DataSet in an ASP.NET Page

As mentioned previously, a typed DataSet inherits from System.Data.DataSet. This means that it can be substituted for a DataSet. For example, when using the .NET user interface controls (Web Forms or Windows Forms) a typed DataSet can be used in all places you could use a DataSet. The sample application page shown in the following code example uses two DataGrid controls, RecordingGrid and TrackGrid. You can use the typed DataSet, RecordingDto when setting the DataSource properties on the controls because a typed DataSet inherits from DataSet.

 

using System;
using System.Data;
using RecordingApplication.localhost;

public class RetrieveForm : System.Web.UI.Page
{
   private RecordingCatalog catalog = new RecordingCatalog();
 
   // 

   protected void Button1_Click(object sender, System.EventArgs e)
   {
      string stringId = TextBox1.Text;
      long id = Convert.ToInt64(stringId);

      RecordingDTO dto = catalog.Get(id);
      RecordingGrid.DataSource = dto.recording;
      RecordingGrid.DataBind();

      TrackGrid.DataSource = dto.track;
      TrackGrid.DataBind();
   }
}
 

Tests

Because the typed DataSet is generated by tools in the .NET Framework, you do not need to write tests to verify that it functions correctly. In the following tests, you are testing that the Assembler class loaded the typed DataSet correctly.

AssemblerFixture.cs

 

using NUnit.Framework;
using System.Data;
using Recording;

[TestFixture]
public class AssemblerFixture
{
   private RecordingDto dto;
   private RecordingDto.Recording recording;
   private RecordingDto.Track[] tracks; 
   
   [SetUp]
   public void Init()
   {
      dto = Assembler.CreateRecordingDto(1234);
      recording = dto.Recordings[0];
      tracks = recording.GetTracks();
   }

   [Test]
   public void RecordingCount()
   {
      Assert.Equals(1, dto.Recordings.Rows.Count);
   }

   [Test]
   public void RecordingTitle()
   {
      Assert.Equals("Up", recording.Title.Trim());
   }


   [Test]
   public void RecordingChild()
   {
      Assert.Equals(10, tracks.Length);

      foreach(RecordingDto.Track track in tracks)
      {
         Assert.Equals(recording.Id, track.RecordingId);
      }
   }

   [Test]
   public void TrackParent()
   {
      RecordingDto.Track track = tracks[0];
      RecordingDto.Recording parent = track.Recording;
      Assert.Equals("Up", parent.Title.Trim());
   }

   [Test]
   public void TrackContent()
   {
      RecordingDto.Track track = tracks[0];
      Assert.Equals("Darkness", track.Title.Trim());
   }

   [Test]
   public void InvalidRecording()
   {
      RecordingDto dto = Assembler.CreateRecordingDto(-1);
      Assert.Equals(0, dto.Recordings.Rows.Count);
      Assert.Equals(0, dto.Tracks.Rows.Count);
   }
}
 

These tests describe how to access the individual elements of the DataSet. Because of the use of a typed DataSet, the test code does not require the actual column names and does not require the return type to be cast. Comparing these tests with the ones described in Implementing Data Transfer Object in .NET with a DataSet reveals the differences between using a strongly-typed interface and a generic interface. The strongly-typed interface is easier to use and understand. It also provides the added benefit of compile-time checking on return types.

Resulting Context

Implementing DTO with a typed DataSet shares a number of the same benefits and liabilities as implementing DTO with a DataSet; however, certain benefits and liabilities are unique to a typed-DataSet implementation.

Benefits

The typed DataSet shares the following benefits with a DataSet when used as a DTO:

  • Development tool support. Because the DataSet class is implemented in ADO.NET, there is no need to design and implement the DTO. There is also extensive support in Visual Studio for automating the creation and filling of DataSet and typed-DataSet objects.

  • Integration with controls. A DataSet works directly with the built-in controls in Windows Forms and Web Forms, making it a logical choice as a DTO.

  • Serialization. The DataSet comes complete with the ability to serialize itself into XML. Not only is the content serialized, but the schema for the content is also present in the serialization.

  • Disconnected database model. The DataSet represents a snapshot of the current contents of the database. This means that you can alter the contents of the DataSet and subsequently use the DataSet as the means to update the database.

  • An additional benefit that might persuade you to use a typed DataSet as opposed to an ordinary DataSet is the strongly-typed interface of the typed DataSet. A typed DataSet, as described here, generates classes that can be used to access the contained data. The classes present an interface which defines how the class is to be used in a more explicit manner. This removes the need for casting which was present in the DataSet implementation.

    Liabilities

    The typed DataSet shares the following liabilities with a DataSet when used in the context of a DTO:

  • Interoperability. Because the DataSet class is part of ADO.NET, it is not the best choice for a DTO in cases requiring interoperability with clients that are not running the .NET Framework.. You can still use DataSet, however, the client will be forced to parse the XML and build its own representation. If interoperability is a requirement, see Implementing Data Transfer Object in .NET with Serialized Objects.

  • Stale data. The typed DataSet, like a DataSet, is disconnected from the database. It is filled with a snapshot of the data in the database when it is constructed. This implies that the actual data in the database may be different from what is contained in the typed DataSet. For reading primarily static data, this is not a major issue. If the data is constantly changing, however, using any kind of DataSet is not recommended.

  • Potential for performance degradation. Instantiating and filling a DataSet can be an expensive operation. Serializing and deserializing a DataSet can also be very time consuming. A good rule of thumb for using a DataSet is that a DataSet is a good choice when you are using more than one table or relying on the capability of the DataSet to update the database. If you are displaying the results from a single table, then using a DataReader with strongly-typed objects may offer better performance. For more information, see Implementing Data Transfer Object in .NET with Serialized Objects.

  • The following are additional liabilities when using a typed DataSet as opposed to an ordinary DataSet:

  • A typed DataSet is still a DataSet. A typed DataSet can be substituted at runtime with a DataSet. This means that even though the strongly-typed interface exists, programmers can still access the data without the typed interface. A possible result of doing this is that there could be parts of the code which couple the application tightly to the DataSet table and column names.

  • The need for an XML schema. When using a typed DataSet you have to create and maintain an XML schema to describe the strongly-typed interface. Visual Studio .NET provides a number of tools to assist in this process, but nevertheless you still have to maintain an additional file.

    Related Patterns

    For more information, see the following related patterns:

  • Implementing Data Transfer Object in .NET with a DataSet.

  • Implementing Data Transfer Object in .NET with Serialized Objects.

  • Assembler. In Enterprise Application Architecture Patterns, Fowler defines Assembler as a specialized instance of the Mapper pattern [Fowler03].

    Acknowledgments

    [Beau02] Beauchemin, Bob. Essential ADO.NET. Addison-Wesley, 2002.

    [Fowler03] Fowler, Martin. Enterprise Application Architecture Patterns. Addison-Wesley, 2003.

    [Wildermuth01] Wildermuth, Shawn. "Typed DataSets in ADO.NET." .NET Developer. May 2001.

    Patterns Practices



  • W笨 2005-04-12 12:49 发表评论
    ]]>
    [zt]数据讉K接口体系及数据对象模型探?Beat 1.0) .3http://www.aygfsteel.com/kapok/archive/2005/04/12/3170.htmlW笨W笨Tue, 12 Apr 2005 02:34:00 GMThttp://www.aygfsteel.com/kapok/archive/2005/04/12/3170.htmlhttp://www.aygfsteel.com/kapok/comments/3170.htmlhttp://www.aygfsteel.com/kapok/archive/2005/04/12/3170.html#Feedback0http://www.aygfsteel.com/kapok/comments/commentRss/3170.htmlhttp://www.aygfsteel.com/kapok/services/trackbacks/3170.html阅读全文

    W笨 2005-04-12 10:34 发表评论
    ]]>
    [ZT]数据讉K接口体系及数据对象模型探?Beat 1.0) 2http://www.aygfsteel.com/kapok/archive/2005/04/12/3169.htmlW笨W笨Tue, 12 Apr 2005 02:32:00 GMThttp://www.aygfsteel.com/kapok/archive/2005/04/12/3169.htmlhttp://www.aygfsteel.com/kapok/comments/3169.htmlhttp://www.aygfsteel.com/kapok/archive/2005/04/12/3169.html#Feedback0http://www.aygfsteel.com/kapok/comments/commentRss/3169.htmlhttp://www.aygfsteel.com/kapok/services/trackbacks/3169.html阅读全文

    W笨 2005-04-12 10:32 发表评论
    ]]>
    [ZT]数据讉K接口体系及数据对象模型探?Beat 1.0)http://www.aygfsteel.com/kapok/archive/2005/04/12/3168.htmlW笨W笨Tue, 12 Apr 2005 02:31:00 GMThttp://www.aygfsteel.com/kapok/archive/2005/04/12/3168.htmlhttp://www.aygfsteel.com/kapok/comments/3168.htmlhttp://www.aygfsteel.com/kapok/archive/2005/04/12/3168.html#Feedback0http://www.aygfsteel.com/kapok/comments/commentRss/3168.htmlhttp://www.aygfsteel.com/kapok/services/trackbacks/3168.html阅读全文

    W笨 2005-04-12 10:31 发表评论
    ]]>
    [CMS][ZT]内容理pȝ(CMS)的设计和选型http://www.aygfsteel.com/kapok/archive/2005/04/02/2741.htmlW笨W笨Sat, 02 Apr 2005 07:07:00 GMThttp://www.aygfsteel.com/kapok/archive/2005/04/02/2741.htmlhttp://www.aygfsteel.com/kapok/comments/2741.htmlhttp://www.aygfsteel.com/kapok/archive/2005/04/02/2741.html#Feedback0http://www.aygfsteel.com/kapok/comments/commentRss/2741.htmlhttp://www.aygfsteel.com/kapok/services/trackbacks/2741.html [CMS][ZT]内容理pȝ(CMS)的设计和选型
    蒲永?发表?2005-3-30 8:26:00

     作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com

    版权声明Q可以Q意{载,转蝲时请务必以超链接形式标明文章原始出处和作者信息及本声?BR>http://www.chedong.com/tech/cms.html

    关键词:"content manage system" cms 内容理pȝ

    内容摘要Q?BR>

    内容理pȝ概述


    内容理pȝ是一个很泛的概念Q从商业门户|站的新ȝl到个h的Weblog都可以称作发布系l?BR>

    但无论如何,在发布系l选型之前Q首先了解自q实际需求是最重要的:x据现成系l将自己的需求硬往上照搬是非常不可取的。访问量Q权限控制和各种功能需求。每个模块和功能自己都比较清C点以后,再去|上找找cM的实玎ͼ你会发现其实每个环节到目前上都有比较成熟的实CQ而且q在不断完善和发展中Q如果没有:你的需求太ҎQ或者可以尝试分解成更小的系l组合实现?BR>

    内容理pȝ被分L以下几个层面Q各个层面优先考虑的需求不?BR>

    1. 后台业务子系l管理(理优先Q内容管理)Q新d入系l,BBS论坛子系l,全文索子pȝ{,针对不同pȝ的方便管理者的内容录入Q所见即所得的~辑理界面{,清晰的业务逻辑Q各U子pȝ的权限控制机制等Q?
    2. PortalpȝQ表C先:模板理Q:大部分最l的输出面Q网站首,子频?专题,新闻详情一般就是各U后台子pȝ模块的各U组合,q种发布l合逻辑是非怸富的QPortalpȝ是负责以上q些后台子系l的l合表现理Q?
    3. 前台发布Q效率优先:发布理Q:面向最l用L~存发布Q和搜烦引擎spider的URL设计{…?/LI>

    内容理和表现的分离Q很多成套的CMSpȝ没有把后台各U子pȝ和Portal分离开设计Q以至于在Portal层的模板表现理和新dpȝ的内容管理逻辑混合在一P甚至和BBS{子pȝ的管理都耦合的非帔RQ整个系l会昑־非常庞杂。而且q样的系l各个子pȝ捆绑的比较死Q如果后台的模块很难改变。但是如果把后台各种子系l内容管理逻辑和前台的表现/发布分离后,Portal和后台各个子pȝ之间只是数据传递的关系QPortal只决定后台各个子pȝ数据的取舍和表现Q而后台的各个子系l也都非常容易插拔?BR>
    内容理和数据分发的分离Q需要要Portalpȝ设计的时候注?/A>
    可缓存性(Cache FriendlyQ性设?/A>QCMS后台理和发布机Ӟ本n不要q多考虑“效率”问题,只要最l页面输计的比较CacheableQ效率问题可通过更前端专门的~存服务器解冟?BR>
    此外Q就是除了面向最l浏览器用户外,q要注意面向
    搜烦引擎友好(Search engine Friendly)的URL设计Q通过URL REWRITE转向或基于PATH_INFO的参数解析得动态网在链接QURIQŞ式上更像静态的目录l构Q方便网站内容被搜烦引擎收录Q?BR>

    ---------------    ---------------     ---------------                    
    |新闻理子系l| | BBS论坛子系l| | 商城子系l? |
    --------------- --------------- ---------------
    | \ / | \ / ?
    | ----------|--- \ / ? <== 业务子系l(零g生Q?BR> | / | \ \ / ?
    --------------- | --------------- ?
    |专题制作子系l| | |全文索子pȝ|
    --------------- | ---------------
    \ | /
    -------------------------|---------------------------------------------
    \ | / ?
    --------------- ? <== PortalpȝQ品组装)
    | Portal pȝ | ?
    --------------- ?
    |
    -------------------------|---------------------------------------------
    | ?
    | ? <== 发布pȝQ分发代理)
    --------------- ?
    |前台发布pȝ | ?
    ---------------
    / \
    / \
    --------------- ---------------
    | 用户览? | |Search Engine|
    --------------- ---------------

    q里Q我把在内容发布pȝ选型中找到的一些资料ȝ如下Q?

      内容理pȝ的选型

      关键词:CMS Content Manage System

      CMS行业研究
      http://www.cmswatch.com
      http://www.cmsreview.com
      http://www.cmsinfo.org

      CMS讨论邮g列表
      http://www.cms-list.org

      商业软g和开源项目列表:
      http://directory.google.com/Top/Computers/Software/Internet/Site_Management/Content_Management/

      推荐Q基于XML的发布框?BR>http://cocoon.apache.org/

      具体实现复杂E度可能会根据需求的不同而不同,但越是大型的pȝ是需要分工:内容(数据Q,表现Q模板)和应用逻辑Q程序)可能分d对这3 者的理?BR>

      Portal---门户pȝ
      Open source Projects:
      http://jportlet.sourceforge.net/
      Apache Software Foundation: Jakarta JetSpeed 1.3
      JetSpeed home page:
      http://jakarta.apache.org/jetspeed/site/index.html
      JetSpeed Portlet API:
      http://cvs.apache.org/viewcvs/jakarta-jetspeed/proposals/portletAPI/
      http://www.liferay.com/home/index.jsp
      http://basicPortal.com/
      http://www.jahia.org/
      http://jporta.sourceforge.net/

      商业软gQ?BR>BEA WebLogic Portal -
      http://edocs.bea.com/wlp/docs81/javadoc/com/bea/Portal/model/Portlet.html
      IBM Websphere Portal -
      http://www.software.ibm.com/wsdd/zones/Portal/
      Oracle Portal Developer Kit -
      http://Portalstudio.oracle.com/

      其它:
      P***L -
      http://jakarta.apache.org/jetspeed/site/psml.html
      BEA: Web Logic Portal 4.0
      http://www.bea.com/products/weblogic/Portal/index.shtml
      IBM: WebSphere Portal 2.1
      http://www-4.ibm.com/software/webservers/Portal/
      iPlanet: iPlanet Portal Server 3.0
      http://www.iplanet.com/products/iplanet_Portal/home_Portal.html
      Oracle: Oracle 9i Portal
      http://www.oracle.com/ip/deploy/ias/Portal/index.html
      SAP Portal:
      http://www.iviewstudio.com
      Epicentric Portal:
      http://www.epicentric.com/solutions/products/efs/

      参考:
      WaferQJava开发框架研I?/A>
      http://www.waferproject.org/index.html

      门户(Portal)pȝ相关开发框Ӟ
      http://udoo.51.net/mt/archives/000011.html

      q告理pȝ

      关键词:ad server

      q告pȝ和内容的分离Q可以大大降低系l之间的兌度?BR> 
      专业行业研究|站Q?BR>
      http://adres.internet.com

      相关厂商和开源项目:
      http://directory.google.com/Top/Computers/Programming/Languages/PHP/Scripts/Ad_Management/?il=1
      http://directory.google.com/Top/Computers/Software/Internet/Servers/Advertising/?tc=1
      http://www.jspin.com/home/apps/admanage?cob=winedit
      http://www.scriptdex.com/dex/php_ad_management.shtml

      推荐Q?BR>http://www.phpadsnew.com/ 功能性比较强
      http://oasis.sourceforge.net/ 免费 Z日志记录和定期导入MYSQLl计Q可以负?0万请?每小?以上

      如果看重q告的第3方特性,可以选择W三Ҏ务:
      http://www.doubleclick.net/
      http://www.allyes.com/

      论坛/C֌pȝ

      关键词: BBS FORUM

      论坛软g介绍Q?BR>
      http://directory.google.com/Top/Computers/Internet/Web_Design_and_Development/Message_Boards/

      推荐Q?BR>
      http://www.phpBB.com PHP + MySQL open source
      http://www.vbulletin.com/order/ PHP + MySQL  有付费的商业支持85Q?60$

      http://www.jivesoftware.com/products/pricing.jsp 商业论坛pȝQ?000$Q?500$ 有知识库扩展应用
      http://yazd.yasna.com/features.jsp Z Java

      所见即所得(WYSIWYGQ编辑器

      在内容的录入理斚wQ所见即所得是比较重要的,q样可以大大化对pȝ中布局排版的需求?BR>Z览器的WYSIWYGQ所见即所得)~辑器是CMS设计中,~辑工具的主要考虑斚w。目前主要是通过JAVASCRIPT调用IE或其他浏览器的内|方法实现。其中基于IE5.5览器的实现最为简z。这里有一个完整的例子Q?BR>Building a WYSIWYG HTML Editor Part 1/2
      Building a WYSIWYG HTML Editor Part 2/2

      主要功能Q?BR>

      • 能够通过JAVASCRIPT实现的基本功能:加粗Q斜体字Q居中,d链接Q添加图片,模式切换QHTML和文本模式的切换Q?
      • Word垃圾代码qo
      • 囄上蝲接口Q图片上载最好通过其他独立模块实现?/LI>

      选型指标Q?BR>

      • 不依赖服务器端代码:只通过JAVASCRIPT或客L控g实现代码Q可以保证以后系l迁Uȝ方便?
      • WORD垃圾代码qo

      可视化编辑器大全Q?BR>http://www.bris.ac.uk/is/projects/cms/ttw/ttw.html

      推荐Q?BR>
      http://www.aine.be/aynhtml/

      囄/文g上传l徏

      囄和文件等非结构化数据q是分别使用另外的服务解x较好。这样可以大大简化CMS本n的复杂程度?BR>
      推荐Q?BR>文g上传Q?BR>
      Apache Commons目
      http://jakarta.apache.org/commons/

      ImageJQ图片处理羃略图生成和水印等
      http://rsb.info.nih.gov/ij/

      关于Blogpȝ的选型Q目前主的ZPHP的包括:
      · Nucleus 3.0
      www.nucleuscms.org
      · pmachine 2.3
      www.pmachine.com
      · b2evolution 0.9.0.3
      www.b2evolution.net
      · Serendipity 0.6
      www.s9y.org
      · WordPress 1.2
      www.wordpress.org
      · bBlog 0.7.3
      www.bblog.com
      · pLog 0.3.1
      www.plogworld.org
      · Simplog .9
      www.simplog.org
      · Textpattern 1.18a
      www.textpattern.com



      W笨 2005-04-02 15:07 发表评论
      ]]>
      Java Treehttp://www.aygfsteel.com/kapok/archive/2005/03/31/2657.htmlW笨W笨Thu, 31 Mar 2005 06:08:00 GMThttp://www.aygfsteel.com/kapok/archive/2005/03/31/2657.htmlhttp://www.aygfsteel.com/kapok/comments/2657.htmlhttp://www.aygfsteel.com/kapok/archive/2005/03/31/2657.html#Feedback0http://www.aygfsteel.com/kapok/comments/commentRss/2657.htmlhttp://www.aygfsteel.com/kapok/services/trackbacks/2657.html http://www.matrix.org.cn/article/335.html

      原创 作?- joinme

      Tree型结构,Tree图不在哪个领域都是一个比较吃香的东东。在自己的网站或目中有一个tree型图或tree型结构的权限Q或角色Q和数据库设计相养IQ总能有那么一点点成就感。^_^
          q篇文章把我自己在q方面应用的实践整理一下拿出来。ؓ您详l介l了在Tree有关斚w应用的完整实c?BR>实例如下Q?A target=_blank>
      左边的tree囄实现方式是通过javascript+jsp实现。如果是Z实现逻辑上的treel构的维护,采用的是xml解决Ҏ?BR>现在q里说一?javascript+jsp的表现层的实现。这里的javascriptq不是唯一的选择Q可以在|上下到cM的javascript(毕竟是共享的嘛?) ).?A target=_blank>q里可以下蝲相关代码.
      其中的test.htm是javascript例子代码:
      <script type="text/javascript" src="include/dtree.js"></script>
      <div class="dtree">
       <script type="text/javascript">
        <!--
        d = new dTree('d');
        d.add(0,-1,'文章目录');
      d.add(3,0,'技术与Ҏ','admin.php?module=article&action=catelist&cid=3','','_blank');
      d.add(5,0,'新闻中心','admin.php?module=article&action=catelist&cid=5');
      d.add(34,5,'新闻中心','admin.php?module=article&action=catelist&cid=5');
      d.add(35,34,'新闻中心','admin.php?module=article&action=catelist&cid=5');
      d.add(36,35,'新闻中心','admin.php?module=article&action=catelist&cid=5');
      d.add(37,36,'新闻中心','admin.php?module=article&action=catelist&cid=5');
      d.add(38,37,'新闻中心','admin.php?module=article&action=catelist&cid=5');
      d.add(7,6,'|络知识','admin.php?module=article&action=catelist&cid=7');
      d.add(8,6,'配置手册','admin.php?module=article&action=catelist&cid=8');
      d.add(9,6,'|络安全','admin.php?module=article&action=catelist&cid=9');
      d.add(10,3,'解决Ҏ','admin.php?module=article&action=catelist&cid=10');
      d.add(11,10,'局域网','admin.php?module=article&action=catelist&cid=11');
      d.add(12,10,'宽带接入','admin.php?module=article&action=catelist&cid=12');
      d.add(6,3,'|络技?,'admin.php?module=article&action=catelist&cid=6');
      documentQwrite(d);

      -->
      </script>
      </div>
      "d.add(3,0,'技术与Ҏ','admin.php?module=article&action=catelist&cid=3','','_blank');
      "中的"3"是当前节点,"0"是父节点,"技术与Ҏ"是tree上显C的节点?"admin.php?......"指向的url."_blank"是指向的H口?BR>从上可以看出Q这个javascript已经把tree囑֮现的大部分工作已l做好了。只要我们传入对应的数据可以了?BR>首先是数据库l构。从上可以看出,有节点名Q节点id,父节点id,节点url,节点target,q可以有个节点状态(比如是激zL休眠Q很常用用一U用法)Q当然还可以有其它属性,那就要根据项目的需要了。其实只要抓住一点,有唯一节点id和唯一父节点id可以了Q面向对象)可以了?BR>有了数据库结构,然后要实现tree囑ְ是根据一定的限制Q比如权限,最后对应ؓtreel构的子集(当然也必L完整的treel构Q)取出W合条gq且完整的treel构的数据(我采用的解决Ҏ是把权限对应的节点的上溯父节炚w取出来保证treel构的完整?具体可以?A target=_blank>java&xml心得(?Q?
      假设我们已经完成了上q的工作Q那么要实现tree囄代码应该如下:
      .........
      <html>
      <head>
      <title>Untitled documentQlt;/title>
      <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
      <link rel="stylesheet" href="images/cj_styles.css" type="text/css">
      <script type="text/javascript" src="include/dtree.js"></script>
      </head>

      <body bgcolor="#FFFFFF" text="#000000" leftmargin="2" topmargin="0">
      <div class="dtree">

      <script type="text/javascript">
        <!--

       <%
       if(!finds){
        out.println("documentQwrite('没有权限');");
       }else{
       Result rsShow=ResultFactory.getResult("Vector");
       rsShow.setConnType("jdbc");
       rsShow.setSql(tempsqls);
       rsShow.Create();
       out.println("d=new dTree('d');");
       out.println("d.add(0,-1,'权限列表');");
       String t_tree_id,t_tree_id_p,t_tree_name,t_tree_address,t_tree_target;
        while(rsShow.next()){
         t_tree_id=rsShow.getString("tree_id");
         t_tree_id_p=rsShow.getString("tree_id_p");
         t_tree_name=rsShow.getString("tree_name");
         t_tree_address=rsShow.getString("tree_address");
         t_tree_address+="?tree_id="+rsShow.getString("tree_id")+"&tree_name="+rsShow.getString("tree_name"); //t_tree_address+="edit/list.jsp?tree_id="+rsShow.getString("tree_id")+"&tree_name="+rsShow.getString("tree_name");
         t_tree_target=rsShow.getString("tree_target").length()>0?rsShow.getString("tree_target"):"mainFrame";
         out.println("d.add("+t_tree_id+","+t_tree_id_p+",'"+t_tree_name+"','"+t_tree_address+"','','"+t_tree_target+"');");
        }
        out.println("d.add(-2,0,'退出系l?,'/zdtadmin/content/login.jsp','','_top');");
        out.println("documentQwrite(d);");
       rsShow.close();
       }
       %>

        -->
       </script>


      </div>


      </body>
      </html>
      q样实C动态tree图?BR>上面的这U实现是用jsp+javascript实现。也可以用xml+xsl来实现。不是必要,只是可以让新手也了解一下关于xml的应用?)
      比如我们已经成功把数据库的数据导出成xml格式。代码如下:
      <?xml version="1.0" ?>
      <?xml:stylesheet type="text/xsl" href="ttx2.xsl" ?>
      <table name="cm_tree">
      <col id="1" label="闆嗗z鏂伴椈" parentid="29" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="2" label="闆嗗z瑕侀? parentid="1" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=2"></col>
      <col id="3" label="~煎悎淇℃伅" parentid="1" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=3"></col>
      <col id="4" label="鏀跨瓥娉曡? parentid="29" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="5" label="娉曞R娉曡" parentid="4" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=5"></col>
      <col id="7" label="鏀跨瓥鐮旂? parentid="4" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=7"></col>
      <col id="8" label="鐢熶骇缁忚惀" parentid="29" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="9" label="瀹夊叏鐢熉" parentid="8" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=9"></col>
      <col id="10" label="~忚惀鍔ㄦ? parentid="8" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=10"></col>
      <col id="11" label="宸ョ▼寤鸿" parentid="29" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="12" label="鐏數宸ョ▼" parentid="11" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=12"></col>
      <col id="13" label="姘寸數宸ョ▼" parentid="11" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=13"></col>
      <col id="14" label="鏍哥數宸ョ▼" parentid="11" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=14"></col>
      <col id="17" label="鍥介檯鍚堜綔" parentid="29" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="19" label="鍚堜E鍔ㄦ€? parentid="17" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=19"></col>
      <col id="20" label="gW鏂囧寲" parentid="29" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="22" label="l剧鏂囨槑" parentid="20" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=22"></col>
      <col id="24" label="鍏朵_淇℃伅" parentid="29" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="25" label="澶╂皉|勬姤" parentid="24" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=25"></col>
      <col id="26" label="gW鏂囧寲鍔ㄦ? parentid="20" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=26"></col>
      <col id="27" label="鏂囧寲娲诲姩" parentid="20" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=27"></col>
      <col id="29" label="鍐呭绠Q悊" parentid="0" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="31" label="鏍忕z缁存姢" parentid="0" target="_blank" url="/zdtadmin/treeadmin/tree_edit.jsp"></col>
      <col id="32" label="瑙掕壊缁存姢" parentid="0" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="41" label="澶氱浜тW? parentid="8" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=41"></col>
      <col id="42" label="涓婂竉? parentid="8" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=42"></col>
      <col id="44" label="娣诲姞瑙掕壊" parentid="32" target="_blank" url="/zdtadmin/peradmin/role_edit.jsp"></col>
      <col id="45" label="瑙掕?鏍忕z? parentid="32" target="_blank" url="/zdtadmin/peradmin/role_tree.jsp"></col>
      <col id="46" label="瑙掕?鐢ㄦ? parentid="32" target="_blank" url="/zdtadmin/peradmin/role_user.jsp"></col>
      <col id="47" label="鏂囦Ƣ涓嬭浇" parentid="24" target="_blank" url="/zdtadmin/newsadmin/down_list.jsp"></col>
      <col id="48" label="鐢ㄦ埛绠Q悊" parentid="0" target="_blank" url="/zdtadmin/useradmin/user_list.jsp"></col>
      <col id="51" label="涓撴? parentid="29" target="_blank" url="/zdtadmin/default.jsp"></col>
      <col id="52" label="鐢靛姏绉戞櫘" parentid="51" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=52"></col>
      <col id="53" label="鍩虹绠Q悊? parentid="51" target="_blank" url="/zdtadmin/newsadmin/list.jsp?tree_id=53"></col></table>
      其中q是因为用Cutf8~码。就是节点名。在ie中可以正常显C?BR>然后我们写一个xsl来表C它Q把它{成一个html来显C?BR>"<?xml:stylesheet type="text/xsl" href="ttx2.xsl" ?>"指定了我们要?BR>ttx2.xsl来表C它。代码如下:

      <?xml version='1.0' ?>
      <xsl:stylesheet version='1.0' xmlns:xsl="http://www.w3.org/TR/WD-xsl"; >
      <xsl:template match="/">
      <html>
      <head>
      <title>Tree test</title>
      </head>
      <body>
      <script type="text/javascript" src="include/dtree.js"></script>
      <script type="text/javascript">
      d=new dTree('d');
      d.add(0,-1,"list");
      <xsl:apply-templates select="/table"/>
      documentQwrite(d);
      </script>
      </body>
      </html>
      </xsl:template>
      <xsl:template match="/table">
      <xsl:for-each select="col">
      d.add(<xsl:value-of select="@id"/>,<xsl:value-of select="@parentid"/>,'<xsl:value-of select="@label"/>','<xsl:value-of select="@url"/>','<xsl:value-of select="@label"/>','<xsl:value-of select="@target"/>');
      </xsl:for-each>
      </xsl:template>
      </xsl:stylesheet>
      q些例子在打包文仉可以扑ֈ。我在IE 6.0下测试通过?BR>我在xsl斚w也只是了解皮毛。所以用到的也只是很基础的东ѝ希望有写一些关于xml+xsl斚w的专业的文章。^_^
      上面说的东西是b/sl构下tree囄表现层的实现。如果是逻辑上的l构变更和定义,׃能靠jsp+javascript来实C。我的解x法是用tree型xml来实?如果直接操作数据库的话,要递归q要保证l构完整性,虽然能实C是可能会很复杂,q且效力比较低?tree型xml来实?可以参?A target=_blank>java&xml心得(?.
      上面是自己在Tree型结?nbsp;数据-l构l护-l构交互-表现 上自q理解。当然还有很多不完善的地斏V~_~ 希望能给大家一点帮助或启示?/FONT>

      参与论坛讨论:http://www.matrix.org.cn/forum.asp
      更多技术文?http://www.matrix.org.cn/article.asp
      Matrix java门户:http://www.matrix.org.cn 原文地址Q?A >http://www.matrix.org.cn/article/335.html


      W笨 2005-03-31 14:08 发表评论
      ]]>
      在线~辑器以及开源项目链接等{?/title><link>http://www.aygfsteel.com/kapok/archive/2005/03/31/2650.html</link><dc:creator>W笨</dc:creator><author>W笨</author><pubDate>Thu, 31 Mar 2005 05:19:00 GMT</pubDate><guid>http://www.aygfsteel.com/kapok/archive/2005/03/31/2650.html</guid><wfw:comment>http://www.aygfsteel.com/kapok/comments/2650.html</wfw:comment><comments>http://www.aygfsteel.com/kapok/archive/2005/03/31/2650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kapok/comments/commentRss/2650.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kapok/services/trackbacks/2650.html</trackback:ping><description><![CDATA[1.<BR>在线~辑?<A ><BR>   1.1<BR>http://www.fckeditor.net/</A><BR>         目前来说Q我对FCK的感觉还不错?BR>         相关链接Q?A >http://www.chinaunix.net/jh/27/435736.html</A><BR>         <A >http://www.donews.net</A>好像采用的就是这个在U编辑器?BR> <P>当前FCKeditor对IE的支持很好,不过在Mozilla Firefox中不能正常工作。从官方|站上得到的消息表明FCKeditor的开发小l正在实现其对Mozilla的支持?BR><A >http://www.lividecay.org/doc_view.php?doc_id=1123</A><BR><BR><BR><A >http://www.redsaga.com/mambo/content/view/12/2/</A></P> <P>在jsp下用FCKeditor是非常容易的Q?在FCKeditor的表中带有一个在JSP下用TaglibQ通过调用q个taglibQ?很容易用FCKeditorQ?下面q单说一下它的?BR><STRONG>FCKeditor在Future使用指南</STRONG></P> <OL> <LI>在jsp可以直接调用FCKeditor提供的tagQ?引入/WEB-INF/FCKeditor.tld可以用了 <LI>FCKeditor中editor tag中的属性? <LI>id是对q个tag的唯一标识Q在提交表单以后Q?可以通过q个id定义的参数名得到~辑后生成的内容Q如果在一个页面中要调用多个fckeditorQidg能重? <LI>canUpload表示是否能上载图? <LI>canBrowse表示是否能浏览已上蝲的图? <LI>toolbarSet表示工具栏的cdQ?q里的类型可以在/fckeditor/js/fck_config.js中定? <LI>width是编辑框的宽? <LI>height是编辑框的高?/LI></OL> <P>toolbarSet的定义是非常Ҏ的, 在FCKeditor中用到的所有功能按钮对是有唯一的名U的Q?q个名称你可以在FCKeditor帮助文g或?fckeditor/js/fck_config.js中定义的Default toolbarSet中找?<BR><BR>   1.2<BR>      <A >http://www.freetextbox.com/</A> 不过好像不支持jsp?BR><BR>Javascript实现?BR><A >http://tinymce.moxiecode.com/</A><BR><BR><BR>2.<BR>一个在U字?<BR><A >http://livid.3322.org/lividict/livid.html</A><BR><BR><BR>3.<BR>开源的Zphp的项目:<BR><A >http://xoops.org.cn/modules/wfdownloads/singlefile.php?cid=4&lid=222</A><BR><A >http://xoops.org.cn/modules/wfdownloads/topten.php?list=hit</A><BR><BR><BR><BR>4.<BR><A >http://forum.javaeye.com/viewtopic.php?t=2047&highlight=cvs</A><BR><A >http://forum.javaeye.com/viewtopic.php?t=8360&highlight=cvs</A><BR><A >http://sourceforge.net/cvs/?group_id=94626</A><BR><BR><BR>5.<BR><A >http://www.blog.edu.cn/blog.asp?name=yonghui</A><BR><A >http://www.magnolia.info/en/community.html</A><BR><BR>6.<BR><A >http://duduwolf.winzheng.com/</A><BR><A >http://www.bris.ac.uk/is/projects/cms/ttw/ttw.html</A><BR><A >http://www.aine.be/aynhtml/</A><BR><BR><BR>6.<BR><A >http://www.jdsl.org/</A><BR><A >http://www.cmswiki.com/tiki-index.php?page=JSR170</A><BR><A >http://jsr170tools.day.com/crx/index.jsp</A><BR><BR><BR>7.<BR>目理Q?BR><A >http://www.codeproject.com/tools/ToDoList2.asp</A><BR><A >http://www.moon-soft.com/doc/45036.htm</A><BR><A >http://www.moon-soft.com/doc/45036.htm</A><BR><A >http://www.neokeen.com/mornlee/2005/02/23/1109168404234.html</A><BR><A >http://cosoft.org.cn/forum/forum.php?forum_id=6559</A><BR><A >http://blog.csdn.net/kasam/archive/2004/12/30/234644.aspx</A><BR><A >http://www.redsoftfactory.com/chinese/opensource/opensource.html</A><BR><A >http://forum.javaeye.com/viewtopic.php?t=2300</A><BR><BR><BR><A >http://forum.javaeye.com/viewtopic.php?t=8360</A><BR><BR><BR>8?BR><BR><BR><A >http://java-source.net/open-source/content-managment-systems</A></P><img src ="http://www.aygfsteel.com/kapok/aggbug/2650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kapok/" target="_blank">W笨</a> 2005-03-31 13:19 <a href="http://www.aygfsteel.com/kapok/archive/2005/03/31/2650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">㰲</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֹ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٹ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">齭</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">ŷ</a>| <a href="http://" target="_blank">˹</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ҽ</a>| <a href="http://" target="_blank">Ѩ</a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank">ڰ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>