【问题标题】:Reading input text parameter in Servlet from JSP for fileupload multipart从 JSP 读取 Servlet 中的输入文本参数以进行文件上传多部分
【发布时间】:2013-04-24 07:22:26
【问题描述】:

我正在创建一个 JSP 页面来上传 CSV 或 TXT 文件。文件数据由一些分隔符分隔。我正在使用复选框从用户那里检索,并且基于选中的复选框,我将文本字段值设置为受尊重的复选框值。我还为自定义分隔符添加了一个复选框。当用户选择该复选框时,将显示相同的文本字段(我在其中设置其他复选框的值),并且允许用户输入他们的自定义分隔符。

我还设置了一些其他输入隐藏字段,以将字符串值和 Java 对象从上一个 servlet 传递到下一个 servlet。

由于 JSP 用于文件上传,我不能使用 request.getParameter()。 但我能够阅读文本字段。我的意思是当用户检查除自定义之外的分隔符复选框时,servlet 正在读取文本输入。 但是当用户选中自定义复选框并输入自定义分隔符值时,它无法正确读取文本输入。

这是我的 JSP (FileUpload.jsp) 代码

<form class="form-horizontal" name="fileupload"
            action="GenericFileUpload" onsubmit="return validateFile(this)"
            enctype="multipart/form-data" method="post">
            <div class="control-group">
                <label class="control-label">Please choose delimiter:</label>
                <div class="controls">
                    <ul class="nav nav-list">
                        <li><input type="checkbox" id="," value="," />&nbsp;Comma(,)</li>
                        <li><input type="checkbox" id="|" value="|" />&nbsp;Pipe
                            Delimiter(|)</li>
                        <li><input type="checkbox" name="delimeter" id="custom" />&nbsp;Custom(Specify)</li>
                    </ul>
                </div>
            </div>

            <div id="specify" class="control-group" style="display: none;">
                <label class="control-label" for="delimiter">Please provide
                    the delimiter:</label>
                <div class="controls">
                    <input id="customdelimiter" type="text" name="delimiter"
                        placeholder="Specify Delimiter" />
                </div>
            </div>

            <input type="hidden" name="transportTab"
                value="<c:if test="${transportTab != null}">${transportTab}</c:if>">

            <input type="hidden" name="scheduleData" value="${scheduleData}">

            <div class="control-group">
                <label class="control-label" for="file">Please upload a
                    file:</label>
                <div class="controls">
                    <input type="file" name="file" />
                </div>
            </div>

            <div class="control-group">
                <div class="controls">
                    <button type="submit" class="btn btn-primary">Continue</button>
                </div>
            </div>
        </form>

这是我的 JQuery for Checkbox(我知道更好的方法是使用单选按钮。但我正在使用这个)

<script>
        $(document).ready(function() {
            $('input[type=checkbox]').change(function() {
                if ($(this).is(':checked')) {
                    $('input[type=checkbox]').attr('disabled', true);
                    $(this).attr('disabled', false);
                    var delValue = $(this).val();
                    $('#customdelimiter').attr('value', delValue);

                } else {
                    $('input[type=checkbox]').attr('disabled', false);
                    $('#customdelimiter').attr('value', '');
                }
            });
            $('#custom').change(function() {
                if ($(this).is(':checked')) {
                    $('#customdelimiter').attr('value', '');
                    $('#specify').slideDown("slow");
                } else {
                    $('#specify').slideUp("slow");
                    $('#customdelimiter').attr('value', '');
                }
            });
        });
    </script>

根据选中的复选框值,我将文本框的值设置为该值。

我的 servlet (FileUploadServlet.java) 读取输入值的一部分是,

FileItem fileItem=null;

        if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) 
        {
            try
            {
             List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
             String itemList[]=new String[items.size()];
             for(int i=0;i<items.size();i++)
             {
                 itemList[i]=new String();
             }
             int i=0;
             for (FileItem item : items) {

                    if (item.isFormField()) {
                        // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                       itemList[i]=item.getString();
                       i++;

                    } else {

                        String delimiter=itemList[0];
                     System.out.println("delimiter value is "+delimiter);

                      String transportTab=itemList[1];
                   System.out.println("dataload value is "+transportTab);
                    String  scheduleDataString= itemList[3];

如果我选择自定义,并输入一些值(比如:), 字符串分隔符打开, transportTab 变为: 表示添加自定义时数组索引发生变化。 有没有办法解决这个问题?

【问题讨论】:

  • 数组索引变化在哪里?
  • 在 servlet 中。我的意思是delimiter=itemList[0]; transportTab=itemList[1]; Works选择适当的复选框(获取或|)但选择自定义复选框时,它给定on 987654331 :(假设我给出:作为自定义分隔符)for transporttab字符串。 span>
  • 您已经提到了定界符文本框的 name="delmeter",为什么不检查 java 代码中的字段名称。通过arrayindex删除您找到分隔符和transportTab的代码。
  • 你的意思是request.getParameter("delimiter")
  • 显然不是。下面等我的回答

标签: java jquery jsp servlets multipartform-data


【解决方案1】:

使用数组索引获取字段的值不是一个好主意。您可以使用getFieldName() 获取字段名称并提取值。

getFieldName() 将返回元素name 属性。对于您的情况:

String delimiter =null, transportTab = null;
if("delimiter".equals(item.getFieldName()){
   delimiter = item.getString();
}
if("transportTab".equals(item.getFieldName()){
   transportTab = item.getString();
}

这样,您可以获得所需属性的正确值。

【讨论】:

  • 谢谢。有效。你需要在if的末尾再添加一个括号
  • @ShijuKBabu:if的末尾不用我加括号,是你自己做的:)
  • 是的。我知道。但是将来其他一些人也可能会寻找相同的问题和答案。所以我只说这个。不管怎样,谢谢。它真的帮助了我。我一整天都被困在这个问题上。
猜你喜欢
  • 2011-04-24
  • 2021-09-12
  • 2011-06-04
  • 2014-03-27
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2012-11-01
相关资源
最近更新 更多