请教:jsp声明<%! %>的方法里可不可以连接数据库? 我在jsp<%! %>声明的方法里写了一个方法,在这个方法里连接了数据库,但是有了这个方法这个页面就打不开,始终是连接等待中,我把这个方法去掉就可以打开该页面,我把这个方法中的连接数据库的语句放到<% %>中就可以!为什么?请大家帮帮忙! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在JSP程序中声明合法的变量和方法 JSP 语法<%! declaration; [ declaration; ]+ ... %> 例子<%! int i = 0; %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %> 描述声明你将要在JSP程序中用到的变量和方法。你也必须这样做,不然会出错. 你可以一次性声明多个变量和方法,只要以";"结尾就行,当然这些声明在Java中要是合法的。 当你声明方法或变量时,请注意以下的一些规则: 声明必须以";"结尾(Scriptlet有同样的规则,但是 表达式就不同了). 你可以直接使用在<% @ page %>中被包含进来的已经声明的变量和方法,不需要对它们重新进行声明. 一个声明仅在一个页面中有效。如果你想每个页面都用到一些声明,最好把它们写成一个单独的文件,然后用<%@ include %>或<jsp:include >元素包含进来。 简单点:<%! %>这里是方法的声明;<%%>这里是方法的执行 当然可以!不过你要注意:那里是申明成员变量和成员方法的地方。其实你写在 <%%>里的和<%%>外的 代码,都被自动编译到public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException方法中。而写在 <%! %> 中的东西则不在上面的方法中。把连接数据库需要的信息用参数的方法传进去,一样好用。 <% %>写方法不是很好吗,连数据库当然没问题<%! %>就不行了吧 可以,但不好的做法可以把这些使用Javabean封装,然后在jsp中调用(如果没有使用什么框架的话) <%!int i = 100;private String getString(){ return "Hello!";}%> 那么可以 <%int j = this.i;String s = this.getString();%>在<%! %> 中不但可以申明成员变量,还可以申明成员方法,也可以定义内部类!记住,jsp是servlet,而servlet和普通的JavaBean没有区别! 当然,需要说明的是,在<%! %>里面做过头了就不好了。jsp被部分人说不好,就是因为jsp很强大,导致很多初学者都走错路:在jsp里面大做文章,很少写servlet和bean,结果不好维护。象连接数据库啊,定义类啊,虽然在jsp内部可以做到,但实在不提倡。 那是你的方法可能有问题。还是查查代码是否有问题。另外,虽然楼上说servlet和普通的JavaBean没有区别,但是为了维护,还是习惯于用SERVLET作控制调转用,而真正的业务逻辑封装在javabean中。 可以,不过这么干不推荐,这个变量对于所有的用户来说只有一份,如<%!int i = 0;%>然后<%=i++%>会发现每个用户访问时都会不同。如果把连接放在此处,那么这个连接的存活期是从第一次访问页面到页面重载。写在这儿,你何时关闭连接?数据库连接一般是操作时取得一个,用完后马上关闭 推测是你的代码里有属性或函数外的代码,所以出错了。HAHAHO 首先感谢大家的回贴:由于原代码很长,所以我这里搞了一简短的测试页面代码如下:<%@ 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();%> 这样的代码当然编译都通不过!<%!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 连接数据的声明我是放在conn.jsp里的呀,下面我不是粘贴了conn.jsp的代码的吗 把conn.jsp的声明干掉在调用页面声明就可以了 你把你的联接数据库的方法写到<%! %>之间,在<%! %>里面写的方法是在toGet()之外,也就是说,只要有人调用这个servlet就要执行一次数据库联接,所以你这么写是不对的。 QWERT520(别来无恙) 谢谢了,按你说的那样确实可以,但是为什么申明在别的地方就不行了呢,是不是<%! %>中定义的方法不能引用在别的地方如<% %>中定义的变量呢! 终于知道了,<% %>中定义的是本地变量是不能在<%! %>中定义的方法中使用的!我想这才是问题最终的答案! 用struts2出现的一点问题 如何做到只输入一次密码 Spring 2.x + XFire 集成问题求救.. 把“每条新闻”当作一条记录,数据库怎么设置实现那? 急需JExcelApi包 那位大哥,用过FCKeditor resin热部署的问题 一个完整的JSP服务器需要装什么组件?请大家帮帮我 jsp中request.QueryString()的用法?急问!!!!!!! iis+resin如何配置servlet呢?我把我的servlet放到classpath里就是访问不到呢。 下载.txt文件 页面提交以后,显示的是页面源码?
<%! declaration; [ declaration; ]+ ... %>
例子
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
描述
声明你将要在JSP程序中用到的变量和方法。你也必须这样做,不然会出错. 你可以一次性声明多个变量和方法,只要以";"结尾就行,当然这些声明在Java中要是合法的。 当你声明方法或变量时,请注意以下的一些规则: 声明必须以";"结尾(Scriptlet有同样的规则,但是 表达式就不同了).
你可以直接使用在<% @ page %>中被包含进来的已经声明的变量和方法,不需要对它们重新进行声明.
一个声明仅在一个页面中有效。如果你想每个页面都用到一些声明,最好把它们写成一个单独的文件,然后用<%@ include %>或<jsp:include >元素包含进来。
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException
方法中。而写在 <%! %> 中的东西则不在上面的方法中。把连接数据库需要的信息用参数的方法传进去,一样好用。
<%! %>就不行了吧
可以把这些使用Javabean封装,然后在jsp中调用(如果没有使用什么框架的话)
int i = 100;
private String getString()
{
return "Hello!";
}
%>
那么可以
<%
int j = this.i;
String s = this.getString();
%>在<%! %> 中不但可以申明成员变量,还可以申明成员方法,也可以定义内部类!
记住,jsp是servlet,而servlet和普通的JavaBean没有区别!
在jsp里面大做文章,很少写servlet和bean,结果不好维护。象连接数据库啊,定义类啊,虽然在jsp内部可以做到,但实在不提倡。
不推荐,
这个变量对于所有的用户来说只有一份,
如
<%!
int i = 0;
%>
然后<%=i++%>会发现每个用户访问时都会不同。如果把连接放在此处,那么这个连接的存活期是从第一次访问页面到页面重载。
写在这儿,你何时关闭连接?
数据库连接一般是操作时取得一个,用完后马上关闭
<%@ 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();%>
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
在调用页面声明就可以了
按你说的那样确实可以,但是为什么申明在别的地方就不行了呢,是不是<%! %>中定义的方法不能引用在别的地方如<% %>中定义的变量呢!