如何将Java对象从Servlet传递(正确)到JSP页面

时间:2011-01-11 14:34:18

标签: hibernate jsp orm servlets

我到处都是网络,我很少迷路,无法解决我的问题。

我正在使用Eclipse创建一个Web应用程序,在客户端使用JSP,在服务器端使用Servet / Hibernate。 我正在尝试将一个Object传递给一个servlet的JSP页面。

在servlet中:

Contact c = dao.getContact(dataID);

request.setAttribute("data", c);

getServletContext()
    .getRequestDispatcher("/"+url+"?id="+dataID).forward(request, response);

在JSP页面中:

Contact contact = (Contact)request.getAttribute("data");

联系人是一个ORM,其属性如“lastname”。

但我收到此错误消息:

GRAVE: "Servlet.service()" pour la servlet GetData a généré une exception
org.hibernate.HibernateException: No CurrentSessionContext configured!
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:683)
    at domain.DAOContact.getContact(DAOContact.java:39)
    at domain.GetData.doGet(GetData.java:27)

所以我试图找出原因,在某处我读到我需要在hibernate配置文件中将当前会话上下文设置为“thread”。但是当我这样做时,我得到了这样的信息:

GRAVE: Servlet.service() for servlet [GetData] in context with path [/CarnetContacts] threw exception [org.hibernate.LazyInitializationException: could not initialize proxy - no Session] with root cause
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    at domain.Contact_$$_javassist_1.getLastName(Contact_$$_javassist_1.java)

消息的第二行表明它与延迟加载有关,但是最后一行我显示当程序试图获取“lastname”属性时出现错误,该属性基本上是一个字符串,所以我不知道我认为这是“懒惰的”。

所以,如果有人能帮我找到解决方案,那就非常友好了。

dao方法的代码:

    public Contact getContact(int contactId){
        Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
        Transaction t = session.beginTransaction();
        t.begin();
        Contact contact =(Contact) session.load(Contact.class, new Integer(contactId));
        t.commit();
        return contact; 
    }

1 个答案:

答案 0 :(得分:2)

在这种情况下,您的具体问题是您使用的是Session.load()而不是Session.get()

load()会返回一个延迟初始化的代理,因此只应在特殊情况下使用,在大多数情况下,您需要使用get()

一般来说,除了这种特殊情况,视图层中延迟初始化的问题可以使用以下方法之一解决: