struts2 s:form元素修剪action属性中的s:url参数

我正在使用<s:url>创建一个类似于removeAction.action?id=10的URL,它应该被<s:form>元素中的action属性使用。

这里的问题是当<s:form>转换为<form>元素时,我只能看到action属性值为action="/project/removeAction.action" 。 id参数正在修剪。 我想要的结果是action="/project/removeAction.action?id=10"

<s:url var="actionUrl" action="removeAction" includeContext="false">
  <s:param name="id" value="%{id}" /> 
</s:url>

<s:form action="%{actionUrl}" method="post" enctype="multipart/form-data" >
 <div>
  <s:file name="imgUpload"/>
  <s:submit> upload </submit>
 </div>
</s:form>

最近,我将struts2核心版本升级到2.3.12,并且遇到了这个问题。 此问题在版本2.3.4.1之后开始

并且我不想使用hidden属性来传递参数,因为当文件大小很大时,此参数会丢失。

有没有解决方案?


这意味着隐藏的参数在文件上传时会丢失太大的文件? 它将被重新读取并自动填充...

  • 不要调用RemoveAction实际上文件的操作。 为了逻辑起见,将其UploadAction :|

  • 在POST请求中使用查询参数并不是一个好主意,它们只能在GET请求中使用,可能以REST方式使用......

  • 要防止max multipart size exceeded错误,请将其放在Struts.xml

    <constant name="struts.multipart.maxSize" value="52428800" />
    
  • 要调整fileUpload Interceptor单个文件的最大大小(默认值为2Mb),请将其放在Struts.xml中的Stack definition

    <interceptor-ref name="fileUpload">
        <param name="maximumSize">10485760</param>
    </interceptor-ref>
    

    (在这个例子中,您可以上传最多5个连续10 MB的文件)

  • 最后,对于所有兼容HTML5浏览器(几乎每个人除了较早的IE和某些移动设备),可以通过在onchange事件中检查其大小来防止上传之前的上传,如下所示:

    <s:file name="imgUpload"/ 
            onchange="javascript:checkFileSize(this);" />
    
    <script>
        const maxFileSize = 10485760; // 10MB
    
        function checkFileSize(fileElement){
            if (fileElement.files[0].size > maxFileSize) {
                var mb = (((fileElement.files[0].size) / 1024)/1024).toFixed(2);
                alert("Max file size exceeded: " + mb + " MegaBytes");
                fileElement.value = '';
            }
        }
    </script>
    

  • 也许你可以使用通配符映射

    <action name="removeAction*" class="..">
    
    </action>
    

    并将id作为url的一部分传递给self.eg:removeAction / 101

    请参阅http://struts.apache.org/release/2.3.x/docs/wildcard-mappings.html


    发生该问题是因为org.apache.struts2.components.ServletUrlRenderer.renderUrl()方法找不到操作“removeAction”的操作配置,因为您的URL(#actionUrl)已包含“.action”后缀。

    来自struts2:关于action参数的表单文档:

    将操作名称设置为提交,但没有.action后缀

    解决方案很简单:不要使用<s:url> ,而是:

    <s:form action="removeAction?id=%{id}" method="post" enctype="multipart/form-data">
     <div>
      <s:file name="imgUpload"/>
      <s:submit> upload </s:submit>
     </div>
    </s:form>
    
    链接地址: http://www.djcxy.com/p/41101.html

    上一篇: struts2 s:form element trims the s:url parameter in the action attribute

    下一篇: Servlet get GET and POST's parameters at the doPost method