jquery
关键字: js
Query技巧总结
它具有如下一些特点:
1、代码简练、语义易懂、学习快速、文档丰富。
2、jQuery是一个轻量级的脚本,其代码非常小巧,最新版的JavaScript包只有20K左右。
3、jQuery支持CSS1-CSS3,以及基本的xPath。
4、jQuery是跨浏览器的,它支持的浏览器包括IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+。
5、可以很容易的为jQuery扩展其他功能。
6、能将JS代码和HTML代码完全分离,便于代码和维护和修改。
7、插件丰富,除了jQuery本身带有的一些特效外,可以通过插件实现更多功能,如表单验证、tab导航、拖放效果、表格排序、DataGrid,树形菜单、图像特效以及ajax上传等。
jQuery的设计会改变你写JavaScript代码的方式,降低你学习使用JS操作网页的复杂度,提高网页JS开发效率,无论对于js初学者还是资深专家,jQuery都将是您的首选。
jQuery适合于设计师、开发者以及那些还好者,同样适合用于商业开发,可以说jQuery适合任何JavaScript应用的地方,可用于不同的Web应用程序中。
官方站点:http://jquery.com/ 中文站点:http://jquery.org.cn/
、语法总结和注意事项
1、关于页面元素的引用
通过jquery的$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法。
2、jQuery对象与dom对象的转换
只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是jquery对象。
普通的dom对象一般可以通过$()转换成jquery对象。
如:$(document.getElementById("msg"))则为jquery对象,可以使用jquery的方法。
由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。
如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下几种写法都是正确的:
$("#msg").html();
$("#msg")[0].innerHTML;
$("#msg").eq(0)[0].innerHTML;
$("#msg").get(0).innerHTML;
3、如何获取jQuery集合的某一项
对于获取的元素集合,获取其中的某一项(通过索引指定)可以使用eq或get(n)方法或者索引号获取,要注意,eq返回的是jquery对象,而get(n)和索引返回的是dom元素对象。对于jquery对象只能使用jquery的方法,而dom对象只能使用dom的方法,如要获取第三个<div>元素的内容。有如下两种方法:
$("div").eq(2).html(); //调用jquery对象的方法
$("div").get(2).innerHTML; //调用dom的方法属性
4、同一函数实现set和get
Jquery中的很多方法都是如此,主要包括如下几个:
$("#msg").html(); //返回id为msg的元素节点的html内容。
$("#msg").html("<b>new content</b>");
//将“<b>new content</b>” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content
$("#msg").text(); //返回id为msg的元素节点的文本内容。
$("#msg").text("<b>new content</b>");
//将“<b>new content</b>” 作为普通文本串写入id为msg的元素节点内容中,页面显示<b>new content</b>
$("#msg").height(); //返回id为msg的元素的高度
$("#msg").height("300"); //将id为msg的元素的高度设为300
$("#msg").width(); //返回id为msg的元素的宽度
$("#msg").width("300"); //将id为msg的元素的宽度设为300
$("input").val("); //返回表单输入框的value值
$("input").val("test"); //将表单输入框的value值设为test
$("#msg").click(); //触发id为msg的元素的单击事件
$("#msg").click(fn); //为id为msg的元素单击事件添加函数
同样blur,focus,select,submit事件都可以有着两种调用方法
5、集合处理功能
对于jquery返回的集合内容无需我们自己循环遍历并对每个对象分别做处理,jquery已经为我们提供的很方便的方法进行集合的处理。
包括两种形式:
$("p").each(function(i){this.style.color=['#f00','#0f0','#00f'][i]})
//为索引分别为0,1,2的p元素分别设定不同的字体颜色。
$("tr").each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})
//实现表格的隔行换色效果
$("p").click(function(){alert($(this).html())})
//为每个p元素增加了click事件,单击某个p元素则弹出其内容
6、扩展我们需要的功能
$.extend({
min: function(a, b){return a < b?a:b; },
max: function(a, b){return a > b?a:b; }
}); //为jquery扩展了min,max两个方法
使用扩展的方法(通过“$.方法名”调用):
alert("a=10,b=20,max="+$.max(10,20)+",min="+$.min(10,20));
7、支持方法的连写
所谓连写,即可以对一个jquery对象连续调用各种不同的方法。
例如:
$("p").click(function(){alert($(this).html())})
.mouseover(function(){alert('mouse over event')})
.each(function(i){this.style.color=['#f00','#0f0','#00f'][i]});
8、操作元素的样式
主要包括以下几种方式:
$("#msg").css("background"); //返回元素的背景颜色
$("#msg").css("background","#ccc") //设定元素背景为灰色
$("#msg").height(300); $("#msg").width("200"); //设定宽高
$("#msg").css({ color: "red", background: "blue" });//以名值对的形式设定样式
$("#msg").addClass("select"); //为元素增加名称为select的class
$("#msg").removeClass("select"); //删除元素名称为select的class
$("#msg").toggleClass("select"); //如果存在(不存在)就删除(添加)名称为select的class
9、完善的事件处理功能
Jquery已经为我们提供了各种事件处理方法,我们无需在html元素上直接写事件,而可以直接为通过jquery获取的对象添加事件。
如:
$("#msg").click(function(){alert("good")}) //为元素添加了单击事件
$("p").click(function(i){this.style.color=['#f00','#0f0','#00f'][i]})
//为三个不同的p元素单击事件分别设定不同的处理
jQuery中几个自定义的事件:
(1)hover(fn1,fn2):一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法。当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时,会触发指定的第二个函数。
//当鼠标放在表格的某行上时将class置为over,离开时置为out。
$("tr").hover(function(){
$(this).addClass("over");
},
function(){
$(this).addClass("out");
});
(2)ready(fn):当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。
$(document).ready(function(){alert("Load Success")})
//页面加载完毕提示“Load Success”,不同于onload事件,onload需要页面内容加载完毕(图片等),而ready只要页面html代码下载完毕即触发。与$(fn)等价
(3)toggle(evenFn,oddFn): 每次点击时切换要调用的函数。如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二个函数。随后的每次点击都重复对这两个函数的轮番调用。
//每次点击时轮换添加和删除名为selected的class。
$("p").toggle(function(){
$(this).addClass("selected");
},function(){
$(this).removeClass("selected");
});
(4)trigger(eventtype): 在每一个匹配的元素上触发某类事件。
例如:
$("p").trigger("click"); //触发所有p元素的click事件
(5)bind(eventtype,fn),unbind(eventtype): 事件的绑定与反绑定
从每一个匹配的元素中(添加)删除绑定的事件。
例如:
$("p").bind("click", function(){alert($(this).text());}); //为每个p元素添加单击事件
$("p").unbind(); //删除所有p元素上的所有事件
$("p").unbind("click") //删除所有p元素上的单击事件
10、几个实用特效功能
其中toggle()和slidetoggle()方法提供了状态切换功能。
如toggle()方法包括了hide()和show()方法。
slideToggle()方法包括了slideDown()和slideUp方法。
11、几个有用的jQuery方法
$.browser.浏览器类型:检测浏览器类型。有效参数:safari, opera, msie, mozilla。如检测是否ie:$.browser.isie,是ie浏览器则返回true。
$.each(obj, fn):通用的迭代函数。可用于近似地迭代对象和数组(代替循环)。
如
$.each( [0,1,2], function(i, n){ alert( "Item #" + i + ": " + n ); });
等价于:
var tempArr=[0,1,2];
for(var i=0;i<tempArr.length;i++){
alert("Item #"+i+": "+tempArr[i]);
}
也可以处理json数据,如
$.each( { name: "John", lang: "JS" }, function(i, n){ alert( "Name: " + i + ", Value: " + n ); });
结果为:
Name:name, Value:John
Name:lang, Value:JS
$.extend(target,prop1,propN):用一个或多个其他对象来扩展一个对象,返回这个被扩展的对象。这是jquery实现的继承方式。
如:
$.extend(settings, options);
//合并settings和options,并将合并结果返回settings中,相当于options继承setting并将继承结果保存在setting中。
var settings = $.extend({}, defaults, options);
//合并defaults和options,并将合并结果返回到setting中而不覆盖default内容。
可以有多个参数(合并多项并返回)
$.map(array, fn):数组映射。把一个数组中的项目(处理转换后)保存到到另一个新数组中,并返回生成的新数组。
如:
var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
tempArr内容为:[4,5,6]
var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
tempArr内容为:[2,3]
$.merge(arr1,arr2):合并两个数组并删除其中重复的项目。
如:$.merge( [0,1,2], [2,3,4] ) //返回[0,1,2,3,4]
$.trim(str):删除字符串两端的空白字符。
如:$.trim(" hello, how are you? "); //返回"hello,how are you? "
12、解决自定义方法或其他类库与jQuery的冲突
很多时候我们自己定义了$(id)方法来获取一个元素,或者其他的一些js类库如prototype也都定义了$方法,如果同时把这些内容放在一起就会引起变量方法定义冲突,Jquery对此专门提供了方法用于解决此问题。
使用jquery中的jQuery.noConflict();方法即可把变量$的控制权让渡给第一个实现它的那个库或之前自定义的$方法。之后应用Jquery的时候只要将所有的$换成jQuery即可,如原来引用对象方法$("#msg")改为jQuery("#msg")。
如:
jQuery.noConflict();
// 开始使用jQuery
jQuery("div p").hide();
// 使用其他库的 $()
$("content").style.display = 'none';
dwr.xml文件的结构如下:
术语
这里是一些必须理解的术语 - 参数会被converted,远程Bean会被created。所以如果你有一个叫A的bean,它有一个方法叫A.blah(B) 那么你需要一个A的creator和一个B的converter。
一:<allow>
allow段落里面定义的试DWR可以创建和转换的类。
二:Creators
dwr.xml文件中的create元素的结构如下:
<allow> <create creator="..." javascript="..." scope="..."> <param name="..." value="..."/> <auth method="..." role="..."/> <exclude method="..."/> <include method="..."/> </create> ...</allow> 这里的多数元素都是可选的 - 你真正必须知道的是指定一个creator和一个javascript名字。
creator属性 是必须的 - 它用来指定使用那种创造器。
默认情况下DWR1.1有8种创造器。它们是:
new: 用Java的new关键字创造对象。
none: 它不创建对象,看下面的原因。 (v1.1+)
scripted: 通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。
spring: 通过Spring框架访问Bean。
jsf: 使用JSF的Bean。 (v1.1+)
struts: 使用Struts的FormBean。 (v1.1+)
pageflow: 访问Beehive或Weblogic的PageFlow。 (v1.1+)
如果你需要写自己的创造器,你必须在init部分注册它。
javascript属性 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript的关键字。
scope属性 非常类似servlet规范中的scope。它允许你指定这个bean在什么生命范围。选项有"application", "session", "request" 和"page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了。
scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写。
param元素 被用来指定创造器的其他参数,每种构造器各有不同。例如,"new"创造器需要知道要创建的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接。
include和exclude元素 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝";如果是exclude列表则暗示默认的访问策略是"允许"。
例如要拒绝防范除了setWibble()以外的所有方法,你应该把如下内容添加到dwr.xml中。
<create creator="new" javascript="Fred"> <param name="class" value="com.example.Fred"/> <include method="setWibble"/></create> 对于加入到create元素中的类的所有方法都是默认可见的。
auth元素 允许你指定一个J2EE的角色作为将来的访问控制检查:
<create creator="new" javascript="Fred"> <param name="class" value="com.example.Fred"/> <auth method="setWibble" role="admin"/></create>
--------------------------------------------------------------------------------
new创造器在DWR中已经默认声明了:<creator id="new" class="uk.ltd.getahead.dwr.create.NewCreator"/> 。你不需要在dwr.xml文件中添加这段话,它已经存在于DWR的内部dwr.xml文件中了。
这个创造器通过类默认的够早函数创造对象实例。用new创造器有一些好处:
安全:DWR创造的对象生存的事件越短,多次调用中间的值不一致的错误机会越少。
内存消耗低:如果你的站点用户量非常大,这个创造器可以减少VM的内存溢出。
你可以通过下面的方式使用new创造器来创造远程调用Bean:
<allow> <create creator="new" javascript="Blah"> <param name="class" value="java.util.Date"/> </create> ... </allow> 这些代码把 java.util.Date 映射成Javascript,并且命名为Blah,所以在Javascript中当你调用Blah.toString(reply) 那么一个新的 java.util.Date 就会通过默认的构造函数创造出来, 然后 toString() 方法被调用,然后结果数据返回给reply方法(在这个例子中date是字符串格式)。
none'创造器不创建任何对象 - 它会假设你不需要创建对象。这有可能是对的,有两个原因。
你可能在使用的scope不是"page"(看上面),并在在前面已经把这个对象创建到这个scope中了,这时你就不需要再创建对象了。
还有一种情况是要调用的方法是静态的,这时也不需要创建对象。DWR会在调用创建器之前先检查一下这个方法是不是静态的。
对于上诉两种情况,你仍然需要class参数,用来告诉DWR它是在操作的对象类型是什么。
scripted创造器在DWR中已经默认声明了:<creator id="script" class="uk.ltd.getahead.dwr.create.ScriptedCreator"/>
这个创造器用BSF来执行脚本得到Bean,例如:
<allow> ... <create creator="script" javascript="EmailValidator"> <param name="language" value="beanshell"/> <param name="script"> import org.apache.commons.validator.EmailValidator; return EmailValidator.getInstance(); </param> </create> ...</allow> script创造器有如下参数:
参数 DWR版本 描述
language 1.0 脚本语言,字符串,例如'beanshell'. (必需)
script 1.0 要执行的脚本。 (必需,除非scriptPath参数存在)
scriptPath 1.1 脚本文件路径。 (必需,除非script参数存在)
reloadable 1.1 是否检测脚本文件的改动,以重新加载 (可选, 默认true)
class 1.0 创造出对象的类型(可选). 如果没有DWR通过创造器得到类型。
需要了解的主题
要使用这个创造器,你需要把一些辅助库放到WEB-INF/lib文件夹下:BSF的jar包,你要用的脚本语言的jar包。
当一个类是用script创造出来的,并且scope是session或application,如果你的脚本改变,session中的类和script中的类就不一致了。这样会出现错误。虽然web容器不用重启,但是用户需要先登出(或以某种方式清空session),然后再登录。
当clazz参数不为空,并且用来创造新实例,DWR简单的调用 class.newInstance() 方法。这种方法是没问题的,除非脚本正在用某个参数创建一个类,或者调用某个函数来配置这个类。不幸的是,每次请求都要重新运行script并造成上面的问题。
创造器
让DWR和Spring一起工作的步骤
确认你用的是最新版的DWR。Spring创造器已经有了变化,所以你最好检查一下DWR的最新版本。
确认你查看过开始指南中的内容。
确认你的Spring的Bean在DWR外面运行良好。
配置DWR和Spring一起工作。 (看下面)
查看演示页面: http://localhost:8080/[ YOUR-WEBAPP ]/dwr ,检查spring的Bean是否出现。
DWR对于Spring没有运行期依赖,所以如果你不使用Spring那么Spring的支持不会产生任何影响到。
The SpringCreator
这个创造器会查找spring的中配置的Bean,用Spring去创建它们。如果你已经在使用Spring,那么这个创造器会非常有用。
你可以通过下面的方式来创建远程调用的Bean:
<allow> ... <create creator="spring" javascript="Fred"> <param name="beanName" value="Shiela"/> </create> </allow> 寻找你的Spring配置
有三种方式寻找配置文件:
ContextLoaderListener
最简单的方式是使用org.springframework.web.context.ContextLoaderListener。你不必使用所有的Spring-MVC功能,只需要这个Listener就够了,所以这是个不错的方案。你需要在WEB-INF/web.xml中做如下配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> 我能找到的ContextLoaderListener的最好的文档就是javadoc。如果你知道还有更好的文档,请告知我。
Rob Sanheim 指出还有一个能深入了解ContextLoaderListener的文档。
使用location*参数
如果你要在dwr.xml中指定使用哪些bean,你可以使用location*参数。你可以指定任意多个文件,只要参数以location开始并且唯一即可。例如:location-1, location-2。这些location被用做Spring的ClassPathXmlApplicationContext的参数:
<allow> ... <create creator="spring" javascript="Fred"> <param name="beanName" value="Shiela"/> <param name="location" value="beans.xml"/> </create> </allow> 直接设置BeanFactory
SpringCreator有一个静态方法 setOverrideBeanFactory(BeanFactory) 用来通过编程的方式直接设置BeanFactory。
配置DWR和Spring
Bram Smeets写了一个有意思的blog,教你配置DWR使用beans.xml代替WEB-INF/web.xml。
我也对于如何在beans.xml中指定dwr.xml很感兴趣,尽管这看上去有些Spring传染病的感觉。有人知道如何实现吗?请加入邮件列表并告诉大家。
--------------------------------------------------------------------------------
三:Converters
我们必须保证所有的参数都可以被转换。JDK中的多数类型已经有转换器了,但是你需要给DWR转换你的代码的权利。一般来说JavaBean的参数需要一个<convert ...>定义。默认情况下,如下类型不需要定义就可以转换:所有的原生类型 boolean,int,double, 等等
原生类型的对象类型 Boolean,Integer,等等
java.lang.String
java.util.Date 和SQL中的Date
以上类型组成的数组
以上类型的集合类型 (Lists, Sets, Maps, Iterators, 等)
从DOM, XOM, JDOM 和 DOM4J中的DOM对象 (类似 Element 和 Document)
基础的转换器
原生类型,String,像BigDecimal这样的简单对象的转换器已经有了。你不需要在dwr.xml中<allow>部分的<convert>中定义。它们默认支持。
默认支持的类型包括: boolean, byte, short, int, long, float, double, char, java.lang.Boolean, java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Character, java.math.BigInteger, java.math.BigDecimal 和 java.lang.String
Date转换器
Date转换器负责在Javascript的Date类型与Java中的Date类型(java.util.Date, java.sql.Date, java.sql.Times or java.sql.Timestamp)之间进行转换。同基础的转换器一样,DateConverter默认是支持的。
如果你有一个Javascript的字符串 (例如"01 Jan 2010") ,你想把它转换成Java的Date类型有两个办法:在javascript中用Date.parse()把它解析成Date类型,然后用DWR的DateConverter传递给服务器;或者把它作为字符串传递给Server,再用Java中的SimpleDateFormat(或者类似的)来解析。
四:<init>
可选的init部分用来声明创造bean的类和转换bean的类。多数情况下你不需要用到他们。如果你需要定义一个新的Creator [JavaDoc] 和 Converter [JavaDoc] ,那么你就需要在这里定义他们。但是建议你现检查一下DWR是不是已经支持了。
在init部分里有了定义只是告诉DWR这些扩展类的存在,给出了如何使用的信息。这时他们还没有被使用。这中方式很像Java中的import语句。多数类需要在使用前先import一下,但是只有import语句并不表明这个类已经被使用了。每一个creator和converter都用id属性,以便后面使用。
五:多个dwr.xml文件
可以有多个dwr.xml文件(详细信息见web.xml文档)。每个文件中的定义会被加在一起。DWR用这个功能来加载基础配置文件。我们可以看看标准被配置文件来了解dwr.xml的内容。
Bean Converter
<convert converter="bean" match="your.full.package.BeanName"/>
指定属性转换只有针对bean才有效
<convert converter="bean" match="com.example.Fred"/>
<param name="exclude" value="property1, property2"/>
</convert>
授权访问方式
<convert converter="bean" match="com.example.Fred"/>
<param name="include" value="property1, property2"/>
</convert>
Maps和Collections converter
<convert converter="collection" match="java.util.Collection"/>
<convert converter="map" match="java.util.Map"/>
creator
Creator Parameter User
new class 类的全名称(包括包路径)
scripted language BSF框架支持的脚本语言名称(BSF为apache项目)
scripted script 返回远程对象的脚本,脚本可以指定一些属性,多数情况下一般只设置param节点配置.属性很少设置.
spring Location* 任何以location开头的参数,每个参数都是指定一个spring的配置文件,在参数没有设置的情况下DWR会去读取spring的全局的配置文件.
spring beanName 从配置文件中读取的bean的名称
fan访问权限
如果要设置除了setWibble方法之外的所有方法都不可访问可以采用下面的设置.
<create creator="new" javascript="Fred">
<param name="class" value="com.example.Fred"/>
<exclude method="setWibble"/>
</create>
如果采用j2ee访问角色控制的模式
<create creator="new" javascript="Fred">
<param name="class" value="com.example.Fred"/>
<auth method="setWibble" role="admin"/>
</create>
DWR的引擎文件,他承担着把后台自动生成的javascript接口与前台调用之间的衔接责任
<script type='text/javascript'
src='/[YOUR-WEB-APP]/dwr/engine.js'>
</script>
Java组件的编写和发布以及客户端引用
Java组件必须是一个具体类(因为接口、抽象类反射机制无法实例化)
实体类必须遵循Java Bean规范即实现Getter和Setter
配置文件中Allow部分的Create元素的JavaScript属性的值要唯一
如果存在Java Bean需要转换则要配置Allow部分的Convert元素
客户端引用业务组件要以dwr/interface/xxx.js的路径引用JS文件
DWR前台引擎(Engine.js)的主要职责:
截取每个后台组件的请求实现客户端的统一入口
将用于组件调用的JS参数对象重新包装组合
检测客户端浏览器的环境并选择最佳的数据提交方案
处理后台执行结果并通过执行回调函数通知客户
后台控制器(DWRServet)的主要职责
装载Servlet时初始化DWR配置参数
实现后台业务组件调用的服务器端统一入口
分发各种不同类型的请求 JS文件请求 业务调用请求等
输出组件执行结果(JavaScript语句)到客户端浏览器
业务组件执行器的主要职责
根据配置文件的参数确定后台组件的访问规则和生命周期
拆包前台传入的参数 包装组件执行结果
按参数类型匹配数据类型转换器
采用反射机制执行业务组件方法处理客户端请求
处理与其他系统的接口和协作 如:Spring Hibernate等
dwr.xml的业务组件发布和调用规则配置部分Allow
Create配置元素详细说明:
属性:
Creator
配置业务组件的创建类型。主要有四种:Spring、New、 none 、Scripts。
JavaScript
前台页面javascript引用此组件的名称。名称需要唯一。
scope
组件的作用范围或则叫做生命周期。这个和Servlet的生命周期的作用是 一样的。共Session、request、application、page四个选项。
子节点:
Param
配置业务组件的创建参数。Name属性设置名称,value属性设置业务组件的具体路径(类全名称)。
Include
授权方式保护业务组件方法的可见性。属性method可以访问的方法名称。如果没有配置则默认为所有方法都可以访问。
exclude
排除方式保护业务组件方法的可见性。属性method设置不可以访问的方法名称。除此之外的都可以访问。如果有需要控制业务组件方法的访问权限时建议采用这种方式。
Auth
采用EJB的角色访问控制方式。Method属性设置可以访问的方法名称,role属性设置访问角色。
Convert配置元素详细说明:
属性:
converter
配置数据类型的转换器。一般是设置bean转换器,因为基本类型的转换器DWR默认设置。
match
设置要使用此转换器的java实体对象。如:
<convert converter="bean" match="demo.entity.*"/>
子节点:
Param对象属性的转换规则,name属性设置规则有include和exclude选项,作用和组件方法控制的一样。Value属性设置实体对象的属性。默认是所有属性都进行转换。
dwr.xml的业务组件方法签名配置部分Signatures
Signatures是用来配置Java Bean数据类型转换时遇到不能确定转换类型的情况。如:
Bean.setList(List a)方法,DWR设置集合a的时候就无法确定a这个集合里需要填充哪种数据类型。所以针对有输入集合对象的情况就需额外设置Signatures配置节点来设置。这个节点的配置如下:
<signatures>
<![CDATA[
import java.util.List;
import demo.entity.*;
import demo.busi.*;
Customer.setAccounts(List<Account> accounts);
DemoBusinessObject.getListSet(List<Contact> inList);
]]>
</signatures>
Signatures主要有两个部分:
Import部分 和java文件的作用一样
另一部分对方法的签名进行范型的设定。返回结果的集合元素类型不需要设置,因为可以在运行时确定。
JS开发注意事项
1、要注意DWR异步机制带来的数据可能不同步问题
2、返回结果只能是一个值所以要详细设计返回结果类型
3、要注意Java引用传递和JavaScript值传递的差异
4、连续多次后台请求尽量采用批量调用
5、尽量将JavaScript的逻辑处理代码抽取成一个独立的文件
su命令是最基本的命令之一,常用于不同用户间切换。例如,如果登录为 user1,要切换为user2,只要用如下命令:
$su user2
然后系统提示输入user2口令,输入正确的口令之后就可以切换到user2。完成之后就可以用exit命令返回到user1。
su命令的常见用法是变成根用户或超级用户。如果发出不带用户名的su命令 ,则系统提示输入根口令,输入之后则可切换为根用户。
如果登录为根用户,则可以用su命令成为系统上任何用户而不需要口令。
pwd
pwd命令也是最常用最基本的命令之一,用于显示用户当前所在的目录。
cd
cd命令不仅显示当前状态,还改变当前状态,它的用发跟dos下的cd命令基本一致。
cd ..可进入上一层目录
cd -可进入上一个进入的目录
cd ~可进入用户的home目录
ls
ls命令跟dos下的dir命令一样,用于显示当前目录的内容。
如果想取得详细的信息,可用ls -l命令, 这样就可以显示目录内容的详细信息。
如果目录下的文件太多,用一屏显示不了,可以用ls -l |more分屏显示 。
find
find命令用于查找文件。这个命令可以按文件名、建立或修改日期、所有者(通常是建立文件的用户)、文件长度或文件类型进行搜索。
find命令的基本结构如下:
$find
其中指定从哪个目录开始搜索。指定搜索条件。表示找到文件怎么处理。一般来说,要用-print动作,显示 整个文件路径和名称。如果没有这个动作,则find命令进行所要搜索而不显示结果,等于白费劲。
例如,要搜索系统上所有名称为ye的文件,可用如下命令:
$find / -name ye -print
这样就可以显示出系统上所有名称为ye的文件。
tar
tar最初用于建立磁带备份系统,目前广泛用于建立文件发布档案。可用如下方法建立tar档案:
$tar cvf
例如,如果要将当前目录中所有文件存档到ye.tar中,可用如下命令:
$tar cvf ye.tar *.*
要浏览档案内容,将c选项变成t。如果要浏览ye.tar档案中的内容,可用如下命令:
$tar tvf ye.tar
要取出档案内的内容,将c选项变成x。如果要将ye.tar档案中的内容取到当前目录中,可用如下命令:
$tar xvf ye.tar
gzip
gzip命令用于压缩文件。 例如,如果要将ye.txt文件压缩,可用如下命令:
$gzip ye.txt
这样就可以压缩文件并在文件名后面加上gz扩展名,变成文件ye.txt.gz。
解压缩文件可用gzip -d命令实现:
$gzip -d ye.txt.gz
这样就可以解压缩文件并删除gz扩展名。除此之外还可以用gunzip命令来解 压缩文件,效果跟用gzip -d命令一样。
旧版的tar命令不压缩档案,可用gzip压缩。例如:
$tar cvf ye.tar *.txt
$gzip ye.tar
则可建立压缩档案ye.tar.gz。
新版的tar可以直接访问和建立gzip压缩的tar档案,只要在tar命令中加上z 选项就可以了。例如:
$tar czvf ye.tar *.txt
生成压缩档案ye.tar.gz,
$tar tzvf ye.tar *.txt
显示压缩档案ye.tar.gz的内容,而
$tar xzvf ye.tar *.txt
取出压缩档案ye.tar.gz的内容。
mkdir
这个命令很简单,跟dos的md命令用法几乎一样,用于建立目录。
cp
cp命令用于复制文件或目录。
cp命令可以一次复制多个文件,例如:
$cp *.txt *.doc *.bak /home
将当前目录中扩展名为txt、doc和bak的文件全部复制到/home目录中。
如果要复制整个目录及其所有子目录,可以用cp -R命令。
rm
rm命令用于删除文件或目录。
rm命令会强制删除文件,如果想要在删除时提示确认,可用rm -i命令。
如果要删除目录,可用rm -r命令。rm -r命令在删除目录时,每删除一个文件或目录都会显示提示,如果目录太大,响应每个提示是不现实的。这时可以用 rm -rf命令来强制删除目录,这样即使用了-i标志也当无效处理。
mv
mv命令用于移动文件和更名文件。例如:
$mv ye.txt /home
将当前目录下的ye.txt文件移动到/home目录下,
$mv ye.txt ye1.txt
将ye.txt文件改名为ye1.txt。
类似于跟cp命令,mv命令也可以一次移动多个文件,在此不再赘叙。
reboot
重启命令,不必多说。
halt
关机命令,不必多说。
注:在一个jsp中一定要注意
<%@ page isELIgnored="true|false" %>
1,可以访问一个简单的参数
userName是一个参数
${userName}
2, 访问一个嵌套的参数
${userBean.userName}
3, 可以是一个表达式
${userBean.age>0}
${userBean.age>20 && userBean.age<10}
4, 隐含对象
1) pageContext jsp页面的上下文,它提供了访问以下对象的方法
a, Servlet Context,Servlet的上下文信息
b, Session 客户端的session对象
c, request
d, response
2) param 把请求中的参数名和单个值进行映射
3) paramValues 把请求中的参数名和一个array值进行映射
4) cookie 把请求中的cookie名和单个值进行映射
表达式编程举例:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset:gb2312" language="java" %>
<jsp:useBean id="user" class="com.iss.ch1.TestBean" scope="request">
<jsp:setProperty name="user" property="*" />
</jsp:useBean>
<html>
<head><title>表达式语言举例</title>
</head>
<body>
姓名:${user.userName}<br>
密码:${user.password}<br>
年龄:${user.age}<br>
<hr>
姓名:${param.userName}<br>
密码:${param.password}<br>
年龄:${param.age}<br>
<hr>
姓名:${param['userName']}<br>
密码:${param['password']}<br>
年龄:${param['age']}<br>
<hr>
标准标签库(JSTL)
JSTL包含了和以下操作相关的标签
常用标签 <c:out> ,<c:set>
条件标签 <c:if>, <c:choose> <c:when> <c:otherwise>
url标签 <c;import>
xml标签 <xml:out>
国际化输出标签 <fmt:timeZone>
SQL标签 : <sql:query>
1, 一般标签;
<c:out> <c:set> <c:remove> <c:catch>
1) 把计算的结果输出
a <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/>
b <c:out value="value" [escapeXml="{true|false}"]> body </c:out>
<c:out value="test"/> //输出"test"
<c:out value="test2'>itese </c:out> //中的body中的内容不会发送到客户端
<c:out value="${test}"/>
<c:out value="${notex}" default="如果notex变量不存在,则将显示此信息"/>
2) 用来将某范围(request,session,application等)中设置某个值
a, <c:set value="value" var="varName" [scope="{page|request|session|application}"]>
b, <c:set var="varname" [scope="{page....}"]> body </c:set>
c, <c:set value="value" target="target" property="propertyname"/>
d, <c:set target="target" property="propertyname"> body </c:set>
如:<c:set value="admin" var="username"/>
<c:out value="${username}"/>
<c:set var="password">
pass
</c:set>
<c:set value="100" var="maxUser" scope="application"/>
<jsp:useBean id="user" scope="request" class="com.iss.ch1.test"/>
<c:set value="admin" target="${user}" property="userName"/>
<c:set target="${user}" property="password">
test
</c:set>
3) 用于删除某个变量或者属性
<c:remove var="varName" [scope="{page|request|session|application}"]/>
如:
<c:set value="20" var="max" scope="application"/>
<c:remove var="max" scope="application"/>
4) 捕获由嵌套在它里面的标签抛出的异常
<c:catch [var="varName"]> test </c:catch>
例:
<c:catch var="mytest">
<% int i=0;
int j=10/i;
%>
</c:catch>
<c:out value="${mytest}"/>
<c:out value="${mytest.message}"/>
<c:out value="${mytest.cause}"/>
2 条件标签
1) 用于进行条件判断,如果test属性为true,则就计算它的body
a, <c:if test="test1" var="varName" [scope="{page|request|....}"] />
b, <c:if test="test1" var="varName" [scope="{page|request|....}"] > body </c:if>
test为表达式的条件
例: <jsp:useBean id="user" class="com.iss.ch1.test"/>
<c:set value="16" target="${user}" property="age"/>
<c:if test="${user.age<18}">
对不起,你的年龄过小
</c:if>
2) <c:choose> 用于条件选择,它和<c:when>及<c:otherwise>一起使用
注: 不能单独使用
就象是开关语句 swith
<c:choose> </c:choose>
<c:when test="条件"> 也就是<c:choose>的分支
此语句一定要在<c:choose>的里面,并且一定要在<c:otherwise>之前
</c:when>
在<c:choose>中可以有0个或者多个<c:when>或<c:otherwise>
<c:otherwise> 也就是最后的分支语句
test 与开关语句中的最后选择
</c:otherwise>
如:
<c:choose>
<c:when test="${user.age<=18}">
<font color="blue">
</c:when>
<c:when test="${user.age<30 && user.age>18}">
<font color="red">
</c:when>
<c:otherwise>
<font color="green">
</c:otherwise>
</c:choose>
你的年龄:<c:out value="${user.age}"/>
3 迭代标签
我们一般使用 Iterator 或Enumeration来进行迭代
<c:forEach>
<c:forTokens>
语法1 在Collection中迭代
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="stet"]>
body
</c:forEach>
语法2 迭代固定的次数
<c:forEach [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="stet"]>
body
</c:forEach>
例:
<% Collection users=new ArrayList();
for(int i=0;i<5;i++)
{
TestBean user=new TestBean();
user.setUser("user");
user.setAge("age");
users.add(user);
}
session.setAttribute("usert",users);
%>
<c:forEach var="use" items="${usert}">
<tr>
<td><c:out value="${use.user}" /></td>
<td><c:out value="${use.age}" /></td>
</tr>
</c:forEach>
<c:forTokens>
主要用于处理TokenString 的迭代,可以指定一个或者多个分隔符
<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [begin="begin"] [end="end"] [step="step"]>
body
</c:forTokens>
使用"|" 作为分隔符
<c:forTokens var="tok" items="blue,red,green|yellow|pink,black|white" delims="|">
<c:out value="${tok}"/>©
</c:forTokens>
使用"|," 作为分隔符
<c:forTokens var="tok" items="blue,red,green|yellow|pink,black|white" delims="|,">
<c:out value="${tok}"/>©
</c:forTokens>
URL 相关的标签
就是页面导向,重定向,资源获得,参数传递等相关标签
<c:import url="url" var="varname" scope=" " charEnvoding=" ">
tstee <c:param >
</c:import >
与<jsp:include file=""/>一样的功能
<c:redirect url=" " > 重定向到另一个资源
<c:param> teewe
</c:redirect>
<c:redirect url="test.jsp">
<c:param name="username" value="admin"/>
</c:redirect> 重定向到test.jsp中同时带上相关参数
注:在以上所有标签,在jsp中要定义标签:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
xml标签
<x:parse>
<x:out>
<x:set>
1) <x:parse>用于解释xml文档
a, 解释由String 或reader对象产生的xml文档
<x:parse xml="xmldocument" {var="varName" [scope="scope"]|varDom="var" [scopeDom="scope"]} [systemid="systemid"] [filter="filter"/>
b, 解释在Body中指定的xml文档
<x:parse {var="varName" [scope="scope"]|varDom="var" [scopeDom="scope"]} [systemid="systemid"] [filter="filter">
body
</x:parse>
例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jstl/xml" %>
<%@ page contentType="text/html;charset:gb2312" language="java" %>
<html><head><title>test</title></head>
<body>
<c:set var="xmltest">
<a><b><c>test1</c></b><d>test2</d></a>
</c:set>
<x:parse var="myxml" xml="${xmltest}" />
<x:out select="$myxml/a/b/c" />
<x:out select="$myxml//d" />
<x:parse var="mybook">
<books>
<book id="1">
<name>java书</name>
<price>89</price>
</book>
</books>
</x:parse>
<x:out select="$mybook/books//name"/>
<x:out select="$mybook//name"/>
<x:out select="mybook/books/book/name"/>
<x:out select ="mybook/books/book/price"/>
<x:set var="test">
<books>
<book id="01">
<name>jsp书</name>
<price>23</price>
<authors>
<author>
<name>teee</name>
<adder>ddddd</adder>
</author>
</authors>
</book>
</books>
</x:set>
<x:parse var="txml" xml="${test}"/>
<x:out select="txml/books/name"/>
xml流程控制
<x:if>
<x:choose>
<x:when>
<x:otherwise>
<x:forEach>
<%@ taglib prefix="x" uri="http://java.sun.com/jstl/xml" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>实例</title>
</head>
<body bgcolor="#FFFFFF">
<h3>Parse / ForEach</h3>
<x:parse var="document">
<GetAllBooks>
<book id="1234">
<name>JSP应用</name>
<publisher>出版社</publisher>
<price>xxx</price>
<category>计算机</category>
<description>JSP书</description>
<authors>
<author id="1">
<name>asiapower</name>
<address>address:xxxx1</address>
</author>
<author id="2">
<name>hellking</name>
<address>address:xxxx2</address>
</author>
</authors>
</book>
</GetAllBooks>
</x:parse>
<x:forEach select="$document/GetAllBooks">
-> <x:out select="."/>
<br>
</x:forEach>
<hr/>
<x:forEach select="$document//book">
->
<x:if select=".//author">
<x:out select=".//author/name"/>
</x:if>
<br/>
</x:forEach>
<hr>
<x:forEach select="$document//book">
->
<x:choose>
<x:when select='$document//author[@id="2"]'>
author id=2,<x:out select='$document//author[@id="2"]'/>
</x:when>
<x:otherwise>
不是 id=2
</x:otherwise>
</x:choose>
<br/>
</x:forEach>
</body>
</html>
SQL相关标签
<sql:setDataSource> 用于设定数据源 ,还可以指其范围
<sql:stDataSource [datasource="datasource"] url="jdbcurl" [driver="driverClassName"] user="username" password="password" var="varname" scope="">
例:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>sql datasource</title>
</head>
<body bgcolor="#FFFFFF">
创建普通的数据源:<br>
<sql:setDataSource
var="example1"
driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev"
user="bn"
password="bn"
/>
创建普通的数据源,把用户名和密码写在url中:<br>
<sql:setDataSource
var="example2"
driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev;user=bn;password=bn"
/>
获得一个数据源。<br>
<sql:setDataSource
var="example3"
dataSource="jdbc/bn"
/>
<hr>
使用第一个数据源:<hr>
<sql:query var="query1" dataSource="${example1}">
SELECT * FROM contact
</sql:query>
<table border="1">
<c:forEach var="row" items="${query1.rows}">
<tr>
<td>Name: <c:out value="${row.userName}"/></td>
<td>Value: <c:out value="${row.mobile}"/></td>
</tr>
</c:forEach>
</table>
使用第二个数据源:<hr>
<sql:query var="query2" dataSource="${example2}">
SELECT * FROM contact
</sql:query>
<table border="1">
<c:forEach var="row" items="${query2.rows}">
<tr>
<td>Name: <c:out value="${row.userName}"/></td>
<td>Value: <c:out value="${row.mobile}"/></td>
</tr>
</c:forEach>
</table>
使用第三个数据源:<hr>
<sql:query var="query3" dataSource="${example3}">
SELECT * FROM contact
</sql:query>
<table border="1">
<c:forEach var="row" items="${query3.rows}">
<tr>
<td>Name: <c:out value="${row.userName}"/></td>
<td>Value: <c:out value="${row.mobile}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
<sql:query>
语法:
<sql:query var ="varname" scope=" " datasource="" maxRows=" startRow=""/>
<sql:query var ="varname" scope=" " datasource="" maxRows=" startRow="">
<sql:param
</sql:query>
例:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>标准标签查询</title>
</head>
<body bgcolor="#FFFFFF">
创建普通的数据源:<br>
<sql:setDataSource
var="example"
driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev"
user="bn"
password="bn"
scope="session"
/>
第一种查询:<hr>
<sql:query var="query" dataSource="${example}">
SELECT * FROM contact
</sql:query>
<table border="1">
<c:forEach var="row" items="${query.rows}">
<tr>
<td>Name: <c:out value="${row.userName}"/></td>
<td>mobile: <c:out value="${row.mobile}"/></td>
</tr>
</c:forEach>
</table>
<hr>
第2种查询:<hr>
<sql:query var="query2" sql="SELECT * FROM contact where userName=?" dataSource="${example}">
<sql:param value="asiapower"/>
</sql:query>
<table border="1">
<c:forEach var="row" items="${query2.rows}">
<tr>
<td>Name: <c:out value="${row.userName}"/></td>
<td>mobile: <c:out value="${row.mobile}"/></td>
</tr>
</c:forEach>
</table>
<hr>
第3种查询:<hr>
<sql:query var="query3" dataSource="${example}">
SELECT * FROM contact where userName=?
<sql:param value="hellking"/>
</sql:query>
<table border="1">
<c:forEach var="row" items="${query3.rows}">
<tr>
<td>Name: <c:out value="${row.userName}"/></td>
<td>mobile: <c:out value="${row.mobile}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
<sql:update>数据库的更新
语法:
<sql:update sql="" datasource=" " var="varname" scope=""/>
<sql:update sql="" datasource=" " var="varname" scope="">
<sql:param>
</sql:update>
例:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>标准标签的使用</title>
</head>
第1种更新:更新记录值1<hr>
<sql:update var="update1" dataSource="${example}">
update contact set mobile='13688888' where userName='asiapower'
</sql:update>
<hr>
第2种更新:更新记录值2<hr>
<sql:update var="update2" sql="update contact set mobile=? where userName=?" dataSource="${example}">
<sql:param value="13999999"/>
<sql:param value="hellking"/>
</sql:update>
<hr>
第3种更新:更新记录值3<hr>
<sql:update var="update3" dataSource="${example}">
update contact set mobile=? where userName=?
<sql:param value="1399888"/>
<sql:param value="chenzhanjun"/>
</sql:update>
第4种更新:创建表<hr>
<sql:update var="update4" sql="create table test_temp(test varchar(20))" dataSource="${example}"/>
第5种更新:增加记录
<sql:update var="update5" sql="insert into test_temp values('hellking')" dataSource="${example}"/>
第6种更新:删除记录<hr>
<sql:update var="update6" sql="delete from test_temp where test='hellking'" dataSource="${example}"/>
第7种更新:删除表<hr>
<sql:update var="update7" sql="drop table test_temp" dataSource="${example}"/>
</body>
</html>
<sql:param>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>param的使用</title>
</head>
<sql:setDataSource
var="example"
dataSource="jdbc/bn"
/>
执行数据添加操作:<hr>
<sql:update var="update" dataSource="${example}">
insert into contact (userName,mobile,phone,mail)values(?,?,?,?)
<sql:param>wyy</sql:param>
<sql:param>13634234</sql:param>
<sql:param>010213423434</sql:param>
<sql:param>wyy@xtom.com</sql:param>
</sql:update>
执行更新操作:<hr>
<sql:update var="update2" sql="update contact set mobile=? where userName=?" dataSource="${example}">
<sql:param value="13999999"/>
<sql:param value="hellking"/>
</sql:update>
</body>
</html>