请大家指教。

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

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



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

不要用 <! ...> 这个标记,这个标记声明的是静态变量。

初始化当然只有一次了,顾名思义么,呵呵。


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

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

> 不要用 <! ...> 这个标记,这个标记声明的是静态变量。


应该是“成员变量”吧?

用了!以后,就声明了静态成员变量,相当于:

public static String s = null;

不会吧,随便测试以下:


test.jsp:

<%!
String s = null;
%>

test_jsp.java:

public class test_jsp extends HttpJspBase {


String s = null;

...



服务器是jboss 3.2.1

楼主写错了:
<! >
忘了写%号。
什么也没声明成。
如果写上百分号,是实例变量。
<%! %>
标识声明代码,可以声明方法也可以声明成员。
但static还是要手动指明的。
需要提醒的是,一旦声明了静态或非静态成员,就需要考虑线程安全的问题了。尤其是需要频繁读写的成员。

应该是成员变量

看看JSP编译出来的servlet就知道了
不过servlet是单实例的,所以即使关闭浏览器,服务器端的servlet依然存在除非destory
这也是servelt要注意线程安全的原因


jsp


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

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);
}
}
}


建议看一看JSP规范和Servlet规范。

请问,JSP页面声明静态有什么不好之处。。。

不论实例的还是静态的成员都要考虑线程安全问题。
最好还是算了。
对了,你是不是整个应用都用JSP,也就是说是所谓的Model1开发模式。

> 请问,JSP页面声明静态有什么不好之处。。。
>


当然不好!

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

说道地。SERVLET 也是类。。。 默认是多线程的。。

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

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


但是有一个问题,<%!STRING S="ok"%> 这个变量所有用户共享。
提高了性能。就算关闭浏览器也不会消失。。可是却一直占用者内存。
爱。。个有千秋。。。怎么办呢。。

扔到ServletContext里去
就成为对于整个Context都可见的全局对象