向大家请教一个问题:
Jsp中 <%!         %>与 <%          %>差别在哪儿?
书上说<%! %>里放的是声明,<%   %>里放的是java片断,那我想问问,<%! %>中声明的,在,<%   %>中能用吗?
我写了如下代码:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*,java.io.*,java.util.*" %>
<html>
<head><title></title></head>
<body>
<%
 String user = request.getParameter("n");
%>
<h2>Welcome!<%=user%><h2>
<center><h2>用户信息表<h2></center>
<hr><br>
<%
Connection c = null;
PreparedStatement pst = null;
ResultSet rs = null;
int pageNow = 1;
int pageCount = 0;
int pageSize = 3;
int rowCount = 0; String pagenow = request.getParameter("pagenow");
if(pagenow != null)
{
pageNow = Integer.parseInt(pagenow);
}
Class.forName("oracle.jdbc.driver.OracleDriver");
c = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:MYDB","xiaoming","a123");
pst = c.prepareStatement("select count(*) from test");
rs = pst.executeQuery();

if(rs.next())
{
rowCount = rs.getInt(1);
}

pageCount = (rowCount%pageSize==0)?(rowCount/pageSize):(rowCount/pageSize+1);

pst = c.prepareStatement("select * from (select a1.*, rownum rn from (select * from test) a1 where rownum <= ?) where rn>?");
pst.setInt(1,pageSize*pageNow);
pst.setInt(2,pageSize*(pageNow-1));
rs = pst.executeQuery();
%>
<center><table border=1 width=300 height=100>
<tr><th>id</th><th>username</th><th>password</th><th>email</th><th>grade</th></tr>
<%
while(rs.next())
{%>

<tr>
<td><%=rs.getString(1)%></td>
<td><%=rs.getString(2)%></td>
<td><%=rs.getString(3)%></td>
<td><%=rs.getString(4)%></td>
<td><%=rs.getInt(5)%></td>
</tr>


 <%}%>
</table> <br>
<%
for(int j=1; j<=pageCount; j++)
{%>
<font size=3><a href=welcome.jsp?pagenow=<%=j%>&n=<%=user%>>[<%=j%>]</a></font>
<%}%>
</center>
<%
    
%>
<font size=3><a href="login.jsp" align="right">返回登录页面</a></font>
</body>
</html>红色标注部分,为什么用<%!  %>就会出现错误??哪位大侠帮忙解释一下,谢谢!

解决方案 »

  1.   

    带!号的是方法,可以调用但是编译的时候首先认得是没有!的。
    简单点说就是说<%!%>是子类,在父类里面可以调用,但是不可以直接认出来。
      

  2.   

    <%! %>是用于声明变量和方法
    <% %>Java中的代码片段
      

  3.   

    <%! %>中定义的变量为成员变量,你可以找到编译成java文件的jsp的源码可以看出<%! %>定义的与<% %>的区别
      

  4.   


    <%! %>中定义的变量为成员变量 
    红色错的部分就在于此
    如果你写成<%! %>这种形式,那么在jsp编译成java文件时,将在类的开头,
    String user = request.getParameter("n");
    而在那时request对象还不存,没有定义,所以你用不成request对象.
    而整个jsp页面从<html>...</html>这里面的内容,包括<%%>所写到的内容都会编译到下面的这个方法中,你可以清晰的看到此方法有一个 HttpServletRequest对象作为参数,所以<%%>中可以用request对象
    public void _jspService(HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, ServletException {
    ....
    }