java - 当使用 enctype="multipart/form-data" 属性时 jsp:getProperty null
问题描述
根据Sending additional data with multipart,request.getParameter;
不能使用 with enctype="multipart/form-data"
。在 process.jsp,我没有使用request.getParameter
. 但jsp:getProperty
返回空值。删除enctype="multipart/form-data"
工作正常。我想知道 enctype="multipart/form-data" 效果如何jsp:setProperty and jsp:getProperty
。它们是如何连接的?我知道jsp:setProperty
不是更喜欢的方式。当我使用旧代码时,没有使用框架或没有使用 MVC。但我必须使用 servlet 3.0 和 tomcat 8.5 运行。enctype="multipart/form-data"
在使用Jsp 到 Jsp时,还有其他方法可以传递数据吗?
表单.jsp
<!-- <form action="process.jsp" method="post" enctype="application/x-www-form-urlencoded"> -->
<!-- <form action="process.jsp" method="post"> -->
<form action="process.jsp" method="post" enctype="multipart/form-data">
Name:<input type="text" name="name"><br>
Password:<input type="password" name="password"><br>
Email:<input type="text" name="email"><br>
File:<input type="file" name="fileName"><br>
<hr>
<input type="submit" value="register">
</form>
进程.jsp
<jsp:useBean id="bean" class="dao.User" scope="page">
<jsp:setProperty property="*" name="bean"/>
</jsp:useBean>
Record:<br>
<jsp:getProperty property="name" name="bean"/><br>
<jsp:getProperty property="password" name="bean"/><br>
<jsp:getProperty property="email" name="bean" /><br>
用户.java
public class User {
private String name;
private String password;
private String email;
private String fileName;
// getter and setter...
}
解决方案
您可以使用 jsp 将文件上传到具有其他输入字段的服务器。
前任。索引.jsp
<form action="upload.jsp" method="post" enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br>
<input type="text" name="name" />
<br />
<input type="submit" value="Upload File" />
</form>
上传.jsp
<%@ page import="java.io.*,java.util.*, javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="org.apache.commons.io.output.*"%>
<html>
<head>
</head>
<body>
<%
File file;
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;
String filePath = "D:/";
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") >= 0)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(maxMemSize);
factory.setRepository(new File("c:\\temp"));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(maxFileSize);
try {
List fileItems = upload.parseRequest(request);
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<body>");
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (!fi.isFormField()) {
String fieldName = fi.getFieldName();
String fileName = fi.getName();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
file = new File(filePath + fileName);
//fi.write(file);
out.println("Uploaded Filename: " + filePath + fileName + "<br>");
}else{
System.out.println(fi.getFieldName() +":"+fi.getString());
}
}
out.println("</body>");
out.println("</html>");
} catch (Exception ex) {
System.out.println(ex);
}
} else {
out.println("<html>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
}
%>
</body>
</html>
您需要在 servlet jar 中包含 jar 文件 commons-fileupload。
推荐阅读
- c# - 如何在单个代理类中添加多个服务引用
- spring - 我想通过使用 cron 表达式设置每 24 小时安排一次任务
- typescript - 是否可以将一种类型的字段混合到另一种类型中?
- reactjs - 在 setState 之后反应不更新渲染
- odoo - 父子和它们之间的过滤
- node.js - 接近 JSON 数据返回“未定义”
- c++ - 为什么我不能使用 for 循环更新像素数组?
- mysql - 在 sql 查询中使用间隔替换
- html - 第二个 tr 标签显示在第一个 tr 标签上方
- selenium-chromedriver - appium chrome borwser的文件下载权限