请大家指教。

03-08-06 cute
在JSP页面中,进行声明变量。我发现s只初始化一次(就算关闭浏览器S的值还是存在),符合我的想法。

问题: s的值什么时候取消??

<!
String s=null;
>
<%
if(s==null)
s="ddddddddddddddd";
else
out.print("存在数据");
%>

robbin
2003-08-06 09:26
不要用 <! ...> 这个标记,这个标记声明的是静态变量。

raynix
2003-08-06 10:08
初始化当然只有一次了,顾名思义么,呵呵。

在<%! %>中定义的reference的生存期等同于此servlet/jsp本身,所以这个s要等到_jspDestroy()被调用才消失,一般来说,就是此app被关闭或reload之时。

<p>

"就算关闭浏览器S的值还是存在", 呵呵,服务器端的obj是生存在浏览器中么?

raynix
2003-08-06 10:14
> 不要用 <! ...> 这个标记,这个标记声明的是静态变量。

应该是“成员变量”吧?

robbin
2003-08-06 10:33
用了!以后,就声明了静态成员变量,相当于:

public static String s = null;

raynix
2003-08-06 10:55
不会吧,随便测试以下:

test.jsp:

<%!
String s = null;
%>

test_jsp.java:

public class test_jsp extends HttpJspBase {


String s = null;

...



<p>

服务器是jboss 3.2.1

mellon
2003-08-06 12:22
楼主写错了:

<! >

忘了写%号。

什么也没声明成。

如果写上百分号,是实例变量。

<%! %>

标识声明代码,可以声明方法也可以声明成员。

但static还是要手动指明的。

需要提醒的是,一旦声明了静态或非静态成员,就需要考虑线程安全的问题了。尤其是需要频繁读写的成员。

AreYouOK?
2003-08-06 12:33
应该是成员变量

看看JSP编译出来的servlet就知道了

不过servlet是单实例的,所以即使关闭浏览器,服务器端的servlet依然存在除非destory

这也是servelt要注意线程安全的原因

jsp

<%!int a;%>
<%="hello1"%>
<%
out.println("hello2");
%>
<p>

servlet

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;


public class test$jsp extends HttpJspBase {

    // begin [file="/test.jsp";from=(0,3);to=(0,9)]
        int a;
    // end

    static {
    }
    public test$jsp( ) {
    }

    private static boolean _jspx_inited = false;

    public final void _jspx_init() throws org.apache.jasper.runtime.JspException {
    }

    public void _jspService(HttpServletRequest request, HttpServletResponse  response)
        throws java.io.IOException, ServletException {

        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 == false) {
                synchronized (this) {
                    if (_jspx_inited == false) {
                        _jspx_init();
                        _jspx_inited = true;
                    }
                }
            }
            _jspxFactory = JspFactory.getDefaultFactory();
            response.setContentType("text/html;ISO-8859-1");
            pageContext = _jspxFactory.getPageContext(this, request, response,
            			"", true, 8192, true);

            application = pageContext.getServletContext();
            config = pageContext.getServletConfig();
            session = pageContext.getSession();
            out = pageContext.getOut();

            // HTML // begin [file="/test.jsp";from=(0,11);to=(1,0)]
                out.write("\r\n");

            // end
            // begin [file="/test.jsp";from=(1,3);to=(1,11)]
                out.print("hello1");
            // end
            // HTML // begin [file="/test.jsp";from=(1,13);to=(2,0)]
                out.write("\r\n");

            // end
            // begin [file="/test.jsp";from=(2,2);to=(4,0)]
                
                out.println("hello2");
            // end

        } catch (Throwable t) {
            if (out != null && out.getBufferSize() != 0)
                out.clearBuffer();
            if (pageContext != null) pageContext.handlePageException(t);
        } finally {
            if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
        }
    }
}


<p>

mellon
2003-08-06 13:35
建议看一看JSP规范和Servlet规范。

cute
2003-08-07 07:46
请问,JSP页面声明静态有什么不好之处。。。

mellon
2003-08-07 10:05
不论实例的还是静态的成员都要考虑线程安全问题。

最好还是算了。

对了,你是不是整个应用都用JSP,也就是说是所谓的Model1开发模式。

raynix
2003-08-07 11:47
> 请问,JSP页面声明静态有什么不好之处。。。

>

当然不好!

因为jsp说到底就是servlet,servlet一般是不应该定义为single-thread,那么servlet内的静态变量/成员实例就会被该servlet的多个实例间共享,数据冲突/丢失就在所难免了。

cute
2003-08-07 13:13
说道地。SERVLET 也是类。。。 默认是多线程的。。

我得 业务就是读数据没有其他的了。。。

我想声明STATIC 应该不会有其他的影响的了。。

但是有一个问题,<%!STRING S="ok"%> 这个变量所有用户共享。

提高了性能。就算关闭浏览器也不会消失。。可是却一直占用者内存。

爱。。个有千秋。。。怎么办呢。。

不吃羊肉
2003-08-07 13:55
扔到ServletContext里去

就成为对于整个Context都可见的全局对象

猜你喜欢