我是Java编程的新手,我正在尝试创建一个带有表单等的基本网页来下订单。我决定在参加工作的几个会议后使用Struts 2。我还使用zurb Foundation 5来响应用户界面。我能够创建一个HTML网页和一个带有文本字段等的表单,并且在提交表单时,电子邮件将通过表单数据发送给客户和网站所有者。
我现在正在尝试将文件上传功能添加到表单中。我面临的问题是文件上传成功但其他表单数据没有被填充并在电子邮件中被删除。
请找到以下代码。
的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="john.doe@email.com" 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 + "]";
}
}
除上述代码外,我还有一个SendOrderEmail.java文件,该文件已成功发送电子邮件。
以下是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 => [ xxxxxx@gmail.com ] 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
请您指导一下表格数据被清除的原因?
答案 0 :(得分:3)
你的问题是你为你的Action定义了一个错误的拦截器堆栈。
默认值为defaultStack
,而FileUpload
拦截后使用的值为basicStack
。
正如您所见in the official documentation,basicStack
没有ModelDriven
支持。从以下位置更改操作配置:
<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>
到:
<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>
甚至更好(避免两次使用FileUpload
拦截器):
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">image/jpeg,image/png,image/gif</param>
<param name="fileUpload.maximumSize">4194304</param>
</interceptor-ref>
另外,请考虑使用Struts2标记生成HTML(使用simple
主题来最大程度地控制生成的HTML,或使用XHTML
(默认值)来获得HTML生成的最大帮助。 / p>
在许多代码中(文档中包含动态属性允许:true 的代码),例如<s:textfield/>
,<s:textarea/>
,<s:file/>
等等,您可以定义自己的属性,例如HTML5 pattern
。
HTML将更清晰,您将更快地编码。