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

时间:2013-04-11 19:41:58

标签: jsp parameters struts2

我正在使用<s:url>创建removeAction.action?id=10之类的网址,该网址应由<s:form>元素中的action属性使用。

此处的问题是,当<s:form>转换为<form>元素时,我只能将动作属性值视为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属性来传递参数,因为当文件大小很大时,此参数会丢失。

有没有解决方案?

3 个答案:

答案 0 :(得分:0)

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

  • 不要将 RemoveAction 称为实际上传文件的操作。 为了逻辑起见,将其称为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的{​​{1}}中:

    Stack definition

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

  • 最后,对于所有符合<interceptor-ref name="fileUpload"> <param name="maximumSize">10485760</param> </interceptor-ref> 标准的浏览器(除了旧IE和某些移动设备之外的几乎所有浏览器),您可以通过在{{1}中检查其大小来阻止上传之前的上传像这样的事件:

    HTML5

答案 1 :(得分:0)

可能你可以使用通配符映射

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

</action>

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

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

答案 2 :(得分:-1)

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

来自struts2 s:form documentation的动作参数:

  

设置要提交的操作名称,不带.action suffix

解决方案非常简单:不要使用<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>