本人JSP初学者,最近在做一个小课题,主要采用Struts+SQL2000实现。
由于初学,所以希望循序渐进,暂时先实现注册功能再做后面的。我个人的基本思路是:
Register.java类,用于接收用户注册的基本信息。
DBConnection.java类,用于数据库链接和对数据库数据的操作(插入、删除等)。
RegisteAction.java类,业务处理,通过实例化Register和DBConnection对象调用各自的方法来实现业务处理。
index.jsp,注册页面。
目前类、web.xml、struts.xml都写好了(当然不一定都合理和正确哈!!),但在注册时无法将数据插入数据
库,在这过程中也出现了很多其他问题,不过最在主要的问题应该就是传值没成功(个人觉得哈),Tomcat老
提示“空指针异常”。
下面贴上详细代码:希望大家帮我看看,指点、指点,若有不合理或错误的地方,希望大家不要喷我哈。Register.java类:
package ntss.User;import java.io.Serializable;public class Register implements Serializable{
private long id;     //用户编号(学号或者教师号)
private String name; //用户姓名
private String sex;  //用户密码
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex =  sex;
}}DBConnection.java类:package ntss.Tools;import java.sql.Connection;          //表示连接到某个数据库的连接
import java.sql.DriverManager;      //用来获取数据库连接
import java.sql.PreparedStatement; //用来执行SQL语句
import java.sql.ResultSet;        //封装查询类结果
import java.sql.SQLException;    //异常处理类public class DBConnection {
private final String dBDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; //连接SQL数据库的方法(驱动)
private final String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=NTSSystem";
private final String userName = "sa";
private final String password = "test123";
public Connection conn = null;
public PreparedStatement pstmt = null;//用于执行带或不带IN参数(?)的预编译SQL语句  ###### 公有私有??
public ResultSet rs = null;   //保存SQL语句执行结果(结果集)  ###### 公有私有??
  
   //*****加载数据库驱动
  public DBConnection() {
   try {
     Class.forName(dBDriver).newInstance();
   }
   //加载失败,抛出异常
   catch (Exception e) {
     System.out.println("数据库加载失败!");
   }
}
 
  //*****创建数据库连接
public Connection GetConnection(){
try {
conn=DriverManager.getConnection(url,userName,password);
} catch (SQLException e) {
System.out.println("创建数据库连接失败!");
conn = null;
e.printStackTrace();
}
return conn;
}

  /******
***<1、>数据库操作:插入、更新、删除(不带参数IN)。
*** executeUpdate(String sql) 执行给定的SQL语句,该语句可能为:Insert、
*** Update、Delete语句,或者不还回任何内容的SQL语句。*/
  public boolean ExecUpdate(String sql) {
  
    if (conn == null) {
      GetConnection();
    }
    try {
     // pstmt = conn.prepareStatement(sql);  //此处执行的是不带参数IN的SQL语句
      pstmt.executeUpdate(sql);
    //  System.out.println("操作成功,所影响的记录数为:" + String.valueOf(iCount));
    }
    catch (Exception e) {
     e.printStackTrace();
      System.out.println(e.getMessage());
      System.out.println("executeUpdater()函数执行失败!<<**public boolean ExecUpdate(String sql)**>>");
    }
    return true;
  }
 
  /*******
     ***<2、>数据库操作:查询(不带参数IN)。 
     ***executeQuery(String sql)执行给定的SQL语句,该语句还回单个ResultSet对象。
     */
  public ResultSet ExecQuery(String sql) {
    try {
      if (conn == null) {
        GetConnection();
      }
      pstmt = conn.prepareStatement(sql);
      try {
        rs = pstmt.executeQuery(sql);
      }
      catch (SQLException e) {
        System.out.println(e.getMessage());
        return null;
      }
    }
    catch (SQLException e) {
      System.out.println(e.getMessage());
      System.out.println("executeQuery()函数执行失败!");
      return null;
    }
    return rs; // 还回RS记录集。
  }
  
   /******
       ***<3、>数据库操作:查询、插入、更新、删除(带参数IN)。
       */ 
  public void DoPstmt(String sql,Object[] params){
  if(sql != null && !sql.equals("")){
  if(params == null)
  params = new Object[0];
  GetConnection();  //调用gerConnection()方法获取数据库连接
  if(conn != null){
  try{
  pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,
  ResultSet.CONCUR_READ_ONLY);
  for(int i = 0; i < params.length; i++){
  pstmt.setObject(i+1, params[i]);
  }
  pstmt.execute();            //执行SQL语句
  }catch(SQLException e){
  System.out.println("doPstmt()函数出错!");
  e.printStackTrace();        //输出错误信息
  }
  }
  }
  }
  
 
   /******
   ***关闭数据库,释放连接。*/
  public void Close(){
  try{
  if(rs!=null)
  rs.close();
  }catch (SQLException e){
 System.out.println("关闭Rs对象失败!");
     e.printStackTrace();
}
  try{
if(pstmt!=null)
pstmt.close();
  }catch(SQLException e){
System.out.println("关闭Pstmt对象失败!");
e.printStackTrace();
}
  try{
if(conn!=null)
conn.close();
  }catch(SQLException e){
System.out.println("关闭Conn对象失败!");
e.printStackTrace();
}
}
}RegisterAction类:package ntss.Action;import ntss.Tools.DBConnection;
import ntss.User.Register;import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
public Register register;              //定义注册对象
public Register getRegister(){
return register;
}
public void setRegister(Register register){
this.register = register;
}
public DBConnection dbConnection; //定义数据库连接对象

public RegisterAction(){
dbConnection = new DBConnection(); //初始化数据库连接对象
}
public String execute(Register register) throws Exception{
long id = register.getId();
String name = register.getName();
String sex = register.getSex();
String sql = "insert into reg_user([U_Id],[U_Name],[U_Sex]) values('"+id+"','"+name+"','"+sex+"')";
try{
dbConnection.ExecUpdate(sql);
System.out.print("+name+");
}finally{
dbConnection.Close();
}
return null;

}
}另外web.xml、struts.xml等下附上,还有本人对struts的标签库不了解哈,希望大家尽量不要牵扯到这个东东。

解决方案 »

  1.   

    Web.xml<?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    </web-app>
    Struts.xml<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>
        
        <constant name="struts.enable.DynamicMethodInvocation" value="false" />
        <constant name="struts.devMode" value="false" />    <package name="default" extends="struts-default">
        <action name="register" class="ntss.Action.RegisterAction">
         <result name="ture">/index.jsp</result>
        </action>
        </package>
    </struts>
      

  2.   

    你先把你传过来的值全部输出来,看看到底有没有从页面传过来,还有你是哪一行出现了问题要贴出来,这才好帮你找啊,最好是在你的项目当中运用log4j写点日志,更好定位问题所在...
    个人建议
      

  3.   

    (⊙o⊙)…。。是啊 我主要想到、后面其他功能也要用到DBConnection.jva类,所以就把后面要用的方法都写出来占位了,在这里注册功能只用第二个 ExecUpdate(String sql) 方法就行了,其实用其他两个也可以,只是还要处理,后面的两个方法还没完全实现。
      

  4.   

    空指针,首先检查你的连接到底有没有取到,然后看action里面需要的值有没有取到。设个断点跟踪一下。如果不会debug,那就System.out.println打印调试信息。
      

  5.   

    我的哥啊,你吓死我了,都整上来的,你还不如把source code 给我呢
      

  6.   

    看你数据库用的是Sqlserver2000,这个是需要打补丁的,要是没打补丁,就没法连接数据库了
      

  7.   

    你用的是这个ExecUpdate方法
    但是方法里怎么能把这句给注释了呢
    // pstmt = conn.prepareStatement(sql);  //此处执行的是不带参数IN的SQL语句
      

  8.   

    调试!!! 看conn 是不是为null.sqlseriver2000要打补丁的.
      

  9.   

    额SP4补丁嘛?打了的。。还是没想通问题在哪里有谁愿意加我QQ花10分钟帮我仔细分析分析么?