好像再定义变量的时候
加上!就是jsp语法
不加,是 javascript语法,我也记不清了

解决方案 »

  1.   

    %!  是一个静态变量,所有的session使用的画面用同一个变量
      

  2.   

    那使用它的目的是不是: 同一个session 不同页面  之间 数据共享?
      

  3.   

    "我另外写了一个jsp,里面不声明d的话,就不能编译 "
      

  4.   

    在Tomcat4.17中(在E:\Tomcat4.1\webapps\test\)
    hello.jsp
    =========
    <%@ page contentType="text/html; charset=gb2312" %>
    <HTML>
    <HEAD>
    <TITLE></TITLE>
    </HEAD>
    <BODY>
    <%! String hello = "hello"; %>
    <%
    String world = "world";
    %>
    </BODY>
    </HTML>所生成对应的java文件(E:\Tomcat4.1\work\Standalone\localhost\test\)hello_jsp.java
    ==============
    package org.apache.jsp;import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;
    import org.apache.jasper.runtime.*;public class hello_jsp extends HttpJspBase { String hello = "hello";   private static java.util.Vector _jspx_includes;  public java.util.List getIncludes() {
        return _jspx_includes;
      }  public void _jspService(HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, ServletException {    JspFactory _jspxFactory = null;
        javax.servlet.jsp.PageContext pageContext = null;
        HttpSession session = null;
        ServletContext application = null;
        ServletConfig config = null;
        JspWriter out = null;
        Object page = this;
        JspWriter _jspx_out = null;
        try {
          _jspxFactory = JspFactory.getDefaultFactory();
          response.setContentType("text/html; charset=gb2312");
          pageContext = _jspxFactory.getPageContext(this, request, response,
           null, true, 8192, true);
          application = pageContext.getServletContext();
          config = pageContext.getServletConfig();
          session = pageContext.getSession();
          out = pageContext.getOut();
          _jspx_out = out;      out.write("\r\n");
          out.write("<HTML>\r\n");
          out.write("<HEAD>\r\n");
          out.write("<TITLE>");
          out.write("</TITLE>\r\n");
          out.write("</HEAD>\r\n");
          out.write("<BODY>\r\n");
          out.write("\r\n"); String world = "world";      out.write("\r\n");
          out.write("</BODY>\r\n");
          out.write("</HTML>");
        } catch (Throwable t) {
          out = _jspx_out;
          if (out != null && out.getBufferSize() != 0)
            out.clearBuffer();
          if (pageContext != null) pageContext.handlePageException(t);
        } finally {
          if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
        }
      }
    }
      

  5.   

    加叹号声明的变量可以在整个jsp页面调用,不加叹号只能在该定义域使用。全局变量跟局部变量差别
      

  6.   

    如果你在JSP页面中定义的函数,此函数用到一局变量时就要用了.即加!表全局变量
      

  7.   

    <%!是动态全局变量,我一般会在里面直接申明方法当内在函数用
    比如:<%!
        public void foo(){}
    %><%
       foo();//前面申明的方法能直接用
    %>
      

  8.   

    liad() 
    的方法很好,
    在编译的java文件中找出差别
      

  9.   

    看了jsp对应的java文件后,明白了:
    <%! %>里声明的变量和方法都是作为类的属性和方法存在的
    而<% %>里声明的变量则是作为_jspService这个方法的内部属性
    (这也决定了<% %>里不能声明方法)希望没搞错!
      

  10.   

    test1.jsp:
    ----------------------
    <% int i=0;%>
    <% ++i;
       out.println(i);
    %>
    用户A访问结果:
    1
    用户B访问结果:
    1
    test2.jsp:
    ----------------------
    <%! int i=0;%>
    <% ++i;
       out.println(i);
    %>
    用户A访问结果:
    1
    用户B访问结果:
    2
    用户A访问结果:
    3
      

  11.   

    liad() ( ) 贴的代码经典!
    现在小个结:
    一.jsp运行过程:客户端IE发送请求 -> 
    web服务器接收请求 ->
    当请求为.jsp文件时,就会自动将请求交给应用服务器处理(应用服务器有很多种,如tomcat,resin,weblogic等)->
    应用服务器 找到用户请求的.jsp文件,解释jsp文件,产生相应的servlet类(又称java程序)->
    编绎servlet类(又称java程序) ->运行java程序
    ->由java程序 处理用户请求的参数,返回html文本
    ->html文本由java程序回送到应用服务器,再由应用服务器回送到web服务器,由web服务器回送到客户端IE
    ->客户端ie对接收到的html文本 进行 显示二.jsp语法jsp页面
        |
        --------element(元素)
        |          |
        |           -------directive 
        |          | 
        |           -------actions
        |          |
        |           --------scripting( 脚本,分三种:声明,执行语句,表达式)
        |
        --------comments(分纯html的注释,java的注释,回送到客户端的注释三种)
        |
        --------Template Data(模板数据,指html的内容)必须清楚,应用服务器并非将jsp文件直接把脚本内容替换一下就返回给客户端了,这种理解大错特错。应用服务器会针对每个jsp文件 生成一个相应的servlet类,又称java程序。servlet类一般在work目录下,具体位置很容易找到。
    最终要理解的就是 jsp文件 一定会被 转化成一个类,jsp文件的jsp元素,注释,html数据 最终都被封装成一个servlet类,例如;public class _index1__jsp extends com.caucho.jsp.JavaPage{
      private boolean _caucho_isDead;   private static int GlobalVar1=0 ; 
      
      public void
      _jspService(javax.servlet.http.HttpServletRequest request,
                  javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException
      {
      ....
          out.write(_jsp_string8, 0, _jsp_string8.length);
     ....这个类 接收用户的请求参数,并产生输出与回送。
    用户接收到的数据来自于这个servlet类,所以servlet类又称为 java程序,或称为 一个服务。
    简言之: jsp文件对应的是一个服务,即servlet类,又称java程序。
    附:当用户请求某个jsp文件,只有第一次请求时 会解释生成,编译,运行 java程序
    以后请求此文件时直接从 此java程序返回结果,所以你可以看到第一次访问一个网页很慢,而以后奇快!
      

  12.   


    下面贴一个.jsp文件  与其对应的servlet(.java文件)
    环境 resin + jdk 1.4.2.jsp文件  C:\Resin\webapps\test2\subpath1\index1.jsp 内容如下;
    <% response.setHeader("Refresh","500") ;%>
    <html>
    <head>
    <title>
    welcome title
    </title><body><%-- 最正规的注释,不会被翻译成java注释 --%><% // 被翻译成java注释 %>
    <% /* 被翻译成java注释 */ %>
    <% /** 被翻译成java注释 **/ %><!-- 发回到客户端的注释 -->
    <!--   -->
    <h3>
    <!-- 全局变量  -->
    <%! private static int GlobalVar1=0 ; %>
    <%out.println("全局变量GlobalVar1的值:");%><%=GlobalVar1 %>
    <%GlobalVar1++;%>
    </h3><h3>
    <!-- 局部变量  -->
    <%   int PrivateVar1=0 ; %>
    <%out.println("局部变量PrivateVar1的值:");%><%=PrivateVar1 %>
    <%PrivateVar1++;%>
    </h3>
    <h3>
    <%out.println("hello,world");%>
    </h3>
    <h1>
    当前时间
    </h1>
    <%=new java.util.Date() %><h3>
    <%//=HelloWorld.GetString()%>
    </h3></body></html>
    ==================================================================
    对应的servlet类的源文件 :C:\Resin\webapps\test2\WEB-INF\work\_subpath1\_index1__jsp.java  由应用服务器自动生成,内容如下(贴不下,最后不重要的部分省略了)
    ======================================================================/*
     * JSP generated by Resin 3.0.3 (built Mon Sep 22 15:54:15 PDT 2003)
     */package _subpath1;
    import javax.servlet.*;
    import javax.servlet.jsp.*;
    import javax.servlet.http.*;public class _index1__jsp extends com.caucho.jsp.JavaPage{
      private boolean _caucho_isDead;   private static int GlobalVar1=0 ; 
      
      public void
      _jspService(javax.servlet.http.HttpServletRequest request,
                  javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException
      {
        com.caucho.jsp.PageContextImpl pageContext = com.caucho.jsp.QJspFactory.allocatePageContext(this, request, response, null, true, 8192, true);
        javax.servlet.jsp.JspWriter out = (javax.servlet.jsp.JspWriter) pageContext.getOut();
        javax.servlet.ServletConfig config = getServletConfig();
        javax.servlet.Servlet page = this;
        javax.servlet.http.HttpSession session = pageContext.getSession();
        javax.servlet.ServletContext application = pageContext.getServletContext();
        response.setContentType("text/html");
        try {
           response.setHeader("Refresh","500") ;
          out.write(_jsp_string0, 0, _jsp_string0.length);
          out.write(_jsp_string1, 0, _jsp_string1.length);
           // \u00b1\u00bb\u00b7\u00ad\u00d2\u00eb\u00b3\u00c9java\u00d7\u00a2\u00ca\u00cd 
          out.write(_jsp_string2, 0, _jsp_string2.length);
           /* \u00b1\u00bb\u00b7\u00ad\u00d2\u00eb\u00b3\u00c9java\u00d7\u00a2\u00ca\u00cd */ 
          out.write(_jsp_string2, 0, _jsp_string2.length);
           /** \u00b1\u00bb\u00b7\u00ad\u00d2\u00eb\u00b3\u00c9java\u00d7\u00a2\u00ca\u00cd **/ 
          out.write(_jsp_string3, 0, _jsp_string3.length);
          out.write(_jsp_string2, 0, _jsp_string2.length);
          out.println("\u00c8\u00ab\u00be\u00d6\u00b1\u00e4\u00c1\u00bfGlobalVar1\u00b5\u00c4\u00d6\u00b5:");
          out.print((GlobalVar1 ));
          out.write(_jsp_string2, 0, _jsp_string2.length);
          GlobalVar1++;
          out.write(_jsp_string4, 0, _jsp_string4.length);
             int PrivateVar1=0 ; 
          out.write(_jsp_string2, 0, _jsp_string2.length);
          out.println("\u00be\u00d6\u00b2\u00bf\u00b1\u00e4\u00c1\u00bfPrivateVar1\u00b5\u00c4\u00d6\u00b5:");
          out.print((PrivateVar1 ));
          out.write(_jsp_string2, 0, _jsp_string2.length);
          PrivateVar1++;
          out.write(_jsp_string5, 0, _jsp_string5.length);
          out.println("hello,world");
          out.write(_jsp_string6, 0, _jsp_string6.length);
          out.print((new java.util.Date() ));
          out.write(_jsp_string7, 0, _jsp_string7.length);
          //=HelloWorld.GetString()
          out.write(_jsp_string8, 0, _jsp_string8.length);
        } catch (java.lang.Throwable _jsp_e) {
          pageContext.handlePageException(_jsp_e);
        } finally {
          com.caucho.jsp.QJspFactory.freePageContext(pageContext);
        }
      }  private com.caucho.java.LineMap _caucho_line_map;
      private java.util.ArrayList _caucho_depends = new java.util.ArrayList();  public boolean _caucho_isModified()
      {
        if (_caucho_isDead)
          return true;
        if (com.caucho.util.CauchoSystem.getVersionId() != 1174304625)
          return true;
        for (int i = _caucho_depends.size() - 1; i >= 0; i--) {
          com.caucho.make.Dependency depend;
          depend = (com.caucho.make.Dependency) _caucho_depends.get(i);
          if (depend.isModified())
            return true;
        }
        return false;
      }  public long _caucho_lastModified()
      {
        return 0;
      }  public com.caucho.java.LineMap _caucho_getLineMap()
      {
        return _caucho_line_map;
      }  public void destroy()
      {
          _caucho_isDead = true;
          super.destroy();
      }  public void init(com.caucho.java.LineMap lineMap,
                       com.caucho.vfs.Path appDir)
        throws javax.servlet.ServletException
      {
        com.caucho.vfs.Path resinHome = com.caucho.util.CauchoSystem.getResinHome();
        com.caucho.vfs.MergePath mergePath = new com.caucho.vfs.MergePath();
        mergePath.addMergePath(appDir);
        mergePath.addMergePath(resinHome);
        com.caucho.loader.DynamicClassLoader loader;
        loader = (com.caucho.loader.DynamicClassLoader) getClass().getClassLoader();
        String resourcePath = loader.getResourcePathSpecificFirst();
        mergePath.addClassPath(resourcePath);
        _caucho_line_map = new com.caucho.java.LineMap("_index1__jsp.java", "foo");
        _caucho_line_map.add("/subpath1/index1.jsp", 20, 13);
        _caucho_line_map.add(1, 28);
        _caucho_line_map.add(1, 28);
        _caucho_line_map.add(12, 31);
        _caucho_line_map.add(12, 31);
        _caucho_line_map.add(13, 33);
        _caucho_line_map.add(13, 33);
        _caucho_line_map.add(14, 35);
        _caucho_line_map.add(14, 35);
        _caucho_line_map.add(20, 37);
        _caucho_line_map.add(21, 38);
        _caucho_line_map.add(21, 39);
        _caucho_line_map.add(21, 40);
        _caucho_line_map.add(22, 41);
        _caucho_line_map.add(27, 43);
        _caucho_line_map.add(27, 43);
        _caucho_line_map.add(28, 45);
        _caucho_line_map.add(28, 45);
        _caucho_line_map.add(28, 46);
        _caucho_line_map.add(28, 47);
        _caucho_line_map.add(29, 48);
        _caucho_line_map.add(34, 50);
        _caucho_line_map.add(34, 50);
        _caucho_line_map.add(39, 52);
        _caucho_line_map.add(39, 53);
        _caucho_line_map.add(42, 54);
        _caucho_line_map.add(42, 54);
        com.caucho.vfs.Depend depend;
        depend = new com.caucho.vfs.Depend(mergePath.lookup(".//c:/resin/webapps/test2/subpath1/index1.jsp"), "ZuLzbop0USGXdISiNaF9Dg==", false);
        _caucho_depends.add(depend);
      } .....
      

  13.   

    老兄,进步真不少呀 :)
    小弟跟着你学习ing...