从JSP中读取Servlet中的输入文本参数,用于fileupload multipart

时间:2013-04-24 07:22:27

标签: java jquery jsp servlets multipartform-data

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

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

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

这是我的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>

这是我的Checkbox的JQuery(我知道更好的方法是使用无线电按钮。但我正在使用它)

<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>

根据所选的复选框值,我将textbox的值设置为该值。

我读取输入值的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];

如果我选择自定义,并输入一些值(比如:), 字符串分隔符bcomes on, transportTab变为: 表示添加自定义时的数组索引更改。 无论如何要解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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