<%@ page import="java.sql.*"%>
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>view topic</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head><body>
<%
java.sql.Connection sqlConn;
java.sql.ResultSet sqlRst;
java.sql.Statement sqlStmt;
String Topic_name=request.getParameter("Topic_name");
Topic_name = new String(Topic_name.getBytes("ISO8859_1"), "GBK");
String TID=request.getParameter("TID");
//得到论题名字以及此论题文章在数据库中的编号
if((Topic_name==null)&&(TID==null))
//先排除为空的情况
out.println("参数错误!");
 if(TID==null)
//TID号为空,说明是显示论题的首篇文章,也可能是从后篇中单击首篇过来的
{
try
{
        Class.forName("com.inet.tds.TdsDriver");
        sqlConn= java.sql.DriverManager.getConnection("jdbc:inetdae7://localhost:1113/user_db?user=rain&password=");
     //连接数据库
sqlStmt=sqlConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
 sqlRst=sqlStmt.executeQuery("select * from forum_topic where Topic_name=\'"+Topic_name+"\'and Is_first=1");
 //查询到此文章的记录
 if(sqlRst.next())
 {
 //此文章存在,则读取出相关信息
 int Topic_id=sqlRst.getInt("TID");
 //得到文章在库中的ID
 Topic_name=sqlRst.getString("Topic_name");
 String UName=sqlRst.getString("UName");
 String Email=sqlRst.getString("Email");
 String Is_first=sqlRst.getString("Is_first");
 int First_id=sqlRst.getInt("First_id");
 int Previous=sqlRst.getInt("Previous");
 Timestamp Time=sqlRst.getTimestamp("Time");
 Date date_time=new  Date(Time.getTime());
 Time time_time=new  Time(Time.getTime());
 //从Timestamp对象中提取日期的日期部分和时间部分去掉末尾的毫秒部分
 int Total_reply=sqlRst.getInt("Total_reply");
 String Topic_context=sqlRst.getString("Topic_context");
 sqlRst.close();
 %>
 <table width="90%" align="center" border="1" cellspacing="0" cellpadding="0" bordercolordark="#000000" bordercolorlight="#88a6dd">
 <!--定制输出表格的样式-->
 <tr>
 <td bgcolor="#88a6dd"><font size="2">主题:</font></td>
 <td colspan=3><%=Topic_name%></td></tr>
 <tr><td ><font size="2">作者:</font></td>
 <td><%=UName%></td></tr>
 <tr>
 <td bgcolor="88a6dd"><font size=2>Email:</font></td>
 <td><%
 out.println("<a href=mailto:"+Email+">"+Email+"</a>");
 %>
 </td></tr>
 <tr><td ><font size="2">发表时间:</font></td>
 <td colspan="3"><%=date_time%>  <%=time_time%></td></tr>
 <tr><td bgcolor="#88a6dd"><font size="2">回复:</font> </td>
 <td colspan="3"><%=Total_reply%></td></tr>
 <tr><td ><font size="2">内容:</font></td><td colspan="3"><%=Topic_context%></td></tr>
 </table>
 
 <p align="center">
 【<a href="forum_action.jsp">首页</a>】
 【首篇】
 【上篇】
 <!--因为是首篇,所以就不需要设定首篇和上篇的链接-->
 <%
   if(Total_reply>0)
   //假如已经由回复的文章
   {
    sqlRst=sqlStmt.executeQuery("select TID from forum_topic where previous=\'"+Topic_id+"\'");
//查找到下一篇回复文章的标号
if(sqlRst.next())
{
int temp=sqlRst.getInt("TID");
out.println("[<a href=\"view_topic.jsp?TID="+temp+"\">下一篇</a>]");
//查找到,则输出下一篇的链接,把下一篇的编号传给接受页面
sqlRst.close();
sqlConn.close();
}
else
{
out.println("【下一篇】");
sqlRst.close();
sqlConn.close();
}
}
else out.println("【下一篇】");
//没查到或它还没有回复文章,则直接输出下一篇文字,没有链接
%>
[<a href="reply_topic.jsp?Topic_name=<%=Topic_name%>">回复</a>]
<!--设定回复此论题的链接-->
            [<a href="new_topic.htm">发表新主题</a>]
<!--设定发表新文章的链接-->         
 </p>
 <%
 }
 }catch(Exception e)
 {}
 }
 else
 {
 try
 //此为TID不为空的情况,它用于处理一个论题中文章的上一篇和下一篇的情况
 {
 int int_id=Integer.valueOf(TID).intValue();
 Class.forName("com.inet.tds.TdsDriver");
         sqlConn= java.sql.DriverManager.getConnection("jdbc:inetdae7://localhost:1113/user_db?user=rain&password=");
     //连接数据库
sqlStmt=sqlConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
 sqlRst=sqlStmt.executeQuery("select * from forum_topic where TID=\'"+int_id+"\'");
 //通过TID号查询此文章的记录
 if(sqlRst.next())
 {
 //下面为如果此文章存在的情况,得到有关此文章的所有信息
int Topic_id=sqlRst.getInt("TID");
 Topic_name=sqlRst.getString("Topic_name");
 String UName=sqlRst.getString("UName");
 String Email=sqlRst.getString("Email");
 String Is_first=sqlRst.getString("Is_first");
 String First_id=sqlRst.getString("First_id");
 int Previous=sqlRst.getInt("Previous");
 Timestamp Time=sqlRst.getTimestamp("Time");
 Date date_time=new Date(Time.getTime());
 Time time_time=new Time(Time.getTime());
 String Total_reply=sqlRst.getString("Total_reply");
 String Topic_context=sqlRst.getString("Topic_context");
 sqlRst.close();
 %>
 <table width="90%" align="center" border="1" cellspacing="0" cellpadding="0" bordercolordark="#000000" bordercolorlight="#88a6dd">
 <!--定制输出同样的表格-->
 <tr>
 <td bgcolor="#88a6dd"><font size="2">主题:</font></td>
 <td colspan=3><%=Topic_name%></td></tr>
 <tr><td ><font size="2">作者:</font></td>
 <td><%=UName%></td></tr>
 <tr>
 <td bgcolor="88a6dd"><font size=2>Email:</font></td>
 <td><%
 out.println("<a href=mailto:"+Email+">"+Email+"</a>");
 %>
 </td></tr>
 <tr><td ><font size="2">发表时间:</font></td>
 <td colspan="3"><%=date_time%>  <%=time_time%></td></tr>
 <tr><td bgcolor="#88a6dd"><font size="2">回复:</font> </td>
 <td colspan="3"><%=Total_reply%></td></tr>
 <tr><td ><font size="2">内容:</font></td><td colspan="3"><%=Topic_context%></td></tr>
 </table>
 <p align="center">
 【<a href="forum_action.jsp">首页</a>】
 <%
 if(Previous!=0)
 {
 //假如此篇不是首篇的情况,因为发表新文章时设定一篇文章的Previous为0
 %>
 [<a href="view_topic.jsp?Topic_name=<%=Topic_name%>">首篇</a>]
 <%
 }
 else out.println("【首篇】");
 //否则输出文字,不是链接
 if(Previous!=0)
 //如果不是首篇,输出上一篇的链接,此种情况和首页链接一样
 {
 out.println("[<a href=\"view_topic.jsp?TID="+Previous+"\">上一篇</a>]");
 }
 else out.println("【上一篇】");
 %>
 <%
 sqlRst=sqlStmt.executeQuery("select TID from forum_topic where Previous=\'"+Topic_id+"\'");
 //查询它下一篇文章的编号
 if(sqlRst.next())
 //如果存在
 {
 int temp=sqlRst.getInt("TID");
 out.println("[<a href=\"view_topic.jsp?TID="+temp+"\">下一篇</a>]");
 //设定下一篇的链接
 sqlRst.close();
 sqlConn.close();
 }
 else
 {
 out.println("【下一篇】");
 sqlRst.close();
 sqlConn.close();
 }
 %>
 [<a href="reply_topic.jsp?Topic_name=<%=Topic_name%>">回复</a>]
 <!--设定回复文章的链接-->
 [<a href="new_topic.htm">发表新文章</a>]
 <!--设定发表新文章的链接-->
 </p>
 <%
 }
 }
 catch(Exception e)
 {}
 }
 %>
</body>
</html>
显示帖子的代码

解决方案 »

  1.   

    java.lang.NullPointerException
    at org.apache.jsp.view_0005ftopic$jsp._jspService(view_0005ftopic$jsp.java:68)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:475)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1017)
    at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1115)
    at java.lang.Thread.run(Thread.java:536)我看不懂
      

  2.   

    <%@ page contentType="text/html;charset=gb2312"%>===>GBK
    Topic_name = new String(Topic_name.getBytes("ISO8859_1"), "GBK");
    这两个不一致呀?先改成一致的看看
      

  3.   

    //得到论题名字以及此论题文章在数据库中的编号
    if((Topic_name==null)&&(TID==null))
    //先排除为空的情况
    out.println("参数错误!");
     if(TID==null)等于null的时候,直接 out.close()算了。别弄那么长的if-else语句错误的原因,还是因为没有完全排除为空的情况,检查检查!
      

  4.   

    首先编码转换有问题吗?自己写个简单的页面试试--我认为没错然后,写个简单的页面来进行操作。或者一个页面就是用来显示,一个就是用来更新数据库java.lang.NullPointerException:错误原因就是有变量没有初始化成功,自己找找吧
      

  5.   

    判断你的变量为空时的操作

    if(name != null && name.equals("add"){
    ...
    }数据格式主要是防止用户非法输入不正确的参数
    可用可不用写入写出时数据库时做转换操作当前网页的编码方式与你数据的编码方式
    有的appserver你不做操作或做部分也可以的
    但有的不行,
    如果写入写出都做了
    在移植平中时database,appserver就不会出现问题个人观点