Ошибка с Hibernate + Facelet JSF Managed Bean - PullRequest
1 голос
/ 30 августа 2011

Я прочитал этот урок .Я пытаюсь, но я получаю ошибку.У нас есть Mysql и netbean 7.0.1.Таблица с именем: "customer", столбцы: "id int, имя varchar, адрес электронной почты varchar, описание varchar".Я использовал Hibernate для отображения таблицы.Это мой класс модели:

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import domain.Customer;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author xuanhung2401
 */
public class CustomerModel {

    Session session = null;

    public CustomerModel(){
        session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public List<Customer> getAllCustomer(int startId, int endId){
        List<Customer> list = null;
        try{
            session = HibernateUtil.getSessionFactory().getCurrentSession();
            Transaction ts = session.beginTransaction();
            Query query = session.createQuery("from Customer");
            list = (List<Customer>)query.list();
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
        return list;
    }

    public Customer getById(int id){
        Customer c = new Customer();
        try{
            Transaction ts = session.beginTransaction();
            Query query = session.createQuery("from Customer as c where c.id = "+id );
            c = (Customer)query.uniqueResult();
        }catch(Exception ex){
            ex.printStackTrace();

        }

        return c;
    }

    public boolean updateCustomer(Customer c){
        try{
            Transaction ts = session.beginTransaction();
            session.update(c);  
            ts.commit();
            return true;

        }catch(Exception ex){
            ex.printStackTrace();
            return false;
        }       
    }

    public boolean addCustomer(Customer c){
        try{
            Transaction ts = session.beginTransaction();
            session.save(c);            
            ts.commit();            
            return true;
        }catch(Exception ex){
            ex.printStackTrace();
            return false;
        }        
    }

    public boolean deleteCustomer(Customer c){
        try{
            Transaction ts = session.beginTransaction();
            session.delete(c);
            ts.commit();
            return true;
        }catch(Exception ex){
            ex.printStackTrace();
            return false;
        }
    }
}

Это мой контроллер:

   /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import domain.Customer;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.view.facelets.FaceletContext;
import model.CustomerModel;

/**
 *
 * @author xuanhung2401
 */
@ManagedBean
@SessionScoped
public class CustomerController {

    CustomerModel model;
    DataModel customers;
    Customer currentCustomer;
    /** Creates a new instance of CustomerController */
    public CustomerController() {
        model = new CustomerModel();
    }

    public DataModel getCustomers(){
        if (customers==null) {
            customers = new ListDataModel(model.getAllCustomer(1, 3));
        }
        return customers;
    }

    public void recreateModel(){
        customers = null;

    }


    public Customer getCurrentCustomer(){
        if (currentCustomer==null) {
            currentCustomer = new Customer();
        }
        return currentCustomer;
    }

    public String editCustomer(){
        int id = 0;        
        try {
            id = Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")) ;        
            currentCustomer = model.getById(id);
            if (currentCustomer!=null) {
                return "edit";
            }
        }catch(Exception ex){

        }                
        return "myTemplateClient";
    }
    public String editProcess(){  
        try{
            model.updateCustomer(currentCustomer);
            recreateModel();
        }catch(Exception ex){

        }        
        return "myTemplateClient";
    }

    public String addCustomer(){
        currentCustomer = new Customer();
        return "add";
    }

    public String addProcess(){   
        if (currentCustomer!=null) {
            model.addCustomer(currentCustomer);                     
            currentCustomer = new Customer();
            recreateModel();
        }        
        return "myTemplateClient";
    }

    public String deleteCustomer(){
        int id = 0;        
        id = Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")) ;        
        currentCustomer = model.getById(id);
        model.deleteCustomer(currentCustomer);
        recreateModel();
        return "myTemplateClient";
    }

    public String goIndex(){
        return "myTemplateClient";
    }

    public String prepareView(){
        currentCustomer = (Customer) customers.getRowData();
        if (currentCustomer !=null) {
            return "details";
        }
        return "myTemplateClient";
    }


}

Как видите, у нас есть 4 вида: myTemplateClient.xhtml, add.xhtml, edit.xhtml,details.xhtml.я перемещаюсь с помощью команды "return" viewname ";".Проблема:

  1. Адресная строка не совпадает с адресом страницы, которую я просматриваю.Пример: я читаю myTemplateClient.xhtml, но адресная строка: localhost: 8080 / iDo_Hibernate / Faces / details.xhtml (это должно быть: localhost: 8080 / iDo_Hibernate / Face / MyTemplateClient.xhtml).После этого, когда я перехожу к add.xhtml, адресная строка имеет вид: localhost: 8080 / iDo_Hibernate / Faces / myTemplateClient.xhtml.

  2. После добавления нового клиента он перенаправляется на «myTemplateClientmsgstr "страница (это страница указателя, она показывает всех клиентов) с адресной строкой: localhost: 8080 / iDo_Hibernate /faces / add.xhtml.Теперь, когда я обновляю свой браузер, он добавляет больше клиентов с той же информацией.Я пытаюсь удалить добавленный объект, но ошибка все равно.

    Пожалуйста, помогите мне исправить эти ошибки (Простите, потому что мой английский не очень хороший).Спасибо за чтение.

1 Ответ

1 голос
/ 30 августа 2011

Кажется, что проблема с URL-адресами заключается в том, что вы используете forward для навигации между страницами. Вместо этого используйте sendRedirect. Больше информации здесь: http://www.javapractices.com/topic/TopicAction.do?Id=181

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...