Java学习日记10:EL表达式,JNDI,ajax

jsp中的EL表达式:

EL表达式都是以${开始,以}结束,如 username {username.firstName}

有算数操作符,逻辑操作符(下面例子中有)
条件和Empty操作符:

  • 条件操作符:${A>B?B:C}
  • Empty操作符:${emptyB}
    判断一个值是否为nullempty

操作符的优先级:(从高到低)


 - []
 - ()
 - not ! empty
 - / div % mod
 - < > <= >= lt gt le ge
 - == != eq ne
 - && and
 - || or
 - ?:

隐含对象   内容
—— 与范围有关的隐含对象
applicationScope 应用程序范围内的scoped变量组成的集合
sessionScope 所有会话范围的对象的集合
requestScope 所有请求范围的对象的集合
pageScope 页面范围内所有对象的集合
—— 其他隐含对象
cookie 所有cookie组成的集合
header HTTP请求头部,字符串
headerValues HTTP请求头部,字符串集合
initParam 全部应用程序参数名组成的集合
pageContext 当前页面的javax.servlet.jsp.PageContext对象
—— 与输入有关的隐含对象
param 所有请求参数字符串组成的集合
paramValues 所有作为字符串集合的请求参数

在EL中,对于自定义变量的查找是通过PageContext.findAttribute(String)方法来完成的。如:${username}。这个表达式将按照page,request,session,application范围的顺序查找username,如果没有找到将返回null.我们也可以利用pageScope、requestScope、sessionScopeapplicationScope指定范围。如:${requestScope.username}

表达式语言中允许定义函数,函数定义和使用的机制与标签库是一样的。首先自己写一个java类,它的函数必须是静态的

Demo01:

例子:
记得写一个对应的User的类:


package com.pojo;

public class User {
String uname;
String upwd;

public User(){}
public User(String uname,String upwd)
{
    this.uname=uname;
    this.upwd=upwd;
    }
public String getUname() {
    return uname;
}
public void setUname(String uname) {
    this.uname = uname;
}
public String getUpwd() {
    return upwd;
}
public void setUpwd(String upwd) {
    this.upwd = upwd;
}

}

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="com.pojo.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL_demo</title>
</head>
<body>
EL表达式
<%
pageContext.setAttribute("user","cccc");
request.setAttribute("user","admin");
session.setAttribute("user", "adminsession");
application.setAttribute("user","adminapplicatoin");

com.pojo.User user=new com.pojo.User("lisi","123");

session.setAttribute("person", user);


%>
<h1>${3+2}</h1>
<h1>${10%3}</h1>
<h1>${10/3}</h1>
<h1>${str=="admin"}</h1>
<h1>${user}</h1><!-- 相当于Servlet中的getAttribute,不过是自动匹配是哪一种类型的 -->
<h1>${sessionScope.user}</h1><!-- 相当于Servlet中的session.getAttribute -->
<h1>${sessionScope.person.uname}</h1><!-- 相当于Servlet中的session.getAttribute的getuname -->
</body>
</html>

Demo02:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>获取请求报头的值</h1>
<h1>${header["Host"]}</h1><!-- 得到对应报头的值 -->
<h1>${header.host}</h1><!-- 得到对应报头的值 -->
<h1>${headerValues.headerValues}</h1><!-- 试一下是什么作用 -->
<h1>${cookie.JSESSIONID.value}</h1><!-- 得到cookie -->
<h1>${param.uname}</h1><!-- 得到对应的变量的值 -->
</body>
</html>

JNDI:

把一个对象绑定到一个名字上,通过这个名字就能得到这个对象
一个项目用一个连接池;
现在想让Tomcat管理连接池,项目启动以后,向Tomcat申请这个链接
Tomcat启动的时候把连接池准备好,Tomcat把连接池的DataSource绑定到一个名字,
我们可以通过这个名字可以得到连接池对象,从而得到链接
在META-INF里面有一个Context.xml,在这里的这个配置相当于是全局的一个配置,相当于是给Tomcat服务器的一个配置。这样Tomcat启动的时候就已经把实例化javax.sql.DataSource的对象并且绑定到这个jdbc/test名字的事情做了。

Context.xml:

<Context>
<Resource   数据源
name="jdbc/test"   
auth="Container" 
type="javax.sql.DataSource"   类型,如果以后配置c3p0的话这里就是ComboPooledDataSource什么的,
                                     这里要参考对应的文档
                                      Tomcat的文档中有JNDIResource

maxActive="100"     连接池的一些属性,最大
maxIdle="30"    最小
maxWait="10000"     等待时间
username="root"     用户名
password="mysql"    密码
driverClassName="com.mysql.jdbc.Driver"     驱动
url="jdbc:mysql://localhost:3306/emps"/>    URL,链接它
</Context>

在Servlet中:

InitialContext ic = new InitialContext();//实例化一个InitialContext对象

            //这里就用“jdbc/test”这个名字得到DataSource对象,用实例化的InitialContext对象来调用lookup方法
            DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/test");

            Connection con=ds.getConnection();//得到链接对象
            ResultSet rs=con.createStatement().executeQuery("select * from emp");
…

记得把驱动类(就是C3p0的jar包什么的放到Tomcat的lib文件夹下)

Ajax

其实就是嫩异步处理,就是在不用点刷新页面的时候,浏览器后台偷偷传消息给服务器并且得到服务器的回应。

在看代码的时候不懂的话可以多看看说明文档,里面说的很清楚。

Index:


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
var xmlhttp;//XMLHTTPRequest

//创建xmlhttp对像
function createXmlHTTP()
{
    if (window.XMLHttpRequest)//如果浏览器支持的话
      {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();//实例化一个XMLHttpRequest对象
      }
    else//浏览器不支持的话
      {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");//实例化一个ActiveXObject对象
      }
}



function check()//check函数
{

    var email=document.getElementById("email").value;//得到页面中email传过来的值
    createXmlHTTP();//创建xmlhttp对像,ajax要用的

    //xmlhttp.readyState一共有5个值,分别代表不同的状态,解释如下:
    /*
    0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法) 
    1 (初始化) 对象已建立,尚未调用send方法 
    2 (发送数据) send方法已调用,但是当前的状态及http头未知 
    3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误, 
    4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据 


    */

    //当xmlhttp.readyState 发生改变一次,都会触发此事件
    xmlhttp.onreadystatechange=function()//这个事件后面的 =function()是一个函数,就是这个事件每触发一次,就执行一次这个函数
    {
         var show=document.getElementById("tip");//得到id为tip的节点
        if(xmlhttp.readyState==4&&xmlhttp.status==200)//status是状态码,是服务器返回来的
        //常用状态码:200 OK;  404 Not Found; 302 Found

            {
               var re=xmlhttp.responseText;//将响应信息作为字符串返回,也就是将Servlet返回来的信息得到。

               //还有responseXML 将响应信息格式化为Xml Document对象并返回
               //responseStream 以Ado Stream对象的形式返回响应信息
               //responseBody 以unsigned array格式表示直接从服务器返回的未经解码的二进制数据。

               if(re==1)//如果得到的是1(在Servlet中写好的)
                   {
                     show.innerHTML="<span style='color:red;'>不可以注册</span>";//在HTML中显示
                   }else//如果得到的不是1(在Servlet中写好的)
                       {
                       show.innerHTML="<span style='color:green;'>可以注册</span>";
                       }
            }else
                {
                show.innerHTML="<span style='color:green;'>正在给服务器发请求</span>";
                }
    }

    //创建一个新的http请求,并指定此请求的方法、URL以及验证信息
    //括号中的意思:选择Get方法,对应哪个Servlet,并且把email传进去,是否为异步方式。
    xmlhttp.open("GET","checkEmail?email="+email,true);


    //xmlhttp.open("GET","hello.txt",true);
    xmlhttp.send();//发送请求到http服务器并接收回应





}
</script>
</head>
<body>
<center>
<!-- 这个Email输入框要实现输入邮箱之后,和现有的邮箱账号匹配,如果有的话这个邮箱就不能再进行注册
      在转移焦点的时候就要提示出来 -->
 Email:<input type="text" id="email" onblur="check();"/><span id="tip"></span>
 <!-- onblur就是转移焦点,意思是转移焦点的时候执行check函数 -->
 <!-- 这里定义span用来显示返回来能不能用这个邮箱注册 -->

 <br/>密码:<input type="password" id="pwd"/>

</center>
</body>
</html>

Index对应的Servlet:

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/checkEmail")
public class CheckServlet extends HttpServlet
{

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.setContentType("text/plain");
        PrintWriter out=resp.getWriter();
        /*try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        String email=null!=req.getParameter("email")?req.getParameter("email"):"";
        if("admin@163.com".equals(email))//如果符合这个邮箱就返回1,就是不能注册
        {
            out.print(1);
        }else//如果不是就返回0,就是能注册
        {
            out.print(0);
        }

        out.close();

    }

}

用jQuery的index3:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="jquery-1.11.1.min.js"></script><!-- 导入一个已经写好的jQuery -->
<script type="text/javascript">

//jQuery的例子:
/*
 * $(this).hide() - 隐藏当前元素

 $("p").hide() - 隐藏所有段落

 $(".test").hide() - 隐藏所有 class="test" 的所有元素

 $("#test").hide() - 隐藏所有 id="test" 的元素


 */
$(function()//这里是执行这个函数的意思吗,这个函数怎么执行呢?
        {

    $("#email").blur//当id是email的元素失去焦点的时候,执行下面写的函数
    (function()
            {
        var email=$("#email").val();
        $.get("checkEmail",{'email':email},function(data)//请求checkEmail这个Servlet,并且根据这个Servlet的返回值做判断
                /*
                jQuery.get(url,[data],[callback]) 通过远程 HTTP GET 请求载入信息。
                返回值是XMLHttpRequest
                参数:
                url (String) : 待载入页面的URL地址
                data (Map) : (可选) 待发送 Key/value 参数。
                callback (Function) : (可选) 载入成功时回调函数。



显示 test.php 返回值(HTML 或 XML,取决于返回值)jQuery 代码:

$.get("test.php", function(data){
  alert("Data Loaded: " + data);
}); 


                */
                {

               if(data==1)
                   {
                     $("#tip").html("<span style='color:red;'>不可以注册</span>");
                   }else
                       {
                       $("#tip").html("<span style='color:green;'>可以注册</span>");
                       }
        });
    });

});


</script>
</head>
<body>
<center>
 Email:<input type="text" id="email"/><span id="tip"></span>
 <br/>密码:<input type="password" id="pwd"/>
</center>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值