【问题标题】:jsp <html:file> propertyjsp <html:file> 属性
【发布时间】:2012-07-31 01:06:49
【问题描述】:

我需要循环传递来自 jsp 文件属性的值。这是代码

</tr>
                    <%

                    for (int i = 0; i < value.size(); i++) {
                        <html:form action="save" method="post" styleId="update" enctype="multipart/form-data">
                        <input type=hidden id="secfeaturetype" name="secfeaturetype" value="" />

                        <html:file property="testfile" styleId="testfile"/>
                        <input type="button" value="Update" onclick='javascript:check_updatefields()' />
                        </html:form>
                        </td>
                    </tr>

我正在尝试在 javascript 中进行一些验证,它只正确读取第一个文件而不是其余文件。有什么想法吗?

function check_updatefields() {
    var file = jQuery('#testfile').val();
    alert(testfile);
 }

我在这里遗漏了什么吗?谢谢。

【问题讨论】:

  • id 属性应该是唯一的,因此在循环中创建具有相同 id 的元素会给您无效的 html,$("#testfile") 将只选择具有该 id 的第一个元素(除了在某些可能只选择最后一个的浏览器中)。关于您发布的代码,开头的&lt;tr&gt;&lt;td&gt; 标签在哪里?关闭%&gt; 在哪里? for 循环的结尾在哪里?
  • 感谢您的建议。所以,我是否应该每次在循环中生成唯一的 id。for 循环是 java 代码(在 内),其余的是 html 标签( )这是正确的代码
    .....
  • 所以表中的每一行都有自己的表单,当按下更新按钮时,它应该只验证它所属的表单,但是每个表单的验证都是一样的? Java 生成的所有 html 是否仅在初始页面加载时生成,或者您是否使用 Ajax 动态更新页面的一部分?最后(在我发布答案之前),&lt;html:file...&gt; 标签生成的 html 在浏览器中是什么样子的?
  • Html 由 java 在初始页面加载时生成。 标签在浏览器上显示一个“选择文件”按钮,单击该按钮,打开文件浏览器以上传文件。谢谢

标签: java javascript jsp struts-validation struts-html


【解决方案1】:

"id",表示它在你的页面中是唯一的,所以如果有多个,浏览器只会识别第一个元素,所以这里最好使用"class",更正如下:styleClass="测试文件”。 js: jQuery('.testfile').

【讨论】:

  • 谢谢,但是 js: jQuery('.testfile') 返回未定义。 var testfile = jQuery('.testfile') 并将 jsp 代码更改为 .. 我在这里遗漏了什么吗..
  • @User - jQuery('.testfile') 永远不应返回未定义。即使没有元素具有该类,您也应该返回一个“空”jQuery 对象。如果没有找到匹配的元素,那么 .val() 方法将返回 undefined。您是在文档就绪处理程序中和/或在正文的末尾(即,在解析页面之后)运行脚本吗?
  • 是的,我错了。 jQuery('.testfile').val() 返回 undefined 并且 jQuery('.testfile') 什么也不返回。如何在 JQuery 中获取上传的文件值
【解决方案2】:

正如我在上面的评论中提到的,id 属性应该是唯一的,因此在循环中创建具有相同 id 的元素会给您无效的 html,$("#testfile") 将只选择具有该 id 的第一个元素(除了在某些可能只选择最后一个的浏览器中)。

对于重复元素,一个更好的解决方案是给它们一个公共类,并根据它们属于哪个容器来区分它们,或者根据与其他元素的已知关系(如果不是容器)来区分它们。或者,如果包含元素足够独特,则按标记名选择,或者按name 属性选择。您似乎在使用 jQuery,它使这些选项中的任何一个都变得容易。

我认为您可以将代码整理成这样:

<table id="yourTableIdHere">
<% for (int i = 0; i < value.size(); i++) { %>
   <tr><td>
      <html:form action="save" method="post" styleId="update" enctype="multipart/form-data">
         <input type=hidden name="secfeaturetype" value="" />
         <html:file property="testfile" styleClass="testfile"/>
         <input type="button" value="Update" />
      </html:form>
   </td></tr>
<% }%>
</table>

我不太熟悉 Struts html 标签库,但我相信styleClass="testfile" 将呈现属性class="testfile"(如果不是,请替换为呈现class=... 的任何适当的东西)。请注意,我删除了您的内联 onclick=... 属性。您可以使用 jQuery 一步分配这些处理程序:

$(document).ready(function() {
   // assign a click handler to all the Update buttons that are
   // within forms within your table element:
   $('#yourTableIdHere form input[type="button"][value="Update"]').click(function() {
       var $myForm = $(this).parent();  // or $(this).closest('form'),
           $myFileInput = $myForm.find('input.testfile'),
           $myHiddenInput = $myForm.find('input[type="hidden"]');
       alert($myFileInput.val());       // alert value of file input
       $myHiddenInput.val("something"); // set value of hidden
   });
});

在点击处理程序中,this 是被点击的按钮,因此您可以从$(this) 导航到父元素以获取对特定按钮所属表单的引用,并且从该表单您可以使用@987654333 @ 选择当前表单中的文件和隐藏输入。

【讨论】:

  • 非常感谢。我实现了上面的代码,它在 Firefox 中运行良好。但是,在 chrome 中,当我尝试在 java 中检索值时,它仍然只返回第一个值。任何想法..脚本提交 document.getElementById('update').submit();和函数 String inputfile = request.getParameter("filename");只返回第一组值..
  • 只有当你知道一个参数只有一个值时,你才应该使用request.getParameter() method。如果您要提交多个具有相同名称的请求参数,请使用request.getParameterValues() method,它会返回一个包含所有值的数组。 (我不明白为什么浏览器的选择会以某种方式影响这一点。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多