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

x7yiwoj4  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(122)

我正在使用<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,我遇到了这个问题。这个问题开始于www.example.com版本之后2.3.4.1
我不想使用hidden属性来传递参数,因为当上传的文件太大时,此参数会丢失。
对此有什么解决办法吗?

flvlnr44

flvlnr441#

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

  • 不要调用**RemoveAction一个实际上是UPLOADING**一个文件的操作。调用它UploadAction,为了逻辑:|
  • it is not a good idea to use Query Parameters in POST requests,它们应该只在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>

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

  • 最后,对于所有兼容HTML5的浏览器(几乎所有浏览器,除了旧版IE和一些移动的),您可以通过在onchange事件中检查其大小来防止上传BEFORE IT IS SENT,如下所示:
<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>
z18hc3ub

z18hc3ub2#

您可以使用通配符Map

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

</action>

并将id作为url本身的一部分传递。例如:删除操作/101
参考http://struts.apache.org/release/2.3.x/docs/wildcard-mappings.html

px9o7tmv

px9o7tmv3#

发生该问题的原因是,org.apache.struts2.components.ServletUrlRenderer.renderUrl()方法找不到动作“removeAction”的动作配置,因为URL(#actionUrl)已包含“.action”后缀。
struts2 s:form documentation上取动作参数:
设置要提交到的操作名称,不带.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>

相关问题