20120321html
1,jsp的url-pattern问题
通过为jsp设置action,然后用action路径来设置url-pattern。
2,多个<security-constraint>的叠加,如果其中一个<security-constraint>下没有设置<auth-constraint>,则该<security-constraint>下的<url-pattern>内容可以无障碍进
入。
3,css文件加载
s:include的页面加载外部css文件,无法加载的问题。
在浏览器中输入该css文件的url,测试是否有效,能读出即有效。
注意如果在JAAS屏蔽下,会导致css文件无法读取(除非进入该页面前已经完成JAAS的认证)。
css文件的链接声明可以放在被引入的jsp片段里,也可以放在引入者页面中。
注意css文件的路径,
如调用该jsp页面的action是“/”或默认目录下,则<link rel="stylesheet" type="text/css" href="css/navibar.css" />有效;
如调用该jsp页面的action是“/xxx”的情况,则必须使用<link rel="stylesheet" type="text/css" href="../css/navibar.css" />。
那如果一个jsp页面既要被“/”或默认目录下的action调用,也要被“/xxx”目录下的action调用,则选择为其指定一个跳转action,让前面的某个action先redirect到这个跳转action。
4,float
<div>
<div id="a"/>
<div id="b"/>
</div>
如果a、b都浮动,一个向左,一个向右,则这个父div是不占空间的,可以用如下方法处理,使父div包含这几个浮动的子div:
<div>
<div id="a"/>
<div id="b"/>
<br class="clear"/>
</div>
其中clear类的格式:
.clear{clear:both;}
5,table的边框问题
如果直接在jsp页面中设置的话:
<table border="1em">,即可产生边框为1em的边框。
如果在css文件中设置的话,比较繁琐:
首先,要设置
table{ border-collapse:collapse;}
其次
td{
border-width:1px;
border-style:solid;
border-color:balck;
}
如果光在table中设置这些border-xxx属性的话,只对table的外边框起作用,而对单元格与格之间不起作用。
6,要在一组radio按钮里对个别按钮设定不同的样式,如独立成行,可以建立两组radio,并确保name值相同即可,如:
<s:radio name="leaveInfo.leaveType" list="{'vacation'}" label="%{#request.bonusDays} Days left"/>
<s:radio name="leaveInfo.leaveType" label="Other Type" list="{'Maternity','Marriage'}" />
7,http请求中Parameter(参数) 和Attribute(属性)的区别
http://kanghao126.iteye.com/blog/99104
request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部,在具有转发关系的Web组件之间共享。这两个方法能够设置Object类型的共享数据。
getParameter得到的都是String类型的。或者是http://a.jsp id=123中的123,或者是某个表单提交过去的数据。
getAttribute则可以是对象。
getParameter()是获取POST/GET传递的参数值;
getAttribute()是获取对象容器中的数据值;
getParameter:用于客户端重定向时,即点击了链接或提交按扭时传值用,即用于在用表单或url重定向传值时接收数据用。
getAttribute:用于服务器端重定向时,即在sevlet中使用了forward函数,或struts中使用了mapping.findForward。getAttribute只能收到程序用setAttribute传过来的值。
另外,可以用setAttribute,getAttribute发送接收对象.而getParameter显然只能传字符串。
setAttribute是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另一个页面时,应用服务器会把这块内存拷贝另一个页面所对应的内存中。这样getAttribute就能取得你所设下的值,当然这种方法可以传对象。session也一样,只是对象在内存中的生命周期不一样而已。
getParameter只是应用服务器在分析你送上来的request页面的文本时,取得你设在表单或url重定向时的值。
8,点击按钮实现是否显示日期选择框。
<script type="text/javascript">
function flipDate() {
document.getElementById("DateDiv").style.display =
((document .getElementById("DateDiv").style.display == "block") ? "none": "block");
}
</script>
9,块级元素和行内元素
a) block元素的特点:
总是在新行上开始;此元素将显示为块级元素,此元素前后会带有换行符。
高度,行高以及顶和底边距都可控制;
宽度缺省是它的容器的100%,除非设定一个宽度。
可以控制宽高。
<div>, <p>, <h1>, <form>, <ul> 和 <li>是块元素的例子。
b) inline元素的特点:
和其他元素都在一行上;默认。此元素会被显示为内联元素,元素前后没有换行符。
高,行高及顶和底边距不可改变;
行内元素,不能定义自己的宽和高(input是个例外,可以独立设置宽/高)。如果需要设置高度,可以通过行高line-height撑起来。
宽度就是它的文字或图片的宽度,不可改变。
左右margin可以改变,padding可以改变。(ie6上下不能padding)
行内元素不会单独的占有一行,而是挨着显示的。
行内元素要设置宽高,可以通过设置display:inline-block,即可像块级元素一样设置宽高了。
<span>, <a>, <label>, <input>, <img>, <strong> 和<em>是inline元素的例子
c) 行内元素和块元素之间的转换。
把块元素加上display:inline的属性后就变成了行内元素。例如div{display:inline;}。
相反的,行内元素如果加上display:block就会变成块元素,如span{display:block;}。
10,request path
request.getContextPath() /Aasmod
request.getScheme() http
request.getServerName() localhost
request.getServerPort() 8080
request.getRemoteAddr() 127.0.0.1
request.getServletPath() /tt
request.getRemoteUser() null
request.getRequestURI() /Aasmod/tt
11,js+HTML事件属性
<input type="button" value="+" onClick="add(annualDays)" />
function add(id) {
alert(id);
var n = document.getElementById(aId).value;
n++;
document.getElementById(aId).setAttribute("value", n);
}
alert(id);会显示object HTMLInputElement。id换成其他字符串,如aid也一样。
解决:在html中,为参数加单引号。
<input type="button" value="+" onClick="add('annualDays')" />
'annualDays'是一个字符串,才能代入getElementById()并取得对应的Element,而annualDays是一个元素对象。
12,获取触发事件的源对象:
<s:textfield name="dayRecordDelta.annualDays" id="annualDays" onchange="validn(this)"/>
js中:
function validn(target){
if(!(/^\d+$/.test(target.value))){
alert('Wrong data type entered!');
target.setAttribute("value", 0);
}
}
13,js对table单元格内容的操作(target为<td>中的input控件)
获取目标控件所在单元格(DOM对象操作):
var cell = target.parentNode;
获取该单元格之前或之后的单元格:
var cellbefore = cell.previousSibling;
var cellafter = cell.nextSibling;
获取cellbefore单元格中的内容(若直接显示内容而无其他控件的话即为一个Textnode):
var valuebefore = cellbefore.firstChild.nodeValue;
或者:
var valuebefore = cellbefore.innerText;
因为此时获取的valuebefore是字符串,所以要对其中的内容进行计算的话,要转换成数字(用Number()函数):
var sum = Number(cellbefore.innerText) + Number(target.value);
a,普通dom对象操作
Js
function add(aId) {
var n = document.getElementById(aId).value;
n++;
document.getElementById(aId).setAttribute("value", n);
}
function minus(aId) {
var n = document.getElementById(aId).value;
n--;
document.getElementById(aId).setAttribute("value", n);
}
function validn(target) {
if (!(/^-?\d{1,2}(\.\d{1})?$/.test(target.value))) {
alert('Wrong data type entered!');
target.setAttribute("value", 0);
} else {
var cellbefore = target.parentNode.previousSibling;
var sumday = Number(cellbefore.innerText) + Number(target.value);
if ((sumday >= 100) || (sumday <= 0)) {
alert('Data out of range!');
target.setAttribute("value", 0);
}
}
}
Jsp
<td><s:property value="dayRecordOld.annualDays" /></td>
<td><s:textfield name="dayRecordDelta.annualDays" cssClass="daytf"/></td>
<td><input type="button" value="-" class="minusbtn"/>
<input type="button" value="+" class="addbtn"/></td>
b,jQuery(用jquery的事件触发+dom对象操作)
$(document).ready(function() {
$(".minusbtn").click(function(){
var n = Number(this.parentNode.previousSibling.firstChild.value);
var m = Number(this.parentNode.previousSibling.previousSibling.innerText);
n--;
if(isinrange(n+m)){
this.parentNode.previousSibling.firstChild.setAttribute("value", n);
}
});
$(".addbtn").click(function(){
var n = Number(this.parentNode.previousSibling.firstChild.value);
var m = Number(this.parentNode.previousSibling.previousSibling.innerText);
n++;
if(isinrange(n+m)){
this.parentNode.previousSibling.firstChild.setAttribute("value", n);
}
});
$(".daytf").change(function(){
if(!isrightformat(this.value)){
alert('Wrong data type entered!');
this.setAttribute("value", 0.0);
}else {
var n = Nmuber(this.value);
var m = Number(this.parentNode.previousSibling.innerText);
if(!isinrange(n+m)){
alert('Data out of range!');
this.setAttribute("value", 0.0);
}
}
});
function isinrange(num){
if((num >= 100) || (num < 0)) {
return false;
}else{
return true;
}
}
function isnum(value){
var reg = /^-?\d{1,2}(\.\d{1})?$/;
if(reg.test(value)){
return true;
}else{
return false;
}
}
});
注意:
s:textfield标签中用cssClass属性标记js及css中会用到的该textfield的class。
this.parentNode.previousSibling.previousSibling.innerText中的innerText如改为value则无效。
并且如果通过点击按钮来改变某元素值的话,该元素的.change事件不会被触发,故这里在add和minus里分别添加了检测值改变的函数。
C,用jquery的事件触发+jquery对象操作(可以使用jquery的类方法),比如:
this.parentNode.previousSibling.firstChild.value
如果用jquery对象操作的话:
$(this).parent().prev().children().first().val()
14,velocity教材
http://www.iteye.com/topic/138757
http://www.cnblogs.com/firstyi/archive/2007/11/01/945745.html
#set($range =${info.toDate} - ${info.fromDate}) 没用
截取Date的时间部分
首先,将Date变量转成字符串类型,方法是加"",然后就可以用字符串处理函数了:
#set($fromD="${info.fromDate}")
#set($fromDd=$fromD.substring(0,10))
$!前缀是quiet notation符号,用这个前缀产生的引用在引用对象不存在的时候,会返回“”字符串而不是不存在的对象的名字的字符串。
15,js防止表单重复提交
<script type="text/javascript">
var flag_submitted = false;
function checkSubmit() {
if (flag_submitted) {
alert("submitted!");
return false;
}
flag_submitted = true;
return true;
}
</script>
<s:form action="CreateLRAction" namespace="/ep"
onsubmit="return checkSubmit();">
16,jQuery
检测某组件值是否为空,
正确用法:
var aId = $.trim($("#psid").val());
if (aId!= ""){}
错误用法:
var aId = $("#psid").val();
$.trim(aId);
if (aId!= ""){}
-------------------------------------
设置disabled及enable
第一种:改变disabled的boolean状态
$("button:eq(2)").click(function(){
var text2=$("input:text:eq(2)");
if(text2.attr("disabled")==false){
//通过设置disabled的boolean属性将第三个text输入框disabled属性置为true
text2.attr("disabled",true);
}else{
//通过将第三个text输入框disabled属性置为false来移除disabled属性
text2.attr("disabled",false);
}
});
第二种:移除disabled属性,
$("button:eq(1)").click(function(){
var text2=$("input:text:eq(1)");
if(text2.attr("disabled")==false){
//通过设置disabled的值将第二个text输入框置为disabled
text2.attr("disabled","disabled");
}else{
//通过移除的方式将第二个text输入框的disable属性删除
text2.removeAttr("disabled");
}
});
第三种:改变disabled的值
$("button:eq(0)").click(function(){
var text1=$("input:text:eq(0)");
if(text1.attr("disabled")==""){
// 或者text1.attr("disabled")==false
//通过设置disabled的值将第一个text输入框置为disabled
text1.attr("disabled","disabled");
}else{
//通过覆盖的方式将第一个text输入框中的disabled属性清除掉
text1.attr("disabled","");
}
});
-------------------------------------
jquery的validation插件
http://www.cnblogs.com/weiqt/articles/2013800.html
-------------------------------------
关于jquery中的change事件的触发时机:
当用于 select 元素时,change 事件会在选择某个选项时发生。当用于 text field 或 text area 时,该事件会在元素失去焦点时发生。
-------------------------------------
jquery的BlockUI弹出层插件
http://jquery.malsup.com/block/#
页面跳转时冻结页面,跳转成功后解冻
$("form").submit(function(){
$.blockUI({ message: '<div>Please wait...</div>'});
});
$(window).unload(function(){
$.unblockUI();
});
-------------------------------------
jquery中的this和$(this)
一般来说,在代码中,尽量使用$(this),一来代码更规范一点,二来,jQuery的函数你也就可以直接调用了。如$(this).children()之类的。
用$(".minusbtn").click($.proxy(minus(),this.parentNode.previousSibling));会直接在加载完成页面后就调用该minus函数;
用
$(".minusbtn").click(function(){$.proxy(minus(),this.parentNode.previousSibling);});才能通过点击按钮激发该函数。
jquery对象和dom对象的区别
http://www.ccvita.com/192.html
jquery如何给这些新生成的元素绑定事件呢?
直接在元素还未生成前就绑定肯定是无效的,因为所绑定的元素目前根本不存在。
这种情况下可以使用.live()或.delegate()(1.7以后用.on()),它们可以给所有元素绑定事件,不论是已有的,还是将来生成的。对于用.on()来绑定未来元素,不能直接用该元素的选择器,如未来元素id为future,则不能直接用
$("#future").on('click', function);
而是要该未来元素的已经存在的上级元素作为选择器,或者直接document(因为document肯定存在):
$("#father").on('click','#future', function);
有时候会出现一些函数未触发就自己执行的情况,原因是触发代码写的不正确。
.replaceWith()会将选择器选中的匹配元素替换掉,如:
$("#a #inhand").replaceWith(‘<input type="button">’);将会用<input type="button">元素把#inhand元素替换掉。
要在匹配元素内替换其所有子元素,用:
$("#b #action").empty();
$("#b #action").append(saction);
根据内容选择元素并删除:
$("#b #inhand td:contains(" + event.data + ")").remove();
17,在js中获取集合元素的个数用.length。
18,js调用函数时带()与否的区别
尾处没有括号,赋值给变量的是函数本身,是对函数本身的引用,而非结果;而尾处有括号是对函数的调用,得到的是其返回值,也就是函数的返回结果。
函数只要是要调用它进行执行的,都必须加括号。此时,函数()实际上等于函数的返回值。当然,有些没有返回值,但已经执行了函数体内的行为,这个是根本,就是说,只要加括号的,就代表将会执行函数体代码。
不加括号的,都是把函数名称作为函数的指针,用于传参,此时不是得到函数的结果,因为不会运行函数体代码。它只是传递了函数体所在的地址位置,在需要的时候好找到函数体去执行。