jsp中的变量、方法的可访问性可见性即<%!%><%%>的区别

jsp中的变量、方法的可访问性可见性即<%!%><%%>的区别

第一节 成员变量和局部变量

一、使用<%! %>定义的变量编译成servlet后成为servlet的私有成员变量,在servlet环境中,一个JSP页面只对应有一个servlet 实例在运行和响应所有的页面请求。因此,这个servlet实例的成员变量被所有的请求共享,所以当该页面被访问过后,下次再访问该页面时其成员变量保持上次的值。由于这个效果,这个“成员变量”也被称为“全局变量”了。

二、使用<% %>定义的变量编译成servlet后成为service()方法的一个局部变量,而service()方法中的局部变量在每次响应一个请求时就重建一次。所以请求和请求之间是隔开的,互不干扰。

 

<html>

<head>

<title>helloworld</title>

</head>

<body>

 

    <%!int i = 1;//成员变量%>

    <%

       int i = 5;//局部变量

    %>

 

    <%

       out.println("i=" + i++);//访问局部变量

    %>

 

    <br/>

    <%

       out.println("(this.i)=" + (this.i)++);//访问成员变量(被局部变量隐藏,所以要用this

    %>

    <br/>

</body>

</html>

 

运行结果是

第一次

i=5

(this.i)=1

第二次

i=5

(this.i)=2

n

i=5

(this.i)=n

 

总结:在写多线程或者用多线程框架时,应该考虑一下上述两种变量的区别。推荐用局部变量。

第二节 编译结果放置位置

<% %>和<%= %>的编译结果如同放在service()方法里,<%! %>的编译结果则作为成员变量、成员方法。

 

下例显示了访问计数功能:

<%!int i = 0;%>

<%

    i++;

%>

<%

    int i = 8;

%>

您是第<%=i%>个访问本站的用户

<br/>

您是第<%=this.i%>个访问本站的用户

 

运行结果是:

第一次

您是第8个访问本站的用户

您是第1个访问本站的用户

第二次

您是第8个访问本站的用户

您是第2个访问本站的用户

n

您是第8个访问本站的用户

您是第n个访问本站的用户

 

总结:<%= %>的编译结果如同放在service()方法里。<%= %>以局部变量优先,如果局部变量隐藏了成员变量,则访问成员变量需要用this.。

 

第三节用<%! %>定义成员方法

<%!int i = 1;%>

<%!int getNumber() {

       return i++;

    }%>

<%

    int i = 10;

    out.print("i:" + getNumber() +"<br/>");

    out.print("i:" + i);

%>

 

运行结果是

i:1

i:10

 

第四节 页面代码的一种特殊情形

一般喜欢把页面里多处要用到的变量设置成全局变量。这时,当把该变量赋值后,再次访问该页面时,该变量的值依然保存。当希望通过用全局变量接受提交的参数时:

if(request.getParameter("operation")!=null);

ID = request.getParameter("operation").trim();

有一种意外情形:当ID在前一次赋过初值后,再次访问该页面但'operation'参数为空时,本来希望ID也为空,但web运行环境下有可能使得ID的值为上次访问该页面时赋的值。此时,希望通过ID值的不同而做不同的操作的意图落空。解决的办法是将ID用<% %>定义等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值