2013-07-19 2 views
1

struts를 처음 사용하고 struts 및 hibernate를 사용하여 jsp 페이지에서 DB (mysql)에 일부 값을 저장하려고했습니다.struts2를 사용하여 mysql에 값 저장

그러나 응용 프로그램이 매번 null 값을 저장하고 자동 증가 ID가 증가하고 있습니다.

내 데이터베이스 구조. :

Table Name | osdetail 
------------------------- 
    Columns | os_name, 
      | os_version, 
      | id, 
      | created, 
      | notes. 

index.jsp를 페이지

<%@ page contentType="text/html; charset=UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags"%> 
<html> 
<head> 
    <title>OS Manager - Struts2 Hibernate Example</title> 
</head> 
<body> 
  
<h1>OS Manager</h1> 
<s:actionerror/> 
  
<s:form action="add" method="post"> 
    <s:textfield name="osdetail.OSname" label="name"/> 
    <s:textfield name="osdetail.OSversion" label="version"/> 
    <s:textfield name="osdetail.OSnotes" label="notes"/> 
    <s:submit value="Add OS Details" align="center"/> 

</s:form> 
  
  
<h2>OS Details</h2> 
<table> 
<tr> 
    <th>OS Name</th> 
    <th>OS Version</th> 
    <th>OS Notes</th> 
</tr> 
<s:iterator value="osdetails_list" var="osdetail"> 
    <tr> 
        <td><s:property value="OSname"/></td> 
        <td><s:property value="OSversion"/></td> 
        <td><s:property value="OSnotes"/></td> 
    </tr> 
</s:iterator> 
</table> 
</body> 
</html> 

내보기 : OSAction.java

package net.ajeet.os.view; 

    import java.util.List; 

    import net.ajeet.os.controller.OSManager; 
    import net.ajeet.os.model.OSDetail; 

    import com.opensymphony.xwork2.ActionSupport; 
    import com.opensymphony.xwork2.ModelDriven; 


     public class OSAction extends ActionSupport implements ModelDriven<OSDetail> { 

private static final long serialVersionUID = 9149826260758390091L; 
private OSDetail osdetail= new OSDetail(); 
private List<OSDetail> osdetails_list; 
private Long id; 

private OSManager linkController= new OSManager(); 
@Override 
public OSDetail getModel() { 
    return osdetail; 
} 
public OSAction() { 
    linkController = new OSManager(); 
} 

public String execute() { 
    this.osdetails_list = linkController.list(); 
    return SUCCESS; 
} 

public String add() { 
    System.out.println("this is oS detail get ID"+osdetail.getId()); 
    try { 
     //linkController.add(getOSDetail()); 
     linkController.add(osdetail); 
     System.out.println("this is oS detail after add "+getOSDetail()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    this.osdetails_list = linkController.list(); 
    return SUCCESS; 
} 

public String delete() { 
    linkController.delete(getId()); 
    return SUCCESS; 
} 

public OSDetail getOSDetail() { 
    return osdetail; 
} 

public List<OSDetail> getOSDetail_list() { 


    return osdetails_list; 
} 

public void setOSDetail(OSDetail osdetail) { 
    this.osdetail = osdetail; 

} 

public void setOSDetail_list(List<OSDetail> osdetails_list) { 
    this.osdetails_list = osdetails_list; 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

} 

내 모델 : OSDetail.java

package net.ajeet.os.model; 


     import java.io.Serializable; 
    import java.sql.Date; 


    import javax.persistence.Column; 
    import javax.persistence.Entity; 
    import javax.persistence.GeneratedValue; 
    import javax.persistence.Id; 
    import javax.persistence.Table; 

    @Entity 
    @Table(name="osdetail") 

    public class OSDetail implements Serializable{ 

private static final long serialVersionUID = -8767337896773261247L; 

private Long OSid; 

private String OSname; 
private String OSversion; 
private String OSnotes; 

private Date OScreated; 

@Id 
@GeneratedValue 
@Column(name="id") 
public Long getId() { 

    System.out.println("set os name is os id"+OSid); 
    return OSid; 

} 
@Column(name="os_name") 
public String getOS_name() { 
    return OSname; 
} 
@Column(name="os_version") 
public String getOS_version() { 
    return OSversion; 
} 
@Column(name="notes") 
public String getNotes() { 
    return OSnotes; 
} 

@Column(name="created") 
public Date getCreated() { 
    return OScreated; 
} 
public void setId(Long OSid) { 
    this.OSid = OSid; 
} 
public void setOS_name(String OSname) { 
    this.OSname = OSname; 

} 
public void setOS_version(String OSversion) { 
    this.OSversion = OSversion; 
} 
public void setNotes(String OSnotes) { 
    this.OSnotes = OSnotes; 
} 
public void setCreated(Date OScreated) { 
    this.OScreated = OScreated; 

} 

내 콘트롤 : OSManager.java DB에 저장

 import java.util.List; 

    import org.hibernate.HibernateException; 
    import org.hibernate.classic.Session; 

     import net.ajeet.os.model.OSDetail; 
     import net.ajeet.os.util.HibernateUtil; 

     public class OSManager extends HibernateUtil { 

public OSDetail add(OSDetail osdetail) { 

    System.out.println("value of the os in OSManager"+osdetail.getId()); 

    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    session.save(osdetail); 
    session.getTransaction().commit(); 
    return osdetail; 
} 

public OSDetail delete(Long id) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    OSDetail osdetail = (OSDetail) session.load(OSDetail.class, id); 
    if(null != osdetail) { 
     session.delete(osdetail); 
    } 
    session.getTransaction().commit(); 
    return osdetail; 
} 
@SuppressWarnings("unchecked") 
public List<OSDetail> list() { 

    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    List<OSDetail> osdetails_list = null; 
    try { 

     osdetails_list = (List<OSDetail>)session.createQuery("from OSDetail").list(); 

    } catch (HibernateException e) { 
     e.printStackTrace(); 
     session.getTransaction().rollback(); 
    } 
    session.getTransaction().commit(); 
    return osdetails_list; 
} 
} 

값은

는 액션 ... 업데이트 게터을 변경했습니다 ID..Please 도움말을 제외하고 ... 항상 null입니다/setter

package net.ajeet.os.view; 

import java.util.List; 

import net.ajeet.os.controller.OSManager; 
import net.ajeet.os.model.OSDetail; 

import com.opensymphony.xwork2.ActionSupport; 
import com.opensymphony.xwork2.ModelDriven; 


public class OSAction extends ActionSupport { 

    private static final long serialVersionUID = 9149826260758390091L; 
    public OSDetail osdetail= new OSDetail(); 
    private List<OSDetail> osdetails_list; 
    public OSDetail getOsdetail() { 
     return osdetail; 
    } 

    public void setOsdetail(OSDetail osdetail) { 
     this.osdetail = osdetail; 
    } 

    private Long id; 

    private OSManager linkController= new OSManager(); 
/* @Override 
    public OSDetail getModel() { 
     return osdetail; 
    }*/ 
    public OSAction() { 
     linkController = new OSManager(); 
    } 

    public String execute() { 
     this.osdetails_list = linkController.list(); 
     return SUCCESS; 
    } 

    public String add() { 

     try { 

      linkController.add(getOsdetail()); 
      //linkController.add(osdetail); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     this.osdetails_list = linkController.list(); 
     return SUCCESS; 
    } 

    public String delete() { 
     linkController.delete(getid()); 
     return SUCCESS; 
    } 

    public List<OSDetail> getOsdetails_list() { 
     return osdetails_list; 
    } 

    public void setOsdetails_list(List<OSDetail> osdetails_list) { 
     this.osdetails_list = osdetails_list; 
    } 

    public Long getid() { 
     return id; 
    } 

    public void setid(Long id) { 
     this.id = id; 
    } 




} 

수정 된 OSDetail.java가 자동으로 생성 된 getter/setter입니다.

 package net.ajeet.os.model; 


import java.io.Serializable; 
import java.sql.Date; 



import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="osdetail") 

public class OSDetail implements Serializable{ 

    private static final long serialVersionUID = -8767337896773261247L; 

    private Long OSid; 

    private String OSname; 
    private String OSversion; 
    private String OSnotes; 

    private Date OScreated; 


    @Id 
    @GeneratedValue 
    @Column(name="id") 
    public Long getOSid() { 
     return OSid; 
    } 

    public void setOSid(Long oSid) { 
     OSid = oSid; 
    } 

    @Column(name="os_name") 
    public String getOSname() { 
     return OSname; 
    } 

    public void setOSname(String oSname) { 
     OSname = oSname; 
    } 

    @Column(name="os_version") 
    public String getOSversion() { 

     return OSversion; 
    } 

    public void setOSversion(String oSversion) { 
     OSversion = oSversion; 

     System.out.println("value of the os in OSversion in setter"+OSversion); 
    } 

    @Column(name="notes") 
    public String getOSnotes() { 
     return OSnotes; 
    } 

    public void setOSnotes(String oSnotes) { 
     OSnotes = oSnotes; 
    } 

    @Column(name="created") 
    public Date getOScreated() { 
     return OScreated; 
    } 

    public void setOScreated(Date oScreated) { 
     OScreated = oScreated; 
    } 



} 

<?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" namespace="/"> 

     <action name="add" 
      class="net.ajeet.os.view.OSAction" method="add"> 
      <result name="success" type="chain">index</result> 
      <result name="input" type="chain">index</result> 
     </action> 



     <action name="index" 
      class="net.ajeet.os.view.OSAction"> 
      <result name="success">index.jsp</result> 
     </action> 
    </package> 
</struts> 

에 struts.xml 추가 그리고 나는 jsp에서 값을 읽어 어디서든 OSAction 코드에 표시되지 않습니다

 <?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 

    <session-factory> 

     <!-- Database connection settings --> 
     <property name="connection.driver_class"> 
      com.mysql.jdbc.Driver 
     </property> 
     <property name="connection.url"> 
      jdbc:mysql://localhost:3306/test 
     </property> 
     <property name="connection.username">root</property> 
     <property name="connection.password">Asmita24</property> 

     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 

     <!-- SQL dialect --> 
     <property name="dialect"> 
      org.hibernate.dialect.MySQLDialect 
     </property> 

     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 

     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class"> 
      org.hibernate.cache.NoCacheProvider 
     </property> 

     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 

     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">update</property> 

     <mapping class="net.ajeet.os.model.OSDetail" /> 

    </session-factory> 

</hibernate-configuration> 
+0

'OSManager''add' 메소드에 중단 점을 넣고 디버그하여 모든 세부 사항을 확인했는지 확인하십시오. – neo108

+0

아니요, os_name, os_version 및 notes 값으로 null이 표시됩니다. – Asmi

답변

1

변수 osdetail에 대한 getter 함수의 이름이 잘못 지정되었습니다. getOSDetail() 대신 getOsdetail()이어야합니다. 이것이 양식의 값이 설정되지 않고 변수 osdetail에 공백 값이있는 이유입니다. 변경해보십시오. setter 메서드에서도 마찬가지입니다. setOsdetail()이어야합니다. 또한 fututre에서 이러한 실수를 방지하기 위해 수작업으로 작성하는 대신 generate your getter and setter functions automatically을 사용할 수 있습니다.

+0

당신이 말한 것처럼 getter/setter 메서드를 변경했습니다. 아직도 불행이 – Asmi

+0

나도 안다. OSDetail.java에서 모든 getter/setter의 이름이 잘못되었습니다. 예를 들어'OSname'의 경우 getOSname() 및 setOSname()이어야합니다. 다른 필드에 대해서도 마찬가지입니다. 이 명명 형식은 struts2에서 각각의 값을 채우는 데 필요합니다. – anu

+0

또한 수정했습니다. – Asmi

0

있는 hibernate.cfg.xml . 그리고 그 이유는 값이 DB에서 null이 될 것이라고 생각하는 이유입니다.

jsp에서 세부 정보를 가져 와서 osdetail으로 설정하고 linkController.add(osdetail);으로 전화하면 작동한다고 가정합니다.

내가 너무 잘 ActionSupport에 조예가 아니에요하지만 난 당신이 getText() 방법을 사용하여 jsp에서 값을 읽을 수 있다고 생각 ... linkController.add(osdetail); 라인 전에이 줄을 추가

시도 ...

osdetail.setOS_name(getText("osdetail.OSname")); 
osdetail.setOS_version(getText("osdetail.OSversion")); 
osdetail.setNotes(getText("osdetail.OSnotes")); 
+0

osdetail.setOS_name (getText ("osdetail.OSname")); 여기서 osdetail.OSname 값을 얻는 방법은 jsp 페이지에 입력 할 값이 아닌 DB의 값으로 osdetail.OSname을 입력하는 것입니다. – Asmi

+0

JSP에서 Action으로 값을 가져 오는 방법 ?? – Asmi

+0

'OSAction' 클래스에'getters'와'setters'를 추가하십시오. 내가 읽은 것부터'Struts 2'는'getters'와'setters'로 값을 선택합니다. – neo108