`

Jsp全局变量定义

阅读更多
注:以下内容可能不完全准确,仅供参考。

2008-09-28 00:25
   <%! 定义 %>与 <% 定义 %>区别如下,一切尽在代码中。

Jsp:

<%@ page contentType="text/html; charset=GBK" %>
<!--定义方式1 -->
<%   int j=1;%>
<!--定义方式2 -->
<%! int j=0;%>
<html>
<head>
<title>
jsp1
</title>
</head>
<body bgcolor="#ffffff">
<h1>

<!--
调用定义方式1的变量
-->
<%=j%>
<br>
<!--
调用定义方式2的变量
-->
<%=this.j%>
</h1>
</body>
</html>

反编译的Java jsp1_0002ejsp_jsp.class:

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.HttpJspBase;
import org.apache.jasper.runtime.JspException;

public class jsp1_0002ejsp_jsp extends HttpJspBase
{

     public jsp1_0002ejsp_jsp()
     {
         j = 0;
     }

     public final void _jspx_init()
         throws JspException
     {
     }

     public void _jspService(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException
     {
         JspFactory _jspxFactory = null;
         PageContext pageContext = null;
         HttpSession session = null;
         ServletContext application = null;
         ServletConfig config = null;
         JspWriter out = null;
         Object page = this;
         String _value = null;
         try
         {
             if(!_jspx_inited)
                 synchronized(this)
                 {
                     if(!_jspx_inited)
                     {
                         _jspx_init();
                         _jspx_inited = true;
                     }
                 }
             _jspxFactory = JspFactory.getDefaultFactory();
             response.setContentType("text/html; charset=GBK");
             pageContext = _jspxFactory.getPageContext(this, request, response, "", true, 8192, true);
             application = pageContext.getServletContext();
             config = pageContext.getServletConfig();
             session = pageContext.getSession();
             out = pageContext.getOut();
             out.write("\r\n<!--\u5B9A\u4E49\u65B9\u5F0F1 -->\r\n");
             //定义方式1,这里定义的只能作用在_jspService成员函数的定义之后,如果想引用定
             //义方式2的变量只能用this应用
             int j = 1;
             out.write("\r\n<!--\u5B9A\u4E49\u65B9\u5F0F2 -->\r\n");
             out.write("\r\n<html>\r\n<head>\r\n<title>\r\njsp1\r\n</title>\r\n</head>\r\n<body bgcolor=\"#ffffff\">\r\n<h1>\r\n\r\n<!--\r\n\u8C03\u7528\u5B9A\u4E49\u65B9\u5F0F1\u7684\u53D8\u91CF\r\n-->\r\n");
             out.print(j);
             out.write("\r\n<br>\r\n<!--\r\n\u8C03\u7528\u5B9A\u4E49\u65B9\u5F0F2\u7684\u53D8\u91CF\r\n-->\r\n");
             out.print(this.j);
             out.write("\r\n</h1>\r\n</body>\r\n</html>\r\n");
         }
         catch(Throwable t)
         {
             if(out != null && out.getBufferSize() != 0)
                 out.clearBuffer();
             if(pageContext != null)
                 pageContext.handlePageException(t);
         }
         finally
         {
             if(_jspxFactory != null)
                 _jspxFactory.releasePageContext(pageContext);
         }
     }

     //定义方式2 ,<%! xxxx >就是声明一个类的成员变量,如果我们在这个jsp文件定义一个
     //成员函数,那么只能调用此种方式的变量了
     int j;
     private static boolean _jspx_inited = false;

}

===========================================

使用jsp页面中<%! %>全局变量声明遇到的问题

一般喜欢把页面里多处要用到的变量设置成全局变量,如:

当把该变量赋值后,再次访问该页面时,该变量的值依然保存。这使得想通过用全局变量接受提交的参数时会受到一些迷惑:

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


当ID在前一次赋过初值后,因为另一种原因而再次访问该页面但‘operation'参数为空时,本来希望ID也为空,但实际上ID的值为上次访问该页面时赋的值。当希望通过ID的值做不同的操作时可能引起操作类型的混乱。

原因:使用<%! %>定义的变量编译成servlet后成为servlet的私有成员变量,在servlet环境中,对于一个JSP页只允许有一个结果servlet的实例在运行和响应所有的页面请求。因此,在结果servlet中所有的成员变量可以被所有的请求所共享,所以只要成员变量没有重新赋值,下次访问该页面时仍然不变。而在<% %>中定义的变量编译成servlet后成为service()方法的一个本地变量,而service()方法中的本地变量只能每响应一次请求就重建一
次。

解决的办法是将ID用<% %>定义,或在判断ID的操作后重新对ID初始化。

自己添加的内容为:

<%!
//设置全局变量
int i=0;
%>
<%
response.setHeader("refresh","1");
%>
<h1><%=++i%></h1>

该页面若编译成功后生成Servlet文件,全局变量i就会被所有客户的请求所共享,即客户端每进行一次请求,变量i就会加1。

当修改了*.jsp文件后,再次在客户端进行访问,这时全局变量i就又从0开始变化了。

全局变量和 page,request,session.application中的application变量类似。
分享到:
评论

相关推荐

    java、jsp环境变量配置.cmd

    2. **PATH**:这个全局环境变量包含可执行文件的路径列表,添加%JAVA_HOME%\bin到PATH中,使得系统可以在任何位置执行Java相关命令,如`java`和`javac`。 3. **JRE_HOME**:虽然不是必须的,但有些程序可能需要JRE...

    JSP页面组成.ppt

    例如,可以定义一个名为`count`的全局变量并初始化为0,然后在页面加载时(可能是`&lt;jsp:include&gt;`或`&lt;jsp:forward&gt;`之后)增加`count`的值。 了解并掌握以上知识点,将使你能够有效地开发和维护JSP应用程序,同时...

    对jsp两个页面间传递变量出现变量乱码的解决

    这里,`contentType`定义了页面的MIME类型和字符集,`pageEncoding`指定了JSP源文件的编码。将`pageEncoding="ISO-8859-1"`改为`pageEncoding="GBK"`,可以确保该JSP文件内部的编码方式与乱码问题相匹配。然而,这种...

    JSP基础教程笔记

    #### 一、JSP Scriptlets与变量定义 - **局部变量**: 使用 `&lt;% %&gt;` 定义局部变量,仅在当前脚本块中有效。 - **全局变量**: 使用 `! %&gt;` 定义全局变量,可以在整个JSP页面内多次调用,并且在页面加载期间保持其值。...

    jsp实用教程 jsp电子教程 jsp 从入门到精通 jsp

    1. page指令:定义JSP页面的全局属性,如编码、导入包等。 2. include指令:用于在页面编译时或运行时包含其他文件。 3. taglib指令:引入自定义标签库。 三、JSP脚本元素 1. Scriptlet:在中编写Java代码,用于...

    JSP基础语法

    %&gt;:定义全局变量,编写方法,编写类 例如:scriptletdemo02.jsp、scriptletdemo03.jsp 2.3 &lt;%= %&gt;:表达式输出 例如:scriptletdemo04.jsp、scriptletdemo06.jsp、scriptletdemo07.jsp 3. page 指令 page ...

    JSP程序设计从入门到精通

    JSP声明用于定义全局变量或方法,表达式用于输出,而Scriptlet则可以包含多个Java语句。 #### JSP语法概要 JSP的基本语法与Java语言类似,但它增加了特定的指令和动作标签,例如page指令用于设置页面依赖属性,...

    (word完整版)JSP纸制教案(4).doc

    变量在这里声明为全局变量,对整个JSP页面有效。方法定义则可以被页面内的其他Java程序片调用。类定义同样在页面范围内有效,可以用于创建对象。 - **表达式**:`&lt;%= ... %&gt;`标记用于插入一个能够计算出数据值的...

    JSP页面与JSP标记.ppt

    这些声明的变量被称为成员变量,对于所有用户都是全局共享的。 例如: ```jsp ;charset=GB2312" %&gt; &lt;HTML&gt;&lt;BODY BGCOLOR=cyan&gt; ! int i=0; %&gt; i++; %&gt; 您是第 &lt;%= i %&gt; 个访问本站的客户。 &lt;/BODY&gt;&lt;/HTML&gt; ``` 在...

    jsp内置对象编程

    #### 二、JSP 输出与变量定义 ##### 1. 输出对象 out `out` 对象用于向客户端输出数据。它支持 HTML 标签,因此可以直接输出 HTML 文本。 - **示例代码**: ```jsp ; charset=UTF-8" pageEncoding="UTF-8"%&gt; ...

    jsp网站源码jsp网站源码

    声明部分用于定义变量或方法;脚本元素包括脚本let、scriptlet、表达式和声明,它们可以包含Java代码;指令则用于配置页面行为,如import、page、include等。 **2. JSP生命周期** JSP页面经历四个阶段:翻译、编译...

    Jsp的经典例题大全

    - `page`指令:定义页面的编码、语言、导入的包等属性。 - `include`指令:在编译时包含其他文件。 - `taglib`指令:引入自定义标签库。 3. **JSP表达式**: - `&lt;%= %&gt;`:将Java表达式的值转换为字符串并输出到...

    JSP考试复习资料

    JSP有九大内置对象,如`request`、`response`、`session`、`application`等,它们提供了处理HTTP请求和响应的功能,以及管理会话和全局变量的能力。 7. **处理中文字符**: 当表单提交的参数中含有汉字时,接收...

    jsp语法(jsp脚本元素、jsp指令和jsp动作)

    这种格式用于定义变量或方法,并且这些定义仅在当前页面中有效。声明代码通常位于任何方法之外,即在Servlet类的类级别上。声明的示例代码如下: ```jsp &lt;title&gt;JSP声明 ! public String output(String ...

    一套JSP测试题,有答案

    - **page指令**:定义页面的全局属性,例如content type、import等。 - **include指令**:用来包括静态或动态文件。 - **taglib指令**:定义自定义标签库的位置。 #### 4. JSP脚本元素 JSP脚本元素用于嵌入Java代码...

    jsp九大内置对象

    它类似于一个全局变量,可以跨多个用户会话共享数据。 - **作用域**:整个Web应用。 #### 五、Out对象 - **定义**:`javax.servlet.jsp.JspWriter` 类型的对象。 - **用途**:用于向客户端输出数据,例如HTML文本、...

    jsp手把手教程 让你精通jsp编程

    4. **Java代码段**:`&lt;% ... %&gt;`用于编写Java代码,可以是变量声明、方法调用等。 5. **表达式**:`${...}`用于输出Java表达式的值到页面上。 **JSP内置对象** JSP提供了多个内置对象,它们在每次请求时由容器自动...

    JSP网络编程从基础到实践

    声明用于定义变量或方法,这些变量和方法可以在Java代码块中使用。表达式则用于输出Java表达式的结果到HTML页面中。 在JSP中,我们可以使用内置对象,如request、response、session和application。Request对象存储...

    jsp编写的30个网站实例

    3. **内置对象**:JSP提供了九个内置对象,如`request`、`response`、`session`、`application`等,它们简化了HTTP协议的处理,使得开发者可以方便地获取请求信息、设置响应头、管理会话和全局变量。 4. **EL...

    JSP基本语法及由浅入深

    - **JSP 2.0+的声明式错误处理**:使用`error-page`元素定义错误处理页面,提高错误处理的规范性和一致性。 - **自定义标签**:开发自定义标签库,可以封装复杂功能,增强代码复用。 通过不断学习和实践,我们可以...

Global site tag (gtag.js) - Google Analytics