初始化变量接缝的正确方法
Correct way of initialize variables seam
我想初始化一个变量并希望它与 HTML 中的文本字段相结合。
当我调用一个函数时,我想使用这个变量在数据库中插入一些东西。但目前我一直在为该字段获取空值。有任何想法吗 ? (见下面的代码)
目前我有这个:
Name("orderUploadAction")
@Scope(ScopeType.CONVERSATION)
public class OrderUploadAction implements Serializable {
public static final int MAX_SYNC_PART_AMOUNT = 50;
private final static String SEAM_UPLOAD = "seamUpload";
private final static String COMMONS_UPLOAD = "commonsUpload";
@Logger
static Log log;
@In
Identity identity;
@In(create = true)
private ProductDao productDao;
@In(scope = ScopeType.SESSION)
private PortalUserHome portalUserHome;
@In(create=true,required=false,scope=ScopeType.CONVERSATION)
private String refNumber;
@In
private EntityManager entityManager;
private UploadItem uploadItem;
private ArrayList<String> errors = null;
@In(required=false,scope=ScopeType.CONVERSATION)
@Out(required=false)
private String refNumber;
@Email
private String email;
public
// Upload Method
boolean usedSeamBuildInUpload = true;
// Apache Commons FileUpload
byte[] byteArray;
public OrderUploadAction() {
}
@Create
public void init(){
log.debug("Initing CONVERSATION component FileUploadAction...");
uploadItem = null;
errors = new ArrayList<String>();
errors.clear();
refNumber = "";
}
// listener for the upload function on fileUpload.xhtml
public void listener(UploadEvent event) throws Exception {
uploadItem = event.getUploadItem();
log.debug("File uploaded with name: #0", uploadItem.getFileName());
}
public String decideWhatToDo(){
errors = new ArrayList<String>();
String s = refNumber;
String x = customerOrderHome.getInstance().getReferenceNumber();
System.out.println(s);
if(refNumber == null || refNumber == "" ){
errors.add("Please fill in a P.O number before starting upload");
return "error";
}
else if(uploadItem == null || uploadItem.getData() == null){
log.debug("Cannot decide, there is no file");
log.debug("-> Decision outcome: ERROR");
return "error";
}
else{
doSyncProcessing();
return "success";
}
}
/**
* @return the refNumber
*/
public String getRefNumber() {
return refNumber;
}
/**
* @param refNumber the refNumber to set
*/
public void setRefNumber(String refNumber) {
this.refNumber = refNumber;
}
/**
* @param errors the errors to set
*/
public void setErrors(ArrayList<String> errors) {
this.errors = errors;
}
private String doSyncProcessing() {
return doSyncProcessing(true, false);
}
public String doSyncProcessing(boolean buildInSeamUpload, boolean convarFlag){
usedSeamBuildInUpload = buildInSeamUpload;
log.debug("Starting SYNCHRONOUS processing...");
ByteArrayInputStream bis = null;
if(usedSeamBuildInUpload) {
bis = new ByteArrayInputStream(uploadItem.getData());
}else {
bis = new ByteArrayInputStream(byteArray);
}
return createOrder(null,bis,identity, convarFlag);
}
public String createOrder(String email,InputStream bis,Identity identity, boolean convarFlag){
log.debug("Transforming to a Order");
// Load the byte array to an input stream for reading.
// Load the input stream to a buffered reader to read the data.
BufferedReader br = new BufferedReader(new InputStreamReader(bis));
String csvLine;
int nextTxt = 0;
int index = 0;
UploadOrderItem item = new UploadOrderItem();
ArrayList<UploadOrderItem> items= new ArrayList<UploadOrderItem>();
// here we go...
try {
// start reading
while ((csvLine = br.readLine()) != null) {
if(!csvLine.toUpperCase().contains("PRODUCTCODE")){
if (!(csvLine.equals("EOF"))) {
nextTxt = 0;
index = 2;
for(int i=0;i<csvLine.length();i++) {
if(csvLine.charAt(i) == ';'){
switch(index){
/*case 0:
item.setCustomerSAP(Integer.parseInt(csvLine.substring(0, (i)).trim()));
break;*/
/*case 1:
item.setRefPO(csvLine.substring(nextTxt,(i)).trim());
break;*/
case 2:
item.setProductCode(csvLine.substring(nextTxt,(i)).trim());
break;
case 3:
try{
int quantity = Integer.parseInt(csvLine.substring(nextTxt,(i)).trim());
item.setQuantity(Integer.parseInt(csvLine.substring(nextTxt,(i)).trim()));
}catch(Exception e){
errors.add("Quantity incorrect with productcode "+item.getProductCode());
}
break;
}
index++;
nextTxt = i +1;
}
}
if(csvLine.substring(nextTxt,csvLine.length()).trim().equals("Y")){
item.setFOC(true);
}
else if(!csvLine.substring(nextTxt,csvLine.length()).trim().equals("")){
errors.add("Free of charge incorrect with productcode "+item.getProductCode());
}
items.add(item);
item = new UploadOrderItem();
} else {
index =0;
break;
}
}
}
} catch (IOException e) {
log.debug("IOException occured when reading the CSV file.");
} catch (Exception e) {
log.error("Intern error occured while processing the CSV file!");
}
// close the reader
try{
br.close();
} catch (IOException e) {
log.warn("Buffered Reader from file upload could not be closed for some reason...");
}
log.debug("-> Transformation done!");
//Check items
CustomerOrder currentOrder = new CustomerOrder();
OrderItem oItem;
for (UploadOrderItem ul : items) {
oItem = new OrderItem();
oItem.setCurrency("EUR");
Product x = null;
try{
x = productDao.findProductByProductCode(ul.getProductCode());
oItem.setProduct(x);
}catch(Exception e){
log.error("Error occured while getting product");
errors.add("Error getting product for "+ul.getProductCode()+"\n");
e.printStackTrace();
}
if(ul.isFOC()){
int foc = 100;
oItem.setDiscountType(DiscountType.PERCENTAGE);
oItem.setDiscountValue(BigDecimal.valueOf(foc));
}
oItem.setQuantity(ul.getQuantity());
oItem.setStatus(OrderStatus.INITIAL);
oItem.setTotalNetPrice(null);
oItem.setVatAmount(null);
oItem.setVatRate(null);
oItem.setTotalSurcharges(null);
oItem.setCustomerOrder(currentOrder);
currentOrder.getOrderItems().add(oItem);
currentOrder.setReferenceNumber(refNumber);
}
String fullName = "";
if(portalUserHome.getInstance().getFirstName() != null) {
fullName+= portalUserHome.getInstance().getFirstName() + " ";
}
if (portalUserHome.getInstance().getLastName() != null) {
fullName += portalUserHome.getInstance().getLastName();
} else {
fullName = fullName.trim();
}
currentOrder.setCreatorFullName(fullName);
currentOrder.setCreatorUserName(portalUserHome.getInstance().getUserName());
currentOrder.setCreatedOn(new Date());
customerOrderHome.setInstance(currentOrder);
Customer customer = entityManager.find(Customer.class, portalUserHome.getInstance()
.getCustomer().getId());
portalUserHome.getInstance().setCustomer(customer);
customerOrderHome.getInstance().setCustomer(customer);
customerOrderHome.getInstance().setAddress(customer.getDefaultAddress());
if(errors.size()==0){
try{
customerOrderHome.persist();
}catch(Exception e){
e.printStackTrace();
}
}
else{
return "error";
}
return "success";
}
/**
* Very fast method to give an approximate number of lines in the file
* @param data A byte[] representing the data
* @return int The number of lines
* @throws IOException If IO exceptions occurs
*/
private int count(byte[] data) throws IOException {
ByteArrayInputStream is = new ByteArrayInputStream(data);
try {
byte[] c = new byte[1024];
int count = 0;
int readChars = 0;
while ((readChars = is.read(c)) != -1) {
for (int i = 0; i < readChars; ++i) {
if (c[i] == '\n')
++count;
}
}
return count;
} finally {
is.close();
}
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// GETTERS & SETTERS
public List<String> getErrors() {
return errors;
}
XHTML :
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
xmlns:a="http://richfaces.org/a4j"
xmlns:pioneer="http://www.pioneer.com/jsf"
template="/layout/template.xhtml">
<ui:define name="body">
<h1>
<h:outputText value="#{messages.upload_title}" />
</h1>
<div class="clearfix">
<rich:panel>
<script>
function showErrors(){
alert("File upload has failed please see the output below the fileupload");
}
function showComplete(){
alert("File successfully processed. Orders are placed.");
}
</script>
<s:div styleClass="block bgcolor-6" id="orderSearchFields">
<div class="hd">
<h3>#{messages.upload_subTitle}</h3>
</div>
<div class="bd">
#{messages.upload_info}<br /> #{messages.upload_csv}<br />
<br />
<s:decorate id="refNumBer" template="/layout/editShort.xhtml">
<h:inputText id="refNumBer"
value="#{orderUploadAction.refNumber}" styleClass="txt" />
</s:decorate>
<a:status for="uploadRegion"
onstart="Richfaces.showModalPanel('confirmWait');">
<f:facet name="start">
<h:column>
<br />
<h:outputText>
<b>#{messages.upload_wait_process}</b>
</h:outputText>
<h:graphicImage value="/img/pioneer/spinner.gif" />
</h:column>
</f:facet>
</a:status>
</div>
</s:div>
<h:form>
<rich:panel id="fileUpload">
<a:region id="uploadRegion">
<rich:fileUpload
fileUploadListener="#{orderUploadAction.listener}" id="upload"
addControlLabel="Add" acceptedTypes="csv" maxFilesQuantity="1">
<a:support event="onuploadcomplete"
action="#{orderUploadAction.decideWhatToDo()}"
reRender="errorUpload,fileUpload" />
<!-- oncomplete="if (#{orderUploadAction.errors.size()==0}) {showComplete();}
else{showErrors();} "-->
</rich:fileUpload>
</a:region>
</rich:panel>
</h:form>
<br />
<!-- <rich:panel id="errorUpload" rendered="orderUploadAction.errors !=0">
<c:forEach items="#{orderUploadAction.errors}" var="error">
<h:outputText value="#{error}" style="color:red">
</h:outputText>
<br />
</c:forEach>
</rich:panel>-->
</rich:panel>
</div>
</ui:define>
</ui:composition>
如果您想在 orderUploadAction.decideWhatToDo() 动作事件中初始化变量 n。
我认为您的 form 标记应该移动到开始位置。
例如
<h:form>
<s:div styleClass="block bgcolor-6" id="orderSearchFields">
...
<s:decorate id="refNumBer" template="/layout/editShort.xhtml">
<h:inputText id="refNumBer"
value="#{orderUploadAction.refNumber}" styleClass="txt" />
</s:decorate>
...
decideWhatToDo() action..
...
</h:form>
我想初始化一个变量并希望它与 HTML 中的文本字段相结合。 当我调用一个函数时,我想使用这个变量在数据库中插入一些东西。但目前我一直在为该字段获取空值。有任何想法吗 ? (见下面的代码)
目前我有这个:
Name("orderUploadAction")
@Scope(ScopeType.CONVERSATION)
public class OrderUploadAction implements Serializable {
public static final int MAX_SYNC_PART_AMOUNT = 50;
private final static String SEAM_UPLOAD = "seamUpload";
private final static String COMMONS_UPLOAD = "commonsUpload";
@Logger
static Log log;
@In
Identity identity;
@In(create = true)
private ProductDao productDao;
@In(scope = ScopeType.SESSION)
private PortalUserHome portalUserHome;
@In(create=true,required=false,scope=ScopeType.CONVERSATION)
private String refNumber;
@In
private EntityManager entityManager;
private UploadItem uploadItem;
private ArrayList<String> errors = null;
@In(required=false,scope=ScopeType.CONVERSATION)
@Out(required=false)
private String refNumber;
@Email
private String email;
public
// Upload Method
boolean usedSeamBuildInUpload = true;
// Apache Commons FileUpload
byte[] byteArray;
public OrderUploadAction() {
}
@Create
public void init(){
log.debug("Initing CONVERSATION component FileUploadAction...");
uploadItem = null;
errors = new ArrayList<String>();
errors.clear();
refNumber = "";
}
// listener for the upload function on fileUpload.xhtml
public void listener(UploadEvent event) throws Exception {
uploadItem = event.getUploadItem();
log.debug("File uploaded with name: #0", uploadItem.getFileName());
}
public String decideWhatToDo(){
errors = new ArrayList<String>();
String s = refNumber;
String x = customerOrderHome.getInstance().getReferenceNumber();
System.out.println(s);
if(refNumber == null || refNumber == "" ){
errors.add("Please fill in a P.O number before starting upload");
return "error";
}
else if(uploadItem == null || uploadItem.getData() == null){
log.debug("Cannot decide, there is no file");
log.debug("-> Decision outcome: ERROR");
return "error";
}
else{
doSyncProcessing();
return "success";
}
}
/**
* @return the refNumber
*/
public String getRefNumber() {
return refNumber;
}
/**
* @param refNumber the refNumber to set
*/
public void setRefNumber(String refNumber) {
this.refNumber = refNumber;
}
/**
* @param errors the errors to set
*/
public void setErrors(ArrayList<String> errors) {
this.errors = errors;
}
private String doSyncProcessing() {
return doSyncProcessing(true, false);
}
public String doSyncProcessing(boolean buildInSeamUpload, boolean convarFlag){
usedSeamBuildInUpload = buildInSeamUpload;
log.debug("Starting SYNCHRONOUS processing...");
ByteArrayInputStream bis = null;
if(usedSeamBuildInUpload) {
bis = new ByteArrayInputStream(uploadItem.getData());
}else {
bis = new ByteArrayInputStream(byteArray);
}
return createOrder(null,bis,identity, convarFlag);
}
public String createOrder(String email,InputStream bis,Identity identity, boolean convarFlag){
log.debug("Transforming to a Order");
// Load the byte array to an input stream for reading.
// Load the input stream to a buffered reader to read the data.
BufferedReader br = new BufferedReader(new InputStreamReader(bis));
String csvLine;
int nextTxt = 0;
int index = 0;
UploadOrderItem item = new UploadOrderItem();
ArrayList<UploadOrderItem> items= new ArrayList<UploadOrderItem>();
// here we go...
try {
// start reading
while ((csvLine = br.readLine()) != null) {
if(!csvLine.toUpperCase().contains("PRODUCTCODE")){
if (!(csvLine.equals("EOF"))) {
nextTxt = 0;
index = 2;
for(int i=0;i<csvLine.length();i++) {
if(csvLine.charAt(i) == ';'){
switch(index){
/*case 0:
item.setCustomerSAP(Integer.parseInt(csvLine.substring(0, (i)).trim()));
break;*/
/*case 1:
item.setRefPO(csvLine.substring(nextTxt,(i)).trim());
break;*/
case 2:
item.setProductCode(csvLine.substring(nextTxt,(i)).trim());
break;
case 3:
try{
int quantity = Integer.parseInt(csvLine.substring(nextTxt,(i)).trim());
item.setQuantity(Integer.parseInt(csvLine.substring(nextTxt,(i)).trim()));
}catch(Exception e){
errors.add("Quantity incorrect with productcode "+item.getProductCode());
}
break;
}
index++;
nextTxt = i +1;
}
}
if(csvLine.substring(nextTxt,csvLine.length()).trim().equals("Y")){
item.setFOC(true);
}
else if(!csvLine.substring(nextTxt,csvLine.length()).trim().equals("")){
errors.add("Free of charge incorrect with productcode "+item.getProductCode());
}
items.add(item);
item = new UploadOrderItem();
} else {
index =0;
break;
}
}
}
} catch (IOException e) {
log.debug("IOException occured when reading the CSV file.");
} catch (Exception e) {
log.error("Intern error occured while processing the CSV file!");
}
// close the reader
try{
br.close();
} catch (IOException e) {
log.warn("Buffered Reader from file upload could not be closed for some reason...");
}
log.debug("-> Transformation done!");
//Check items
CustomerOrder currentOrder = new CustomerOrder();
OrderItem oItem;
for (UploadOrderItem ul : items) {
oItem = new OrderItem();
oItem.setCurrency("EUR");
Product x = null;
try{
x = productDao.findProductByProductCode(ul.getProductCode());
oItem.setProduct(x);
}catch(Exception e){
log.error("Error occured while getting product");
errors.add("Error getting product for "+ul.getProductCode()+"\n");
e.printStackTrace();
}
if(ul.isFOC()){
int foc = 100;
oItem.setDiscountType(DiscountType.PERCENTAGE);
oItem.setDiscountValue(BigDecimal.valueOf(foc));
}
oItem.setQuantity(ul.getQuantity());
oItem.setStatus(OrderStatus.INITIAL);
oItem.setTotalNetPrice(null);
oItem.setVatAmount(null);
oItem.setVatRate(null);
oItem.setTotalSurcharges(null);
oItem.setCustomerOrder(currentOrder);
currentOrder.getOrderItems().add(oItem);
currentOrder.setReferenceNumber(refNumber);
}
String fullName = "";
if(portalUserHome.getInstance().getFirstName() != null) {
fullName+= portalUserHome.getInstance().getFirstName() + " ";
}
if (portalUserHome.getInstance().getLastName() != null) {
fullName += portalUserHome.getInstance().getLastName();
} else {
fullName = fullName.trim();
}
currentOrder.setCreatorFullName(fullName);
currentOrder.setCreatorUserName(portalUserHome.getInstance().getUserName());
currentOrder.setCreatedOn(new Date());
customerOrderHome.setInstance(currentOrder);
Customer customer = entityManager.find(Customer.class, portalUserHome.getInstance()
.getCustomer().getId());
portalUserHome.getInstance().setCustomer(customer);
customerOrderHome.getInstance().setCustomer(customer);
customerOrderHome.getInstance().setAddress(customer.getDefaultAddress());
if(errors.size()==0){
try{
customerOrderHome.persist();
}catch(Exception e){
e.printStackTrace();
}
}
else{
return "error";
}
return "success";
}
/**
* Very fast method to give an approximate number of lines in the file
* @param data A byte[] representing the data
* @return int The number of lines
* @throws IOException If IO exceptions occurs
*/
private int count(byte[] data) throws IOException {
ByteArrayInputStream is = new ByteArrayInputStream(data);
try {
byte[] c = new byte[1024];
int count = 0;
int readChars = 0;
while ((readChars = is.read(c)) != -1) {
for (int i = 0; i < readChars; ++i) {
if (c[i] == '\n')
++count;
}
}
return count;
} finally {
is.close();
}
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// GETTERS & SETTERS
public List<String> getErrors() {
return errors;
}
XHTML :
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
xmlns:a="http://richfaces.org/a4j"
xmlns:pioneer="http://www.pioneer.com/jsf"
template="/layout/template.xhtml">
<ui:define name="body">
<h1>
<h:outputText value="#{messages.upload_title}" />
</h1>
<div class="clearfix">
<rich:panel>
<script>
function showErrors(){
alert("File upload has failed please see the output below the fileupload");
}
function showComplete(){
alert("File successfully processed. Orders are placed.");
}
</script>
<s:div styleClass="block bgcolor-6" id="orderSearchFields">
<div class="hd">
<h3>#{messages.upload_subTitle}</h3>
</div>
<div class="bd">
#{messages.upload_info}<br /> #{messages.upload_csv}<br />
<br />
<s:decorate id="refNumBer" template="/layout/editShort.xhtml">
<h:inputText id="refNumBer"
value="#{orderUploadAction.refNumber}" styleClass="txt" />
</s:decorate>
<a:status for="uploadRegion"
onstart="Richfaces.showModalPanel('confirmWait');">
<f:facet name="start">
<h:column>
<br />
<h:outputText>
<b>#{messages.upload_wait_process}</b>
</h:outputText>
<h:graphicImage value="/img/pioneer/spinner.gif" />
</h:column>
</f:facet>
</a:status>
</div>
</s:div>
<h:form>
<rich:panel id="fileUpload">
<a:region id="uploadRegion">
<rich:fileUpload
fileUploadListener="#{orderUploadAction.listener}" id="upload"
addControlLabel="Add" acceptedTypes="csv" maxFilesQuantity="1">
<a:support event="onuploadcomplete"
action="#{orderUploadAction.decideWhatToDo()}"
reRender="errorUpload,fileUpload" />
<!-- oncomplete="if (#{orderUploadAction.errors.size()==0}) {showComplete();}
else{showErrors();} "-->
</rich:fileUpload>
</a:region>
</rich:panel>
</h:form>
<br />
<!-- <rich:panel id="errorUpload" rendered="orderUploadAction.errors !=0">
<c:forEach items="#{orderUploadAction.errors}" var="error">
<h:outputText value="#{error}" style="color:red">
</h:outputText>
<br />
</c:forEach>
</rich:panel>-->
</rich:panel>
</div>
</ui:define>
</ui:composition>
如果您想在 orderUploadAction.decideWhatToDo() 动作事件中初始化变量 n。 我认为您的 form 标记应该移动到开始位置。 例如
<h:form>
<s:div styleClass="block bgcolor-6" id="orderSearchFields">
...
<s:decorate id="refNumBer" template="/layout/editShort.xhtml">
<h:inputText id="refNumBer"
value="#{orderUploadAction.refNumber}" styleClass="txt" />
</s:decorate>
...
decideWhatToDo() action..
...
</h:form>