java - Struts 2/Foundation 5-ModelDriven class y File upload
html jsp (1)
Soy nuevo en la programación de Java y estoy tratando de crear una página web básica con formulario, etc. para realizar un pedido. Decidí usar Struts 2 después de asistir a un par de sesiones en el trabajo. También utilicé zurb Foundation 5 para una interfaz de usuario receptiva. Pude crear una página web HTML y un formulario con campos de texto, etc. y al enviar el formulario, los correos electrónicos se envían al cliente y al propietario del sitio con los datos del formulario.
Ahora estoy tratando de agregar la funcionalidad de carga de archivos al formulario. El problema al que me enfrento es que la carga del archivo es exitosa, pero los otros datos del formulario no se están rellenando y desaparecen en el correo electrónico.
Por favor encuentre el código a continuación.
WebContent / WEB-INF / submitAssign.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title></title>
<link rel="stylesheet" href="css/foundation.css" />
<link rel="stylesheet" href="code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css">
<script src="code.jquery.com/jquery-1.10.2.js"></script>
<script src="code.jquery.com/ui/1.11.0/jquery-ui.js"></script>
<link href="images/icon_small.jpg" rel="shortcut icon" type="jpeg"/>
</head>
<body>
<div class="row">
<img class="smallscreen" src="images/bannersmall.jpg" alt="slide 1"/>
<img src="images/banner.jpg" alt="slide 1"/>
</div>
<div class="row">
<div class="large-12 columnsrow">
<nav class="top-bar show-for-medium-up">
<section class="top-bar-section">
<ul class="left">
<li><a href="index.html" class="button">Home</a></li>
<li><a href="submitAssign.html" class="button">Submit</a></li>
<li><a href="faqsPage.html" class="button">FAQs</a></li>
<li><a href="contactUs.html" class="button">Contact</a></li>
</ul>
</section>
</nav>
</div>
</div>
<div class="off-canvas-wrap" data-offcanvas>
<div class="inner-wrap">
<nav class="tab-bar hide-for-medium-up">
<section class="left-small">
<a class="left-off-canvas-toggle menu-icon"><span></span></a>
</section>
<section class="middle tab-bar-section">
<h1 class="title">Menu</h1>
</section>
</nav>
<aside class="left-off-canvas-menu">
<ul class="off-canvas-list">
<li><label>FileUploadExample</label></li>
<li><a href="index.html" class="button">Home</a></li>
<li><a href="submitAssign.html" class="button">Submit</a></li>
<li><a href="faqsPage.html" class="button">FAQs</a></li>
<li><a href="contactUs.html" class="button">Contact</a></li>
</ul>
</aside>
<br><br>
<div class="row">
<div class = "panel">
<div class = "large-12 columnsrow">
<form id="assign-form" action="submitAssign" method="post" enctype=''multipart/form-data'' data-abide>
<div class="row">
<div class = "large-7 columns">
<div class="email-field">
<label>Email <small>required</small>
<input name="email" type="email" placeholder="[email protected]" required>
</label>
<small class="error">Please enter a valid email address</small>
</div>
</div>
<div class = "large-5 columns">
<div class="phone-field">
<label>Phone Number <small>required</small>
<input name="phoneNum" type="tel" pattern="[+]?[1-9]/d*" required placeholder="9999999999" />
</label>
<small class="error">Please enter a valid phone number</small>
</div>
</div>
</div>
<div class="row">
<div class = "large-12 columns">
<div class="name-field">
<label>Name <small>required</small>
<input name="custName" type="text" required pattern="[/sa-zA-Z]+">
</label>
<small class="error">Only alphabets are allowed </small>
</div>
</div>
</div>
<div class="row">
<div class = "large-4 columns">
<div class="subject-field">
<label>Subject
<input name="assignSubject" type="text" required pattern="[/sa-zA-Z]+">
</label>
<small class="error">Only alphabets are allowed </small>
</div>
</div>
<div class = "large-4 columns">
<div class="pages-field">
<label>No. of Pages
<input name="noOfPages" type="tel" pattern="[1-9]/d*">
</label>
<small class="error">Please enter a number value </small>
</div>
</div>
<div class = "large-4 columns">
<div class="words-field">
<label>No. of Words
<input name="noOfWords" type="tel" pattern="[1-9]/d*" >
</label>
<small class="error">Please enter a number value </small>
</div>
</div>
</div>
<div class="row">
<div class = "large-4 columns">
<label>Deadline
<input name ="lastDate" type="date" required>
</label>
<small class="error">Please enter a valid date </small>
</div>
<div class = "large-8 columns">
</div>
</div>
<div class="row">
<div class = "large-12 columns">
<div class="desc-field">
<label>Description
<textarea name="descAssign" placeholder="Please describe here..."></textarea>
</label>
</div>
</div>
</div>
<div class="row">
<div class="large-12 columns">
<div class="file-upload">
<label>Select Attachment
<input id="file" type="file" name="assignUpload" />
</label>
</div>
</div>
</div>
<button type="submit">Submit</button>
</form>
</div>
</div>
</div>
</div>
</div>
<br><br><br>
<a class="exit-off-canvas"></a>
<script src="js/vendor/jquery.js"></script>
<script src="js/foundation.min.js"></script>
<script src="js/foundation/foundation.abide.js"></script>
<script>
$(document).foundation();
</script>
<script>
$(''#assign-form'')
.on(''invalid.fndtn.abide'', function () {
var invalid_fields = $(this).find(''[data-invalid]'');
console.log(invalid_fields);
})
.on(''valid.fndtn.abide'', function () {
$(''#date'').
console.log(''valid!'');
});
</script>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.multipart.maxSize" value="10485760" />
<package name="assignUpload" extends="struts-default" namespace="/">
<action name="submitAssign" class="com.assignupload.actions.SubmitAssignment">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/png,image/gif</param>
<param name="maximumSize">4194304</param>
</interceptor-ref>
<interceptor-ref name="basicStack"></interceptor-ref>
<result name="success">submitSuccess.html</result>
<result name="error">submitError.html</result>
</action>
</package>
</struts>
SubmitAssignment.java
package com.assignupload.actions;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.assignupload.pojo.AssignmentInfo;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class SubmitAssignment extends ActionSupport implements ModelDriven, ServletRequestAware {
private File[] assignUpload;
private String[] assignUploadFileName;
private String[] assignUploadContentType;
AssignmentInfo assignInfo = new AssignmentInfo();
@Override
public Object getModel() {
return assignInfo;
}
@Override
public String execute() throws Exception {
System.out.println(assignInfo);
ServletContext servletContext = ServletActionContext.getServletContext();
String dataDir = servletContext.getRealPath("/WEB-INF");
for (int i = 0; i < assignUpload.length; i++){
File savedFile = new File(dataDir, assignUploadFileName[i]);
assignUpload[i].renameTo(savedFile);
}
try{
SendOrderEmail sendEmail = new SendOrderEmail(assignInfo);
sendEmail.sendEmail();}
catch (Exception e){
e.printStackTrace();
return ERROR;
}
return SUCCESS;
}
public File[] getAssignUpload() {
return assignUpload;
}
public void setAssignUpload(File[] assignUpload) {
this.assignUpload = assignUpload;
}
public String[] getAssignUploadFileName() {
return assignUploadFileName;
}
public void setAssignUploadFileName(String[] assignUploadFileName) {
this.assignUploadFileName = assignUploadFileName;
}
public String[] getAssignUploadContentType() {
return assignUploadContentType;
}
public void setAssignUploadContentType(String[] assignUploadContentType) {
this.assignUploadContentType = assignUploadContentType;
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
// TODO Auto-generated method stub
}
}
AssignmentInfo.Java
package com.assignupload.pojo;
import java.io.File;
public class AssignmentInfo {
private String email;
private Long phoneNum;
private String custName;
private String assignSubject;
private int noOfPages;
private int noOfWords;
private String lastDate;
private String descAssign;
public AssignmentInfo() {
// TODO Auto-generated constructor stub
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Long getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(Long phoneNum) {
this.phoneNum = phoneNum;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public String getAssignSubject() {
return assignSubject;
}
public void setAssignSubject(String assignSubject) {
this.assignSubject = assignSubject;
}
public int getNoOfPages() {
return noOfPages;
}
public void setNoOfPages(int noOfPages) {
this.noOfPages = noOfPages;
}
public int getNoOfWords() {
return noOfWords;
}
public void setNoOfWords(int noOfWords) {
this.noOfWords = noOfWords;
}
public String getLastDate() {
return lastDate;
}
public void setLastDate(String lastDate) {
this.lastDate = lastDate;
}
public String getDescAssign() {
return descAssign;
}
public void setDescAssign(String descAssign) {
this.descAssign = descAssign;
}
@Override
public String toString() {
return "AssignmentInfo [email=" + email + ", phoneNum=" + phoneNum
+ ", custName=" + custName + ", assignSubject=" + assignSubject
+ ", noOfPages=" + noOfPages + ", noOfWords=" + noOfWords
+ ", lastDate=" + lastDate + ", descAssign=" + descAssign + "]";
}
}
Además del código anterior, tengo un archivo SendOrderEmail.java que envía correctamente los correos electrónicos.
Aquí está el registro de error en eclipse.
INFO 2014-07-22 14:27:04,351 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.Dispatcher - Unable to find ''struts.multipart.saveDir'' property setting. Defaulting to javax.servlet.context.tempdir
DEBUG2014-07-22 14:27:04,351 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.Dispatcher - saveDir=C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/AssignmentUpload
DEBUG2014-07-22 14:27:04,428 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Found item email
DEBUG2014-07-22 14:27:04,428 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Item is a normal form field
DEBUG2014-07-22 14:27:04,429 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Found item phoneNum
DEBUG2014-07-22 14:27:04,429 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Item is a normal form field
DEBUG2014-07-22 14:27:04,430 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Found item custName
DEBUG2014-07-22 14:27:04,430 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Item is a normal form field
DEBUG2014-07-22 14:27:04,431 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Found item assignSubject
DEBUG2014-07-22 14:27:04,431 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Item is a normal form field
DEBUG2014-07-22 14:27:04,432 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Found item noOfPages
DEBUG2014-07-22 14:27:04,432 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Item is a normal form field
DEBUG2014-07-22 14:27:04,432 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Found item noOfWords
DEBUG2014-07-22 14:27:04,432 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Item is a normal form field
DEBUG2014-07-22 14:27:04,433 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Found item lastDate
DEBUG2014-07-22 14:27:04,433 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Item is a normal form field
DEBUG2014-07-22 14:27:04,434 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Found item descAssign
DEBUG2014-07-22 14:27:04,434 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Item is a normal form field
DEBUG2014-07-22 14:27:04,434 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Found item assignUpload
DEBUG2014-07-22 14:27:04,435 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Item is a file upload
DEBUG2014-07-22 14:27:04,448 [http-bio-8080-exec-7] com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@1ac8b63], property=struts]
DEBUG2014-07-22 14:27:04,457 [http-bio-8080-exec-7] com.opensymphony.xwork2.DefaultActionProxy - Creating an DefaultActionProxy for namespace [/] and action name [submitAssign]
DEBUG2014-07-22 14:27:04,482 [http-bio-8080-exec-7] com.opensymphony.xwork2.interceptor.ParametersInterceptor - Setting params NONE
DEBUG2014-07-22 14:27:04,482 [http-bio-8080-exec-7] com.opensymphony.xwork2.interceptor.ParametersInterceptor - Setting params assignUploadFileName => [ 1235962_10151872148662472_2018380961_n.jpg ] noOfWords => [ 1000 ] phoneNum => [ 919766759029 ] noOfPages => [ 4 ] email => [ [email protected] ] descAssign => [ Image test 6 ] assignSubject => [ Astronomy ] lastDate => [ 2014-07-31 ] assignUpload => [ C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/AssignmentUpload/upload_1dec45bb_28eb_4942_9d60_566bc01b4d5d_00000008.tmp ] custName => [ XXXXX ] assignUploadContentType => [ image/jpeg ]
DEBUG2014-07-22 14:27:04,486 [http-bio-8080-exec-7] com.opensymphony.xwork2.DefaultActionInvocation - Executing action method = null
AssignmentInfo [email=null, phoneNum=null, custName=null, assignSubject=null, noOfPages=0, noOfWords=0, lastDate=null, descAssign=null]
java.lang.NullPointerException
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:678)
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:638)
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:615)
at com.assignupload.actions.SendOrderEmail.custEmail(SendOrderEmail.java:55)
at com.assignupload.actions.SendOrderEmail.sendEmail(SendOrderEmail.java:41)
at com.assignupload.actions.SubmitAssignment.execute(SubmitAssignment.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
at org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:254)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:254)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:325)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:434)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Email to customer was not sent!
DEBUG2014-07-22 14:27:18,318 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.ServletDispatcherResult - Forwarding to location submitSuccess.html
DEBUG2014-07-22 14:27:18,336 [http-bio-8080-exec-7] com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler - Entering nullPropertyValue [target=[com.assignupload.actions.SubmitAssignment@19d85cd, com.opensymphony.xwork2.DefaultTextProvider@1ac8b63], property=struts]
DEBUG2014-07-22 14:27:18,356 [http-bio-8080-exec-7] com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler - Entering nullPropertyValue [target=[com.assignupload.actions.SubmitAssignment@19d85cd, com.opensymphony.xwork2.DefaultTextProvider@1ac8b63], property=struts]
DEBUG2014-07-22 14:27:18,367 [http-bio-8080-exec-7] org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - Removing file assignUpload name=1235962_10151872148662472_2018380961_n.jpg, StoreLocation=C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/AssignmentUpload/upload_1dec45bb_28eb_4942_9d60_566bc01b4d5d_00000008.tmp, size=96207 bytes, isFormField=false, FieldName=assignUpload
¿Podría indicarme por qué se borran los datos del formulario?
Tu problema es que estás definiendo una Pila de Interceptor incorrecta para tu Acción.
El predeterminado es defaultStack
, mientras que el que FileUpload
después del FileUpload
Interceptor es basicStack
.
Como puede ver en la documentación oficial , basicStack
no tiene basicStack
con ModelDriven
. Cambie su configuración de acción desde:
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/png,image/gif</param>
<param name="maximumSize">4194304</param>
</interceptor-ref>
<interceptor-ref name="basicStack"></interceptor-ref>
a :
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/png,image/gif</param>
<param name="maximumSize">4194304</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
o incluso mejor (para evitar usar FileUpload
Interceptor dos veces) para:
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">image/jpeg,image/png,image/gif</param>
<param name="fileUpload.maximumSize">4194304</param>
</interceptor-ref>
También considere usar etiquetas Struts2 para generar el HTML (use simple
tema simple
para el control máximo del HTML generado, o XHTML
, el predeterminado, para la máxima asistencia en la generación de HTML).
En muchas de las etiquetas (las que tienen Atributo dinámico permitido: verdaderas en la documentación), como <s:textfield/>
, <s:textarea/>
, <s:file/>
y así sucesivamente, puede definir sus propios atributos , como el pattern
HTML5, por ejemplo.
El HTML estará más limpio y lo codificarás más rápido.