准备想在框架的基础上写一个后台模板生成类,就好像之前用的那个框架一样.

因为后台的样式基本上都是一样的,不需要什么特殊或者不规则的html,一些form,input,列表,分页,tab…不外乎就那么几种,完全没有必要花时间在逐个页面写HTML,很费时间,修改也麻烦.写好一个类之后,就通过简单的PHP语句生成你想要的html,几句php就搞掂一个页面了.

嗯,那第一步就找一个好看,结构又简单的后台模板.

1.Free Admin Template For Web Applications - 三栏标签式模板,整体淡蓝色、橙色、白色。给人感觉非常舒服。

演示地址  下载地址

2.Gooey Templates Proton - 非常简洁的模板,主题黑白色调。

下载地址

3.Bloganje Free Admin Template

演示地址  下载地址

4.Transdmin Light - 包括html格式和PSD格式。

演示地址  下载地址

 

人力资源管理系统(HR)HTML模板

人力资源管理系统(HR)HTML模板

模板名称: 人力资源管理系统(HR)HTML模板
添加日期: 2009-4-23 08:55:34 下载方式: 免费下载
模板大小: 173KB HTML文件:
模板说明: 人力资源管理系统(HR)HTML模板,蓝色风格,带登陆页面及后台操作页面html文件,该模板属本人前不久开发的一款简单的人力资源管理系统,现在整成HTML文件,供需要的朋友下载。
[模板下载]

一款简单黑色后台管理模板

一款简单黑色后台管理模板

模板名称:一款简单黑色后台管理模板
添加日期: 2009-4-23 08:48:18 下载方式: 免费下载
模板大小: 1220KB HTML文件:
模板说明: 一款简单黑色后台管理模板,黑色风格,有登陆页面及操作页面,含PSD文件,会设计的朋友自己切割会好很多,因为此模板的HTML文件切割的不是很好,水平有限,嘿嘿。
[模板下载] 

乡镇农户评级系统后台模板

乡镇农户评级系统后台模板模板名称: 乡镇农户评级系统后台模板
添加日期: 2009-4-15 08:45:44 下载方式: 免费下载
模板大小: 180KB HTML文件:
模板说明: 乡镇农户评级系统后台模板,淡绿色风格,带登陆页面及后台操作页面html文件,菜单有点复杂,横向纵向结合,不过本人觉得还行,适合开发各类系统后台,有心思改的朋友可以下。
[模板下载]

TaskMenu3.0仿WindowsXP后台模板

TaskMenu3.0仿WindowsXP后台模板模板名称:TaskMenu3.0仿WindowsXP后台模板
添加日期: 2009-4-15 08:38:28 下载方式: 免费下载
模板大小: 31KB HTML文件:
模板说明: TaskMenu3.0仿WindowsXP后台模板,WindowsXP蓝色、银色、经典三种风格,因为全是js控制,所以自带了风格切换功能以及菜单控制功能,这款后台出来应该有几年了,经典值得收藏。

三款简单通用的后台管理模板

三款简单通用的后台管理模板模板名称: 三款简单通用的后台管理模板
添加日期: 2009-4-11 09:55:47 下载方式: 免费下载
模板大小: 13KB HTML文件:
模板说明: 三款简单通用的后台管理模板,一款黑色,两款蓝色,带登陆页面及后台操作页面,三款模板结构上都差不多,设计的挺简单的,适合简单的后台管理功能开发。
[模板下载]

漂亮的深蓝色登陆界面

漂亮的深蓝色登陆界面模板名称:漂亮的深蓝色登陆界面
添加日期: 2009-4-11 09:18:18 下载方式: 免费下载
模板大小: 61KB HTML文件:
模板说明: 漂亮的深蓝色登陆界面,深蓝色风格,只含登陆界面html文件,缺登陆界面的朋友可以考虑下载。
[模板下载] 

一款不错的物业管理系统全套html模板

一款不错的物业管理系统全套html模板模板名称: 一款不错的物业管理系统全套html模板
添加日期: 2009-3-31 09:41:22 下载方式: 免费下载
模板大小: 274KB HTML文件:
模板说明: 一款不错的物业管理系统全套html模板,绿色风格,带登陆页面及后台操作页面,看上去跟前几款的设计模式差不多,不过风格比较清新,个人觉得挺喜欢的。
[模板下载]

国外简单后台模板[3]

国外简单后台模板[3]模板名称: 国外简单后台模板[3]
添加日期: 2009-3-31 09:23:12 下载方式: 免费下载
模板大小: 28KB HTML文件:
模板说明: 国外简单后台模板[3],蓝白风格,国外的模板没的说,简单,后台就更不用说了,设计超简单的,但功能又介于其内,真是不多得的好模板。
[模板下载] 

国外简单后台模板[1]

国外简单后台模板[1]模板名称: 国外简单后台模板[1]
添加日期: 2009-3-23 16:20:23 下载方式: 免费下载
模板大小: 140KB HTML文件:
模板说明: 国外简单后台模板[1],多种风格,蓝色、橙色、黑色等,可相互切换,如果开发网站的时候有会员机制的话用这套就再简单不过了。含PSD文件,懂设计的朋友可以自己修改。
[模板下载]

国外简单后台模板[2]

国外简单后台模板[2]模板名称: 国外简单后台模板[2]
添加日期: 2009-3-23 15:43:22 下载方式: 免费下载
模板大小: 120KB HTML文件:
模板说明: 国外简单后台模板[2],白色风格,相对于上面那套模板来说,不提供风格切换功能,但是在用户操作方面设计的超简单的,所谓后台越简单越好嘛,所以前台有会员功能要做的时候可以借鉴一下哦。含PSD文件,懂设计的朋友可以自己修改。
[模板下载] 

黄色动网风格后台模板

黄色动网风格后台模板模板名称: 黄色动网风格后台模板
添加日期: 2009-3-18 11:51:36 下载方式: 免费下载
模板大小: 35KB HTML文件:
模板说明: 黄色动网风格后台模板,黄色风格,相信前两年大多数的后台都是采用动网风格或是模仿动网风格吧。
[模板下载]

蓝色动网风格后台模板

蓝色动网风格后台模板模板名称: 蓝色动网风格后台模板
添加日期: 2009-3-18 11:43:12 下载方式: 免费下载
模板大小: 20KB HTML文件:
模板说明: 蓝色动网风格后台模板,蓝色风格,经典的动网蓝色风格后台,好像又回到几年前了,结构简单,开发起来速度快。
[模板下载] 

网站后台管理系统模板

网站后台管理系统模板模板名称: 网站后台管理系统模板
添加日期: 2009-3-16 11:33:22 下载方式: 免费下载
模板大小: 29KB HTML文件:
模板说明: 网站后台管理系统模板,蓝色风格,菜单较复杂,带横向菜单和纵向菜单,功能交错处理,权限不好控制,有需要的下吧。
[模板下载] 

一款超炫的后台,Ext模拟Windows桌面

一款超炫的后台,Ext模拟Windows桌面模板名称: 一款超炫的后台,Ext模拟Windows桌面
添加日期: 2009-3-14 15:33:46 下载方式: 免费下载
模板大小: 492KB HTML文件:
模板说明: 一款超炫的后台,Ext模拟Windows桌面,Ext经典浅蓝风格,功能非常强大,包括最大化、最小化、状态栏、桌面图标等,不过需要非常懂Ext脚本的才可驾驭它。
[模板下载]

仿163简约风格邮件系统后台模板

仿163简约风格邮件系统后台模板模板名称: 仿163简约风格邮件系统后台模板
添加日期: 2009-3-14 14:56:22 下载方式: 免费下载
模板大小: 90KB HTML文件:
模板说明: 仿163简约风格邮件系统后台模板,蓝色风格,花了一个上午修改出来的,开发邮件系统应该有用,并且去掉了163原有的冗余脚本代码,其他不必要的东西也已经被我清理的非常干净了。
[模板下载] 

学校管理系统后台模板

学校管理系统后台模板模板名称: 学校管理系统后台模板
添加日期: 2009-3-12 15:36:26 下载方式: 免费下载
模板大小: 253KB HTML文件:
模板说明: 学校管理系统后台模板,浅蓝色风格,登陆页面挺时尚哦,后台功能菜单也是半透明效果,喜欢的赶紧下吧。
[模板下载] 

绿色经典后台模板,适合开发CMS、HR、OA、CRM等

绿色经典后台模板,适合开发CMS、HR、OA、CRM等模板名称: 绿色经典后台模板,适合开发CMS、HR、OA、CRM等
添加日期: 2009-3-11 09:06:26 下载方式: 免费下载
模板大小: 148KB HTML文件:
模板说明: 绿色经典后台模板,适合开发CMS、HR、OA、CRM等,绿色风格,是一套结构稍微复杂的模板,适合开发各类中小型系统,并包含配套登陆页面模板,确实值得收藏哦。
[模板下载] 

Ext 做的清爽简单后台模板

Ext 做的清爽简单后台模板模板名称: Ext 做的清爽简单后台模板
添加日期: 2009-3-9 15:46:26 下载方式: 免费下载
模板大小: 9KB HTML文件:
模板说明: Ext 做的清爽简单后台模板,清爽淡蓝色风格,功能较简单,以选项卡方式打开功能,前台中要做用户后台的时候可以考虑下。
[模板下载] 

posted @ 2009-06-15 16:25 希 阅读(5534) | 评论 (4)编辑 收藏

js验证表单大全
1. 长度限制
<script>
function test() 
{
if(document.a.b.value.length>50)
{
alert("不能超过50个字符!");
document.a.b.focus();
return false;
}
}
</script>
<form name=a onsubmit="return test()">
<textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea>
<input type="submit" name="Submit" value="check">
</form> 

2. 只能是汉字 
<input onkeyup="value="/oblog/value.replace(/[^\u4E00-\u9FA5]/g,'')">

3." 只能是英文
<script language=javascript>
function onlyEng()
{
if(!(event.keyCode>=65&&event.keyCode<=90))
event.returnvalue=false;
}
</script>

<input onkeydown="onlyEng();">

4. 只能是数字
<script language=javascript>
function onlyNum()
{
if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))
//考虑小键盘上的数字键
event.returnvalue=false;
}
</script>

<input onkeydown="onlyNum();">

5. 只能是英文字符和数字
<input onkeyup="value="/oblog/value.replace(/[\W]/g,"'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">

6. 验证油箱格式
<SCRIPT LANGUAGE=javascript RUNAT=Server>
function isEmail(strEmail) {
if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
return true;
else
alert("oh");
}
</SCRIPT>
<input type=text onblur=isEmail(this.value)>

7. 屏蔽关键字(这里屏蔽***和****)
<script language="javascript1.2">
function test() {
if((a.b.value.indexOf ("***") == 0)||(a.b.value.indexOf ("****") == 0)){
alert(":)");
a.b.focus();
return false;}
}
</script>
<form name=a onsubmit="return test()">
<input type=text name=b>
<input type="submit" name="Submit" value="check">
</form>

8. 两次输入密码是否相同
<FORM METHOD=POST ACTION="">
<input type="password" id="input1">
<input type="password" id="input2">
<input type="button" value="test" onclick="check()">
</FORM>
<script>
function check()

with(document.all){
if(input1.value!=input2.value)
{
alert("false")
input1.value = "";
input2.value = "";
}
else document.forms[0].submit();
}
}
</script>
够了吧 :)
屏蔽右键 很酷 
oncontextmenu="return false" ondragstart="return false" onselectstart="return false"
加在body中




2.1  表单项不能为空

<script  language="javascript">
<!--
function  CheckForm()
{  
if  (document.form.name.value.length  ==  0)  {  
alert("请输入您姓名!");
document.form.name.focus();
return  false;
}
return  true;
}
-->
</script>

2.2  比较两个表单项的值是否相同

<script  language="javascript">
<!--
function  CheckForm()
if  (document.form.PWD.value  !=  document.form.PWD_Again.value)  {  
alert("您两次输入的密码不一样!请重新输入.");
document.ADDUser.PWD.focus();
return  false;
}
return  true;
}
-->
</script>

2.3  表单项只能为数字和"_",用于电话/银行帐号验证上,可扩展到域名注册等

<script  language="javascript">
<!--
function  isNumber(String)
{  
var  Letters  =  "1234567890-";  //可以自己增加可输入值
var  i;
var  c;
if(String.charAt(  0  )=='-')
return  false;
if(  String.charAt(  String.length  -  1  )  ==  '-'  )
return  false;
for(  i  =  0;  i  <  String.length;  i  ++  )
{  
c  =  String.charAt(  i  );
if  (Letters.indexOf(  c  )  <  0)
return  false;
}
return  true;
}
function  CheckForm()
{  
if(!  isNumber(document.form.TEL.value))  {  
alert("您的电话号码不合法!");
document.form.TEL.focus();
return  false;
}
return  true;
}
-->
</script>


2.4  表单项输入数值/长度限定

<script  language="javascript">
<!--
function  CheckForm()  
{  
if  (document.form.count.value  >  100  ||  document.form.count.value  <  1)
{  
alert("输入数值不能小于零大于100!");
document.form.count.focus();
return  false;
}
if  (document.form.MESSAGE.value.length<10)
{  
alert("输入文字小于10!");
document.form.MESSAGE.focus();
return  false;
}
return  true;
}
//-->
</script>

2.5  中文/英文/数字/邮件地址合法性判断

<SCRIPT  LANGUAGE="javascript">
<!--

function  isEnglish(name)  //英文值检测
{  
if(name.length  ==  0)
return  false;
for(i  =  0;  i  <  name.length;  i++)  {  
if(name.charCodeAt(i)  >  128)
return  false;
}
return  true;
}

function  isChinese(name)  //中文值检测
{  
if(name.length  ==  0)
return  false;
for(i  =  0;  i  <  name.length;  i++)  {  
if(name.charCodeAt(i)  >  128)
return  true;
}
return  false;
}

function  isMail(name)  //  E-mail值检测
{  
if(!  isEnglish(name))
return  false;
i  =  name.indexOf("  at  ");
j  =  name  dot  lastIndexOf("  at  ");
if(i  ==  -1)
return  false;
if(i  !=  j)
return  false;
if(i  ==  name  dot  length)
return  false;
return  true;
}

function  isNumber(name)  //数值检测
{  
if(name.length  ==  0)
return  false;
for(i  =  0;  i  <  name.length;  i++)  {  
if(name.charAt(i)  <  "0"  ||  name.charAt(i)  >  "9")
return  false;
}
return  true;
}

function  CheckForm()
{  
if(!  isMail(form.Email.value))  {  
alert("您的电子邮件不合法!");
form.Email.focus();
return  false;
}
if(!  isEnglish(form.name.value))  {  
alert("英文名不合法!");
form.name.focus();
return  false;
}
if(!  isChinese(form.cnname.value))  {  
alert("中文名不合法!");
form.cnname.focus();
return  false;
}
if(!  isNumber(form.PublicZipCode.value))  {  
alert("邮政编码不合法!");
form.PublicZipCode.focus();
return  false;
}
return  true;
}
//-->
</SCRIPT>

2.6  限定表单项不能输入的字符

<script  language="javascript">
<!--

function  contain(str,charset)//  字符串包含测试函数
{  
var  i;
for(i=0;i<charset.length;i++)
if(str.indexOf(charset.charAt(i))>=0)
return  true;
return  false;
}

function  CheckForm()
{  
if  ((contain(document.form.NAME.value,  "%\(\)><"))  ||  (contain(document.form.MESSAGE.value,  "%\(\)><")))
{  
alert("输入了非法字符");
document.form.NAME.focus();
return  false;
}
return  true;
}
//-->
</script>  

1. 检查一段字符串是否全由数字组成       
---------------------------------------       
<script language="Javascript"><!--           
function checkNum(str){return str.match(/\D/)==null}           
alert(checkNum("1232142141"))           
alert(checkNum("123214214a1"))           
// --></script>         
      
2. 怎么判断是否是字符         
---------------------------------------       
if (/[^\x00-\xff]/g.test(s)) alert("含有汉字");          
else alert("全是字符");      
           
3. 怎么判断是否含有汉字        
---------------------------------------        
if (escape(str).indexOf("%u")!=-1) alert("含有汉字");         
else alert("全是字符");           
    
4. 邮箱格式验证    
---------------------------------------      
//函数名:chkemail     
//功能介绍:检查是否为Email Address     
//参数说明:要检查的字符串     
//返回值:0:不是 1:是     
function chkemail(a)     
{ var i=a.length;     
var temp = a.indexOf('@');     
var tempd = a.indexOf('.');     
if (temp > 1) {     
if ((i-temp) > 3){     
if ((i-tempd)>0){     
return 1;     
}     
    
}     
}     
return 0;     
}     
    
5. 数字格式验证    
---------------------------------------      
//函数名:fucCheckNUM     
//功能介绍:检查是否为数字     
//参数说明:要检查的数字     
//返回值:1为是数字,0为不是数字     
function fucCheckNUM(NUM)     
{     
var i,j,strTemp;     
strTemp="0123456789";     
if ( NUM.length== 0)     
return 0     
for (i=0;i<NUM.length;i++)     
{     
j=strTemp.indexOf(NUM.charAt(i));     
if (j==-1)     
{     
//说明有字符不是数字     
return 0;     
}     
}     
//说明是数字     
return 1;     
}     
    
6. 电话号码格式验证    
---------------------------------------      
//函数名:fucCheckTEL     
//功能介绍:检查是否为电话号码     
//参数说明:要检查的字符串     
//返回值:1为是合法,0为不合法     
function fucCheckTEL(TEL)     
{     
var i,j,strTemp;     
strTemp="0123456789-()# ";     
for (i=0;i<TEL.length;i++)     
{     
j=strTemp.indexOf(TEL.charAt(i));     
if (j==-1)     
{     
//说明有字符不合法     
return 0;     
}     
}     
//说明合法     
return 1;     
}    
   
7. 判断输入是否为中文的函数   
---------------------------------------      
function ischinese(s){   
var ret=true;   
for(var i=0;i<s.length;i++)   
ret=ret && (s.charCodeAt(i)>=10000);   
return ret;   
}    
   
8. 综合的判断用户输入的合法性的函数  
---------------------------------------      
<script language="javascript">  
//限制输入字符的位数开始  
//m是用户输入,n是要限制的位数  
function issmall(m,n)  
{  
if ((m<n) && (m>0))  
  {  
  return(false);  
  }  
else  
{return(true);}  
}  
  
9. 判断密码是否输入一致  
---------------------------------------      
function issame(str1,str2)  
{  
if (str1==str2)  
{return(true);}  
else  
{return(false);}  
}  
  
10. 判断用户名是否为数字字母下滑线 
---------------------------------------      
function notchinese(str){ 
var reg=/[^A-Za-z0-9_]/g 
    if (reg.test(str)){ 
    return (false); 
    }else{ 
return(true);    } 


11. form文本域的通用校验函数
---------------------------------------      
作用:检测所有必须非空的input文本,比如姓名,账号,邮件地址等等。
该校验现在只针对文本域,如果要针对form里面的其他域对象,可以改变判断条件。

使用方法:在要检测的文本域中加入title文字。文字是在提示信息,你要提示给用户的该字段的中文名。比如要检测用户名
html如下<input name="txt_1" title="姓名">,当然,最好用可视化工具比如dreamweaver什么的来编辑域。
如果要检测数字类型数据的话,再把域的id统一为sz.
javascript判断日期类型比较麻烦,所以就没有做日期类型校验的程序了.高手可以补充。

程序比较草,只是提供一个思路。抛砖引玉! :)
哦,对了,函数调用方法:< form  onsubmit="return dovalidate()">

function dovalidate()
{
fm=document.forms[0] //只检测一个form,如果是多个可以改变判断条件
    for(i=0;i<fm.length;i++)
    {  
    //检测判断条件,根据类型不同可以修改
    if(fm[i].tagName.toUpperCase()=="INPUT" &&fm[i].type.toUpperCase()=="TEXT" && (fm[i].title!=""))
    
         if(fm[i].value="/blog/="")//
         {
         str_warn1=fm[i].title+"不能为空!";
         alert(str_warn1);
        fm[i].focus();
         return false;         
         }
         if(fm[i].id.toUpperCase()=="SZ")//数字校验
         {
                 if(isNaN(fm[i].value))
                { str_warn2=fm[i].title+"格式不对";
                alert(str_warn2);
                fm[i].focus();
                 return false;
                 }
        }
    }
    return true;
}


2 >表单提交验证类 


2.1 表单项不能为空

<script language="javascript">
<!--
function CheckForm()

if (document.form.name.value.length == 0) { 
alert("请输入您姓名!");
document.form.name.focus();
return false;
}
return true;
}
-->
</script>

2.2 比较两个表单项的值是否相同

<script language="javascript">
<!--
function CheckForm()
if (document.form.PWD.value != document.form.PWD_Again.value) { 
alert("您两次输入的密码不一样!请重新输入.");
document.ADDUser.PWD.focus();
return false;
}
return true;
}
-->
</script>

2.3 表单项只能为数字和"_",用于电话/银行帐号验证上,可扩展到域名注册等

<script language="javascript">
<!--
function isNumber(String)

var Letters = "1234567890-"; //可以自己增加可输入值
var i;
var c;
if(String.charAt( 0 )=='-')
return false;
if( String.charAt( String.length - 1 ) == '-' )
return false;
for( i = 0; i < String.length; i ++ )

c = String.charAt( i );
if (Letters.indexOf( c ) < 0)
return false;
}
return true;
}
function CheckForm()

if(! isNumber(document.form.TEL.value)) { 
alert("您的电话号码不合法!");
document.form.TEL.focus();
return false;
}
return true;
}
-->
</script>


2.4 表单项输入数值/长度限定

<script language="javascript">
<!--
function CheckForm() 

if (document.form.count.value > 100 || document.form.count.value < 1)

alert("输入数值不能小于零大于100!");
document.form.count.focus();
return false;
}
if (document.form.MESSAGE.value.length<10)

alert("输入文字小于10!");
document.form.MESSAGE.focus();
return false;
}
return true;
}
//-->
</script>

2.5 中文/英文/数字/邮件地址合法性判断

<SCRIPT LANGUAGE="javascript">
<!--

function isEnglish(name) //英文值检测

if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) { 
if(name.charCodeAt(i) > 128)
return false;
}
return true;
}

function isChinese(name) //中文值检测

if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) { 
if(name.charCodeAt(i) > 128)
return true;
}
return false;
}

function isMail(name) // E-mail值检测

if(! isEnglish(name))
return false;
i = name.indexOf(" at ");
j = name dot lastIndexOf(" at ");
if(i == -1)
return false;
if(i != j)
return false;
if(i == name dot length)
return false;
return true;
}

function isNumber(name) //数值检测

if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) { 
if(name.charAt(i) < "0" || name.charAt(i) > "9")
return false;
}
return true;
}

function CheckForm()

if(! isMail(form.Email.value)) { 
alert("您的电子邮件不合法!");
form.Email.focus();
return false;
}
if(! isEnglish(form.name.value)) { 
alert("英文名不合法!");
form.name.focus();
return false;
}
if(! isChinese(form.cnname.value)) { 
alert("中文名不合法!");
form.cnname.focus();
return false;
}
if(! isNumber(form.PublicZipCode.value)) { 
alert("邮政编码不合法!");
form.PublicZipCode.focus();
return false;
}
return true;
}
//-->
</SCRIPT>

2.6 限定表单项不能输入的字符

<script language="javascript">
<!--

function contain(str,charset)// 字符串包含测试函数

var i;
for(i=0;i<charset.length;i++)
if(str.indexOf(charset.charAt(i))>=0)
return true;
return false;
}

function CheckForm()

if ((contain(document.form.NAME.value, "%\(\)><")) || (contain(document.form.MESSAGE.value, "%\(\)><")))

alert("输入了非法字符");
document.form.NAME.focus();
return false;
}
return true;
}
//-->
</script>

posted @ 2009-06-11 15:15 希 阅读(204) | 评论 (0)编辑 收藏

Javascript的document对象

对象属性:

document.title                 //设置文档标题等价于HTML的<title>标签
document.bgColor               //设置页面背景色
document.fgColor               //设置前景色(文本颜色)
document.linkColor             //未点击过的链接颜色
document.alinkColor            //激活链接(焦点在此链接上)的颜色
document.vlinkColor            //已点击过的链接颜色
document.URL                   //设置URL属性从而在同一窗口打开另一网页
document.fileCreatedDate       //文件建立日期,只读属性
document.fileModifiedDate      //文件修改日期,只读属性
document.fileSize              //文件大小,只读属性
document.cookie                //设置和读出cookie
document.charset               //设置字符集 简体中文:gb2312
----------------------------
常用对象方法:

document.write()                      //动态向页面写入内容
document.createElement(Tag)           //创建一个html标签对象
document.getElementById(ID)           //获得指定ID值的对象
document.getElementsByName(Name)      //获得指定Name值的对象
document.body.appendChild(oTag)
========================================================================
body-主体子对象

document.body                   //指定文档主体的开始和结束等价于<body></body>
document.body.bgColor           //设置或获取对象后面的背景颜色
document.body.link              //未点击过的链接颜色
document.body.alink             //激活链接(焦点在此链接上)的颜色
document.body.vlink             //已点击过的链接颜色
document.body.text              //文本色
document.body.innerText         //设置<body>...</body>之间的文本
document.body.innerHTML         //设置<body>...</body>之间的HTML代码
document.body.topMargin         //页面上边距
document.body.leftMargin        //页面左边距
document.body.rightMargin       //页面右边距
document.body.bottomMargin      //页面下边距
document.body.background        //背景图片
document.body.appendChild(oTag) //动态生成一个HTML对象
----------------------------
常用对象事件:

document.body.onclick="func()"              //鼠标指针单击对象是触发
document.body.onmouseover="func()"          //鼠标指针移到对象时触发
document.body.onmouseout="func()"           //鼠标指针移出对象时触发
========================================================================
location-位置子对象:

document.location.hash          // #号后的部分
document.location.host          // 域名+端口号
document.location.hostname      // 域名
document.location.href          // 完整URL
document.location.pathname      // 目录部分
document.location.port          // 端口号
document.location.protocol      // 网络协议(http:)
document.location.search        // ?号后的部分
----------------------------
常用对象事件:

documeny.location.reload()          //刷新网页
document.location.reload(URL)       //打开新的网页
document.location.assign(URL)       //打开新的网页
document.location.replace(URL)      //打开新的网页
========================================================================
selection-选区子对象
document.selection
========================================================================
images集合(页面中的图象):
----------------------------
a)通过集合引用
document.images                 //对应页面上的<img>标签
document.images.length          //对应页面上<img>标签的个数
document.images[0]              //第1个<img>标签          
document.images[i]              //第i-1个<img>标签
----------------------------
b)通过name属性直接引用
<img name="oImage">
document.images.oImage          //document.images.name属性
----------------------------
c)引用图片的src属性
document.images.oImage.src      //document.images.name属性.src
----------------------------
d)创建一个图象
var oImage
oImage = new Image()
document.images.oImage.src="1.jpg"
同时在页面上建立一个<img>标签与之对应就可以显示
----------------------------
示例代码(动态创建图象):
<html>
<img name=oImage>
<script language="javascript">
       var oImage
       oImage = new Image()
       document.images.oImage.src="1.jpg"
</script>
</html>

<html>
<script language="javascript">
       oImage=document.caeateElement("IMG")
       oImage.src="1.jpg"
       document.body.appendChild(oImage)
</script>
</html>
========================================================================
forms集合(页面中的表单):
----------------------------
a)通过集合引用
document.forms                     //对应页面上的<form>标签
document.forms.length              //对应页面上<form>标签的个数
document.forms[0]                  //第1个<form>标签
document.forms[i]                  //第i-1个<form>标签
document.forms[i].length           //第i-1个<form>中的控件数
document.forms[i].elements[j]      //第i-1个<form>中第j-1个控件
----------------------------
b)通过标签name属性直接引用
<form name="Myform"><input name="myctrl"></form>
document.Myform.myctrl             //document.表单名.控件名
----------------------------
c)访问表单的属性
document.forms[i].name             //对应<form name>属性
document.forms[i].action           //对应<form action>属性
document.forms[i].encoding         //对应<form enctype>属性
document.forms[i].target           //对应<form target>属性
document.forms[i].appendChild(oTag) //动态插入一个控件
----------------------------
示例代码(form):
<html>
<!--Text控件相关Script-->
<form name="Myform">
<input type="text" name="oText">
<input type="password" name="oPswd">
<form>
<script language="javascript">
//获取文本密码框的值
document.write(document.Myform.oText.value)
document.write(document.Myform.oPswd.value)
</script>
</html>
----------------------------
示例代码(checkbox):
<html>
<!--checkbox,radio控件相关script-->
<form name="Myform">
<input type="checkbox" name="chk" value="1">1    
<input type="checkbox" name="chk" value="2">2    
</form>    
<script language="javascript">    
function fun(){    
      //遍历checkbox控件的值并判断是否选中    
      var length    
      length=document.forms[0].chk.length    
      for(i=0;i<length;i++){    
      v=document.forms[0].chk[i].value    
      b=document.forms[0].chk[i].checked    
      if(b)    
        alert(v=v+"被选中")    
      else    
        alert(v=v+"未选中")   
      }    
      }    
</script>     
<a href=# onclick="fun()">ddd</a>                     
</html>
----------------------------
示例代码(Select):
<html>
<!--Select控件相关Script-->
<form name="Myform">
<select name="oSelect">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</form>

<script language="javascript">
       //遍历select控件的option项
       var length
       length=document.Myform.oSelect.length
       for(i=0;i<length;i++)
       document.write(document.Myform.oSelect[i].value)
</script>

<script language="javascript">
       //遍历option项并且判断某个option是否被选中
       for(i=0;i<document.Myform.oSelect.length;i++){
       if(document.Myform.oSelect[i].selected!=true)
       document.write(document.Myform.oSelect[i].value)
       else
       document.write("<font color=red>"+document.Myform.oSelect[i].value+"</font>")  
       }
</script>

<script language="javascript">
       //根据SelectedIndex打印出选中的option
       //(0到document.Myform.oSelect.length-1)
       i=document.Myform.oSelect.selectedIndex
       document.write(document.Myform.oSelect[i].value)
</script>

<script language="javascript">
       //动态增加select控件的option项
       var oOption = document.createElement("OPTION");
       oOption.text="4";
       oOption.value="4";
       document.Myform.oSelect.add(oOption);
</script>
<html>
========================================================================
Div集合(页面中的层):
<Div id="oDiv">Text</Div>
document.all.oDiv                                  //引用图层oDiv               
document.all.oDiv.style.display=""                 //图层设置为可视
document.all.oDiv.style.display="none"             //图层设置为隐藏
document.getElementId("oDiv")                      //通过getElementId引用对象
document.getElementId("oDiv").
document.getElementId("oDiv").display="none"
/*document.all表示document中所有对象的集合
只有ie支持此属性,因此也用来判断浏览器的种类*/
----------------------------
图层对象的4个属性
document.getElementById("ID").innerText      //动态输出文本
document.getElementById("ID").innerHTML      //动态输出HTML
document.getElementById("ID").outerText      //同innerText
document.getElementById("ID").outerHTML      //同innerHTML
----------------------------
示例代码:
<html>
<script language="javascript">
function change(){
document.all.oDiv.style.display="none"
}
</script>
<Div id="oDiv" onclick="change()">Text</Div>
</html>

<html>
<script language="javascript">
function changeText(){
document.getElementById("oDiv").innerText="NewText"
}
</script>
<Div id="oDiv" onmouseover="changeText()">Text</Div>
</html>

posted @ 2009-06-11 14:45 希 阅读(760) | 评论 (1)编辑 收藏

ioc

一、IOC的概念
        Inversion of control 控制反转;
        以前: 对象的协作关系A类自己来负责;
            A do() ---> B f1()
                   ---> C f2()
            do(){
                new B().f1();
                new C().f2();
            }
            对象A负责建立与其协作对象的关系;
            问题:
                1)对象协作关系的建立与业务本身的逻辑纠缠在一起;
                2)协作关系也是不容易维护的;(B, C发生改变)

         现在: 对象的协作关系容器来负责;
            
             A do() ---> IB <---B f1()
                    ---> IC <---C f2()
             setIB(B)
             setIC(C)
           对象不再负责建立与协作对象的关系, 由容器来负责对象的协作关系;       
            
       控制: 指对象的协作关系由谁来建立;
       反转: 原来由对象自己调用的变成了容器调用;
      
       好处: 代码更好维护, 协作关系不需要考虑了;
                                      对象依赖于接口, 协作对象发生改变以后, 不需要改变;
       控制反转又叫依赖注入: 将对象的协作关系由容器来注入;                               
       
二、 基本的容器与IOC的使用
1, spring-framework-2.0.6-with-dependencies
      MyEclipse 自带的有jar包,但是会有一些问题;

      我们再创建自己的user库: spring2_lib:
      需要三个地方的包:
      spring framework/dist/spring.jar
                       lib/jakarta-commons/*.jar
                       lib/cglib/*.jar

      新建工程springdev 右击, myeclipse-- add spring capabilities--- add user libriay--spring2_lib

      接口: Greeter
            package ioc1;

            public interface Greeter {
                   public String sayHello();
            }
      实现类: GreeterImpl
            package ioc1;

            public class GreeterImpl implements Greeter{
            private String user;
            //提供一个set方法, 可以注入
            public void setUser(String user) {
               this.user = user;
            }
           
            public String sayHello() {
              
               return "你好 " +user;
            }
            }

        配置文件: applicationContext.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
            <bean id="greeter" class="ioc1.GreeterImpl">
              <property name="user"><!-- 属性名字 -->
        <value>zhangsan</value>
              </property>
            </bean>
        </beans>

        测试类:Test
            import org.springframework.beans.factory.BeanFactory;
            import org.springframework.beans.factory.xml.XmlBeanFactory;
            import org.springframework.core.io.ClassPathResource;
            import org.springframework.core.io.Resource;
           
            public class Test {
            public static void main(String[] args) {
               //配置文件的路径
               Resource rs=new ClassPathResource("/ioc1/applicationContext.xml");
               BeanFactory bf=new XmlBeanFactory(rs);
               Greeter gt=(Greeter) bf.getBean("greeter");//配置文件中id的名字
               System.out.println(gt.sayHello());
              
            }
            }

2, IOC的类型:
         1) set 方式来注入:
                <property name=””></property>
                其中,name属性的取值依setter方法名而定
                对于基本类型,spring容器会自动做类型转换,以便赋值;

         2)构造器的方式来注入;
                <constructor-arg index=””></ constructor-arg>
                其中,index表示构造方法中的参数位置(第一个参数索引为0)

         3)实现特定的接口来注入,
                这种方式已经不采用了,因为业务对象会依赖框架的特定接口;
                " 侵入式 "方案;

    注入的类型:
        1)八种基本类型+String ;
        2)对象
        3)集合: list, set , map , properties
        4)null

3, Spring 容器 :
      用于实例化对象, 然后赋值或者装配, 生命周期管理的一种类;
      容器的种类:
            BeanFactory: 1)所有容器的父接口, 组件的生成和组装;
                         2)提供了基本的IOC的功能;
                         3)一个实现: XmlBeanFactory ,
                           需要提供一个Resource的实例给XmlFactory, Resource对象来包装配置文件;
                         4)getBean(String)方法,返回一个装配好的对象;
                         5)在默认情况下返回的对象都采用的单例模式;
                         6)直到调用getBean方法时, 才会实例化并且装配对象;
                         实例化 -- 构造对象, 给属性赋值 -- 装配/注入 ;

            ApplicationContext: Spring的上下文, 也是一个容器, 是BeanFactory的子接口;
                                增强了BeanFactory, 提供了事件处理, 国际化,复杂的生命周期管理;
                                一般情况下用ApplicationContext, 而不用BeanFactory;
                                实现类:
                                     ClassPathXmlApplicationContext: 依据classpath查找配置文件;
                                     容器初始化的时候会预先实例化单例的对象; 可以配置, 有的采用单例有的不用; 三、set 方式注入:
<1>. 基本类型的注入:
      注入简单类型: 八种基本类型+String
      方式: id是bean的id号, 唯一的; class是bean类的全路径;
      <bean id="" ,class="">     
            <property name=""> <!--属性名, set方法去掉set并将首字母小写后的名字 -->     
                <value>属性值</value>
            </property>     
     </bean>                
     对于基本类型, 会自动转换数据类型; 跟序列化的意思差不多;
      用ApplicationContext 容器写测试类:
        ApplicationContext ctx=new ClassPathXmlApplicationContext("/ioc1/applicationContext.xml");
        Greeter gt2=(Greeter) ctx.getBean("greeter");
        Greeter gt3=(Greeter) ctx.getBean("greeter");
         System.out.println(gt2.sayHello());
        //测试单例模式;true
        System.out.println(gt2==gt3);

<2>. 对象类型的注入:
     1) <ref local> 要注入的对象在同一个配置文件中;
      2) <ref bean> 要注入的对象可以分散在其他的配置文件中;
      3) 将要注入的bean类的配置信息直接嵌入到bean类中;(有点象内部类)
         不让客户端直接用getBean方式获得,该对象只被注入的对象使用;

例子1:
        实现类:
        public class OderServiceImpl implements OrderService{
     private SomeBean sb; //最好用接口
}

        ============================第一种:<ref local>=================================
配置文件1: <ref local>
                    使用local则定义的两个类必须出现在同一个配置文件中
        <!-- 第一个bean -->
        <bean id="otherBean" class="IOC.pm.set.Class.OtherBean">
        <property name="str"><!-- 属性名字 -->
           <value>someinfo</value>
        </property>
        </bean>
       
        <!-- 第二个bean -->
        <bean id="someBean" class="IOC.pm.set.Class.SomeBean">
        <property name="ob">
           <ref local="otherBean"/> //另外一个bean的id;
        </property>
        </bean>
      
        ===========================第二种:嵌套==================================
        或者2: 嵌到一起: 被嵌套的bean就不能够使用getBean()来返回了;
               使用嵌套定义的两个类必须出现在同一个配置文件中
         <bean id="someBean" class="IOC.pm.set.Class.SomeBean">
   <property name="ob">
                 <!--这样的话ohterBean只能被someBean调用 -->
           <bean id="otherBean" class="IOC.pm.set.Class.OtherBean">
                        <property name="str1"><!-- 属性名字 -->
                           <value>tarena</value>
     </property>
    </bean>
   </property>
</bean>

        ============================第三种:<ref bean>==================================
        或者3: <ref bean>: 功能最强大的搜索多个配置文件;
                 加一个配置文件: otherContext.xml 放someBean的配置;
                 applicationContext.xml中 <ref bean="otherBean"/>
                 测试类中: 写成一个字符串数组;
                 ApplicationContext ctx=new ClassPathXmlApplicationContext(
                               new String[]{"/ioc2/applicationContext.xml","/ioc2/other-config.xml.xml"});

   <3>. 集合的注入: (看老师的示例; )
         List: 可重复的,有序
                可以存放字符串,对象, 以及集合;
                <property name="list">
           <list>
            <value>String1</value>
            <value>String2</value>
           </list>
         </property>

         Set: 不重复, 无序
                可以存放字符串,对象, 以及集合;
                <property name="set">
    <set>
     <value>String1</value>
     <value>String1</value>
    </set>
   </property>

         Map:Key(只能用String), value 键值对;
                <property name="map">
    <map>
     <entry key="key1"><!-- 用key来存放key的值,用value来存放value值 -->
      <value>value1</value>
     </entry>
     <entry key="key2">
      <value>value2</value>
     </entry>
    </map>
   </property>
  
         Properties: key(String),value(String) 键值对
        
                <property name="properties">
    <props>
     <prop key="key11">value11</prop>
     <prop key="key22">value22</prop>
    </props>
   </property>
四、构造器的方式注入:      
              <1>. <constructor-arg>
   <value>基本类型</value>
</constructor-arg>
             <2>. <constructor-arg>
   <ref bean=""></ref>
</constructor-arg>
    <bean id="someBean" class="ioc4.SomeBean">
   <constructor-arg index="1"><!--参数的顺序可以改变,下标从0开始 -->
     <value>String1</value>
   </constructor-arg>
   <constructor-arg index="0">
     <value>String2</value>
   </constructor-arg>
</bean>

构造器注入和set方式注入比较:
             用构造器注入:如果要注入的对象,属性不是特别多,并且属性值一定要被注入后才能来使用;
             其他情况用set方式注入;
                                 
五、IOC的特例 ;

    1, 自动装配, 让容器依据某种规则,自动的对组件实施装配;
             在bean中:
              autowire=""
                   <1>. byName: 匹配属性的名字与bean的id号进行匹配; 找set方法;

                       someBean中有一个ob的属性:
                        <bean id="ob" class="ioc6.OtherBean">
                <property name="str1">
                 <value>String1</value>
                </property>
                </bean>
                <bean id="someBean" class="ioc6.SomeBean" autowire="byName">
                   <property name="str1">
                    <value>String1</value>
                   </property>
                </bean>
               
                   <2>. byType: 寻找配置文件, 匹配的属性类型与bean一致; 找set方法;
                                 上面例子改成byType 也是正确的, 并且ob可以改为别的名字;
                                 如果在配置文件中找到符合条件的bean的个数超过一个,会报错;

                   <3>. constructor: 匹配构造器,看构造器的参数类型和配置文件bean的类型是否一致,
                                     一致就成功,否则报错;
                                     匹配个数超过一个,也报错;
                                     提供一个构造器;

                   <4>. autodetect: 自动检测, 先构造器, 再set方法(也就是可以set方法和构造方法可以同时使用);

              自动从配置文件中寻找对应的bean的名字;
              注意:手动装配会覆盖自动装配的策略;
             
          问题:
                    1)自动装配用的很少, 配置文件中,bean的关系不清晰, 易出错;
                       在建立原型的时候, 快速搭建, 真正开发的时候, 一般手动配置;
                    2)自动装配和手动装配配合在一起使用; 手动可以覆盖自动的;
                    3)自动装配搭配一个装配检查; 属性先检查, 出错后就不再进行了;
                     dependency-check=""
                            simple :只检查基本类型属性是否装配成功;
                            objects:只检查Object类型是否装配成功;
                            all:全检查;
                     既可以和自动装配一起使用, 也可以单独用来检查是否装配成功;

          自动装配的使用情况:
                   1,构建系统原形;
                   2,与dependency-check=""配合使用;
                   3,手动装配会和自动装配要配合使用;             


     2, 用工厂的方式创建对象: 静态工厂, 实例工厂;
          原因是: 很多对象不方便采用配置文件去装配;
          如: 获得数据库连接, 可以写一个ConnectionFactory, getConnection方法
          静态工厂类, 静态方法, getBean("connection")就可以得到连接;
                public static Car createCar(){// 静态工厂,静态方法
      return new Car();
   }
                <bean id="car" class="ioc5.CarFactory" factory-method="createCar" />
                Car car=(Car) ctx.getBean("car");
   System.out.println(car);
          实例工厂: 指工厂实例化后才能使用,
                public Car createCar(){// 必须是实例方法
      return new Car();
   }
               <bean id="carFactory" class="ioc5.CarFactory" />
       <bean id="car" factory-bean="carFactory"   factory-method="createCar" />

    3,继承关系:
         <bean id="abstractBean" class="day02.ioc7.SomeBean" abstract="true">
    <property name="str1">
     <value>string1</value>
    </property>
    <property name="num">
     <value>20</value>
    </property>
   </bean>
   <!-- 继承关系 -->
   <bean id="someBean" parent="abstractBean">
    <property name="num">
     <value>30</value>
    </property>
         </bean>
       
    得到的bean不想用单例时, 在bean标签上加 Scope=singleton/prototype


    装配中的其它情况:
    
   单例:scope=""
        singleton,prototype
      
   初始化与销毁: init-method,destroy-method

posted @ 2009-06-05 14:22 希 阅读(195) | 评论 (0)编辑 收藏

在GUI下:
(1)可按i进入插入模式
(2)使用鼠标拖动反选要粘贴的内容,按鼠标左键复制选定块到缓冲区
(3)然后将光标移到要粘贴处,按鼠标中键(两键鼠标可同时按左右键),粘贴缓冲区内容。

在纯文本终端下:
(1)选定文本块,使用v进入可视模式;移动光标键选定内容
(2)复制选定块到缓冲区,用y;复制整行,用yy
(3)剪切选定块到缓冲区,用d;剪切整行用dd
(4)粘贴缓冲区中的内容,用p

在同一编辑窗打开第二个文件,用:sp [filename]
在多个编辑文件之间切换,用Ctrl+w

命令前面加数字表示重复次数,加字

posted @ 2009-06-03 17:37 希 阅读(882) | 评论 (0)编辑 收藏

1、使用SHOW语句找出在服务器上当前存在什么数据库:

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
3 rows in set (0.00 sec)


    2、创建一个数据库abccs
    mysql> CREATE DATABASE abccs;
    注意不同操作系统对大小写的敏感。

    3、选择你所创建的数据库
    mysql> USE abccs
    Database changed
    此时你已经进入你刚才所建立的数据库abccs.

    4、 创建一个数据库表

    首先看现在你的数据库中存在什么表:
    mysql> SHOW TABLES;
    Empty set (0.00 sec)
    说明刚才建立的数据库中还没有数据库表。下面来创建一个数据库表mytable:
    我们要建立一个你公司员工的生日表,表的内容包含员工姓名、性别、出生日期、出生城市。

mysql> CREATE TABLE mytable (name VARCHAR(20), sex CHAR(1),
-> birth DATE, birthaddr VARCHAR(20));
Query OK, 0 rows affected (0.00 sec)


    由于name、birthadd的列值是变化的,因此选择VARCHAR,其长度不一定是20。可以选择从1到255的任何长度,如果以后需要改变它的字长,可以使用ALTER TABLE语句。);性别只需一个字符就可以表示:"m"或"f",因此选用CHAR(1);birth列则使用DATE数据类型。

    创建了一个表后,我们可以看看刚才做的结果,用SHOW TABLES显示数据库中有哪些表:

mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| mytables |
+---------------------+


    5、显示表的结构:

mysql> DESCRIBE mytable;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| deathaddr | varchar(20) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)


    6、 往表中加入记录

    我们先用SELECT命令来查看表中的数据:
    mysql> select * from mytable;
    Empty set (0.00 sec)
    这说明刚才创建的表还没有记录。

    加入一条新记录:

mysql> insert into mytable
-> values (′abccs′,′f′,′1977-07-07′,′china′);
Query OK, 1 row affected (0.05 sec)


    再用上面的SELECT命令看看发生了什么变化。我们可以按此方法一条一条地将所有员工的记录加入到表中。

    7、用文本方式将数据装入一个数据库表

    如果一条一条地输入,很麻烦。我们可以用文本文件的方式将所有记录加入你的数据库表中。创建一个文本文件“mysql.txt”,每行包含一个记录,用定位符(tab)把值分开,并且以在CREATE TABLE语句中列出的列次序给出,例如:

abccs f 1977-07-07 china  
mary f 1978-12-12 usa
tom m 1970-09-02 usa


    使用下面命令将文本文件“mytable.txt”装载到mytable表中:mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;

    再使用如下命令看看是否已将数据输入到数据库表中:mysql> select * from mytable;

posted @ 2009-06-02 16:16 希 阅读(1201) | 评论 (1)编辑 收藏

重量级组件:运行平台必须存在一个对应的组件.
轻量级组件:在一个虚拟的画布上画出来的组件(所以swing较慢),所有轻量级组件 "最终 "要放到重量级组件(jframe,jdialog)中.由于是画出来所以能做到各种平台上一致的表现.同样,如果混合重量级组件和轻量级组件容易引起重叠上的冲突.  

JDK   1.2   之后,Java   有了另一组   GUI   的   API,叫做   Swing。因为   Swing   是   lightweight   的   API,所以无所不能,不但有各式各样先进的组件,而且连组件风格都可抽换。Swing   出现之后,大家很快地就不太使用   AWT   了。
不要以为   Swing   是用来取代   AWT   的,其实   Swing   是架构在   AWT   之上做出来的(Swing   有四个   heavyweight   组件),没有   AWT,也就不会有   Swing。Swing   的出现只是减少程序员直接使用   AWT   的机会,而不会让   AWT   消失。  

在swing中有5个heavyweight组件:   JFrame,   JDialog,   JApplet,   JInternalFrame,   and   JWindow   ,其它的组件全部是源自JComponent类和lightweight的组件,尽可能的不要使用awt组件。

posted @ 2009-06-02 15:46 希 阅读(264) | 评论 (0)编辑 收藏

 当HelloAction类调用HttpServletRequest的setAttribute()方法,向hello.jsp传递PersonBean对象时,需要提供一个名为"personbean"的属性key:
request.setAttribute("personbean",pb);

    hello.jsp通过这个名为"personbean"的属性key来读取PersonBean对象:

<logic:present name="personbean" scope="request">
     <h2>
       Hello <bean:write name="personbean" property="userName" />!<p>
     </h2>
</logic:present>


    对于Struts应用,提倡将这些属性key常量定义在一个Java文件Constants.java中,例程2-6显示了它的源程序。

例程2-6  Constants.java
package hello;
public final class Constants {
   /**
     * The application scope attribute under which our user database
     * is stored.
     */
    public static final String PERSON_KEY = "personbean";
}


    这样,HelloAction类可以按以下方式来调用HttpServletRequest的setAttribute()方法:request.setAttribute( Constants.PERSON_KEY, pb);

    把一些常量定义在Constants.java中可以提高Action类的独立性,当属性key常量值发生改变,只需要修改Constants.java文件,不需要修改Action类。

此外,在本例中,把PersonBean对象保存在HttpServletRequest对象中。对于其他实际的Web应用,也可以根据需要把JavaBean对象保存在HttpSession对象中。


本文选自飞思图书《精通Struts:基于MVC的Java Web设计与开发》

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zaowei21/archive/2005/01/14/253446.aspx

posted @ 2009-06-01 14:08 希 阅读(473) | 评论 (0)编辑 收藏

本文对于Struts的基本工作原理MVC模式不进行具体的讨论,仅针对container启动之后,struts框架中所发生的一些"事情"进行讨论。

    通常我们在配置Struts框架的时候,所使用的Controller都是默认的org"apache"struts"action"ActionServlet,它继承自javax.servlet.http.HttpServlet,因此具有一般servlet的所有特征,必须在web.xml中对其进行注册。当我们的container第一次启动的时候(这个说法不是很准确,或者是ActionServlet第一次被请求调用得时候),会自动加载ActionServlet,同时调用其中的init()方法。

一个用户的请求是通ActionServlet来处理和转发的。那么,ActionServlet如何决定把用户请求转发给哪个Action对象呢?这就需要一些描述用户请求路径和Action衍射关系的配置信息了。在Struts中,这些配置映射信息都存储在特定的XML文件Struts- config.xml中。在该配置文件中,每一个Action的映射信息都通过一个<Action>元素来配置。

这些配置信息在系统启动的时候被读入内存,供Struts在运行期间使用。在内存中,每一个<action>元素都对应一个org.apache.struts.action.ActionMapping类的实例。

对于采用Struts框架的web应用,在web应用启动时就会加载并初始化ActionServlet,ActionServlet从struts- config.xml文件中读取配置信息,把它们存放到各个配置对象中,例如Action的映射信息存放在ActionMapping

当ActionServlet接收到一个客户请求时,将执行如下流程:

1.检索和用户请求相匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效信息。

2.如ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。

3.根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的Validate()方法。

4.如果ActionForm的Validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。

5.ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。

6.Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。

7.ActionForward对象指向的JSP组件生成动态网页,返回给客户。

posted @ 2009-05-31 17:33 希 阅读(186) | 评论 (0)编辑 收藏

当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。

    下面就将逐一介绍其中几个关键的部分:


  第一部分:内核的引导(核内引导)

  Red Hat9.0可以使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权,然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。这里使用了几个汇编程序来引导Linux,这一步泛及到Linux源代码树中的“arch/i386/boot”下的这几个文件:bootsect.S、setup.S、video.S等。

  其中bootsect.S是生成引导扇区的汇编源码,它完成加载动作后直接跳转到setup.S的程序入口。setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到特别内存中,以便以后这些参数被保护模式下的代码来读取。此外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到 0x100000。

  那么0x100000这个内存地址中存放的是什么代码?而这些代码又是从何而来的呢?

  0x100000这个内存地址存放的是解压后的内核,因为Red Hat提供的内核包含了众多驱动和功能而显得比较大,所以在内核编译中使用了“makebzImage”方式,从而生成压缩过的内核,在RedHat中内核常常被命名为vmlinuz,在Linux的最初引导过程中,是通过"arch/i386/boot/compressed/"中的head.S利用misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000的。

  当CPU跳到0x100000时,将执行"arch/i386/kernel/head.S"中的startup_32,它也是vmlinux的入口,然后就跳转到start_kernel()中去了。start_kernel()是"init/main.c"中的定义的函数,start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。start_kernel()函数中,做了大量的工作来建立基本的Linux核心环境。如果顺利执行完start_kernel(),则基本的Linux核心环境已经建立起来了。

  在start_kernel()的最后,通过调用init()函数,系统创建第一个核心线程,启动了init过程。而核心线程init()主要是来进行一些外设初始化的工作的,包括调用do_basic_setup()完成外设及其驱动程序的加载和初始化。并完成文件系统初始化和root文件系统的安装。

  当do_basic_setup()函数返回init(),init()又打开了/dev/console设备,重定向三个标准的输入输出文件stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。到此init()函数结束,内核的引导部分也到此结束了,

    第二部分:运行init


  init的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序,。init程序需要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。在Redhat系统中,inittab的内容如下所示(以“###"开始的中注释为笔者增加的):

  #
  # inittab       This file describes how the INIT process should set up
  #               the system in a certain run-level.
  #
  # Author:       Miquel van Smoorenburg,

  #               Modified for RHS Linux by Marc Ewing and Donnie Barnes
  #

  # Default runlevel. The runlevels used by RHS are:
  #   0 - halt (Do NOT set initdefault to this)
  #   1 - Single user mode
  #   2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)
  #   3 - Full multiuser mode
  #   4 - unused
  #   5 - X11
  #   6 - reboot (Do NOT set initdefault to this)
  #
  ###表示当前缺省运行级别为5(initdefault);
  id:5:initdefault:

  ###启动时自动执行/etc/rc.d/rc.sysinit脚本(sysinit)
  # System initialization.
  si::sysinit:/etc/rc.d/rc.sysinit

  l0:0:wait:/etc/rc.d/rc 0
  l1:1:wait:/etc/rc.d/rc 1
  l2:2:wait:/etc/rc.d/rc 2
  l3:3:wait:/etc/rc.d/rc 3
  l4:4:wait:/etc/rc.d/rc 4
  ###当运行级别为5时,以5为参数运行/etc/rc.d/rc脚本,init将等待其返回(wait)
  l5:5:wait:/etc/rc.d/rc 5
  l6:6:wait:/etc/rc.d/rc 6

  ###在启动过程中允许按CTRL-ALT-DELETE重启系统
  # Trap CTRL-ALT-DELETE
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now

  # When our UPS tells us power has failed, assume we have a few minutes
  # of power left.  Schedule a shutdown for 2 minutes from now.
  # This does, of course, assume you have powerd installed and your
  # UPS connected and working correctly.
  pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

  # If power was restored before the shutdown kicked in, cancel it.
  pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

  ###在2、3、4、5级别上以ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登录,
  ###如果进程退出则再次运行mingetty程序(respawn)
  # Run gettys in standard runlevels
  1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6

  ###在5级别上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行(respawn)
  # Run xdm in runlevel 5
  x:5:respawn:/etc/X11/prefdm -nodaemon

以上面的inittab文件为例,来说明一下inittab的格式。其中以#开始的行是注释行,除了注释行之外,每一行都有以下格式:
  id:runlevel:action:process

  对上面各项的详细解释如下:

  1. id

  id是指入口标识符,它是一个字符串,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。

  2. runlevel

  runlevel是init所处于的运行级别的标识,一般使用0-6以及S或s。0、1、6运行级别被系统保留:其中0作为shutdown动作,1作为重启至单用户模式,6为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现,实际上,进入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。在一般的系统实现中,都使用了2、3、4、5几个级别,在Redhat系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示XDM图形登录方式。7-9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。

  3. action

  action是描述其后的process的运行方式的。action可取的值包括:initdefault、sysinit、boot、bootwait等:

  initdefault是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活以后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入runlevel。

  sysinit、boot、bootwait等action将在系统启动时无条件运行,而忽略其中的runlevel。

  其余的action(不含initdefault)都与某个runlevel相关。各个action的定义在inittab的man手册中有详细的描述。

  4. process

  process为具体的执行程序。程序后面可以带参数。

  第三部分:系统初始化

  在init的配置文件中有这么一行:

  si::sysinit:/etc/rc.d/rc.sysinit

  它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

  rc.sysinit约有850多行,但是每个单一的功能还是比较简单,而且带有注释,建议有兴趣的用户可以自行阅读自己机器上的该文件,以了解系统初始化所详细情况。由于此文件较长,所以不在本文中列出来,也不做具体的介绍。

  当rc.sysinit程序执行完毕后,将返回init继续下一步。


第四部分:启动对应运行级别的守护进程


  在rc.sysinit执行后,将返回init继续其它的动作,通常接下来会执行到/etc/rc.d/rc程序。以运行级别3为例,init将执行配置文件inittab中的以下这行:

  l5:5:wait:/etc/rc.d/rc 5

  这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些链接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。

  /etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的链接文件,对于以以S开头的启动脚本,将以start参数来运行。而如果发现存在相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。

  至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。常见的守护进程有:

  amd:自动安装NFS守护进程
  apmd:高级电源管理守护进程
  arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库
  autofs:自动安装管理进程automount,与NFS相关,依赖于NIS
  crond:Linux下的计划任务的守护进程
  named:DNS服务器
  netfs:安装NFS、Samba和NetWare网络文件系统
  network:激活已配置网络接口的脚本程序
  nfs:打开NFS服务
  portmap:RPC portmap管理器,它管理基于RPC服务的连接
  sendmail:邮件服务器sendmail
  smb:Samba文件共享/打印服务
  syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本
  xfs:X Window字型服务器,为本地和远程X服务器提供字型集
  Xinetd:支持多种网络服务的核心守护进程,可以管理wuftp、sshd、telnet等服务

  这些守护进程也启动完成了,rc程序也就执行完了,然后又将返回init继续下一步。

    第五部分:建立终端


  rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。init接下来会打开6个终端,以便用户登录系统。通过按Alt+Fn(n对应1-6)可以在这6个终端中切换。在inittab中的以下6行就是定义了6个终端:

  1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6

  从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。

  第六部分:登录系统,启动完成

  对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。而本文主要讲的还是文本方式登录的情况:

  当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。

  Linux的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

  在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为/bin/bash。

  login程序成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下)。然后开始设置各种环境变量:对于bash来说,系统首先寻找/etc/profile脚本文件,并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。

posted @ 2009-05-25 11:06 希 阅读(177) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4 下一页 

posts - 40, comments - 9, trackbacks - 0, articles - 9

Copyright © 希