Struts 2/ Foundation 5 - ModelDriven 类和文件上传

2024-04-06

我是 Java 编程新手,我正在尝试创建一个带有表单等的基本网页来下订单。在参加了几次工作会议后,我决定使用 Struts 2。我还使用 zurb Foundation 5 来实现响应式 UI。我能够创建一个 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="[email protected] /cdn-cgi/l/email-protection" 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>

提交作业.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

    }

}

作业信息.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 => [ [email protected] /cdn-cgi/l/email-protection ] 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

您能指导我为什么表单数据被删除吗?


您的问题是您为您的操作定义了错误的拦截器堆栈。

默认的是defaultStack,而您在之后使用的那个FileUpload拦截器是basicStack.

如你看到的在官方文档中 http://struts.apache.org/release/2.3.x/docs/interceptors.html, the basicStack has no 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>

to :

<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 生成提供最大帮助)。

在许多标签中(带有允许的动态属性: true在文档中),例如<s:textfield/> http://struts.apache.org/release/2.3.x/docs/textfield.html, <s:textarea/> http://struts.apache.org/release/2.3.x/docs/textarea.html, <s:file/> http://struts.apache.org/release/2.3.x/docs/file.html等等,你可以定义自己的属性,就像HTML5pattern, 例如。

HTML 将会更加清晰,您的编码速度也会更快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Struts 2/ Foundation 5 - ModelDriven 类和文件上传 的相关文章

随机推荐

  • 如何使用 Cocoa 或 C++ 在 Mac OS X 中截取屏幕截图

    如何在 Mac OS X 中以编程方式截取桌面区域的屏幕截图 我见过两个有趣的选项 但尚未专业使用 它们是屏幕捕获实用程序和 MacFuse 演示 根据手册页 屏幕捕获实用程序从 10 2 开始就已经存在 并且可以通过使用 NSTask 链
  • 以编程方式配置 Log4NetLoggerFactoryAdapter

    我正在使用 NUnit 来测试一个项目 我想配置我的测试以编程方式设置 Common Logging 以使用 Log4Net 这是我尝试过的 NameValueCollection config new NameValueCollectio
  • 为什么分叉我的进程会导致文件被无限读取

    我已经将整个程序简化为一个简短的主程序来复制该问题 所以请原谅我它没有任何意义 input txt 是一个文本文件 其中包含几行文本 这个简化的程序应该打印这些行 但是 如果调用 fork 程序就会进入无限循环 一遍又一遍地打印文件的内容
  • 如何使用 React-Native-FS 进行 mkdir

    我正在尝试向我的 RN 应用程序添加功能 该功能将允许用户在手机的文件系统中创建新目录 我尝试编写代码 以便该函数在路径 storage emulated 0 AppName NewFolder 中创建一个目录 因为 storage emu
  • Java 相当于 session_start()、session_destroy() 和 $_SESSION['username']

    在 PHP 中 当用户登录她的帐户时 我会执行以下操作 以便在用户浏览网站时记住该用户 session start SESSION username username 在可能需要敏感数据的任何其他页面上 我检查 SESSION userna
  • Ratchet PHP - 推送消息服务

    我使用 Ratchet 查看的大多数示例都是针对聊天服务的 我目前正在构建一个应用程序 用户可以在其中登录并根据其用户 ID 从服务器接收通知 我有基本的教程 但是我很难理解以下几点 当 的时候onOpen 方法被调用 我设置了 conn对
  • R 中出现重复值并返回以逗号分隔的唯一值

    我在 R 中有以下数据框 Number ship no 4432 1 4432 2 4564 1 4389 5 6578 6 4389 3 4355 10 4355 10 我想找到重复的Number以独特的方式重复ship no Numbe
  • requests.exceptions.SSLError: [Errno 2] 没有这样的文件或目录

    我正在使用一个名为 Tweetpony 的 python 库 一切正常 除了当我使用 Pyinstaller 打包我的脚本时 我在执行时收到以下错误 Traceback most recent call last File
  • 找不到在 64 位 Windows 上运行 32 位应用程序的 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId

    确实如标题 在 regedit 中查看键值存在 但 Wow6432 键 HKLM SOFTWARE Wow6432Node Microsoft Windows NT CurrentVersion 没有此键 这意味着 32 位应用程序无法在我
  • Xpath 仅选择属性的一部分

    if dt id returns comment 34232 or comment 12我怎样才能让它返回34232 or 12 换句话说 替换 comment with and if span style returns width 80
  • HTML5 音频播放器中的搜索不一致

    我想从特定时间戳开始播放音频 但我什至无法让最简单的例子正常工作 我尝试了以下方法 并进行了修改w3school 的例子 http www w3schools com tags tryit asp filename tryhtml5 av
  • htaccess 301 重定向 htaccess 或 php

    我在 Htaccess 中有一个动态 URL 重写规则 如下所示 RewriteRule cartoon html fm cart new r id 1 location 2 L 此规则导致 URL 为http localhost fm c
  • 如何在 Windows 上升级 pgAdmin 4?

    我安装了 pgAdmin 4 作为 Windows 的 postgres 安装程序的一部分 pgAdmin 现在告诉我有一个更新的版本 我有 4 8 gt 4 5 但是 我没有看到内置的升级功能 当我下载并运行 pgAdmin 4 安装程序
  • C++ 重复符号

    Mac 我尝试过命名空间 包括警卫 编译指示一次等 基本上 这是结构 CMakeLists txt add executable Game Game main cpp Game rtexture cpp 游戏 main cpp includ
  • Google 新闻 rss 参数 num 100 仅返回 30 个结果

    我用来从谷歌新闻获取结果的链接 它工作正常 但我得到的结果数量存在问题 当 num 参数超过 30 时 无论数量多少 num 参数最多返回 30 个结果 谷歌是否改变了它给出的结果数量 如果是的话有没有任何文档 提前致谢 根据source
  • 如何使用 pandas 将多行字符串合并为一行?

    我有一个包含多行的 DataFrame 有什么方法可以将它们组合成一个字符串吗 例如 words 0 I will hereby 1 am gonna 2 going far 3 to 4 do 5 this 预期输出 I will her
  • 查找与区域设置相关的一周的第一天

    给定一个NSDate 在给定用户的区域设置的情况下 如何找到该日期一周的第一天 例如 我听说有些国家将星期一视为一周的第一天 而其他国家则将星期日视为一周的第一天 在第一种情况下我需要返回前一个星期一 在后一种情况下我需要返回前一个星期日
  • 具有多个命名空间的 DataContractSerializer

    我正在使用 DataContractSerializer 将对象序列化为 XML 主要对象是SecurityHolding 其命名空间为 http personaltrading test com http personaltrading
  • 如何修改codeigniter中的路由

    帮我解决这个问题 举个例子 我有这个正常的网址 localhost CI index php base storeurl 我怎样才能让 Codeigniter 知道要寻找 本地主机 CI storeurl 我有一个名为index 的函数 它
  • Struts 2/ Foundation 5 - ModelDriven 类和文件上传

    我是 Java 编程新手 我正在尝试创建一个带有表单等的基本网页来下订单 在参加了几次工作会议后 我决定使用 Struts 2 我还使用 zurb Foundation 5 来实现响应式 UI 我能够创建一个 HTML 网页和一个带有文本字