当前位置:文档之家› 第从零开始开发服务器控件

第从零开始开发服务器控件

第从零开始开发服务器控件
第从零开始开发服务器控件

第3章从零开始开发服务器控件

本章内容

3.1 选择基类

3.2 控件呈现顺序

3.3 Render呈现控件的几种方式

3.4 AddAttributesToRender方法

3.5 CreateChildControls方法

3.6 INamingContainer接口

3.7 实现复合控件

3.8 常用开发技巧

3.1 选择基类

在开发一个控件之前要先选择控件开发要继承的基类,这些基类封装了控件最基本的功能,可以提高代码重用性,并且每个基类提供的功能不同,在第1章中已经列出了许多常用基类,如果您还不大清楚,请看一下第1章。

这里仅谈一谈一般开发基本控件所选择基类的方式。

Control

控件开发基类,所有控件都直接或间接继承该类。提供了各类控件通用属性和方法,如唯一标志ID属性、可见性Visible等。

该类仅具有控件最基本的属性,扩展灵活性最强。

WebControl

WebControl除了继承了Control的所有属性,还增加了布局、可访问性、外观样式等特性;另外,对行为也扩充了好多属性。

Control和WebControl都用于开发简单控件(即单个控件或非组件控件)。一般在选择控件时,如果要开发的控件对外观布局和样式等控件特性要求比较高,则可以选择继承WebControl要方便得多;反之,选用Control实现即可。如果一定要选用Control实现WebControl的特性也是可以的,但要自己增加所需的属性,如布局属性width和height,实现起来会较麻烦。

28

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

一般在基于Web 的系统中用得最多,扩展灵活性也很强。 CompositeControl

此类为https://www.doczj.com/doc/6418478703.html, 2.0版本时已经支持的一个控件基类。如果把现有控件聚合起来创建一

个组合控件时,可以继承此类,此类默认实现了INamingContainer 接口,并且对设计模式表现有较好的支持。后面会详细介绍其创建方法。一般用于将具有一定功能的多个控件集成为一个控件的情况。

继承现有控件

把具有一定功能的成型控件,如Label ,Button ,甚至GridView 等控件,作为新控件的基类,并在此基础上扩展或改变(通过override 重载其方法实现)其功能,满足业务需要。 一般情况下开发一个基于Web 平台的控件,比较常用的方法是从WebControl 继承;本章主要讲开发一个控件的过程。就以继承WebControl 为例来展开讲解。

只要是Web 控件,不管是https://www.doczj.com/doc/6418478703.html, 控件还是第三方厂商控件,最终被解析到客户端的都是标准的HTML 标记。也可以这么说,做一个控件的过程就是根据控件使用者设置控件的属性(简单值或复杂数据源集合等)进行组织HTML 并输出的过程。控件无非就是把一些常用的功能抽象成一个通用的控件,提高重用性,节省开发时间,这样要比之前开发人员对每个页面用纯HTML 开发要好多了。

控件开发可以理解为组织HTML 的过程。当然https://www.doczj.com/doc/6418478703.html, 控件开发技术提供了一些规则,用多种方式有效地组织输出这些HTML 标记,对样式、资源文件封装等也提供了一些帮助类和功能支持,下面我们就一起来看一下组织HTML 标记的方式。

3.2 控件呈现顺序

控件生命周期的Render 阶段,主要将控件标记和字符文本输出到服务器控件输出流中。在这个阶段可以直接写HTML 标记,也可以调用每个控件都有的RenderControl 方法到输出流。在WebControl 基类中,以Render 开头的呈现方法有如下几个:

RenderControl(HtmlTextWriter writer) Render(HtmlTextWriter writer) RenderBeginTag(HtmlTextWriter writer) RenderContents(HtmlTextWriter output) RenderEndTag(HtmlTextWriter writer)

以上几个Render 方法并不是毫无联系的,它们的执行顺序是从上往下,并且有嵌套的调用关系。其中在RenderControl 方法内部会调用Render 方法,在Render 方法内部会依次调用RenderBeginTag, RenderContents 和RenderEndTag 。

其中RenderControl 和Render 是Control 基类中的方法,因为WebControl 本身也是继承Control 的。一般在开发基本控件时,我们只需重写RenderContents 方法即可,在此方法中可以把控件HTML 文本标记和其他内容写到输出流中。

另外,还有两个可以重载的方法 RenderBeginTag 和RenderEndTag 。这两个方法执行时刻点是分别在Render 控件内容之前和之后。可以重写这两个方法自己定义控件的起始和结束标记。默认情况下控件是以作为起始和结束标记的,图3-1是没有重写标记的一

第3章从零开始开发服务器控件个控件的默认显示。

29

30

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

图3-1 控件默认标记是

下面以一个例子来演示使用上面几个Render 方法。新建一个RenderOrderControl.cs Web

控件类,重载以下几个方法,并填充相应语句。代码如下所示:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

///

/// Render 方法执行顺序: 3

///

public override void RenderBeginTag(HtmlTextWriter writer) {

//base.RenderBeginTag(writer);

writer.AddAttribute ( HtmlTextWriterAttribute.Id, this .ID); writer.RenderBeginTag(HtmlTextWriterTag.Div); }

///

/// Render 方法执行顺序: 4 ///

protected override void RenderContents(HtmlTextWriter output) {

output.Write(Text); }

///

/// Render 方法执行顺序: 5 ///

public override void RenderEndTag(HtmlTextWriter writer) {

//base.RenderEndTag(writer); writer.RenderEndTag(); }

上面代码仅呈现出控件Text 属性文本。另外,重写了控件起始和结尾标签。呈现到浏览器中的控件如图3-2所示。

图3-2 控件重写标记为

另外,读者可能注意到在RenderBeginTag 和RenderEndTag 方法中有:

31

第3章 从零开始开发服务器控件

base.RenderEngTag(writer);

这里跟面向对象继承是一个概念,表示调用基类中的方法,当继承于某个控件,扩展功能时常用到这样的方法。有以下几种处理方式:

(1)复制基类方法功能:直接调用base.Method()方式,不加任何代码。

(2)扩展基类方式功能:除了调用base.Method()之外,增加自己的扩展功能代码,并且base.Method()在方法体中的位置可以根据需要任意放置。

(3)替换基类方法功能:不调用base.Method(),并增加自己需要的新功能代码。 (4)取消重载规则:使用new 关键字代替override ,这样仅保证方法名是相同的,其内部执行逻辑可以由自己任意组织,用于面向对象编程中实现与基类中毫无相关的功能。

(5)禁用基类方法功能:保留一个空的方法体。

3.3 Render 呈现控件的几种方式

3.3.1 使用HtmlTextWriter 类输出

先看一个例子,其功能是输出一个超链接控件:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

protected override void RenderContents(HtmlTextWriter output) {

//方式

output.AddAttribute(HtmlTextWriterAttribute .Href,"https://www.doczj.com/doc/6418478703.html,/"); output.AddAttribute(HtmlTextWriterAttribute.Target, "blank"); output.AddStyleAttribute(HtmlTextWriterStyle.Color, "Blue"); output.AddStyleAttribute(HtmlTextWriterStyle.Cursor, "Hand"); output.RenderBeginTag(HtmlTextWriterTag.A); output.Write(this.Text); output.RenderEndTag();

output.WriteBreak(); }

RenderContents 方法的参数类型为HtmlTextWriter ,是具有呈现标记和其他HTML 标记(包括HTML 变量)的方法的实用工具类。该类能将控件的字符和文本标记等写入到服务器控件输出流中。并且此类在运行期间会自动生成实例。

Output.AddAttribute 方法生成控件的属性,它有许多重载方法,可以直接以字符串形式把属性名称和属性值写入到输出流,也可以使用HtmlTextWriterAttribute 枚举,帮助输入控件属性,如下都是使用AddAttribute 方法的一些例子:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

32

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

output.AddAttribute(HtmlTextWriterAttribute.Accesskey, "n");

output.AddAttribute("Accesskey", "n");

output.AddAttribute(HtmlTextWriterAttribute.Bgcolor, "#6699ff"); output.AddAttribute("bgcolor", "#6699ff");

output.AddAttribute(HtmlTextWriterAttribute.Checked, "true"); output.AddAttribute("checked", "true");

output.AddAttribute(HtmlTextWriterAttribute.Class, "TextBoxStyleName"); output.AddAttribute("class", "TextBoxStyleName");

output.AddAttribute(HtmlTextWriterAttribute.Onclick, "alert('Hello');"); output.AddAttribute("onclick", "alert('Hello');");

output.AddAttribute(HtmlTextWriterAttribute.ReadOnly, "true"); output.AddAttribute("readonly", "true");

output.AddAttribute(HtmlTextWriterAttribute.Tabindex, "5"); output.AddAttribute("tabindex", "5");

不用多说,仅通过这些例子读者就能够理解AddAttribute 方法和HtmlTextWriterAttribute 枚举的用途了。其中AddAttribute 方法除了能够为控件增加一般属性外,还能够增加客户端事件属性,如上面例子中的“onclick ”属性。

HtmlTextWriterAttribute 枚举包含了几乎所有控件的属性标记,同时也要求使用者了解不同的控件具有一些不同的属性标记,在知道要添加的控件具有某个枚举值的情况下才为其增加某个属性标记,避免把控件弄成“驴头对马身”情况。

Output.AddStyleAttribute 方法生成控件的样式属性,像style="width:100%;" 中的width 就是样式属性标记。同样使用HtmlTextWriterStyle 枚举也可以帮助快速输入样式属性标记。通过如下示例了解一下它的功能:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

output.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, "#6699ff"); output.AddStyleAttribute("background-color", "#6699ff");

output.AddStyleAttribute(HtmlTextWriterStyle.Cursor, "Hand"); output.AddStyleAttribute("cursor", "Hand");

output.AddStyleAttribute(HtmlTextWriterStyle.Display, "block"); output.AddStyleAttribute("display", "block");

output.AddStyleAttribute(HtmlTextWriterStyle.Left, "20px"); output.AddStyleAttribute("left", "20px");

output.AddStyleAttribute(HtmlTextWriterStyle.Overflow, "auto"); output.AddStyleAttribute("overflow", "auto");

output.AddStyleAttribute(HtmlTextWriterStyle.Visibility, "true"); output.AddStyleAttribute("visibility", "true");

output.AddStyleAttribute(HtmlTextWriterStyle.ZIndex, "100"); output.AddStyleAttribute("z-index", "100");

本例中AddStyleAttribute 和HtmlTextWriterStyle 与前面的AddAttribute 和HtmlText WriterAttribute 用法一样。它们的区别也可以用一个例子来演示:

33

第3章 从零开始开发服务器控件

其中蓝色属性align="center" 就是用AddAttribute 方法输出的位置;粉红色样式属性style="border-color:Blue" 就是使用AddStyleAttribute 方法输出的位置,样式属性嵌套在复合属性style 中。一般属性(AddAttribute 方法增加的属性)与样式属性(AddStyleAttribute 方法增加的属性)有些具有相同功能的标记,比如,既可以使用一般属性也可以使用样式属性给控件设置背景色,但它们作用于控件的优先级是不一样的。

还有一对很重要且常用的方法RenderBeginTag 和枚举HtmlTextWriterTag 。下例演示了它们的功能:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

output.RenderBeginTag(HtmlTextWriterTag.A); output.RenderBeginTag("A");

output.RenderBeginTag(HtmlTextWriterTag.Button); output.RenderBeginTag("button");

output.RenderBeginTag(HtmlTextWriterTag.Div); output.RenderBeginTag("div");

output.RenderBeginTag(HtmlTextWriterTag.Table); output.RenderBeginTag("table");

output.RenderBeginTag(HtmlTextWriterTag.Input); output.RenderBeginTag("input");

关于RenderBeginTag 和枚举HtmlTextWriterTag 的功能就不再多说了。只说一下这个方法输出标记对应控件的位置,看一下这个控件标记:

RenderBeginTag 不是为控件生成属性和样式属性标记,而是生成控件标记,即上面例子中的绿色文本部分

在实际开发中建议尽量使用HtmlTextWriterAttribute ,HtmlTextWriterStyle 和HtmlTextWriterTag 枚举生成控件以及其属性标记,使用这些枚举输出最大的好处是我们不用关心浏览器的兼容性,让它在Render 时自行处理,否则我们必须得保证当前浏览器要支持此标记。例如:

output.RenderBeginTag(HtmlTextWriterTag.Div);

此写法要比如下写法好:

output.RenderBeginTag("div");

这些枚举中不包含的HTML 标记时,可直接使用标记字符串。

相信读者通过以上这么多示例应该对HtmlTextWriter 类有了系统的认识。另外,在HtmlTextWriter 类中还包含了很多常用的方法和属性,感兴趣的读者可以自己去研究,并在实践中应用它们。

3.3.2 直接输出HTML 标签

先看例子,也以输出一个超链接控件为例:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx

34

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

///

protected override void RenderContents(HtmlTextWriter output ) {

output.Write("");

output.Write(this.Text); output.Write(""); }

HtmlTextWriter 对象还有个非常重要的方法Write ,可以用这个方法直接输出HTML 标记,如上面的代码所示。如果方法中的参数是一个有效的HTML 标记或一个HTML 控件标记串,则它能够自动识别并输出该标记对应的浏览结果到浏览器。反之,如果该方法接收的参数不是有效的HTML 标记,则直接输出参数,如:

output.Write(this.Text);

就是直接将属性Text 的值输出。

当要连续输出多个HTML 标记时,调用多个Write 方法把标记直接输出到输出流中要比先组装好字符串再一次性输出到输出流中效率要高,即:

output.Write("

"); output.Write("
"); output.Write("性能比较”);

output.Write("

"); output.Write("

运行效率要高于:

string str = "

"; str += "
"; str += "性能比较";

str += "

”; str += "
"; output.Write(str);

另外,强烈建议不要把3.3.1节和3.3.2节介绍的方式混用,这样做除了代码比较混乱,不便于阅读外,还有一个重要的原因,笔者在项目开发中就遇到过这种情况。先看这个例子:

///

/// 获得本书更多内容,请看

:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

protected override void RenderContents(HtmlTextWriter output) {

output.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0"); output.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0"); output.AddAttribute(HtmlTextWriterAttribute.Border, "0"); output.RenderBeginTag(HtmlTextWriterTag.Table); output.Write("我是单元格内容"); output.Write("

以上代码仅输出一个表格,包含一行一列,且单元格内容为:我是单元格内容。从结构上看,各个标签的起始和结尾标记都比较匹配。事实上呈现到浏览器中的标记为:

最后一行如上代码所示,多一个标签,这是由于HtmlTextWriter 的方法输出控件

35

第3章 从零开始开发服务器控件

标记时比较智能,output.RenderEndTag 可以省略,运行环境在运行时会自动检测到默认的尾签并自动追加。以上代码比较简单,事实上可以省略所有的RenderEndTag 标记。

以上例子出现输出错误标记的原因是,运行环境在生成控件时无法检测到我们已经用output.Write 方法输出了一个结束标记。

3.3.3 使用服务器控件的RenderControl 方法

再介绍一种控件输出方法,直接用服务器控件的RenderControl 方法进行把控件Render 到输出流中。请看代码:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

protected override void RenderContents(HtmlTextWriter output) {

//方式

HtmlGenericControl A = new HtmlGenericControl("A");

A.Attributes.Add("href", " https://www.doczj.com/doc/6418478703.html,/ChengKing"); A.Attributes.Add("target", "blank");

A.Style.Add(HtmlTextWriterStyle.Color, "Blue"); A.Style.Add(HtmlTextWriterStyle.Cursor, "Hand"); A.InnerText = this.Text;

A.RenderControl(output); }

该示例也是生成一个超链接标签控件,大部分https://www.doczj.com/doc/6418478703.html, 现有控件都会有控件对应的类,如Button ,Label 控件等对应的类分别为Button 和Label 。但HTML 标签非常灵活且标记比较多,.NET framework 没有一一提供专门的类,那些没有专门提供类的标记是用类HtmlGenericControl 类取代,使用时把要生成控件的HTML 标签作为参数传入该类的构造方法即可。如上例中的:new HtmlGenericControl("A");然后为控件增加一些属性和样式属性。再使用控件的RenderControl()方法呈现到控件输出流对象中。使用这种输出方式其效率要比直接输出HTML 标记要低些,但是在很多场景下,比如创建复合控件时不得不用此方法。 采用3.3.1节和3.3.2节方式的优点是执行速度非常快。因为它直接输出的是HTML 标记,省去了从服务器控件解析成HTML 标记的时间;而采用3.3.3节的方式在控件解析时把服务端控件解析成HTML 标记是要花些时间的,相对来说效率会低一点。

采用3.3.1节和3.3.2节方式的缺点是,代码已经写死,以至于它不能自动识别浏览器,这样就不能根据浏览器类型生成对应的能够被各个浏览器识别的代码,那么做成的控件有可能在有些浏览器上不能够正常呈现或功能受限等。反之,使用3.3.3节方式输出即可以实现大部分跨浏览器的不同代码。如果读者对HTML 标记掌握得不是非常熟练的话,笔者不建议使用3.3.2节方式输出控件内容标记。另外,使用Write 方法最致命的缺点是服务器无法识别它(它不包含于服务器的控件集合中,对于保存页面状态的视图状态ViewState 来说,里面也不会保存这些控件的信息),即使设置了name 属性。也就是说它一般用于直接输出文本,或者输出简单HTML 标签,前提是这些标签不处理服务端事件或处理服务端回发数据。

以上介绍了三种输出控件标记的方法,使用的例子很简单,但能够说明开发所有控件的方式和注意事项,比较容易懂。同时也分析了各种方式的优缺点,这些优缺点并不是绝对的,要根据实际场景选用合适的方法。事实上我们在开发控件的过程中,以上几种输出方式都用到了。

36

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

3.4 AddAttributesToRender 方法

除了上面讲到的在Render 方法中输出控件内容之外,使用AddAttributesToRender 方法也

是一个比较好的输出方式。使用AddAttributesToRender 方式一般在创建原生控件(单个元素)时用的较多,且此方法一般与方法RenderContents 方法一起使用。

此重载方法可以为当前自定义控件容器标记增加属性,即对控件呈现HTML 标记的最外层一级增加属性。

通过一个简单示例来讲解一下它的用法,其代码如下:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

public class AddAttributesToRenderControl : WebControl {

///

/// 重载TagKey 属性, 使用

替换掉默认的 ///

protected override HtmlTextWriterTag TagKey {

get {

return HtmlTextWriterTag.Table; } }

protected override void AddAttributesToRender (HtmlTextWriter writer) {

writer.AddAttribute(HtmlTextWriterAttribute.Border, "0px");

writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0px"); writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0px"); base.AddAttributesToRender(writer); }

protected override void RenderContents (HtmlTextWriter output) {

//输出三行内容

output.RenderBeginTag(HtmlTextWriterTag.Tr); output.RenderBeginTag(HtmlTextWriterTag.Td); output.Write("");

output.Write("【博客园】【CNBlog 】"); output.Write(""); output.RenderEndTag(); output.RenderEndTag();

output.RenderBeginTag(HtmlTextWriterTag.Tr); output.RenderBeginTag(HtmlTextWriterTag.Td); output.Write("");

output.Write("【中国软件开发网】【CSDN 】"); output.Write(""); output.RenderEndTag(); output.RenderEndTag();

37

第3章 从零开始开发服务器控件

output.RenderBeginTag(HtmlTextWriterTag.Tr); output.RenderBeginTag(HtmlTextWriterTag.Td); output.Write("");

output.Write("【夜战鹰的博客】【ChengKing(ZhengJian)】"); output.Write(""); output.RenderEndTag();

output.RenderEndTag(); } }

示例中首先通过重载TagKey 属性,把控件容器标记设置为

,这样就与RenderContents 输出控件内容匹配为一个完整的表格。如果不重载TagKey ,它也会自动生成一个基本的容器标记。

AddAttributesRender 重载方法主要是为重载的TagKey 增加一些属性,在实际应用时可以在本方法中任意设置TagKey 支持的属性。在这里设置了几个

标记支持的属性。 RenderContents 重载方法的功能主要是输出内容,在这里输出三行,每行中输出一个)时,直接使用一个循环语句输出即可。

3.5 CreateChildControls 方法

CreateChildControls 方法一般用于创建组合控件。在此方法中可以定义自己需要的控件,进行实例化和赋值等,并将其添加到当前Controls 集合中。如以下代码所示:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

protected override void CreateChildControls() {

Controls.Clear();

Button button = new Button(); button.ID = "btnOK";

https://www.doczj.com/doc/6418478703.html,mandName = "ButtonClick"; this.Controls .Add (_button);

TextBox textBox = new TextBox(); textbox.ID = "tbText";

this.Controls.Add(textBox); }

在CreateChildControls 方法中创建了两个子控件,并把它们添加到Controls 集合中。Controls 表示当前的所有控件集合,这样会自动按照Controls 集合中控件的先后顺序呈现控件。如果想改变Controls 呈现顺序,可以重载Render 方法,自定义控件呈现顺序。 在本章后面会还有专门介绍复合控件的一个完整示例,对于此方法的使用在这里就不再多说了。

38

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

3.6 INamingContainer 接口

INamingContainer 是一个没有任何方法的接口。当用控件实现此接口时,https://www.doczj.com/doc/6418478703.html, 页框

架将在此控件下创建新的命名范围。这样可以保证子控件在控件层次结构树中具有唯一的ID 。如果控件是提供数据绑定的复合控件(包含子控件),或者控件是模板化控件,或者控件需要将事件路由到其子控件,则控件必须实现INamingContainer 接口。

在开发控件时,如果控件继承了,则不需要再继承INamingContainer 接口,因为CompositeControl 本身就继承了InamingContainer 。

一般一个控件主要使用以下三个属性作为其唯一标志:ID ,UniqueID ,ClientID 。其中ID 表示我们给它命名的ID ;UniqueID 表示控件的服务端ID ,在服务端标志控件的名称;ClientID 表示控件的客户端ID ,这样在浏览器客户端JavaScript 就可以通过此标记在页面中检索到它。 从使用角度讲,如果继承了CompositeControl 此接口,当我们为子控件设定一个ID 后,它的UniqueID 和ClientID 会自动加上父控件的this.UniqueID 属性值和分隔符作为前缀;分隔符可以通过this.IdSeparator 属性取得。一般来说,在服务端默认使用“$”进行分隔,但是到了客户端会自动将这些“$”转换为下画线“_”,即客户端ID 和服务端ID 名称是一样的,只是分隔符不同。通过反射看.NET 控件库中Control 类的源代码,看到如下代码:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

public virtual string ClientID {

get {

this.EnsureID();

string uniqueID = this.UniqueID;

if ((uniqueID != null) && (uniqueID.IndexOf(this.IdSeparator)>= 0)) {

return uniqueID.Replace(this.IdSeparator, '_'); }

return uniqueID; } }

从上面可以看到Control 类中ClientID 属性的默认实现也是把分隔符简单替换成下画线“_”,根据需要我们也可以自己定义this.IdSeparator 分隔符。 下面通过一个例子来说明当控件继承INamingContainer 后控件集中子控件的命名规则。控件源代码如下:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

public class INamingContainerControl : WebControl {

protected override void CreateChildControls() {

TextBox textbox = new TextBox(); textbox.ID = "btn";

this.Controls.Add(textbox);

39

第3章 从零开始开发服务器控件

Button button = new Button(); button.ID = "btnOK"; button.Text = "确定";

this.Controls.Add(button); } }

本控件主要输出两个控件:一个是Button ,

另一个是TextBox ,注意上面代码还未继承命名空间InamingContainer 。在浏览器中运行控件,生成的HTML

源代码如下:

可以看到,生成的控件ID 就是我们为控件命名的ID 。这样如果同时使用了多个控件,则会出现命名冲突问题,为了说明此问题,再在测试页面中增加一个本示例控件,查看源代码如下:

从生成的HTML 源代码可以看到,就算我们增加多个控件,它的子控件命名还是与我们在控件内部为text 控件命名的ID 相同。

在客户端,假如我们通过如下代码检索页面中控件:

var button = document.getElementById(…btn ?);

则默认情况下会检索到第一个ID 等于“btn ”的按钮。控件检索不够精确。在服务端,当需要取客户端用户输入的数据时也不能正确访问到想到取值的控件。在模板控件中,也会遇到此问题。 以上存在的这些问题,就是通过继承INamingContainer 接口来解决的。我们要做的就是继承此接口而已,不需要写任何额外的代码。把INamingContainer 接口加到控件中:

///

/// 获得本书更多内容

,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

public class INamingContainerControl : WebControl, INamingContainer {

…; }

重新编译控件并在浏览器中运行,查看源代码,如下:

40

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

控件中子控件的ID 都加上了父容器的ID 和分隔符作为前缀,由于父容器的ID (即控件

的ID )是唯一的,所以也就保证了:即使一个页面中使用了多个本控件,生成的所有子控件的ID 都是唯一的。

说到这里,INamingContainer 的作用就是解决一个页面中使用多个自定义控件的ID 命名冲突问题。多个自定义控件也可能不是指多个同一个控件,如果我们开发了多个不同的自定义控件,只要这些控件里面有名字一样的,都会存在命名冲突问题。

3.7 实现复合控件

从实现方式来看,控件分为以下三种类型:

(1)基本自定义控件:不包括现有的子控件,此类控件一般所有标记都要自己编码输出内容,包括所有的事件等。本章之前章节所有内容讲的都是基本自定义控件生成机制。

(2)继承控件:继承于现有的控件,扩展或修改了现有控件的功能。

(3)复合控件:也称为组合控件,主要是把一些现有完整功能组件组合起来,形成单一的功能主控件,并且有主控件统一控制接口,每个子控件不再独立提供接口,复合控件所公开的方法集和属性集通常由构成组件的方法和属性提供,并加入一些新成员。复合控件也可以引发自定义事件,还可以处理并激起子控件所引起的事件。

本节主要讲第三种:复合控件。相对第一种来说,复合控件比较容易理解,基本自定义控件理解起来更抽象一些。

通常情况,复合控件类要派生自https://www.doczj.com/doc/6418478703.html,positeControl 类。在https://www.doczj.com/doc/6418478703.html, 1.x 环境下只能继承System.Web.UI.WebControl 抽象类并自己实现System.Web.UI. INamingContainer 接口来实现复合控件。然而,在https://www.doczj.com/doc/6418478703.html, 下,复合控件类的基类则发生了变化。

下面介绍一下CompositeControl 类,其声明代码如下所示:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

public abstract class CompositeControl : WebControl ,INamingContainer ,ICompositeControlDesignerAccessor

{

//… … }

CompositeControl 类是一个抽象类,该类可为自定义控件提供命名容器和控件设计器。CompositeControl 类继承自WebControl 基类,并且实现INamingContainer 和ICompositeControlDesignerAccessor 接口。

INamingContainer 是一个没有方法的标记接口,当控件在实现INamingContainer 时,页框架可在该控件下创建新的命名范围,因此能够确保子控件在控件的分层树中具有唯一的名称,当复合控件公开模板属性,提供数据绑定或需要传送事件到子控件时,这一点是非常重要的。在控件中可以通过NamingContainer 属性访问命名容器,比如:

this.NamingContainer.ClientID + “_” + this.ID this.ClientID

INamingContainer 命名窗口在前面 3.6节也已经作了详细说明。

41

第3章 从零开始开发服务器控件

ICompositeControlDesignerAccessor 接口使复合控件设计器可以在设计时重新创建其关联控件的子控件,该接口包含一个需要实现的方法RecreateChildControls ,该方法使复合控件的设计器可以在设计时重新创建该控件的子控件。

如果创建的是数据绑定复合控件,那么自定义控件类的基类应该是CompositeDataBound Control ,关于数据绑定控件后面也有章节专门介绍。

除了继承CompositeControl 类,还要掌握其成员和方法。掌握这些成员对于开发复合控件也很重要。下面讲解CompositeControl 类比较常用的方法和属性。

3.7.1 CreateChildControls 方法

重写从Control 继承的受保护的CreateChildControls 方法,以创建子控件的实例,并将它们添加到Controls 集合,此方法可能会在页面和控件的生命周期内反复调用。为避免控件重复,ChildControlsCreated 属性通常被设置为true 。如果此属性返回true ,则CreateChildControls 方法会立即退出。在3.5节也已经作过说明。

3.7.2 ChildControlsCreated 属性

该属性的数据类型为bool ,其用于获取一个值,该值指示是否已创建服务器控件的子控件。如果已创建子控件则该属性为true ;否则为false 。该属性主要是为了避免CreateChildControls 方法重复创建控件。

3.7.3 EnsureChildControls 方法

该方法用于确定服务器控件是否包含子控件。如果不包含,则创建子控件。该方法首先检查ChildControlsCreated 属性的当前值。如果此值为false ,则调用CreateChildControls 方法。当需要确保已创建子控件时,将调用该方法。大多数情况下,自定义服务器控件的开发人员无须重写此方法。它的基类虚方法源代码如下:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

protected virtual void EnsureChildControls() {

if (!this.ChildControlsCreated && !this.flags[0x100]) {

this.flags.Set(0x100); try {

this.ResolveAdapter();

if (this._adapter != null) {

this._adapter.CreateChildControls(); } else {

this.CreateChildControls(); }

this.ChildControlsCreated = true; }

finally {

42

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

this.flags.Clear(0x100);

} } }

3.7.4 RecreateChildControls 方法

重写ICompositeControlDesignerAccessor 接口的RecreateChildContrls 方法,它的基类虚实现代码如下:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

protected virtual void RecreateChildControls() {

base.ChildControlsCreated = false; this.EnsureChildControls(); }

其功能主要是间接调用了CreateChildControls 方法。这样在设计模式下,就可以执行创建子控件的方法并呈现创建的子控件。第1章已经讲过了,默认在设计模式情况下CreateChildControls 方法是不执行的。

如果从WebControl 类继承创建控件,则一般还要实现Render 方法,借助Render 方法呈现控件。Render 方法在设计模式和运行模式下都执行。

3.7.5 Controls 属性

该属性的数据类型为ControlCollection ,用于获取ControlCollection 对象,此对象表示UI 层次结构中指定服务器控件的子控件。其属性值指定服务器控件的子控件集合,可以直接通过索引访问Controls 集合中的控件,当子控件比较多时,经常会通过后面 3.7.8节讲到的FindControl 方法检索子控件。

其属性源代码如下:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

public override ControlCollection Controls {

get {

this.EnsureChildControls(); return base.Controls; } }

3.7.6 HasControls 方法

该方法用于确定服务器控件是否包含任何子控件。如果控件包含其他控件,则返回值为true ;否则返回值为false 。由于该方法仅确定是否存在任何子控件,可以通过允许您避免不必要的Controls.Count 属性调用来改进性能。调用此属性要求实例化ControlCollection 对象。如果没有子级,则创建该对象会浪费服务器资源。

该方法从基类Control 继承而来,其源代码如下:

43

第3章 从零开始开发服务器控件

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

public virtual bool HasControls() {

return (((this._occasionalFields != null) && (this._occasionalFields. Controls != null)) && (this._occasionalFields.Controls.Count > 0));

}

代码中_occasionalFields 对象类型为OccasionalFields ,OccasionalFields 类中包括子控件集合对象ControlCollection 类型的实例。通过判断对象是否为null 来确定是否有子控件要比创建对象实例判断是否有子控件时(Controls.Count )性能要好许多,且OccasionalFields 类中不仅有ControlCollection ,还有EventHandlerList ,SkinId ,ControlsViewState 等对象的集合等。

3.7.7 HasEvents 方法

这是一个https://www.doczj.com/doc/6418478703.html, 2.0已经支持的方法,用于返回一个值,该值指示是否为控件或任何子控件注册事件。如果注册事件,则返回值为true ;否则为false 。

该方法也是从Control 基类继承而来,其源代码如下:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

protected bool HasEvents() {

return ((this._occasionalFields != null) && (this._occasionalFields. Events != null));

}

对此方法的说明请参见3.7.6节。

3.7.8 FindControl 方法

该方法用于在当前的命名容器中搜索指定的服务器控件,其参数为要检索的控件ID 。该方法也是从Control 基类继承而来,.NET Framework 中源代码如下:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

protected virtual Control FindControl(string id, int pathOffset) {

string str;

this.EnsureChildControls(); if (!this.flags[0x80]) {

Control namingContainer = this.NamingContainer; if (namingContainer != null) {

return namingContainer.FindControl(id, pathOffset); }

return null; }

if (this.HasControls() && (this._https://www.doczj.com/doc/6418478703.html,dControls == null)) {

this.EnsureNamedControlsTable();

44

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

}

if ((this._occasionalFields == null) || (this._occasionalFields. NamedControls == null))

{

return null; }

char[] anyOf = new char[] { '$', ':' };

int num = id.IndexOfAny(anyOf, pathOffset); if (num == -1) {

str = id.Substring(pathOffset);

return (this._https://www.doczj.com/doc/6418478703.html,dControls[str] as Control); }

str = id.Substring(pathOffset, num - pathOffset);

Control control2 = this._https://www.doczj.com/doc/6418478703.html,dControls[str] as Control; if (control2 == null) {

return null;

}

return control2.FindControl(id, num + 1); }

该方法代码为.NET 类库内部源代码,仅了解即可。此方法的功能主要是通过递归原理检索指定ID 的控件。

3.7.9 实现复合控件示例

本节就基于前面几节的内容,实现一个复合控件Field 。

本控件由一个Label 和一个TextBox 控件组成,一般在界面上用于表示一个数据字段(标签+文本框)。从工具箱分别拖一个Label 和一个TextBox 控件,如果把这两个控件封装成一个Field 控件,则仅需要拖一个Field 控件就可以实现相同功能。另外,此控件还具有验证功能,开发人员可以任意设定验证表达式,来验证用户的输入。

做好的控件在设计器中的样式如下:

下面来讲解此控件实现方案。首先建立一个继承CompositeControl 类的Field 类,如下所示:

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

[DefaultProperty("TextBoxValue")]

[ToolboxData("<{0}:Field runat=server>")] public class Field : CompositeControl {

//… … }

接下来在类内部定义几个子控件和一些属性接口,代码如下:

private Label lb; private TextBox tb;

private RegularExpressionValidator rev;

上面定义了三个子控件:Label ,TextBox ,ReqularExpressionValidator 。Label 主要用来显示控件标题,TextBox 主要用来显示控件值,RegularExpressionValidator 控件是正则表达式验

45

第3章 从零开始开发服务器控件

证控件,主要用来验证用户输入值(即TextBox 的值)。

LabelTitle 属性功能是获取或设置Label 子控件的值。注意代码this.EnsureChildControls()的主要功能是保证访问子控件时,子控件集合对象已经被创建。EnsureChildControls 方法内部的逻辑是先判断子控件集对象是否被创建,如果没有创建,它会调用CreateChildControls 方法创建子控件集对象。

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

[Category("LabelTextBox")] [Description("标签显示信息")] public string LabelTitle {

get {

this.EnsureChildControls(); return this.lb.Text; } set {

this.EnsureChildControls(); this.lb.Text = value; } }

TextBoxValue 属性主要是用来获取或设置子控件TextBox 的值。此属性是控件表示值的主要属性,因为在类上方有元数据设计属性:[DefaultProperty("TextBoxValue")],表示此属性为控件的默认属性,关于控件属性在第4章作专题讲解。

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

[Category("LabelTextBox")] [Description("文本框显示文本")] public string TextBoxValue {

get {

this.EnsureChildControls(); return tb.Text; } set {

this.EnsureChildControls(); tb.Text = value; } }

LabelWidth 属性主要用来获取或设置标题(Label )的宽度。比如当标题显示文本长度比较长时,可以通过此属性使标题子控件的宽度值增大至可以容纳标题所有文本的宽度。

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

[Category("LabelTextBox")]

46

庖丁解牛——纵向切入https://www.doczj.com/doc/6418478703.html, 3.5控件和组件开发技术

[Description("标签宽度")]

public Unit LabelWidth {

get {

this.EnsureChildControls(); return this.lb.Width; } set {

this.EnsureChildControls();

this.lb.Width = value; } }

LabelHeight 属性主要用来设置标题显示控件的高度。在表示宽度或高度等属性时一般建议使用Unit 类型,而不建议使用int ,string 等类型(有些控件开发人员喜欢这么做),使用这些类型在一般情况下也是可行的,但功能远没有Unit 强大,Unit 可以支持整型、字符串、百分比、点、像素等值类型。

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

[Category("LabelTextBox")] [Description("标签高度")] public Unit LabelHeight {

get {

this.EnsureChildControls(); return this.lb.Height; } set {

this.EnsureChildControls(); this.lb.Height = value; } }

TextBoxWidth 属性主要用来设置子控件TextBox 的宽度,与LabelWidth 功能相似。

///

/// 获得本书更多内容,请看:

/// https://www.doczj.com/doc/6418478703.html,/ChengKing/archive/2008/08/18/2792440.aspx ///

private Unit unitTextBoxWidth = Unit.Empty; [Category("LabelTextBox")] [Description("文本框宽度")] public Unit TextBoxWidth {

get {

this.EnsureChildControls(); return this.tb.Width; } set {

this.EnsureChildControls(); this.tb.Width = value; }

日语入门1

第一回 大家好!从今天开始,我们要和大家一起从零开始学日语。学习日语,都是从「あいうえお」开始的,虽然有些枯燥无味,但是每个人都是从这里开始学起的。 第1课是「五十音図」。 じゃ、始めましょう。 ◆日语是由假名、汉字、罗马字组成的。五十音按照发音规律可排列成表,叫做“五十音图”。 ◆表的横向称「行」,每行五个假名,共有十行。纵向称「段」,每段十个假名,共有五段。 ◆但其实五十音里假名没50个。 "い"、"え"各出现三次,"う"出现两次,包括拨音"ん"的话,共46个假名。

◆每个假名下面的“罗马字”是近代为了表记的方便才创造的,所以并不代表正确的日语发音。 但在用电脑输入日文时,输入这个罗马字就会出来各个假名。 ◆“五十音图”不仅有「あいうえお」等“平假名”,还有「??ウエオ」等“片假名”。 每个平假名都有各自对应的片假名。例如平假名「あ」的片假名是「?」。 第二回 あ行:あいうえお ??ウエオ (它们代表五个元音,其他各行基本上表示辅音+元音形成清音。) 下面我们进入“发音巩固练习”环节! 愛あい①家いえ②上うえ②甥おい?柿かき?赤あか①秋あき①菊きく?池いけ②恋こい①酒さけ①四季しき②寿司すし②汗あせ①嘘うそ①歌うた②下した?父ちち②地下鉄ちかてつ?月つき②テスト①外そと①夏なつ②西にし?犬いぬ②猫ねこ①兄あに①姉あね②角つの②

?型:表示只有第一拍低,其他各拍都高。 ①型:表示只有第一拍高,以下各拍都低。 ②型:表示只有第二拍高,第一拍和第三拍以下各拍都低。 ③型:表示第二拍,第三拍高,第一拍和第四拍以下各拍都低。 ④型:表示第二拍至第四拍高,第一拍和第五拍以下各拍都低。 ⑤型:表示第二拍至第五拍高,第一拍和第六拍以下各拍都低.。 ⑥型:表示第二拍至第六拍高,第一拍和第七拍以下各拍都低。 第三回 拨音ん:ん(ン)

必备员工转正申请书模板7篇

【必备】员工转正申请书模板7篇 在人们越来越重视自我提升的今天,有各项事务需要申请书,转正申请书可以使我们的转正请求得到合理表达。你还在为写转正申请书而苦恼吗?下面是作者帮大家整理的员工转正申请书7篇,仅供参考,希望能够帮助到大家。 员工转正申请书篇1 尊敬的公司领导: 我是xx部门的实习(或者试用)保安员xxx,于xxxx年xx月xx日进入本单位工作,担任实习(或试用)保安员一职,在x个月的工作当中xxxxxxx(把自己这段时间的工作简单介绍一下,尤其是取得了哪些成绩,受到什么表扬,然后一下对保安员这份工作的看法,例如强调责任心,最后表表决心,例如以后一定努力工作,在这个平凡但是重要的岗位上发挥更大的作用等等)。希望领导对我对我的转正申请予以批准,为感。 申请人: 年月日员工转正申请书篇2 尊敬的领导: 我于XX年1月1日成为公司的试用员工,到今天3月试用期已满,根据公司的规章制度,现申请转为公司正式员工。 本人工作认真、细心且具有较强的责任心和进取心,勤勉不懈,极富工作热情;性格开朗,乐于与他人沟通,具有良好和熟练的沟通技巧,有很强的团队协作能力;责任感强,确实完成领导交付的工作,和公司同事之间能够通力合作,关系相处融洽而和睦,配合各部门负责人成功地完成各项工作;积极学习新知识、技能,注重自身发展和进步。 刚到公司工作时,对公司的情况了解很少,对于企业对员工的要求和企业的发展方向只是有了一个简单的了解。通过这两个月的工作,我逐渐认识到,公司对员工的要求是全面的,从工作态度到业务能力到个人素质。企业是要全面发展的,如果员工个人的发展跟不上企业发展的速度,那么员工将被企业淘汰。作为公司这样一个高成长性公司中的一名员工,我有着强烈的紧迫感。在工作中我还存在着很多的不足,例如在业务知识和沟通能力上还存在很大欠缺。我会在今后

高级日语第一册课文翻译第二课

同一屋檐下 年老了要选择居住方式的时候,会有哪种形式呢?是和孩子一起住,独居又或者是住养老院……呢?一种和以前的居住形式都不同的,和他人相互扶持成火灾在同一屋檐下的全新的“最后的住处”这种形式如今逐渐诞生了。 速水澈 在仍然保留着水田和旱田的神奈川县伊势原市的郊外,一片能眺望到富士山的略高的地方,有一所名为“榉树”的集体住宅,在那里生活着三位老人和两位医大的学生。 大约20块榻榻米大小的起居室上下两层空间被打通,并且装有天窗,给人一种开放感。一楼是和式房间,二楼分别有三间铺木质地板的房间,加上厨房和卫生间大约有30平米。共同洗澡间有个舒适宽敞的丝柏质浴盆。房租6万5千日元。包括伙食费全部一起12万5千元。 做菜是由住在附近的房东岩崎弘子(58岁)负责,做饭,做酱汤,盛饭等等就由居住在这里的全体成员分担。大家围坐在餐桌旁热热闹闹得就像一个大家庭。一边吃饭一边聊天谈笑说些“那里的医生经常给我看病,真是风度翩翩啊”。之类的话。 居住近两年的秦女士(72)说:(住在这里)有一种有人陪伴的感觉。我就在这里养老送终了。 曾经一个人独自居住在东京?四谷的秦女士,三年前失去了至亲的

男友。当时她感到没有活下去的动力了。不知道将来该去投靠谁。那个时候,住在伊势原的妹妹告诉秦女士说榉树之家在招募居住者,虽然当时她很犹豫要不要离开住了30几年的四谷,但最终还是下定了决心。她说:“来了太好了。以前吃住都很不规律,现在一日三餐都规规矩矩地进食,原本40公斤体重都增加了10多公斤。” 秦女士在那里也交到了新朋友。很早就住在伊势原的老人们也聚集在岩崎在起居室里开办的绘画书信教室里,擅长绘画的秦女士很享受一个月两次的绘画书信课堂。 白天,榉树之家的玄关是不上锁的。住在附近的一些老人闲逛到这里,大家就一起聊天。(现在榉树之家)成了一个面对地域开放的集会场所。 年轻的居住者也很享受这里的生活。东海大学医学部的木矢绚子(19)来自广岛。去年春天,入学的时候就开始住在这里。木矢说“虽然和大家年龄层不同,但是可以轻松地谈笑,懂得了怎么跟同性女性交流。”木矢早上离开的时候都会对在起居室的秦女士们说“我要出门了”。 岩崎是因为照顾婶婶(86)的经验而想到创办“榉树之家”的。 近十年前,没有子女的叔叔婶婶从千叶搬到了伊势原。要想给上了年纪的夫妇租房实在是太困难了。因为既要考虑到安全问题又要考虑支付能力。后来总算找到了房子,但是八个月左右之后叔叔就去世了。岩崎说:自从叔叔去世之后,我就开始经常在半夜接到婶婶的电话,一想到她如果倒下了之类的事,心就跳得厉害。并且婶婶经常会打电

[学日本语]日语常用会话1000句PDF高清版可打印

日语常用会话1000句PDF高清版可打印 1、はじめまして。 初次见面。 2、どうぞよろしく。 请多关照。 3、よろしくお願いします。 请多关照。 4、こちらこそよろしくお願いします。 也请您多关照。 5、自己(じこ)紹介(しょうかい)いたします。 我来自我介绍一下。 6、これはわたしの名刺(めいし)です。 这是我的名片。 7、わたしは李(り)と申(もう)します。 我姓李。 8、山田さんでいらっしゃいますね。 您是山田先生吧! 9、私は山田です。 我是山田。 10、あのかたはどなたですか。 那位是谁? 11、こちらは社長(しゃちょう)の松本(まつもと)です。 这是我们总经理松本。 12、彼は中国人ではありませんか。 他不是中国人吗? 13、彼は中国人ではありません。 他不是中国人。 14、彼は日本人です。 他是日本人。 15、あなたも日本人ですか。 你也是日本人吗? 16、そうですか。 是吗? 17、はい。 是的。 18、そうです。 是那样的(是的)。 19、いいえ。 不对(不是)。 20、そうではありません。 不是那样的(不是)。 21、いいえ、ちがいます。 不,不对(不是)。 22、よくいらっしゃいました。 欢迎,欢迎。 23、お迎(むか)えにきました。 来欢迎您了。 24、出迎(でむか)えに参(まい)りました。 来欢迎您了。 25、お疲(つか)れでしょう。 路上辛苦了。 26、ちっとも疲(つか)れていません。 一点也不累。 27、それはなによりです。 那太好了。 28、途中(とちゅう)はどうでしたか。 旅途顺利吗? 29、とても順調(じゅんちょう)でした。 很顺利。 30、いつ上海(しゃんはい)をたちましたか。 什么时候离开上海的? 31、日本(にほん)は始(はじ)めてですか。 是第一次来日本吗? 32、皆(みな)さんのご来訪(らいほう)をお待(ま)ちしておりました。我们在等待着各位的光临。 33、わざわざお出迎(でむか)えしていただき、ありがとうございます。承蒙特意来接,深表谢意! 34、お忙(いそが)しいところをありがとうございます。百忙中特意来接,非常感谢! 35、日本(にほん)に来(き)た目的(もくてき)は? 来日本的目的是什么? 36、どのぐらいご滞在(たいざい)の予定(よてい)ですか。 预定停留多久? 37、二年(にねん)ないし三年(さんねん)の予定(よてい)です。 预定二年或三年。 38、このたび日本(にほん)に来(く)ることができて、たいへん嬉しく思っています。 这次能来日本,感到很高兴。 39、たいへんお手数(てすう)をおかけしました。 给您添麻烦了。 40、どういたしまして。 不用客气。 41、おはようございます。 早上好! 42、こんにちは。 你好! 43、こんばんは。 晚上好! 44、おやすみなさい。 晚安(您休息吧)! 45、ご飯(はん)ですよ。 吃饭了! 46、いただきます。 我吃饭啦。 47、ごちそうさま。 承蒙款待,谢谢!

《大家的日本语》课文第二课

第二課 新しい言葉 招待状(しょうたいじょう)请贴邀请涵 クラブ俱乐部 直す 国際 家庭 大丈夫 しばらく ごぶさたする 思い出す 日時 広告 過ぎる 会館 場所 たのしみにする どうか はじめる 一緒に考えましよう 1.日本へ来たから、どんな人に手紙をもらいましたか 2.今までもらった手紙カードの中で、一番うれしかったものは何ですか 3.どんなときに手紙を書き、どんなときに電話をかけますか 4.友達や家族に自分の気持ちを言いたいとき、手紙と電話と、どちらがいいですか 5.日本人やほかの国の友達と話すとき、どんなことがむずかしいですか 伝える 陽一とアンさんから結婚式の招待状が来た。二人とは、学生時代から学部もグラブもずーと同じたっだの手、家族の誰かが結婚するようで、とてもうれしい。招待状も昔から決まっている難しい言葉をたくさん並べたものではなく、、二人の気持ちを伝える大変いいので、二人がにこにこしながら(来てくださいね)と言っているようだった。招待状をもらってすぐに陽一の勤めている広告会社に電話をかけて(おめでとう、良かったな)と言った。陽一に(いい招待状だな)と言うと、(あれはアンさんが書いたのを僕が少し直したんだよ。また遊びに来てくれよ、と言っていた。国際結婚は難しいと言うけれど、二人は大丈夫。いい家庭を作るだろう しばらくご無沙汰しておりますが、皆様、お元気でしょうかいつも、いろいろおせわになっています。 さて、私たち今度結婚することにしました。学生時代の小林先生のクラスで始めて会

い、それからもう五年が過ぎました。結婚式にはたくさんいい思い出を作って下った小林も着てくださるそうで、とても喜んでいます。 私たちが新しい生活を始める記念の日に皆様にも是非来ていただいて、ご一緒の楽しく話ししたいと思います。お忙しいとは思いますが、来ていただければとてもうれしいです、おまちしております。 お返事を十日までにお知らせください。どうが、よろしくお願いいたします。 日時11月23日午後2時 場所桜会館 11月3日中村陽一

学习日语的八大误区

学习日语的八大误区 日语学习者,尤其是初学者在经历过短暂的蜜月期后会遇到各种各样的问题,从而影响了日语学习的效果,阻碍了进一步前进的步伐,而这些问题的产生,涉及到多方面的原因。为了能够帮助日语学习者减少和消除学习上的障碍,笔者结合自己的教学经验总结了在学习日语的过程中有可能碰到的阻碍日语学习的障碍因素。 1、日语零基础入门阶段一味的死背单词,忽视听说基础。 很多从零开始学日语的学生抱怨说:自己单词都背下来了,但是在老师听写的时候或者在听力中根本就不知所云。其实,那是因为很多学生平时只是默默地背单词,不断地反复的记忆中日文的对照含义,往往忽略了耳朵能够捕捉信息的能力。尤其在日语零基础入门阶段,大脑对日语还是比较陌生的状态,就更需要在背单词的时候要多去听,跟着课本上的录音不断地读。 2、日语零基础入门阶段学习中忽视学汉字,用时方知难。 日语当中有中国汉字,这是人人皆知的。正因为我们都懂得汉字的意思,所以日语零基础入门阶段的同学很容易忽视汉字的学习。但是,日语当中的汉字分为音读和训读,若在日语零基础入门阶段不用心学习,这也必将给今后日语学习带来难以想象的困难。 3、单词只背最基本的第一个意思。 日语中很多单词意义比较的多,很多同学只背最表层的一个

意思,这是不行的。如甘(あま)い,大部人学日语的人都知道它的意思是甜的,但是除此之外还有甜蜜的;宽松、好说话;天真的等意思。在日语零基础入门阶段,同学往往顾不及那么多,只觉得背下来一个意思就已经会了这个日语单词,这样的做法只会给今后的学习埋下隐患。 4、缺乏吃苦耐劳、持之以恒的精神 大多数学习者未能学好日语的主要原因,就是在学习日语的过程中不能持之以恒,一天打渔,三天晒网,久而久之丧失了学习日语的激情,进而败下阵来。另外一味讲究所谓的方法和技巧,只可能会被其占用很多的时间和精力,而语言的运用技能不是靠一些技巧就能获得的,必须要用辛勤的汗水才能换得。我们在学习过程中会遇到各种困难,但我们不能向困难低头,要坚持不懈坚持下去。就光拿国际日语能力测试一级部分的单词来说,大纲要求掌握2000字左右的汉字,10000个左右的词汇,这么大的词汇量如果不经过反复的记忆和练习,怎么可能牢固记忆呢?艾宾浩斯遗忘曲线原理也告诉我们:人的遗忘速度在最初是相当快的,然后减慢,然后再趋缓,逐渐接近水平,这也就指出了复习巩固旧知识必须及时的重要性。而这些无一都离不开吃苦耐劳和持之以恒的精神。 5、缺乏归纳整理的能力 善于归纳整理,可以显著提高学习效率,使学习达到事半功倍的效果。认为日语助词非常难于掌握的学习者不在少数,例如:助

日语入门学习

日语入门学习 1、日语语音的基本特点: 1)假名是日语语音的最小元素,单词和句子都是由假名组成; 2)每个假名都是单音节,由一个元音和一个辅音(也可能没有辅音)构成,辅音不单独发音,必须和元音一起组成一个假名的完整读音(促音、拨音除外);3)日语的元音为五个:あいうえお,辅音有 k s t n h m y r w g z d b p以及促音和拨音。 4)日语为音拍语,一个假名为一拍,即是说,每个假名在同一个句子中占有等同的时间间隔,不可或长或短。拨音和促音单独占一拍。 日语的概况:日本国原来只有语言而没有文字,在中国隋唐时代,大量的汉字传入日本,日本人在吸收中国古汉字的基础上又另创造了一些文字,叫假名。所以至今为止,日本的文字就是大量的“中国古字”+“假名”构成!日语的变迁:1946 年,日本教育省对日本文字进行改革,选出中国古汉字1850个做为正式教育文字;1981年,日本教育省又进行审核,将1850个中国古汉字和自创的假名正式 立为本国文字。要学日语的发音就要先学“五十音图”,五十音图就和我们中国小学生学汉字前先学习汉语拼音一样,先学好拼音,再学汉字!学日语也一样,先学好“五十音图”再学日文!日语五十音图,是指日语的五十个清音,在日语 中,它既是日语的字母,也是日语的发音,分为平假名和片假名,相当于英语中字母大写和小写的区别,在应用上还是以平假名为主,片假名主要是用来表示外来语和特殊的词汇,在学习的时候,平假名和片假名是同样重要的。平假名是由汉字的草体简化而来的,片假名则是由汉字的楷体的偏旁部首简化而来。将这五十个清音假名按照发音的规律排列起来的表,分为五段十行,实际上共有45个音。横的叫行,竖的叫段,第一行的五个母音,是日语发音的基础,每行都以这一行的第一个假名命名,如第一行,あいうえお,叫あ行假名,每段也以第一个假名命名,如あかさたなはまやらわ,就叫あ段。行和段在日语的学习里是十分重要的,因为日语的动词形容词等很多词尾的变化就体现在各行各段规律里,所以学习五十音并不只是要会读会写,牢记它们的位置也是十分重要的。平假名和片假名可以代表读音也可以代表字。 平假名和片假名的区别平假名是日语中表音符号的一种。平假名是从中国汉字的草书演化而来的。早期为日本女性专用,后随着紫式部的《源氏物语》的流行而使得日本男人也开始接受和使用平假名。现代日语中,平假名常常用来表示日语中的固有词汇及文法助词,为日文汉字注音时一般也使用平假名,称为振假名。『平假名』是由汉字的草书简化得来的,『片假名』是由楷书的偏旁盖冠得来。日语的字母称为假名(かな),有平假名(ひらがな)和片假名(かたかな)两种.平假名和片假名是对应的,。“假”即“借”,“名”即“字”。只借用汉字的音和形,而不用它的意义,所以叫“假名”平假名:它由48个字

刘珣版对外汉语教育学引论笔记

第一章对外汉语教育是一门专门的学科 第一节对外汉语教育的学科名称 一、语言教学中有关语言的几个基本概念 1、第一语言和第二语言——这是按人们获得语言的先后顺序来区分的两个概念。 第一语言是指人出生以后首先接触并获得的语言;第二语言指人们在获得第一语言以后再学习和使用的另一种语言。有的幼儿出生以后同时获得两种或两种以上的语言叫双语或多语现象。 2、母语和外语——这是按国家的界限来划分的。 母语是指本国、本民族的语言;外语是指外国的语言。一般情况下,母语是指人们的第一语言,但不能等同。 3、本族语和非本族语——这是按言语社团,通常是按民族的界限来分的。 本族语就是本民族的语言,这一术语可以与“母语”通用。非本族语是指本族以外的语言,可能是外语,也可能是指本国其他民族的语言。从对语言的掌握程度及运用情况来看,母语、本族语和第一语言通常是一个人的“主要语言” 4、目的语——这是指人们正在学习并希望掌握的语言。 “第二语言”和“外语”这两个概念的区分是一个比较复杂的问题。一般来说,第二语言是指母语之外的、本国通用语或本国其他民族的语言,而外语是指别国家的语言。但是近年来出现一种用“第二语言”取代“外语”的趋向。这是因为,各国间交流与合作加强,世界正越来越小,在这种情况下,称“外国人”和“外语”就显得见外了;另一方面“第二语言”就学习时间先后这层意义上说,确实可以说包括外语、非本族语,特殊情况下甚至包括母语。广义地说,第二语言与外语的关系是包容的关系。 西方学者还从有无语言学习环境的角度,对“第二语言”和“外语”做了区分:凡是在该语言使用的环境中学习的目的语成为第二语言;而不在其使用环境中学习的目的语成为外语。综上所述,广义的“第二语言”是指任何一种在第一语言获得以后学习和使用的语言,包括外语。狭义的“第二语言”有两种情况:一种是指第一语言以外的本国通用语或本国其他民族的语言,不包括外语;另一种情况是指在该语言的使用环境中学习的目的语,包括一部分外语。 二、学科名称的讨论 1、对外汉语教学 《中国大百科全书-语言文字》中写到:“对外汉语教学是指对外国人的汉语教学”。实际上也包括对第一语言不是汉语的海外华人进行的汉语教学。这一名称基本上体现了这个学科的特点和内涵,简洁上口、符合汉语习惯。局限:只突出了主要教学对象,未能全面准确地反映学科性质——第二语言教学。 2、汉语教学 “对外汉语教学”原本是针对国内教外国人汉语这一事业所起的名字,明显带有从中国人的视角来称述这一学科的色彩。“对外”二字无法为国外从事汉语教学的同行使用,因此它只适用于中国。海外同行有的叫“中文教学”(美国),有的叫“中国语教学”(日本),也有的叫“华文/语教学”(东南亚) 3、汉语作为第二语言的教学 从学术上较精确地指称这一学科内涵和性质的,应该是“汉语作为第二语言的教学”(Teaching of Chinese as a Second Language,TCSL)这一名称能统指以上各名称,但名称太长不上口。 4、应用语言学 广义的应用语言学是跟理论语言学相对的概念,指把理论语言学的理论、规律原则和方法应用到其他学科领域,从而产生的新的边缘学科,如神经语言学、病理语言学、数理语言学、计算语言学、社会语言学、心理语言学等。狭义的应用语言学则专指语言学理论在语言教学中的应用,特别是第二语言教学。 5、外语教学法 这是国外语言学界广泛使用的名称,我国外语教学界也长期使用,但这一名称不能表示出作为一门学科的理论层次和它所包含的全部内容。 6、外语教育学 7、第二语言教学 三“对外汉语教育学科”的提出(P7、8) “教育”的内涵要比“教学”丰富得多,指从德智体美方面培养人的社会活动。对留学生的培养也要根据国际教育的惯例,进行德智体美全面发展的综合素质教育。因此,本学科的研究任务也就不仅仅限于教学一个方面,而是包括教育原理和教育规律、各学科、国家政策和设备等内、外部要素。 第二节对外汉语教育的学科任务和学科体系 一、对外汉语教育的学科任务 对外汉语教育的学科任务是研究汉语作为第二语言的教育原理、教育过程和教育方法,并用来指导教育实践,从而更好地实现学习者德智体美全面发展的教育目的。 对外汉语教育学科研究的核心内容是对外汉语教学。通过研究汉语作为第二语言教与学的全过程和整个教学系统中各种内部和外部因素及其相互作用,揭示汉语作为第二语言学习和教学的本质特征以及学习规律和教学规律,从而制定出对外汉语教学的基本原则和实施办法,并用来指导教学实践,以提高学习效率。 内部因素: A学习与教学活动的主体——学习者和教师,包括学习者心理、生理策略等个体因素和教师的基本素质。 B学习与教学活动的客体——所教的目的语,即作为第二语言的汉语 C学习与教学活动的本身——包括总体设计、教材编写、课堂教学和测试评估等环节和理论。 外部因素: 首先是一些基础学科,其次是语言环境,包括社会语言环境和教学语言环境,及其对学习者所产生的影响,还包括国家的方针政策,教育资源、条件对教学实践所产生的影响。 对外汉语作为一门分支学科,还有一项任务。即以自身的学科理论建设,为第二语言教育学科甚至整个语言教育学科的理论发展做出贡献。现有语言学理论是以西方语言为基础的,是否适合汉语还有待于进一步验证。另一方面,从汉语特点出发研究汉语习得和教学的特殊规律,则可以丰富人们对语言教学普遍规律的认识。 二、对外汉语教育的学科体系 1、国内外学者提出的各种语言教育体系模式(P10) 2、对外汉语教学学科体系(三个层次) 第一层次:理论基础部分。 理论基础部分提出与本学科发展关系最为密切的七个基础学科:语言学、心理学、教育学、文化学、社会学、横断学科、哲学。 第二层次:学科理论体系——属于本学科范围内的学科理论体系包括:基础理论和应用研究。

高级日语2 第二课 翻译

第二课日本语的表情 融入生活的语言 日本人是不愿意把什么事情都讲得一清二楚的,这种倾向己经变得像生活原理一般正广泛渗透融入到日本人的语言生活当中。接下来,让我们来看一些实例。 首先,是“京都茶泡饭”这个词。不过这并不是指有名的高级日式餐厅的茶泡饭,而是指语言方面的茶泡饭。家里来了客人,因临近用餐时间客人欲起身告辞,此时京都人会挽留客人说“我这里什么都没为您准备,但至少请吃点茶泡饭之类的”。如果即使这样客人仍执意要回去的话,他们甚至会哭着恳求你说请留下来,哪怕吃碗茶泡饭也好。一旦客人盛情难却打算接受对方的款待说“啊!既然如此…”,那可就麻烦了。主人就会慌慌张张地叫外卖什么的,开始做准备,并且客人还会给人留下不懂礼仪的坏名声,很久很久也挽回不了声誉。客人应该不论主人怎么说都要回答“下次吧”或是“是吗?尽管您特意准备了但…”,然后告辞,这才是符合礼仪的作法。以上说的就是赫赫有名的“京都的茶泡饭”。总之,对方拜求你做的并不是他真心想要你做的(因为并非真情实意的恳求),因此不知道的人很容易上当受骗。

这些用法,不了解是不行的,但有时是即使了解了也不一定知道个 中原因。假设就某事进行交涉时听到京都人或大阪人回答说“那件事, 请让我考虑一下” 。那么,这句话的含义与“考虑中”这种表面意思相反,是表示拒绝的回答。但它却让听者觉得讲话人将给予慎重考虑,并期 待之后或许会有令人满意的答复。东京等外地人事后催促他们给予答 复时,有时会因“不对,我很早以前就答复你了”的回应而气愤不已。 凭借让对方抱有某种期待,以令对方不当场受到任何伤害,或许这句 话确实缘于这种良苦用心,但同时的确也是一个极其棘手的词汇(很 容易让人误会的说法)。英语中也有let、me、thank、it、over这样 的表现,在表示委婉的拒绝时经常使用。另外,去购物时让对方拿来 各种各样的商品给自己挑选,然后回答说“要回家和老婆商量一下,所以…”。这种说法就等同于说不买。难以启齿时的心理,确实存在着程 度上的差别,但也许是大同小异的。 “向前看”“妥善处理” 作为“认真考虑”的共通语,有必要提一下“妥善处理”这种表达。这 个词在日美纺织谈判中成了问题,在国际上出了名。在佐藤?尼克松会 谈上,佐藤首相就纺织品出口问题回答说“妥善处理”,而美方将其理 解为已经达成协定。之后,佐藤坚持说不记得做过承诺。对说与没说 的争论经过调研后才明白,原来美方把佐藤所说的“妥善处理”认为已

always with me《千与千寻》 中文歌词 罗马音及日文歌词

《千与千寻》always with me 中文歌词罗马音及日文歌词呼唤心灵深处的某个地方 总想保持令人心动的梦想 悲伤虽然无法尽数 在它对面一定能与你相逢 每次重蹈覆辙时人总是 仅仅知道碧空之蓝 虽然永无止境的道路看起来总在延续 这双手一定可以拥抱光明 别离时 平静的胸怀 虽然从零开始仍要侧耳倾听 活着的不可思议死去的不可思议 花,风,街道都一样 啦啦啦…… 啦啦啦…… 啦啦啦…… 呼唤心灵深处的某个地方 不论何时与我同在去描绘梦想吧 与其道尽悲伤的数目 不如用相同的双唇轻轻歌唱 走向尘封的回忆中总是 听得到不愿忘记的细语 即使是在 被粉碎的镜子上 也会映出崭新的美景 开始的清晨那宁静的窗口 因为将从零开始渐渐被充实 不再追寻大海的彼端 因为那闪光的东西一直就在这里 在我心中被发现 啦啦啦…… 啦啦啦…… 1.yo n de i lu / mu ne no do ko ka o ku de 呼んでいる胸のどこか奥で 2、i tsu mo ko ko lo o do lu / yu me wo mi ta i いつも心踊る梦を见たい 3、ka na shi mi wa / ka zo e ki le na i ke le do 悲しみは数えきれないけれど 4、so no mu ko u de ki to / a na ta ni a e lu その向こうできっとあなたに会える

5、ku li ka e su a ya ma chi no / so no ta bi hi to wa 缲り返すあやまちのそのたびひとは 6、ta da a o i so la no / a o i sa wo shi lu ただ青い空の青さを知る 7、ha te shi na ku / mi chi wa tu zu i te mi e lu ke le do 果てしなく道は続いて见えるけれど 8、ko no li yo u te wa / hi ka li wo i da ke lu この両手は光を抱ける 9、sa yo na la no to ki no /shi zu ka na mu ne さよならのときの静かな胸 10、ze lo ni na lu ka la da ga / mi mi wo su ma se lu ゼロになるからだが耳をすませる 11、i ki te i lu fu shi gi / shi n de i ku fu shi gi 生きている不思议死んでいく不思议 ha na mo ka ze mo ma chi mo minna o na ji 12、ららら……(la la la ……) おおお……(o o o ……) るるる……(lu lu lu ……) 13、yo n de i lu / mu ne no do ko ka o ku de 呼んでいる胸のどこか奥で 14、i tsu mo na n do de mo / yu me wo e ga ko u いつも何度でも梦を描こう 15、ka na shi mi no ka zu wo / ii tsu ku su yo li 悲しみの数を言い尽くすより 16、o na ji ku chi bi lu de / so to u ta o u 同じくちびるでそっとうたおう 17、To ji te i ku o mo i de no / so no na ka ni i tsu mo 闭じていく思い出のそのなかにいつも 18、wa su le ta ku na i / sa sa ya ki wo ki ku 忘れたくないささやきを闻く

2021陕西师范大学英语语言文学考研参考书真题经验

陕西师范大学 ——英语语言文学

匆匆之间,考研就结束了,一切都是那么云淡风轻,我把自己的经验写出来,分享给大家,当初的我也是到处找学姐学长们的经验贴才不至于那么迷茫。但是我想说的是同学们不要三心二意,也不要经受不住诱惑,一定要有自己的方向,资料什么的找最适合自己的,不要这个学姐说这个好你就看这个,那个说另外一个好,你就去看那个,这样像只无头苍蝇一样到处乱撞,只会让自己心里更加慌乱。我呢,报考的是陕西师范大学的英语语言文学,和外国语言学及应用语言学考试范围一样,所以报这两个专业的童鞋都可以参考这篇文章。 一、日语 关于新版旧版的讨论已经有很多了,至于我,我想说,1988年版本的标准日本语真是本好教材! 旧版日本语是很好的自学教材。我本科时学日语用的新版,复习时因指定参考书目是旧版,就买了旧版的日语二手书(顺便夸一下二手书,前人做的笔记也是很好的经验呀,而且还节省成本)。新版单词量大,(初)上下的单词能抵上旧版(初)上下+中上。可是语法就不行了,旧版中上的语法精华,新版初级上下里是找不到的。 另外,新版学习动词的时候,是从“ます”型学起,然后是“て”型和原型,这样给初学者带来的困惑,没有老师的指导,不容易解开。尤其是变“て”型时,一类动词而和二类动词的变化,因为“ます”型的扰乱,更加地令人纠结。这是我个人的感触。旧版的动词从原型开始,循序渐进,由少变多,由易到难,很多我在学新版时不解的问题,学习旧版时便豁然开朗了。 日语很烦人的一点就是非常琐碎,尤其是单词的识记。我的个人经验是,在以追求准确度的前提下,尽量用自己的联想记忆记单词。比如说这个词“渋滞”,假名是“じゅうたい”,我经常记不清轻重音。后来我家乡有一个城市叫九台,我就联想记忆成这个了。好吧方法是挺幼稚的,可是很有效呀~ 另外,学好教材,和应对考试也不完全相同,我用了一本阅读练习册,提升蛮大的。市面上有很多日语练习册,里面含有很多高校的考研二外日语真题,建议多做做培养题感。有精力的话,多看看日语三级也不错~ 二、文学语言学

日语学习必备软件全集(精华)

、日语五十音速成一日通V ."3 此软件面向所有想进入日语学习的用户,融合了视频教学与标准的真人发音,人与电脑的有机互动,包括了电脑语音复读,自由练笔等。作为一款共享软件,但是它却没有任何的功能限制。 详解: 1、日语五十音速成一日通的主界面 对于注册的用户,更可以免费得到由CCTV制作的《标准日本语》电视讲座电脑视频光盘(初级五十课时).另外还有在简体中文windows 环境下日文输入法的安装程序和日文输入法使用手册《标准日本语》初级MP3 文件.从而让你在更多的日本语环境下能快速地学习日语。 附加了这个用汇编语言开发的小程序"汉字标注假名",你只要把不会读的日文汉字Copy 一下,就会告诉你怎么读。 二、随想日语晶典2004 V 0. 2004. "05d 它是一款共享软件,未注册有时间和次数上的限制。 随想日语晶典原名随想日语词霸,是一款日汉汉日双向电脑词典工具软件。与其他同类软件相比,具有如下特色: 1、词典模型完备,用真正的日文字体显示日文,帮助学习者严格区分和掌握中日文汉字书写习惯和字形的微妙变化。 2、支持各种日文输入法,支持中日文汉字自动转换。

3、检索功能强大,可以使用通配符和多词组模糊检索,可以分别选择快速、标准、全文模式进行检索。提供中日文部首索引、中文拼音索引和日文假名索引,可以像传统纸质词典一样检索。支持语音朗读,全程TTS语音支持。 4、支持屏幕取词(Windows2000 以上操作系统)、即拷即译等方便快捷的功能。 5、提供生词本,可以随时将当前的单词加入或移出生词本,随想日语背单词还可将生词本作为背诵范围进行设定。生词本可以随意导入和导出。 目前提供的官方词库含有《日语考研大纲》《大学日语》《标准日本语》的全部词汇,提供第三方技术词库,词库不断更新中。 三、学日语背单词V 1. "6 真人语音版 为有一定日语基础的日语学习者能熟练记忆单词而制作的软件,类似于"我爱背单词"一类的英语学习软件,适用于WIN00/XP 等操作系统,目前收录了《大学日语》全四册的课后单词,共计四千余个,句型八十余个,可用于日语四级考试或日语能力测试的辅助学习。 其主要功能包括: 学习、查询、编辑、练习、设置、句型与打印。 共享软件,未注册有时间和次数上的限制。 四、环球使者—轻松背日语2004 V 1."0 环球使者-轻松背日语2004 是由沈阳格微软件公司在成熟的环球使者技术的基础上独立开发研制的辅助用户记忆日文的工具。该软件具有简单易用,方便灵巧等特点,具有强大的发音功能,生词本功能,每日一句功能等。 共享软件,未注册有时间和次数上的限制。

初学者日语歌,适合日语零基础的歌曲

初学者日语歌,适合日语零基础的歌曲 1,新垣结衣- “小さな恋のうた”“Heavenlydays” (节奏比较慢,比较合适刚刚学会五十音的同学) 2,羊毛和花-“仆は空にうたう”(歌词简单,里面的单词适合学习,很适合初学者,) 3,AKB48-“桜の木になろう”“桜の花びらたち”(正在学习初级上册的同学们、后面的这首要难一点。)如果你想学习日语可以来这个扣裙,首先是478,中间是932,最后是026,里面可以学习和交流,也有资料可以下载 4,下川みくに-“もう一度君に会いたい”(合适有一些单词积累的同学,初级水平)5,安室奈美惠-“ come”(这首歌超慢,合适刚刚会五十音的同学) 6,杨丞琳-“暧昧”(中国人唱的假名发音很清,歌也很慢)7,绚香-“ I believe”“why”(这两首歌很好听,而且旋律很慢。很好学的,适合唱功好的初学者 8,中孝介-“绊”“十年”“童话” 9,Angela Aki-拝启十五の君へ(这首歌,歌词很简单 10, 吉田亚纪子-“ありがとう”“i catch a cold”“梦追人”11,水树奈奈-“深爱”“それでも君を思い出すから”(歌词的旋律轻快,合适初级学完的同学) 12,幸田来未-“最後の雨”“TheMeaning Of Peace”“爱の

うた” 13,kiroro-“好きな人”“未来へ”“长い间”对应的中文版:she-记得要忘记, 14,松隆子-“梦のしずく”“梦的点滴”“花のように”“夏の记忆”(松隆子是演技很好的演员,和木村拓哉有合作过,唱歌也很好听,歌词很简单很适合初学者) 15,堀江由衣-“桜”(天天向上的主题曲)“HOLIDAY”“ For fruit basket” 16,熊木杏里-“风の记忆”“春の风”“七月の友だち”“远笛”“时の列车”“モウイチド”“こと”“一千一秒”“私をたどる物语”“流星”“朝の夜ふかし”“君の名前”“はなよりほかに” 17,米仓千寻-“永远の扉”“岚の中で辉いて”

日语学习,日语简体与敬体(1)

日语学习,日语简体与敬体(1) 日语中有简体与敬体两种说法,简体是普通说法,可用于会话,也可以用于写文章。如报纸、杂志上的文章皆是。说话时对很熟悉的、有亲切关系的人可用简体。敬体是说话者对听话者表示敬意的一种客气的说法,而且是标准的说法。一般用于会话和讲演,但也可以用于写文章。 (1)判断句 现在过去 简体肯定-だ-だった 否定-ではない-ではなかった 敬体肯定-です-でした 否定-ではありません-ではあませんでした 例如:あの人は日本人(にほんじん)だ。(简体) あの人は日本人(にほんじん)です。(敬体) 判断句中的推测语气 现在过去 简体肯定-だろう-だっただろう否定-ではなかろう-ではなかった 敬体肯定-でしょう-だったでしょう否定-ではなかったでしょう-ではなかったでしょう例如:明日(あす)の天気(てんき)は暑(あつ)いだろう。(简体) 明日(あす)の天気(てんき)は暑(あつ)いでしょう。(敬体) (2)叙述句 现在过去 简体肯定-いる-いた 否定-いない-いなかった 敬体肯定-います-いました 否定-いません-いませんでした 例如:中村さんは家(いえ)にいる。(简体) 中村さんは家(いえ)にいます。(敬体) 叙述句中的推測语气 现在过去 简体肯定-いるだろう-いただろう 否定-いないだろう-いなかっただろう 敬体肯定-いますでしょう-いましたでしょう否定-いませんでしょう-いませんでしたでしょう例如:田中さんは会社(かいしゃ)にいるだろう。(简体) 田中さんは会社(かいしゃ)にいますでしょう。(敬体) い型形容词的简体与敬体 现在过去

简体肯定美しい美しかった否定美しくない美しくなかった敬体肯定美しいです美しかったです 否定美しくありません美しくなかったです 美しくありませんでした 例如:京都の町は美しいだ。(简体) 京都の町は美しいです。(敬体) い型形容词的推测语气 现在过去 简体肯定美しだろう美しかっただろう否定美しくなかろう美しくなかったろう 敬体肯定美しいでしょう美しかったでしょう否定美しくないでしょう美しくなかったでしょう 例如:京都の町は美しいだろう。(简体) 京都の町は美しいでしょう。(敬体) な型形容词(形容動詞)的简体与敬体 现在过去 简体肯定静かだ静かだった 否定静かでない静かでなかった 敬体肯定静かです静かでした 否定静かで(は)ありません静かで(は)ありません静かで(は)なかったです 例如:このあたりは静かだった。 (简体过去) このあたりは静かで(は)なかったです。(敬体过去) な型形容词(形容動詞)的推测语气 现在过去 简体肯定静かだろう静かだっただろう否定静かではなかろう静かではなかったろう 敬体肯定静かでしょう静かだったでしょう否定静かで(は)ないでしょう静かで(は)なかったでしょう 例如:このあたりは静かだったでしょう。(简体过去) このあたりは静かで(は)なかったでしょう。(敬体过去) 判断句 一、敬体 现在时:……は……です 过去时:……は……でした ……是……。

日语作业第二课

会話1 総務の人 孫おはようございます。孫輝と申します。今日から第一開発部で働くことになりました。どうぞうよろしくお願いします。 春日おはようございます。総務の春日です。よろしくお願いします。ではちょっと勤怠について説明しておきますね。まず、就業規則に従ってくたさい。欠勤する時はもちろんですが、ちょっと遅刻する時も連絡してください。 孫はい 春日それから、昼休み以外に出る場合や10分以上席を外す場合は、ホワイトボードに買いてくださいね。 孫わかりました。 春日詳しいことは、この就業規則の冊子に全部書いてあるので見ておいてください。 孫はい 春日あと、冷蔵庫の食べ物や飲み物で、名前が書いてあるものは、個人用なので食べないでくださいね。 孫はい。そうすると、自分のものには名前を書いておけばいいんえづね。 春日そですね。傘も間違って他の人のものを持って行かないように気おつけてください。 それから。コーヒーヤボットのお湯はじゅう自由に飲んでいいですよ。他に、分からないことがあったら、気軽に周りの人や私に聞いてください。 孫はい。よろしくお願いします。 会話2自己紹介 香川皆さんちょっといいですか。今日から第一開発部で一緒に働くことになった孫輝さんです。じゃ、孫さんからみなに簡単に自己紹介してください。 孫はい。中国から参りました孫輝と申します。中国では3年間IT連企業でWeb系プロクラマーとして働いていました。日本は初めてなので慣れないことばかりですか、頑張りますのでどうぞよろしくお願いします。 (一同)よろしくお願いします。 会話3 ちょっと休 山口孫さん、お疲れさまです。 孫お疲れさまです。 山口私も先月入舎したばかりなんですよ。 孫へえ、そうなんですか。 山口孫さんは、中国のどこで働いてたんですか。 孫僕は北京で働いていました。 山口ふうん。 孫山口さんも別の会社からいらっしゃったんですか。 山口はい。ホームページの制作会社にいたんですが、たばごを吸う人が多くて 孫そうだったんですか。そういえば、ここにはたばこを吸う人がいないみたいね。灰皿がないな。 山口そうそう。だからここで働こうって思ったの。 孫へえ、そうのんですか。 山口そんさんって中国でプログラム作ったの? 孫ええ 山口で、どんなシステムのプログラムを開発してたの?

大学日本语第二册1-10课课文翻译

第一课公共浴池 伊藤:罗西~,去(公共浴池)洗澡吗? 罗西:哎呀,伊藤先生总是去公共浴池吗? 伊藤:也不是,有时候去公共浴池,有时候在出租屋洗澡。但出租屋的浴室太狭窄。公共浴池很宽敞,非常舒服。 罗西:总是这么早就去吗? 伊藤:(碰到)哪天就早点儿,有时也晚点。但是,到了晚上热水会变脏的。 罗西:现在这个时间总是干净的吧? 伊藤:这个。。。有时候干净有时候也不是这样,但现在这个时间基本上人很少。 罗西:那就去吧!带着我! 两个人带着澡巾,肥皂和脸盆等去了公共浴池。公共浴池分别设有男宾入口和女宾入口。不同的浴池男宾入口的具体位置不同,有的在左边,有的在右边,这个浴池(的男宾入口)在右边。两个人交了钱进去了。 罗西:很宽敞呀!并且很安静~ 伊藤:(一边脱衣服一边说)是呀,人还没怎么来,根据时间的不同,有时热闹,有时安静。 罗西:稍有点热呀! 伊藤:是吗,放点(凉)水吧。 罗西:拜托!我比较喜欢稍微温一些的(水)。

伊藤:今天的水真的很热呀,碰上哪天很热有时候又不太热,各种情况都有。 第二课暑假计划 缪勒「真热啊」 贝罗「是啊,已经快到暑假了啊」 缪勒「你的暑假计划已经决定了吗?」 贝罗「嗯嗯,首先,要去报社和电视台去实习」 缪勒「你想要当新闻记者吗?」 贝罗「不,之前确实是那么想的,但现在已经改变主意了。比起那个,我更想要去做电视台的工作」 缪勒「暑假里,你还有什么别的想要做的事情吗?」 贝罗「让我想想……还要到京都和奈良去,拍很多照片回来」 缪勒「你很擅长摄影吗?」 贝罗「不,还得练。但我想要早点变得更熟练。说起来,你在暑假里想要做什么呢?」 缪勒「花一个月左右的时间去东北地方旅行。到时候如果可以的话还想住在当地农家里」 贝罗「原来你对农业感兴趣啊」 缪勒「不,就是想看看农村的生活」 贝罗「这样啊,真想早点听到你的旅行见闻啊」 缪勒「我也是,想要早点听到你的实习经验」

适合睡前听的励志文章5篇

适合睡前听的励志文章5篇 面对困难挫折挑战只要你肯相信自己,不断努力的付出,哪怕你现在的人生是从零开始,你都可以做得到。下面由小编与大家分享适合睡前听的励志文章,希望你们喜欢!欢迎阅读! 励志文章1:弯路比捷径好走 最美的风景往往是在迷路中遇到的。 过去,我上班习惯走那条大路,直且近,大部分人都习惯走这条路,由于车辆众多,人拥车堵的事情时有发生。这时候,我在直路上也要曲里拐弯地走,耗时费力,甚至停下来苦等,捷径就变成了远路。 后来,我无意间发现了另一条路,非直非近,要比前一条大路远500米,稍有坡度和坎坷,也不够宽阔,喜欢走的人不多,在闹市中显得较寂静。我尝试着走了几次,不用避人躲车,可以心无旁骛地一口气走过。看看时间,竟比原先走大路的时间少了10分钟左右。 我不由感慨,有时候弯路竟比捷径好走。 考最好的大学,深造几年,然后进最好的公司工作,实现自己的雄心壮志,去过高品质的生活。这是大多数年轻人心目中的捷径,或者说是最可靠的人生规划。但是有的人会选择打破这种规则,偏偏走另一条弯路。着名门户网站“泡泡网”的GEO李想在高考的关键时期却选择了退出,坚持养大自己好不容易创办起来的网站。他觉得摆在自己面前的机遇稍纵即逝,办网站比考大学更重要,当然这条弯路没有几个同龄人在走,其中的困难和风险很大,但是他有信心、有能力办成它,永不言弃,最终达到成功的顶峰。而同时,许多同龄人在考大学的“独木桥”上被挤下、被淘汰,至今平庸无为。 曾任美联储主席的格林斯潘24岁时,还没有从纽约大学毕业,为挣学费在一家投资机构做兼职调查员。他竟然在美国政府封锁消息、层层保密之下,从军队的营数算出战斗机的架数,再算出耗损量,又预测出朝鲜战争期间每种型号战斗机的需求量,随后找来飞机制造厂的技术报告和工程手册,弄清楚制造战斗机所需铝、铜和钢材等原材料的数量,终于算出了美国政府对原材料的需求量。他的报告使投资家们较准确地预测了美国政府对原材料的需求量对股市的影响,给

相关主题
文本预览
相关文档 最新文档
,每个中输出一个友情链接。

采用AddAttributesRender 和RenderContents 输出控件还有个好处,就是在RenderContents 中只关心输出的内容,不用关心控件容器标记的输出。比如当要循环输出一些内容标记(如