我有一个包含几个字段的多部分表单,我需要将这些值发送到jsp文件。
这是多部分形式,这是我发送参数的方式(非多部分,它完美运行)
<div class="createform">
<form enctype="multipart/form-data" name="create" action="createcompetition.jsp" method="post">
<ul>
<li>
<label for="name">Competition Name</label>
<input type="text" id="name" name="name" placeholder="name" required>
</li>
<li>
<label for="img">Picture</label>
<input type="file" name="img" id ="img" multiple>
</li>
<li>
<label for="startdate">Start Date</label>
<input type="date" id="startdate" name="startdate">
</li>
<li>
<label for="deadline">Deadline</label>
<input type="date" id="deadline" name="deadline">
</li>
<li>
<label for="website">Website URL</label>
<input type="url" id="website" name="website">
</li>
<li>
<label for="termsnconds">Terms & Conds</label>
<textarea id="termsnconds" name="termsnconds" cols="28" rows="5" ></textarea>
</li>
<li>
<input type="submit" value="Create">
<input type="hidden" name="competiname" id="competiname" value="document.getElementById('name').value;" />
<input type="hidden" name="competistartdate" id="competistartdate" value="document.getElementById('startdate').value;" />
<input type="hidden" name="competideadline" id="competideadline" value="document.getElementById('deadline').value;" />
<input type="hidden" name="competiwebsite" id="competiwebsite" value="document.getElementById('website').value;" />
<input type="hidden" name="competitermsnconds" id="competitermsnconds" value="document.getElementById('termsnconds').value;" />
</li>
</ul>
</form>
</div>
这是JSP页面,必须接收这些参数才能在第二个INSERT INTO
中使用它们。
<%
//Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
//Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
//Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
//Parse the request
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) {
//rocessFormField(item);
} else {
item.write(new File("C:\\indigo\\eclipse\\workspace\\JSPyDB\\WebContent\\images\\competitions\\salida.png"));
}
}
//File.createTempFile(arg0, arg1)
%>
<sql:transaction dataSource="jdbc/PuzzleDB">
<sql:update>
INSERT INTO picture_competition (name, url) VALUES (?, ?)
<sql:param value="salida.png" />
<sql:param value="/competitions/" />
</sql:update>
<sql:query var="pictures">
SELECT id FROM picture_competition WHERE name=?
<sql:param value="salida.png" />
</sql:query>
<c:if test="${!empty pictures.rows}">
OK
<c:forEach var="picture" items="${pictures.rows}">
<sql:update>
INSERT INTO Competition (name, id_picture, id_sponsor, start_date, deadline, websiteURL, termsnconds) VALUES (?, ?, ?, ?, ?, ?, ?);
<sql:param value="${param.competiname}" />
<sql:param value="${picture.id}" />
<sql:param value="${sessionScope.userid}" />
<sql:param value="${param.competistartdate}" />
<sql:param value="${param.competideadline}" />
<sql:param value="${param.competiwebsite}" />
<sql:param value="${param.competitermsnconds}" />
</sql:update>
</c:forEach>
</c:if>
</sql:transaction>
但参数${param.name}
是null
以及其他参数。
我做错了什么?
答案 0 :(得分:0)
您可以在JSP中使用MultipartData时执行以下操作。
1)声明web.xml webapp版本3.0
2)使用@MultiPartConfig配置控制器
3)将JSP中的Java代码移动到控制器servlet中
4)如果你想在servlet中使用
Part mypart=request.getPart("Your Name Here")
mypart.getInputStream();
这样您就可以访问从JSP到servlet的零件数据。
如果您不使用servlet 3.0及更高版本,则可以使用apache commonsfileupload
答案 1 :(得分:0)
我尝试使用getPart()
,但它无效。我转到了oracle documentation,它说我应该使用getPart()
来上传文件,但是要将request.getParameter()
用于其他输入字段。
有效!
我添加了这段代码:
final String name = request.getParameter("name");
final String startdate = request.getParameter("startdate");
final String deadline = request.getParameter("deadline");
final String website = request.getParameter("website");
final String termsnconds = request.getParameter("termsnconds");
这是在INSERT TO
<c:forEach var="picture" items="${pictures.rows}">
<c:set var="competiname" value="<%= name %>"></c:set>
<c:set var="competistartdate" value="<%= startdate %>"></c:set>
<c:set var="competideadline" value="<%= deadline %>"></c:set>
<c:set var="competiwebsite" value="<%= website %>"></c:set>
<c:set var="competitermsnconds" value="<%= termsnconds %>"></c:set>
<sql:update>
INSERT INTO Competition (name, id_picture, id_sponsor, start_date, deadline, websiteURL, termsnconds) VALUES (?, ?, ?, ?, ?, ?, ?);
<sql:param value="${competiname}" />
<sql:param value="${picture.id}" />
<sql:param value="${sessionScope.userid}" />
<sql:param value="${competistartdate}" />
<sql:param value="${competideadline}" />
<sql:param value="${competiwebsite}" />
<sql:param value="${competitermsnconds}" />
</sql:update>
</c:forEach>
但是我遇到了一个新问题,type="date"
的输入会返回null ...我要检查一下,然后看看我是否能得到一些东西。
答案 2 :(得分:0)
我找到了一种方法,现在它完美无缺。
显然当我upload.parseRequest
时,multipart-form
的所有参数都在里面,但我只是获取了上传的文件。
为了获得其余的参数,我必须首先将它们插入到Iterator
对象中,然后通过表单中先前给定的名称获取它们中的每一个。
<%
String name = null ;
String startdate = null;
String deadline = null;
String website = null;
String termsnconds = null;
//Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
//Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
//Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
//Parse the request
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) {
InputStream input = item.getInputStream();
if(item.getFieldName().equals("name")){
byte[] str = new byte[input.available()];
input.read(str);
name = new String(str,"UTF8");
}
if(item.getFieldName().equals("startdate")){
byte[] str = new byte[input.available()];
input.read(str);
startdate = new String(str,"UTF8");
}
if(item.getFieldName().equals("deadline")){
byte[] str = new byte[input.available()];
input.read(str);
deadline = new String(str,"UTF8");
}
if(item.getFieldName().equals("website")){
byte[] str = new byte[input.available()];
input.read(str);
website = new String(str,"UTF8");
}
if(item.getFieldName().equals("termsnconds")){
byte[] str = new byte[input.available()];
input.read(str);
termsnconds = new String(str,"UTF8");
}
} else {
item.write(new File("C:\\indigo\\eclipse\\workspace\\JSPyDB\\WebContent\\images\\competitions\\salida.png"));
}
}
//File.createTempFile(arg0, arg1)
%>
<sql:transaction dataSource="jdbc/PuzzleDB">
<sql:update>
INSERT INTO picture_competition (name, url) VALUES (?, ?)
<sql:param value="salida.png" />
<sql:param value="/competitions/" />
</sql:update>
<sql:query var="pictures">
SELECT id FROM picture_competition WHERE name=?
<sql:param value="salida.png" />
</sql:query>
<c:if test="${!empty pictures.rows}">
<c:forEach var="picture" items="${pictures.rows}">
<c:set var="competiname" value="<%= name %>"></c:set>
<c:set var="competistartdate" value="<%= startdate %>"></c:set>
<c:set var="competideadline" value="<%= deadline %>"></c:set>
<c:set var="competiwebsite" value="<%= website %>"></c:set>
<c:set var="competitermsnconds" value="<%= termsnconds %>"></c:set>
<sql:update>
INSERT INTO Competition (name, id_picture, id_sponsor, start_date, deadline, websiteURL, termsnconds) VALUES (?, ?, ?, ?, ?, ?, ?);
<sql:param value="${competiname}" />
<sql:param value="${picture.id}" />
<sql:param value="${sessionScope.userid}" />
<sql:param value="${competistartdate}" />
<sql:param value="${competideadline}" />
<sql:param value="${competiwebsite}" />
<sql:param value="${competitermsnconds}" />
</sql:update>
</c:forEach>
</c:if>
</sql:transaction>