我用structs2和hibernate3写的小程序总是出错!
  
  我快崩溃来了,都不知道哪出错了,大家帮帮我吧!
  这个程序就只有两个jsp页面,一个是添加书名到数据库中,一个是查看书名。   我把源程序放上来了,大家一定要帮我看看啊!   我急等!index.jsp
<%@ page language="java" contentType="text/html; charset=GB2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<body>
<center>
输入要添加的书名:
<s:form action="add.action">
<s:textfield name="bookname" />
<s:submit value="确定" />
</s:form>
</center>
</body>
</html>
success.jsp<%@ page language="java" contentType="text/html; charset=GB2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<body>
<center>
已插入书名列表:
<br>
<table border="1">
<s:iterator value="list">
<tr>
<td>
<s:property value="bookname" />
</td>
</tr>
</s:iterator>
</table>
</center>
</body>
</html>然后是 java代码    文件夹的目录结构是:

解决方案 »

  1.   

    BookAction.java
    package sunyang.action;import java.util.List;import sunyang.domain.Book;
    import sunyang.service.BookService;
    import sunyang.service.BookServiceHibernateImpl;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")
    public class BookAction extends ActionSupport {
    private BookService service;
    private String bookname;
    private List list; // 省略对应bookname和list的getter和setter public BookAction() {
    service = new BookServiceHibernateImpl();
    } public String addBook() {
    Book book = new Book();
    book.setBookname(bookname);
    System.out.println(bookname);
    service.add(book);

    return SUCCESS;
    } public String ListBook() {
    List l = service.find();
    setList(l);
    return SUCCESS;
    } public String getBookname() {
    return bookname;
    } public void setBookname(String bookname) {
    this.bookname = bookname;
    } public List getList() {
    return list;
    } public void setList(List list) {
    this.list = list;
    }
    }Book.javapackage sunyang.domain;public class Book { private Integer id;
    private String bookname; public Book() {
    } public Book(Integer id) {
    this.id = id;
    } public Book(Integer id, String bookname) {
    this.id = id;
    this.bookname = bookname;
    } public Integer getId() {
    return this.id;
    } public void setId(Integer id) {
    this.id = id;
    } public String getBookname() {
    return this.bookname;
    } public void setBookname(String bookname) {
    this.bookname = bookname;
    }}Book.hbm.xml<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>
    <class name="sunyang.domain.Book" table="book" catalog="book">
    <id name="id" type="java.lang.Integer">
    <column name="id" />
    <generator class="native" />
    </id>
    <property name="bookname" type="java.lang.String">
    <column name="bookname" length="45" />
    </property>
    </class>
    </hibernate-mapping>BookService.javapackage sunyang.service;import java.util.List;import sunyang.domain.Book;public interface BookService {
    // 插入信息操作
    public void add(Book book); // 查询所有信息操作
    public List find();
    }BookServiceHibernateImpl.javapackage sunyang.service;import java.util.List;import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;import sunyang.domain.Book;public class BookServiceHibernateImpl implements BookService {
    //实例化Book对象的session工厂,以便调用Hibernate接口
    public static SessionFactory sessionFactory;
    static {
    try {
    Configuration config = new Configuration();
    config.addClass(Book.class);
    sessionFactory = config.buildSessionFactory();
    } catch (Exception e) {
    e.printStackTrace();
    }
    } public void add(Book book) {
    Session session = sessionFactory.openSession();
    //声明并管理事务
    Transaction tx = null;
    try {
    tx = session.beginTransaction();
    session.saveOrUpdate(book);
    tx.commit();
    } catch (Exception e) {
    if (tx != null) {
    tx.rollback();
    }
    } finally {
    session.close();
    } } public List find() {
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
    tx = session.beginTransaction();
    Query query = session.createQuery("from Book");
    List list = query.list();
    tx.commit();
    return list;
    } catch (Exception e) {
    if (tx != null) {
    tx.rollback();
    }
    } finally {
    session.close();
    }
    return null;
    }}
      

  2.   

    这个是hibernate.cfg.xml
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration>
    <session-factory >
    <property name="show_sql">true</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost/book</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver  </property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">admin</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <mapping resource="sunyang/domain/Book.hbm.xml"/>

    </session-factory>
    </hibernate-configuration>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.i18n.encoding" value="GBK" />
    <package name="default" extends="struts-default">
    <action name="add" class="sunyang.action.BookAction" method="addBook">
    <result type="chain">list</result>
    </action>
    <action name="list" class="sunyang.action.BookAction" method="ListBook">
    <result>/success.jsp</result>
    </action> 
    </package>
    </struts>
      

  3.   

     当提交第一个页面后 出现的错误信息java.lang.NullPointerException
    sunyang.service.BookServiceHibernateImpl.add(BookServiceHibernateImpl.java:27)
    sunyang.action.BookAction.addBook(BookAction.java:27)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
    note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.
      

  4.   

     try {
                Configuration config = new Configuration();
                config.addClass(Book.class);
                sessionFactory = config.buildSessionFactory();
            } catch (Exception e) {
                e.printStackTrace();
            }
    这里的问题   Configuration config = new Configuration();
                config.configure("hibernate配置文件位置");
                config.addClass(Book.class);
      

  5.   

    这个hibernate配置文件位置怎么写啊?
      

  6.   

    楼主,建议你看一下BookServiceHibernateImpl.java:27 ,调试看一下到底是什么抛空指针异常
      

  7.   

    session这个地方为空,这个congfig不能通过new得来的 要通过加载文件hibernate文件后获得呀
      

  8.   

     public String addBook() {
            Book book = new Book();
            book.setBookname(bookname);        System.out.println(bookname);
            service.add(book);
            
            return SUCCESS;
        }
    应该是:
     public String addBook() {
            Book book = new Book();
            book.setBookname(this.getBookname());
            System.out.println(bookname);
            service.add(book);
            
            return SUCCESS;
        }