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);

       }

}

 

13jstable单元格内容的操作(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>

 

bjQuery(用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属性标记jscss中会用到的该textfieldclass

this.parentNode.previousSibling.previousSibling.innerText中的innerText如改为value则无效。

并且如果通过点击按钮来改变某元素值的话,该元素的.change事件不会被触发,故这里在addminus里分别添加了检测值改变的函数。

Cjquery的事件触发+jquery对象操作(可以使用jquery的类方法),比如:

   this.parentNode.previousSibling.firstChild.value

       如果用jquery对象操作的话:

$(this).parent().prev().children().first().val()

 

14velocity教材

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符号,用这个前缀产生的引用在引用对象不存在的时候,会返回“”字符串而不是不存在的对象的名字的字符串。

 

15js防止表单重复提交

<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();">

 

16jQuery

检测某组件值是否为空,

正确用法:

var aId = $.trim($("#psid").val());

if (aId!= ""){}

错误用法:

var aId = $("#psid").val();

$.trim(aId);

if (aId!= ""){}

-------------------------------------

设置disabledenable

第一种:改变disabledboolean状态

$("button:eq(2)").click(function(){

var text2=$("input:text:eq(2)");

if(text2.attr("disabled")==false){

//通过设置disabledboolean属性将第三个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","");

}

});

-------------------------------------

jqueryvalidation插件

http://www.cnblogs.com/weiqt/articles/2013800.html

-------------------------------------

关于jquery中的change事件的触发时机:

当用于 select 元素时,change 事件会在选择某个选项时发生。当用于 text field text area 时,该事件会在元素失去焦点时发生。

-------------------------------------

jqueryBlockUI弹出层插件

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()来绑定未来元素,不能直接用该元素的选择器,如未来元素idfuture,则不能直接用

$("#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

18js调用函数时带()与否的区别

尾处没有括号,赋值给变量的是函数本身,是对函数本身的引用,而非结果;而尾处有括号是对函数的调用,得到的是其返回值,也就是函数的返回结果。

函数只要是要调用它进行执行的,都必须加括号。此时,函数()实际上等于函数的返回值。当然,有些没有返回值,但已经执行了函数体内的行为,这个是根本,就是说,只要加括号的,就代表将会执行函数体代码。

不加括号的,都是把函数名称作为函数的指针,用于传参,此时不是得到函数的结果,因为不会运行函数体代码。它只是传递了函数体所在的地址位置,在需要的时候好找到函数体去执行。

 

 

 

 

 

 

 

 

posted @ 2012-03-21 20:41  lastren  阅读(314)  评论(0编辑  收藏  举报