我在jsp<%! %>声明的方法里写了一个方法,在这个方法里连接了数据库,但是有了这个方法这个页面就打不开,始终是连接等待中,我把这个方法去掉就可以打开该页面,我把这个方法中的连接数据库的语句放到<% %>中就可以!为什么?
请大家帮帮忙!

解决方案 »

  1.   

    在JSP程序中声明合法的变量和方法 JSP 语法
    <%! declaration; [ declaration; ]+ ... %> 
    例子
    <%! int i = 0; %> 
    <%! int a, b, c; %> 
    <%! Circle a = new Circle(2.0); %> 
    描述
    声明你将要在JSP程序中用到的变量和方法。你也必须这样做,不然会出错. 你可以一次性声明多个变量和方法,只要以";"结尾就行,当然这些声明在Java中要是合法的。 当你声明方法或变量时,请注意以下的一些规则: 声明必须以";"结尾(Scriptlet有同样的规则,但是 表达式就不同了). 
    你可以直接使用在<% @ page %>中被包含进来的已经声明的变量和方法,不需要对它们重新进行声明. 
    一个声明仅在一个页面中有效。如果你想每个页面都用到一些声明,最好把它们写成一个单独的文件,然后用<%@ include %>或<jsp:include >元素包含进来。
      

  2.   

    简单点:<%! %>这里是方法的声明;<%%>这里是方法的执行
      

  3.   

    当然可以!不过你要注意:那里是申明成员变量和成员方法的地方。其实你写在 <%%>里的和<%%>外的 代码,都被自动编译到
    public void _jspService(HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, ServletException
    方法中。而写在 <%! %> 中的东西则不在上面的方法中。把连接数据库需要的信息用参数的方法传进去,一样好用。
      

  4.   

    <% %>写方法不是很好吗,连数据库当然没问题
    <%! %>就不行了吧
      

  5.   

    可以,但不好的做法
    可以把这些使用Javabean封装,然后在jsp中调用(如果没有使用什么框架的话)
      

  6.   

    <%!
    int i = 100;
    private String getString()
    {
        return "Hello!";
    }
    %>
     
    那么可以 
    <%
    int j = this.i;
    String s = this.getString();
    %>在<%! %> 中不但可以申明成员变量,还可以申明成员方法,也可以定义内部类!
    记住,jsp是servlet,而servlet和普通的JavaBean没有区别!
      

  7.   

    当然,需要说明的是,在<%! %>里面做过头了就不好了。jsp被部分人说不好,就是因为jsp很强大,导致很多初学者都走错路:
    在jsp里面大做文章,很少写servlet和bean,结果不好维护。象连接数据库啊,定义类啊,虽然在jsp内部可以做到,但实在不提倡。
      

  8.   

    那是你的方法可能有问题。还是查查代码是否有问题。另外,虽然楼上说servlet和普通的JavaBean没有区别,但是为了维护,还是习惯于用SERVLET作控制调转用,而真正的业务逻辑封装在javabean中。
      

  9.   

    可以,不过这么干
    不推荐,
    这个变量对于所有的用户来说只有一份,

    <%!
    int i = 0;
    %>
    然后<%=i++%>会发现每个用户访问时都会不同。如果把连接放在此处,那么这个连接的存活期是从第一次访问页面到页面重载。
    写在这儿,你何时关闭连接?
    数据库连接一般是操作时取得一个,用完后马上关闭
      

  10.   

    推测是你的代码里有属性或函数外的代码,所以出错了。HAHAHO
      

  11.   

    首先感谢大家的回贴:由于原代码很长,所以我这里搞了一简短的测试页面代码如下:
    <%@ page contentType="text/html;charset=gb2312" %>
    <%@ include file="../conn/conn.jsp" %>
    <html>
    <head>
    <title>这是一个测试</title>
    </head>
    <body>
    <%!
    String str=null; 
    String connectdb()
    {
    String sql1="select * from message where id='1'"; stmt=con.createStatement();
    rs=stmt.executeQuery(sql1);
    while(rs.next())
    {
    str=rs.getString("topic");

    }
    rs.close();
    stmt.close();
    con.close();
    return str;
    }%>
    <div align="center"><%=connectdb()%></div>
    </body>
    </html>
    这个页面不能打开一直是连接等待中
    下面是我把连接数据代码放到<%  %>中就能够打开!
    代码如下:
    <%@ page contentType="text/html;charset=gb2312" %>
    <%@ include file="../conn/conn.jsp" %>
    <html>
    <head>
    <title>这是一个测试</title>
    </head>
    <body>
    <%
    String str=null; 
    String sql1="select * from message where id='1'"; stmt=con.createStatement();
    rs=stmt.executeQuery(sql1);
    while(rs.next())
    {
    str=rs.getString("topic");

    }
    rs.close();
    stmt.close();
    con.close();
    out.print(str);
    %>
    <div align="center"><%=str%></div>
    </body>
    </html>
    其中conn.jsp是
    <%@ page contentType="text/html;charset=gb2312" %>
    <link rel="stylesheet" href="../conn/laba.css" type="text/css">
    <%@ page import="java.io.*" %>
    <%@ page import="java.util.*" %>
    <%@ page import="java.sql.*" %>
    <%Connection con;
    Statement stmt;
    ResultSet rs;
    Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    con=java.sql.DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/OA?user=root&password=12345678&useUnicode=true&characterEncoding=gb2312");
    /*DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    String dbUrl="jdbc:mysql://localhost:3306/OA?useUnicode=true&characterEncoding=GB2312";
    String dbUser="root";
    String dbPwd="12345678";
    con=java.sql.DriverManager.getConnection(dbUrl,dbUser,dbPwd);*/stmt=con.createStatement();%>
      

  12.   

    这样的代码当然编译都通不过!<%!
    String str=null; 
    String connectdb()
    {
    String sql1="select * from message where id='1'";stmt=con.createStatement();//con 没有申明,stmt也还没有申明
    rs=stmt.executeQuery(sql1);//rs 也没有申明
    while(rs.next())
    {
    str=rs.getString("topic");}
    rs.close();
    stmt.close();
    con.close();
    return str;
    }
    %>那些没有申明的东西你就用参数传进去吧!
    String connectdb(。这里传参数!)还有,不要发重复帖子,除了浪费分数没什么好处。
    http://community.csdn.net/Expert/topic/4459/4459852.xml?temp=.1322748
      

  13.   

    连接数据的声明我是放在conn.jsp里的呀,下面我不是粘贴了conn.jsp的代码的吗
      

  14.   

    把conn.jsp的声明干掉
    在调用页面声明就可以了
      

  15.   

    你把你的联接数据库的方法写到<%!   %>之间,在<%!   %>里面写的方法是在toGet()之外,也就是说,只要有人调用这个servlet就要执行一次数据库联接,所以你这么写是不对的。
      

  16.   

    QWERT520(别来无恙) 谢谢了,
    按你说的那样确实可以,但是为什么申明在别的地方就不行了呢,是不是<%! %>中定义的方法不能引用在别的地方如<% %>中定义的变量呢!
      

  17.   

    终于知道了,<% %>中定义的是本地变量是不能在<%! %>中定义的方法中使用的!我想这才是问题最终的答案!