2006年01月30日

1.     Explain the difference between a hot backup and a cold backup and the benefits associated with each.



A hot backup is basically taking a backup of the database while it is
still up and running and it must be in archive log mode. A cold backup
is taking a backup of the database while it is shut down and does not
require being in archive log mode. The benefit of taking a hot backup
is that the database is still available for use while the backup is
occurring and you can recover the database to any point in time. The
benefit of taking a cold backup is that it is typically easier to
administer the backup and recovery process. In addition, since you are
taking cold backups the database does not require being in archive log
mode and thus there will be a slight performance gain as the database
is not cutting archive logs to disk.



2.     You have just had to restore from backup and do not have any
control files. How would you go about bringing up this database?



I would create a text based backup control file, stipulating where on
disk all the data files where and then issue the recover command with
the using backup control file clause.



3.     How do you switch from an init.ora file to a spfile?



Issue the create spfile from pfile command.



4.     Explain the difference between a data block, an extent and a segment.



A data block is the smallest unit of logical storage for a database
object. As objects grow they take chunks of additional storage that are
composed of contiguous data blocks. These groupings of contiguous data
blocks are called extents. All the extents that an object takes when
grouped together are considered the segment of the database object.



5.     Give two examples of how you might determine the structure of the table DEPT.



Use the describe command or use the dbms_metadata.get_ddl package.



6.     Where would you look for errors from the database engine?



In the alert log.



7.     Compare and contrast TRUNCATE and DELETE for a table.



Both the truncate and delete command have the desired outcome of
getting rid of all the rows in a table. The difference between the two
is that the truncate command is a DDL operation and just moves the high
water mark and produces a now rollback. The delete command, on the
other hand, is a DML operation, which will produce a rollback and thus
take longer to complete.



8.     Give the reasoning behind using an index.



Faster access to data blocks in a table.



9.     Give the two types of tables involved in producing a star schema and the type of data they hold.



Fact tables and dimension tables. A fact table contains measurements
while dimension tables will contain data that will help describe the
fact tables.



10. . What type of index should you use on a fact table?



A Bitmap index.



11. Give two examples of referential integrity constraints.



A primary key and a foreign key.



12. A table is classified as a parent table and you want to drop and
re-create it. How would you do this without affecting the children
tables?



Disable the foreign key constraint to the parent, drop the table, re-create the table, enable the foreign key constraint.



13. Explain the difference between ARCHIVELOG mode and NOARCHIVELOG mode and the benefits and disadvantages to each.



ARCHIVELOG mode is a mode that you can put the database in for creating
a backup of all transactions that have occurred in the database so that
you can recover to any point in time. NOARCHIVELOG mode is basically
the absence of ARCHIVELOG mode and has the disadvantage of not being
able to recover to any point in time. NOARCHIVELOG mode does have the
advantage of not having to write transactions to an archive log and
thus increases the performance of the database slightly.



14. What command would you use to create a backup control file?



Alter database backup control file to trace.



15. Give the stages of instance startup to a usable state where normal users may access it.



STARTUP NOMOUNT – Instance startup



STARTUP MOUNT – The database is mounted



STARTUP OPEN – The database is opened



16. What column differentiates the V$ views to the GV$ views and how?



The INST_ID column which indicates the instance in a RAC environment the information came from.



17. How would you go about generating an EXPLAIN plan?



Create a plan table with utlxplan.sql.



Use the explain plan set statement_id = ‘tst1′ into plan_table for a SQL statement



Look at the explain plan with utlxplp.sql or utlxpls.sql



18. How would you go about increasing the buffer cache hit ratio?



Use the buffer cache advisory over a given workload and then query the
v$db_cache_advice table. If a change was necessary then I would use the
alter system set db_cache_size command.



19. Explain an ORA-01555



You get this error when you get a snapshot too old within rollback. It
can usually be solved by increasing the undo retention or increasing
the size of rollbacks. You should also look at the logic involved in
the application getting the error message.



20. Explain the difference between $ORACLE_HOME and $ORACLE_BASE.



ORACLE_BASE is the root directory for oracle. ORACLE_HOME located beneath ORACLE_BASE is where the oracle products reside.





21.  How would you determine the time zone under which a database was operating?



select DBTIMEZONE from dual;

22.  Explain the use of setting GLOBAL_NAMES equal to TRUE.



Setting GLOBAL_NAMES dictates how you might connect to a database. This
variable is either TRUE or FALSE and if it is set to TRUE it enforces
database links to have the same name as the remote database to which
they are linking.



23.  What command would you use to encrypt a PL/SQL application?



WRAP



24.  Explain the difference between a FUNCTION, PROCEDURE and PACKAGE.



A function and procedure are the same in that they are intended to be a
collection of PL/SQL code that carries a single task. While a procedure
does not have to return any values to the calling application, a
function will return a single value. A package on the other hand is a
collection of functions and procedures that are grouped together based
on their commonality to a business function or application.



25.  Explain the use of table functions.



Table functions are designed to return a set of rows through PL/SQL
logic but are intended to be used as a normal table or view in a SQL
statement. They are also used to pipeline information in an ETL process.



26.  Name three advisory statistics you can collect.



Buffer Cache Advice, Segment Level Statistics, & Timed Statistics



27.  Where in the Oracle directory tree structure are audit traces placed?



In unix $ORACLE_HOME/rdbms/audit, in Windows the event viewer



28.  Explain materialized views and how they are used.



Materialized views are objects that are reduced sets of information
that have been summarized, grouped, or aggregated from base tables.
They are typically used in data warehouse or decision support systems.



29.  When a user process fails, what background process cleans up after it?



PMON



30.  What background process refreshes materialized views?



The Job Queue Processes.



31.  How would you determine what sessions are connected and what resources they are waiting for?



Use of V$SESSION and V$SESSION_WAIT



32.  Describe what redo logs are.



Redo logs are logical and physical structures that are designed to hold
all the changes made to a database and are intended to aid in the
recovery of a database.



33.  How would you force a log switch?



ALTER SYSTEM SWITCH LOGFILE;

34.  Give two methods you could use to determine what DDL changes have been made.



You could use Logminer or Streams



35.  What does coalescing a tablespace do?



Coalescing is only valid for dictionary-managed tablespaces and
de-fragments space by combining neighboring free extents into large
single extents.



36.  What is the difference between a TEMPORARY tablespace and a PERMANENT tablespace?



A temporary tablespace is used for temporary objects such as sort
structures while permanent tablespaces are used to store those objects
meant to be used as the true objects of the database.



37.  Name a tablespace automatically created when you create a database.



The SYSTEM tablespace.



38.  When creating a user, what permissions must you grant to allow them to connect to the database?



Grant the CONNECT to the user.



39.  How do you add a data file to a tablespace?



ALTER TABLESPACE <tablespace_name>; ADD DATAFILE <datafile_name>; SIZE <size>;

40.  How do you resize a data file?



ALTER DATABASE DATAFILE <datafile_name>; RESIZE <new_size>;;

41.  What view would you use to look at the size of a data file?



DBA_DATA_FILES

42.  What view would you use to determine free space in a tablespace?



DBA_FREE_SPACE

43.  How would you determine who has added a row to a table?



Turn on fine grain auditing for the table.



44.  How can you rebuild an index?



ALTER INDEX <index_name>; REBUILD;

45.  Explain what partitioning is and what its benefit is.



Partitioning is a method of taking large tables and indexes and splitting them into smaller, more manageable pieces.



46.  You have just compiled a PL/SQL package but got errors, how would you view the errors?



SHOW ERRORS

47.  How can you gather statistics on a table?



The ANALYZE command.



48.  How can you enable a trace for a session?



Use the DBMS_SESSION.SET_SQL_TRACE or



Use ALTER SESSION SET SQL_TRACE = TRUE;



49.  What is the difference between the SQL*Loader and IMPORT utilities?



These two Oracle utilities are used for loading data into the database.
The difference is that the import utility relies on the data being
produced by another Oracle utility EXPORT while the SQL*Loader utility
allows data to be loaded that has been produced by other utilities from
different data sources just so long as it conforms to ASCII formatted
or delimited files.



50.  Name two files used for network connection to a database.



TNSNAMES.ORA and SQLNET.ORA



Technical – UNIX

Every DBA should know something about the operating system that the
database will be running on. The questions here are related to UNIX but
you should equally be able to answer questions related to common
Windows environments.



1.  How do you list the files in an UNIX directory while also showing hidden files?



ls -ltra

2.  How do you execute a UNIX command in the background?



Use the "&"



3.  What UNIX command will control the default file permissions when files are created?



Umask



4.  Explain the read, write, and execute permissions on a UNIX directory.



Read allows you to see and list the directory contents.



Write allows you to create, edit and delete files and subdirectories in the directory.



Execute gives you the previous read/write permissions plus allows you
to change into the directory and execute programs or shells from the
directory.



5.  the difference between a soft link and a hard link?



A symbolic (soft) linked file and the targeted file can be located on
the same or different file system while for a hard link they must be
located on the same file system.



6.  Give the command to display space usage on the UNIX file system.



df -lk

7.  Explain iostat, vmstat and netstat.



Iostat reports on terminal, disk and tape I/O activity.



Vmstat reports on virtual memory statistics for processes, disk, tape and CPU activity.



Netstat reports on the contents of network data structures.



8.  How would you change all occurrences of a value using VI?



Use :%s/<old>;/<new>;/g



9.  Give two UNIX kernel parameters that effect an Oracle install



SHMMAX & SHMMNI



10.  Briefly, how do you install Oracle software on UNIX.



Basically, set up disks, kernel parameters, and run orainst.

2006年01月29日

英文原文:http://bram.jteam.nl/?p=2

你想再用几个月尝试一下Ajax, HttpXmlRequest, DWR?你的Web App正使用的是Spring的框架?恩,你来对地方了。

本文给出了DWR+Spring的介绍。不过,你必须具备Javascript和使用Spring的基本知识。

DWR
DWR使通过Ajax调用你的业务层模块变得简单。它让你使用Ajax,却不用理会那些繁琐的诸如兼容浏览器之类的麻烦。

虽然DWR自己也提供了一些对于Spring的支持,但是却无法做到无缝整合。例如,它需要你在Web.xml中配置一个独立的Servlet,却无法让它访问Web App Context中的Beans。

让我们开始吧
首先,我们来配置一个Spring MVC Controller,称之DWRServlet,用它取代上面所说的那个独立的Servlet。还好,Spring已经提供了一个现成的,叫ServletWrappingController。将下列代码加到你的dispacher app context,DWR就会成为一个标准的Spring Controller。

<bean id="dwrController" class= "org.springframework.web.servlet.mvc.ServletWrappingController">

  <property name="servletClass">

    <value>uk.ltd.getahead.dwr.DWRServlet</value>

  </property>

  <property name="initParameters">

    <props>

      <prop key="debug">true</prop>

    </props>

  </property>

</bean>

注意,开发过程中将初始化参数Debug置True,它将提供有用的Beans列表。更重要的是,注意我们是怎样将初始化参数值传递给DWR的。

添加一条Url Mapping以确保所有的请求都首先交由这个DWRServlet处理。注意,这个Mapping应该处于最后,以确保能处理到所有的请求。

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

  <property name="mappings">

    <props>

      <prop key="/**/*.html">defaultController</prop>

      <prop key="/**/*">dwrController</prop>

    </props>

  </property>

</bean>


另外,还要确定所有的后缀请求(包括没有后缀)都交给Spring的dispatcher处理了。所以,除了Mapping JSP和HTML以外,还要像下例一样Mapping所有的后缀。下例假设已经定义了名为“main”的Spring DispacherServlet。

<servlet-mapping>

  <servlet-name>main</servlet-name>

  <url-pattern>/dwr/*</url-pattern>

</servlet-mapping>


配置DWR
虽然可以通过初始参数改变,但DWRServlet假设配置文件为/WEB-INF/dwr.xml。下面是一个示例配置文件,文件中使用了假设在App Context中已经存在的一个id为productManager的Bean。

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE dwr PUBLIC

  "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"

  "http://www.getahead.ltd.uk/dwr/dwr10.dtd">

 

<dwr>

  <allow>

    <convert

      converter="bean"

      match="your.package.*"/>

 

    <create

      creator="spring"

      javascript="productManager">

      <param name="beanName" value="productManager"/>

    </create>

  </allow>

</dwr>

注意,现在默认情况下包含了一个Spring creator。这个Creator将处于App Context中的productManager Bean暴露(指在JS中可以调用)了出来。可以用此法创建一个新的Bean,或者找到一个已经存在的Bean。

在<allow>中,首先需要定义一个Convertor以将标准的JavaBeans转换为Javascript的对象。虽然DWR提供了此类支持,但是默认情况下没有开启。DWR默认只开启了对于基本类型以及一些Collection的Convertor。注意,你所开启的包,它必须包含你想要convert的类。

最后,你为每一个想要通过DWR暴露出来的Bean写一个<create>。本例中,我们暴露了一个id为productManager的bean。

访问你的Bean
该做的都差不多了,让我们试试看访问这个Product Manager。假设这个Bean有一个getAllProducts()的方法,并以List方式组织所有已知的Product(JavaBean)将它作为返回。首先需要在我们的页面中包括两个Javascript文件。

<script type='text/javascript' src='/dwrPath/interface/productManager.js’></script>

<script type=’text/javascript’ src=’/dwrPath/engine.js’></script>

上面的dwrPath就是之前提到的已经被映射了的dwrcontroller。现在,唯一要做的就是调用Product Manager的方法了。假设我们需要一个按钮来触发获取信息的过程,并用span来取得所有的返回值。

<input type="button" onclick="productManager.getAllProducts(productCallback);" value="Get all products"/>

<script type="text/javascript">

  var productCallback = function(products) {

    var text = 'Products: <br><ul>';

    for(i = 0; i < products.length; i++) {

      text += '<li>';

      text += products[i].name;

 

      text += ' (';

      price= products[i].price;

      text += price.currency;

      text += ' ';

      text += price.value;

      text += ')';

      text += '</li>';

    }

    document.getElementById('productlist').innerHTML = text;

  }

</script>

<span id="productlist">

注意嵌套的属性如price.currency和price.value。仅当Product和Price位于Bean Convertor所指定的路径(本例为your.package)下的时候,才能被正确解析。

调试
DWR 提供了内置的调试功能。由于在初始参数中将debug置为true,我们可以使用这些内置的调试功能。使用浏览器访问/dwrPath,你会发现一个列表,列出了所有通过DWR暴露的Beans。通过他们的链接,还可以得到每个Bean暴露的方法列表。它还提供了调用这些方法调试例子,以方便使用和调试。

工具
DWR还提供了些工具类方法和处理错误的手段。更多信息参见这里

祝好运
我希望这个简单的教程让你了解了如何集成Spring和DWR,并让你更容易的创建一个基于Ajax技术的Web App。  我现在还在看一些如何使用Spring+DWR进行实时的表单校验等。所以,经常逛逛本Blog以保持你跟上进度了哦!

英文原文:http://getahead.ltd.uk/dwr/browser/util/$

使用$函数(在Javascript中属于合法的名字)的想法是受到了Prototype(一个Javascript框架)的启发。大致说来,$=document.getElementById。由于在Ajax编程中大量使用了后者,用前者取代它则让你受益匪浅。

至此, “$”从当前的HTML文档中找到指定id的元素,所有非字符串的参数,将会返回原值,另外,本$函数对Prototype中的函数中的函数作了部分改进,可能会适应更多浏览器。

DWRUtil.toDescriptiveString演示了用法,可以参考。

理论上说,该函数因为使用了Array.push而不兼容IE5.0,但是,如果与engine.js共同使用,就可以避开此问题。如果你不使用engine.js又想兼容IE5.0,那就得想个法子把Array.push替换掉。

上一页
下一页

2006年01月23日

小时在家看电视,记得是那种传统的国产英雄主义片,片中男主角一身正气,毅然违反了上级错误的决定,最终带来了一个非常完美的结局。回了营地,上上级不仅没有惩罚男主角,反而进行了表彰与嘉奖。当然,做出错误决定的上级受到相应处分。

每个人都是有个性的,每个人都是有个人的想法的,每个人都希望将自己的想法付诸实现。但是,团队意味着这种个性化的东西需要被削弱,降低到最低。诚然,在上面的这个故事中,如果男主角未能勇挑重责,可能会导致一场败仗,甚至全军覆没,但是,如果最终的结果证明男主角的决定是错误的呢?在做决定的时候,没有人会知道最终的结局,不是吗?每个人在做决定的时候,都会有充分的理论依据来支持,因此,也都会认为自己的决定是正确的,如果每个人的正确想法都要被执行的话,这个团队还有何凝聚力可言?

执行即使是你认为错误的命令,这样的队伍才是强大的。

应该得到表彰的是那个正确的决定(事),而不是做出决定的男主角(人)。

2006年01月18日

英文原文:http://java.sun.com/docs/books/tutorial/java/javaOO/annotations.html

JDK5.0 引入了一种新的元语言工具,叫“annotation”。 Annotation 提供的信息不是程序的一部分,例如,代码片断的作者,或者告诉编译器忽略特定的错误等。Annotation不会对程序的运行产生任何影响。

Annotation的形式为:@annotation。它可以被应用到类,属性,方法等的声明处。Annotation位于他们之前,并且(通常)独立一行。它还可以带有参数,例如:
    @Author("MyName")
    class myClass {}
或者
    @SuppressWarnings("unchecked")
    void MyMethod() {}

自定义annotation属于高级用法,不属于本文讨论范畴。但是有三个内置的annotation你必须知道(如果你是Java程序员的话),他们是@Deprecated,@Override和@SuppressWarnings。以下列举他们对于方法的应用。

import java.util.List;

class Food {}
class Hay extends Food {}
class Animal {
Food getPreferredFood() {
return null;
}
/**
* @deprecated document why the method was deprecated
*/
@Deprecated
static void deprecatedMethod() { }
}
class Horse extends Animal {
Horse() {
return;
}
@Override
Hay getPreferredFood() {
return new Hay();
}
@SuppressWarnings("deprecation")
void useDeprecatedMethod() {
Animal.deprecateMethod(); //deprecation warning - suppressed
}
}

@Deprecated

@Deprecated annotation 表示被标志的方法不应该被继续使用了,如果程序使用了deprecated的类,变量或方法,编译器将会给出警告。如果一个元素被deprecate了,那么应该如上例所示在上面的注释文档中添加deprecated的标记并给出原因。注意,文档中标记的首字母是小写d,annotation中的首字母是大写D。一般来说,你应该避免使用deprecated的方法,可以参阅相关文档了解替代方法。


@Override

@Override annotation是为了告诉编译器,该元素会override父类的这个元素。在上例中,override annotation表示Horse中的getPreferredFood方法将会override 父类Animal中的getPreferredFood方法。如果这步失败,编译器会报错。

尽管Override的时候并不是必须使用这个annotation,使用它还是可以使程序逻辑更明了化,特别是当子类方法的返回值继承自父类方法的返回值。如在上例中,子类的getPreferredFood方法返回Hey的实例,父类的getPreferredFood方法返回Food的实例,其中Hey继承Food。更多信息见Overriding and Hiding Methods


@SuppressWarnings

@SuppressWarnings告诉编译器,此处不要报错。在上例中,useDeprecatedMethod方法调用了Animal类中的deprecated方法,通常编译器会给出警告,但是此处,被suprress了。

每一个编译器警告属于一个类别,Java语言规范中列出了两类:“deprecation” 和“unchecked”。如果要suppress这两类警告,使用如下方式:
    @SuppressWarnings ( {"unchecked", "deprecation"} )
参见编译器文档了解警告的类别。

对于annotation更高级的用法是写一段程序不仅可以读java代码,并且可以处理annotations。为了达到这个目标,5.0JDK中包含了一个处理annotation的工具,称为apt。下一个版本JDK(代号Mustang)的apt将成为Java编译器的一个标准部分。更多信息,可以参见Getting Started with the Annotation Processing Tool。关于正在实现的Mustang感兴趣,可以参见Language Model APIJSR 269: Pluggable Annotation Processing API

2006年01月16日

英文原文出自《Spring In Action》

像绝大多数的技术一样,AOP也有自己的术语。不幸的是,很多用于描述AOP特征的术语并不直观,但是,它们已经成为了AOP语言的一部分,如果你想理解AOP,你必须学会这门AOP语言。通俗地说,你想在圈子里面混,你就得学会说行话。

Aspect

Aspect是你正在实现的一个cross-cutting的功能,它是你应用中正在模块化的一个方面(aspect)。比较通用的一个例子是日志。记录日志是一项贯穿整个应用的服务。由于应用基本以功能(基于业务逻辑)为界限进行划分模块,故通过继承的方法来重用日志模块似乎不合理。但是,你可以创建一个日志aspect来实现你的想法。

Joinpoint

Joinpoint是在应用运行中那些aspect可以插进来的点。这个点可能是一个被调用的方法,一个被抛出的异常,甚至可以是一个被改变的字段。在这些点处添加你的aspect的代码,就可以为你的应用增加一些新的行为。

Advice

Advice是对aspect的一个具体实现。它向系统建议(advice)增加一个新的行为。在我们的日志例子中,日志advice包含了记录日志的代码并实现真正的日志记录,比如将日志写入文件。Advice被添加到joinpoint点上。

Pointcut

Pointcut定义了advice应该被插入到什么样的joinpoint点上。Advice可以被应用到任意AOP框架支持的joinpoint上。当然,你不会希望将所有的aspect应用到可以被应用的joinpoint上面。Pointcut让你可以指定advice应用的位置。通常,你用具体的类名或方法名,或者一些符合表达式的类或方法名来指定pointcut。 一些AOP框架允许你创建动态的pointcuts,这些pointcuts可以在运行的时候动态决定是否需要应用advice,比如方法的参数值。

Introduction

Introduction可以让你添加方法和属性到已经存在的类中。例如,你可以创建一个Auditable的advice类用来跟踪某对象最后改变的时期。这个可以简单地通过一个属性记录状态,并添加一个setLastModified(Date)方法来实现。然后,它可以被引入(introduce)到已经存在的类。这样,已有的类不需要做任何改变就有了个新的功能。

Target

Target是正在被advice的类,这可以是你自己写的一个类或者是你想增加新的功能的第三方提供的类。没有AOP,这个类必须被包括自身主要的逻辑并且额外加上那些cross-cutting关心的逻辑。有了AOP,target类只需要关注自身所需要关心的,而把那些应用于自身的advices抛到脑后。

Proxy

Proxy是被应用了advice的target实例。从客户实例的角度来看,无论是target实例(AOP之前)还是proxy实例(AOP以后),都是一样的,当然,它们本来就应该是一样的。也就是说,你的既有应用不需要做改变来支持proxy类。

Weaving

Weaving是指把aspects应用到目标实例上去创建一个新的proxied实例的过程。Aspects在目标对象的joinpoint被组合(weave)进去。Weaving可以发生在目标类生存的如下时间:

  • 编译期 — Aspects在目标类编译期被weave。这个需要特殊的编译器。
  • 载入期 — Aspects在目标类载入期被weave。这个需要特殊的类装载器。
  • 运行期 — Aspects在应用运行时的某个时期被weave。一般来说,AOP容器在weave in aspects的时候会动态创建proxy类来代理target类。

图例:

PS:

2006年01月14日

英文原文:http://getahead.ltd.uk/dwr/browser/util

util.js 包含了一系列的方法帮助你通过javascript对象更新Web页面(比如从服务器端返回的结果对象)。

util.js是一个很独立的模块,可以脱离DWR使用,你可以直接下载,或者和DWR一起下载

四个基本的页面操作函数:getValue[s]()和setValue[s]()对于绝大多数的HTML元素都有效,除了表格(tables), 列表(lists) 和图片(images). getText() 作用于select lists。

编辑表格可以参见addRows()removeAllRows()。编辑列表(包括select lists and ul, ol lists),参见addOptions()removeAllOptions()

下一页

英文原文: http://getahead.ltd.uk/dwr/server/dwrxml

dwr.xml文件可以存在多个(详见web.xml说明文档)。每个文件里面的条目会被结合在一起。DWR据此调用到每一个条目来确保他们的启动。

我们可以通过分析这个标准的dwr.xml来了解它的概貌。


DWR DTD

除去本文外,有关dwr.xml的资料还可以参考DWR DTD和由DTDDoc生成的相关文章


创建一个dwr.xml文件

每一个dwr.xml文件都必须包括DWR DOCTYPE,如下所示:

<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">

以下是一个dwr.xml文件的概貌:

<dwr>

<init>
<creator id="..." class="..."/>
<converter id="..." class="..."/>
</init>

<allow>
<create creator="..." javascript="..." scope="...">
<param name="..." value="..."/>
</create>

<convert converter="..." match="..."/>
</allow>

<signatures>
...
</signatures>

</dwr>

一些必须事先弄清的概念是 – 参数是被转换的(converted),而beans是被创建的(created)。所以,如果你有一个bean A,并且A有一个方法A.blah(B),那么,你需要bean A的creator 和B的converter

init部分是可选的,它用来声明那些需要创建的bean和转换的类。大多数情况,你不需要它。如果你需要定义一个新的Creator[JavaDoc]或者Converter[JavaDoc],那么,可以在此声明,但请确认这个Creator或Converter没有被定义过。

init给出的信息只是告诉DWR存在某些类,但并没有使用它们。这有点像Java语言中的import。外部类必须先import然后才能使用,但是import并不意味着肯定会使用它们。init中的creator或converter都有一个id属性以供使用时引用。

allow部分通过create和convert结点定义了DWR可以创建(create)和转变(convert)的类。以下类默认已经作好转化,可以直接使用,不用声明:

  • 所有的基本类型,布尔(boolean),整型(int)等
  • 所有上述基本类型的封装类,布尔(Boolean),整型(Integer)等
  • 字符串(String)类
  • 日期(java.util.Date)类和三个SQL派生的
  • 由上述类型组成的数组
  • 由上述类型组成的集合(Lists, Sets and Maps),有一定限制

然而,如果要创建(create)一个类,则必须先声明。

2006年01月08日

在学生时代,学校有一个经常被传颂的口号是“培养德智体全面发展的优秀学生”。

德智体,此处只谈智。谈智的时候,对应一下体。

在过去的时代,对于一个人来说,体所需要占的比重比较大,人们对于智的要求不是很高。由于非脑力劳动的工作大多将被机器所取代,而无法被取代的,恰是需要用到人智力的,故在现今,情况可能正好相反。而从事纯脑力劳动者,对智力的要求更是显而易见的,说得更直接和一般化点,脑力劳动者“卖”的不是人,而是他们的 智力。 对于毕业生找工作,公司多数会看文凭,因为没有更多的可以反映智力的地方。那次高考,也可以被认为是一次智力的测试。我想,不可否认,在不了解对方的大多数情况下,通过文凭还是基本能区分智力的高低的。(填鸭式的教育和题海战术会使这种判断丧失准确性,故从某种程度来说,这种教育本身是一种作弊)

我们从小被教育要刻苦读书,并被灌以“头悬梁,锥刺骨”的痛苦却极为正面的印象,殊不知,那恰是“笨鸟先飞”的真实写照。因为有了足够的智力,才能过了那次高考,而不是因为过了高考,大幅提高了自己的智力。

这样说来,似乎有些悲观。

由于体的发展已经到了一个比较成熟的阶段,我们来看看体。体力方面的工作,需要体力强的人,体的判断比较容易,并且观念已经被大多数人所接受,所以,没有一个类似于高考之类的东西,仅在学校的时候有一个叫“达标”的标准。体方面的培养,也很纯粹,通过各种各样的体育锻炼和健身运动提高自己的体。

智力会提高或者降低吗?读书时语文课本里的一篇《伤仲永》,很好的以例子回答了这个问题。其实智力和体力一样,是可以通过锻炼而提高的。我们在学习的过程中,都在提高自己的智,也许目的性不强或并不直接。

智的提高,周期较长且不易考量,所以容易被忽略和被一些近利的观念所遗弃,然而,锻炼智力,开发智力,培养思维,比抱着一本书去应付考试更为重要。

如果有一天,人们对于智的观念转变了,那么,基于一个庞大的市场,也许就会有各种各样的健脑房或由此而衍生的新的游戏,智力的开发也将更为系统和详细。


P.S. 德智体,也许古人对于词的排列顺序都有考究,不知道何时,德才能真的站在第一的位置上。

2006年01月04日



  [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

上面的代码显示了两个类似的例子,类似的原因是为了易于发现区别。从代码看,在第一个例子中,鼠标移上那个层,显示字体会变红,第二个例子中,初始就是红色。只要触发了onmouseout事件,相应层所显示的字体就会变黑。

这些都是可以读懂的。不可理解的是,在第二个例子的时候,当鼠标移入Input框的时候,触发了onmouseout事件,而在第一个例子中没有。按照对onmouseout的理解,应该只有移出div层,才会触发,但是为什么在第二个例子中,明明是移入层内的一个元素,也算mouseout了呢?

对这个问题依旧疑惑,但是,却发现了第一个例子这样的解决方案,即写上mouseover。看上去,onmouseover对于层边界的理解要和我更贴近一些。呵呵。

更正: 以上两个例子里面,其实当鼠标移至input框中,都会触发onmouseout。在第一个例子中,只是因为onmouseover也持续触发,所以掩盖了层字体变黑这个情况。可以用alert再试下。这样,对于以上两个例子的表现基本可以解释了。查阅了一下相关资料,对于两个事件分别定义为:

The onmouseover event occurs when the pointing device is moved onto an element. This attribute may be used with most elements.

The onmouseout event occurs when the pointing device is moved away from an element. This attribute may be used with most elements.

从上面的定义来看,onmouseover和onmouseout指的都是an element,边界应该一样,然而实际情况是,他们对于an element的边界划分明显是不一样的。