1.signin.jsp
<%
    String errMessage = null;
    Object obj = request.getAttribute("errorinfo");
    if(obj != null){
        errMessage = obj.toString().trim().toLowerCase();
    }
%>

<script type="text/javascript">
    function errorLogin(){
      var num = String("<%=errMessage%>");
          if(num !== "null"){
              document.getElementById("error_login").innerHTML = "username or password is wrong !";
       }
    }
</script>

<body οnlοad="javascript:errorLogin();">
   <span id="error_login" class="error" ></span>
</body>

 2. 上面的代码经过了我好长时间的修改才成功了,主要是对于JS中的null和"",这两个空值不熟悉的原因,在加上如何定义JS里面的字符串和变量,这些都不是很熟悉,所以才那样。

     现在解释下:

     (1)初始时:<%=errMessage%>为null,当时的写法是:var num = <%=errMessage%>; if(num !== null),

这样看上去很正确其实是不对的。初始时是正确的但是当我有值时即num=failed,<%=errMessage%>从request获取来的值为failed,这时报“failed未定义”的异常??

      (2)为什么会出现上面的异常呢?然后我去查JS如何定义变量?

      (3)又查了JS如何定义字符串??

String(null) -> "null",初始时
<%=errMessage%>的值为null,这样转化成String类型为"null",紧接着我用if(num !== "null"),这样在以后的num="failed"的时候,这时候就没报failed未定义的异常了,因为我把它转化成了String,这就是JS如何定义字符串。
这样就搞定了我的问题了。
      (4)到String的转换关系?
String(undefined) -> "undefined" ,String(null) -> "null" ,  String("") -> "" , String(0) -> "0"
          String(false) -> "false"      (5)它们的typeof类型?
typeof(undefined) == 'undefined' ,typeof(null) == 'object' ,typeof("") == 'string' ,
           typeof(0) == 'number' ,typeof(false) == 'boolean'
3. 全等号和非全等号(=== 和 !==)
     (1)这两个运算符所做的事情与等号和非等号(==和!==)相同,只是它们在检查相等性前,不执行类型转换。
    (2)例如:
       var sNum = "66";
          var iNum = 66;
          alert(sNum == iNum);	//输出 "true"
          alert(sNum === iNum);	//输出 "false"
          在这段代码中,第一个 alert 使用等号来比较字符串 "66" 和数字 66,输出 "true"。
          如前所述,这是因为字符串 "66" 将被转换成数字 66,,然后才与另一个数字 66 进行比较。
          第二个 alert 使用全等号在没有类型转换的情况下比较字符串和数字,当然,字符串不等于数字,
          所以输出 "false"。

     (3)非全等号由感叹号加两个等号(!==)表示,只有在无需类型转换运算数不相等的情况下,才返回 true。
	例如:
	var sNum = "66";
	var iNum = 66;
	alert(sNum != iNum);	//输出 "false"
	alert(sNum !== iNum);	//输出 "true"
	这里,第一个 alert 使用非等号,把字符串 "66" 转换成数字 66,使得它与第二个运算数 66 相等。
           因此,计算结果为 "false",因为两个运算数是相等的。第二个 alert 使用的非全等号。
           该运算是在问:"sNum" 与 "iNum" 不同吗?这个问题的答案是:是的(true),
          因为 sNum 是字符串,而 iNum 是数字,它们当然不同。