A few beginner questons.
sparkettin Jun 1, 2009 4:55 PMHello,
In my case there is a course, and several documents related to course which I want to attach. The document have name, date and keywords. After I write them, I use rich:upload to temporaliy keep tthe document to be attached. When I finish uploading it, I want a blank interface to enter data for the next document. I use <a4j:support event="onuploadcomplete" reRender="panel, panel1" /><a4j:support event="onuploadcomplete" reRender="panel, panel1" /> to get a blank text and date box. this helps me to clear the data table which I keep the key words. but h:inputText and rich:calendar areas are always there with previous values. Whatever I do they are always there. I even tried ajax commandButton to rerender those fields. But they are never blank.
The other problem is I want date in dd.MM.yyyy format. When I save them there is hour and minutes. I do not want to see them, why they are there? The worse, in the data table I see temporaliy kept document, date is in a very different format (sometimes long date sometimes it is like 09 jun 2009). Why I can not see in my datatable in the way I want it? My code is below. I'd appreciate a lot If you help me. Thanks... (I use RF 3.3.1 with spring and hibernate. Sorry for the code junk:( )
course object:
package course.model.temel;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import course.model.ortak.Dokuman;
@Entity
@Table(name = "COURSE")
public class Course implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1562265533130786503L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "COURSE_ID")
private Integer id;
@Column(name = "name")
private String name;
private Date startDate;
private Date endDate;
@OneToMany(mappedBy = "course", cascade = CascadeType.ALL)
private List<Dokuman> documents = new ArrayList<Dokuman>();
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Course other = (Course) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
public Course() {
}
gettes and setters
}document object
package course.model.ortak;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Parameter;
import course.model.temel.Course;
@Entity
@Table(name="DOCUMENT")
public class Dokuman implements Serializable{
/**
*
*/
private static final long serialVersionUID = 8497390464772048029L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="DOCUMENT_ID")
private Integer id;
private Date date;
private String name;
private String keyWords;
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinTable(name = "DOCUMENT",
inverseJoinColumns = @JoinColumn(name = "COURSE_ID", referencedColumnName = "COURSE_ID"),
joinColumns = @JoinColumn(name = "DOCUMENT_ID", referencedColumnName = "DOCUMENT_ID"))
private Course course;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dokuman other = (Dokuman) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
public Dokuman(){}
getters and setters
}my controller
package course.controller.temel;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.model.ListDataModel;
import org.richfaces.event.UploadEvent;
import org.richfaces.model.UploadItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import course.model.ortak.Dokuman;
import course.model.temel.Course;
import course.service.temel.CourseService;
@Controller("courseController")
@Scope("session")
public class CourseController {
private CourseService courseService;
private ListDataModel list;
private boolean kontrol = false;
private String keyWord;
private String documentKeyWord;
private List<String> keyWords;
private Course course;
private boolean disabled;
private boolean autoclear;
private boolean rendered;
private boolean required;
private String requiredMessage;
private String listHeight;
private boolean immediateUpdate;
private String listWidth;
private String addControlLabel;
private String clearAllControlLabel;
private String clearControlLabel;
private String stopEntryControlLabel;
private String uploadControlLabel;
private Dokuman document;
private Integer maxFilesQuantity;
private String documentName;
private Date documentDate;
private StringBuilder sb;
public CourseController() {
disabled = false;
autoclear = true;
rendered = true;
required = false;
immediateUpdate = true;
requiredMessage = "requiredMessage";
listHeight = "50px";
listWidth = "300px";
addControlLabel = "Tara";
clearAllControlLabel = "Hepsini Temizle";
clearControlLabel = "Temizle";
stopEntryControlLabel = "Durdur";
uploadControlLabel = "Y�kle";
maxFilesQuantity = 1;
this.keyWord = new String();
this.keyWords = new ArrayList<String>();
this.documentName = new String();
this.course = new Course();
this.list = new ListDataModel();
this.document = new Dokuman();
this.keyWord = new String();
this.documentDate = new Date();
}
/*
* Here I save my object. The areas are cleared only when
* I run clear method
*/
public String save() {
courseService.courseSave(course);
clear();
return "tamam";
}
/*Here I store key words to be added
*
*/
public void keyWordAdd() {
this.keyWords.add(keyWord);
keyWord = "";
}
/*
* In case to erase key words before saving
*/
public void keyWordErase() {
ListDataModel list = new ListDataModel();
list.setWrappedData(this.keyWords);
String kelime = (String) list.getRowData();
this.keyWords.remove(kelime);
}
/*
* In case to remove an attached document before saving
*/
public void removeAttachedDocument() {
ListDataModel list = new ListDataModel();
list.setWrappedData(this.course.getDocuments());
Dokuman document = (Dokuman) list.getRowData();
this.course.getDocuments().remove(document);
}
/*
* This is the only way I clear my interface. But everythin is null.
*/
public void clear() {
this.keyWord = new String();
this.keyWords = new ArrayList<String>();
this.documentName = new String();
this.course = new Course();
this.list = new ListDataModel();
this.document = new Dokuman();
this.keyWord = new String();
this.documentDate = new Date();
}
/*
* This place kills me. I wat to see a all boxes clear to enter a new document
* information. whatever I do, document date and document name is still there.
*/
public void fileUploadListener(UploadEvent event) throws Exception {
UploadItem item = event.getUploadItem();
if (item != null && item.getData() != null) {
documentKeyWord();
this.document.setDate(documentDate);
this.document.setName(documentName);
this.course.getDocuments().add(this.document);
//this.documentDate = new Date();
//this.documentName = new String();
this.documentDate = null;
this.documentName="";
this.keyWord = new String();
this.keyWords = new ArrayList<String>();
this.document = new Dokuman();
}
}
/*just trying to transform string array to one string
* I want to keep keywords as a string line in db
*/
private void documentKeyWord() {
Iterator<String> i = this.keyWords.iterator();
String s;
String key;
if (i.hasNext()) {
s = i.next();
key = new String(s);
while (i.hasNext()) {
s = i.next();
key = key + "; " + s;
}
this.document.setKeyWords(key);
}
}
getters and setters
}my jsp page
<html>
<%@ page contentType="text/html; charset=ISO-8859-9"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<head>
</head>
<f:view>
<h:form id="myForm">
<center><rich:tabPanel switchType="client"
style="width:400px;">
<rich:tab label="Course Info">
<h:panelGrid columns="1">
<rich:panel style="height:245px;width:375px;">
<h:panelGrid columns="2">
<h:outputLabel value="Course Name :" />
<h:inputText value="#{courseController.course.name}"
style="width:231px;" />
<h:outputLabel value="Start Date :" />
<rich:calendar value="#{courseController.course.startDate}"
locale="tr/TR" datePattern="dd.MM.yyyy" cellWidth="width:231px"
cellHeight="22px" style="width:200px" />
<h:outputLabel value="End Date :" />
<rich:calendar value="#{courseController.course.endDate}"
locale="tr/TR" datePattern="dd.MM.yyyy" cellWidth="24px"
cellHeight="22px" style="width:200px" />
</h:panelGrid>
</rich:panel>
</h:panelGrid>
</rich:tab>
<rich:tab label="Documents">
<h:panelGrid columns="2" id="panel">
<rich:panel style="height:304px;width:375px;">
<h:panelGrid columns="2">
<h:outputLabel value="Document Name :" />
<h:inputText id="dokumanAditxt"
value="#{courseController.documentName}" style="width:150px;" />
<h:outputLabel value="Doument Date :" />
<rich:calendar locale="tr/TR" id="dokumanTarihitxt"
value="#{courseController.documentDate}"
datePattern="dd.MM.yyyy" cellWidth="170px" cellHeight="22px"
style="width:145px;" />
<h:outputLabel value="Key Word :" />
<a4j:outputPanel>
<h:inputText id="anahtarKelimeGirisitxt"
value="#{courseController.keyWord}" style="width:150px" />
<a4j:commandButton id="eklemeBtn"
action="#{courseController.keyWordAdd}"
reRender="dt2, anahtarKelimeGirisitxt"
image="../../images/img/Plus1png.png" />
<rich:toolTip for="eklemeBtn" value="Add" />
</a4j:outputPanel>
</h:panelGrid>
</rich:panel>
<rich:panel style="width:375px; height : 304px;">
<center><h:panelGrid columns="1">
<rich:dataTable id="dt2" value="#{courseController.keyWords}"
var="kelime" border="1"
onRowMouseOver="this.style.backgroundColor='efdc3b'"
onRowMouseOut="this.style.backgroundColor='F1F1F1'"
align="center" rules="all" rows="10" width="100%">
<f:facet name="header">
<h:outputText value="Key Words" />
</f:facet>
<rich:column sortBy="#{kelime}" filterBy="#{kelime}"
filterEvent="onkeyup">
<f:facet name="header">
<h:outputText value="Kelime" />
</f:facet>
<h:outputText value="#{kelime}"></h:outputText>
</rich:column>
<rich:column>
<f:facet name="header">
</f:facet>
<table width="100%">
<tr align="center">
<td><a4j:commandLink
action="#{courseController.keyWordErase}"
immediate="true" id="deleteLink"
onclick="if (!confirm('Sure?')) return false;"
reRender="dt2">
<h:graphicImage url="../../images/img/delete.gif"
style="text-align:center;border:0; height : 16px;"></h:graphicImage>
</a4j:commandLink> <rich:toolTip for="deleteLink" value="Delete" /></td>
</tr>
</table>
</rich:column>
</rich:dataTable>
<h:outputLabel value="Upload Document :" />
<rich:fileUpload id="upload"
disabled="#{courseController.disabled}"
autoclear="#{courseController.autoclear}"
required="#{courseController.required}"
requiredMessage="#{courseController.requiredMessage}"
rendered="#{courseController.rendered}"
listHeight="#{courseController.listHeight}"
listWidth="#{courseController.listWidth}"
fileUploadListener="#{courseController.fileUploadListener}"
maxFilesQuantity="#{courseController.maxFilesQuantity}"
immediateUpload="#{courseController.immediateUpdate}"
addControlLabel="#{courseController.addControlLabel}"
clearAllControlLabel="#{courseController.clearAllControlLabel}"
clearControlLabel="#{courseController.clearControlLabel}"
stopEntryControlLabel="#{courseController.stopEntryControlLabel}"
uploadControlLabel="#{courseController.uploadControlLabel}"
stopControlLabel="Stop">
<a4j:support event="onuploadcomplete" reRender="panel, panel1" />
<f:facet name="progress">
<rich:progressBar style="height: 10px; width: 250px;">
</rich:progressBar>
</f:facet>
</rich:fileUpload>
</h:panelGrid></center>
</rich:panel>
</h:panelGrid>
<center><h:panelGrid columns="1">
<rich:panel style="width:375px;" id="panel1">
<rich:dataTable id="dt1"
value="#{courseController.course.documents}" var="dokuman"
border="1" onRowMouseOver="this.style.backgroundColor='efdc3b'"
onRowMouseOut="this.style.backgroundColor='F1F1F1'"
align="center" rules="all" rows="10" width="100%">
<f:facet name="header">
<h:outputText value="Attached Documents" />
</f:facet>
<rich:column sortBy="#{dokuman.name}" filterBy="#{dokuman.name}"
filterEvent="onkeyup">
<f:facet name="header">
<h:outputText value="Doküman Adı" />
</f:facet>
<h:outputText value="#{dokuman.name}"></h:outputText>
</rich:column>
<rich:column sortBy="#{dokuman.date}" filterBy="#{dokuman.date}"
filterEvent="onkeyup">
<f:facet name="header">
<h:outputText value="Doküman Tarihi" />
</f:facet>
<h:outputText value="#{dokuman.date}"></h:outputText>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Key Words" />
</f:facet>
<h:outputText value="#{dokuman.keyWords}"></h:outputText>
</rich:column>
<h:column>
<f:facet name="header">
</f:facet>
<table width="100%">
<tr align="center">
<td><a4j:commandLink
action="#{courseController.removeAttachedDocument}"
immediate="true" id="deleteLink"
onclick="if (!confirm('Sure?')) return false;" reRender="dt1">
<h:graphicImage url="../../images/img/delete.gif"
style="text-align:center;border:0;"></h:graphicImage>
</a4j:commandLink> <rich:toolTip for="deleteLink" value="Delete" /></td>
</tr>
</table>
</h:column>
</rich:dataTable>
<rich:datascroller for="dt1" align="center"></rich:datascroller>
</rich:panel>
</h:panelGrid></center>
</rich:tab>
</rich:tabPanel>
<table align="center" width="450px">
<tr align="right">
<h:commandButton action="#{courseController.save}" id="kaydet"
value="Save"></h:commandButton>
</tr>
</table>
</center>
</h:form>
</f:view>
</html>