5.映射请求-映射动态资源-**获取参数
浏览器传递的参数主要包括两类,①普通的请求传参,只传字符串,使用req.getParameter()方法
②文件上传时的传参,传递两种参数:普通参数(字符串)和文件参数;通过fileupload文件上传组件接收参数
注意,浏览器传递参数时可能存在同名情况(例如复选框)**
private void handleDynamicResource(MappingInfo info,HttpServletRequest request,HttpServletResponse response) {
//获得参数
Map<String,Object> paramMap=receiveParams(request);
//处理参数
//调用mappinginfo中的对象的方法,传递参数
}
/*
接受请求传递的参数,将参数处理后装入map
map.key就是请求传递参数key
map.value可能是一个String[] 也可以是一个文件[]--Object表示
*/
private Map<String, Object> receiveParams(HttpServletRequest request) {
Map<String, Object> paramMap = new HashMap<>();
//参数有两种可能(普通请求、文件上传请求)
//普通请求按照文件上传方式处理,会抛出异常(选择这种为突破口)
//文件上传请求按照普通请求处理会得不到参数
try {
//假设是文件上传方式传递参数
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> fis = upload.parseRequest(request);//如果不是文件上传请求会抛出异常
for (FileItem fileItem : fis) {
//拿到了一个参数
if (fileItem.isFormField()) {
//是一个普通参数
String key = fileItem.getFieldName();
String value = fileItem.getString(multipartEncoding);
String[] values=(String[]) paramMap.get(key);
if(values==null){
values=new String[]{value};
}else {
values= Arrays.copyOf(values,values.length+1);
values[values.length-1]=value;
}
paramMap.put(key,values);
}else {
//是一个文件参数
String key=fileItem.getFieldName();
String fileName=fileItem.getName();//文件名
long size=fileItem.getSize();//文件大小
String contentType=fileItem.getContentType();//文件类型
InputStream is= fileItem.getInputStream();//文件内容
MultipartFile multipartFile=new MultipartFile(fileName,size,contentType,is);
MultipartFile[] mf=(MultipartFile[]) paramMap.get(key);
if(mf==null){
mf=new MultipartFile[]{multipartFile};
}else {
mf=Arrays.copyOf(mf,mf.length+1);
mf[mf.length-1]=multipartFile;
}
paramMap.put(key,mf);
}
}
} catch (FileUploadException | UnsupportedEncodingException e) {
//出现异常表示不是文件上传请求方式,按照普通请求方式处理
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String[] values = request.getParameterValues(name);
paramMap.put(name, values);
}
} catch (IOException ioException) {
ioException.printStackTrace();
}
return paramMap;
}
//读取xml中<multipart-encoding>信息
private void parseMultipartEncodingElement(Document document) {
//按照标签的嵌套规则,找到需要的所有mapping标记
Element multipartEncodingElement = (Element) document.selectSingleNode("mvc/multipart-encoding");
if(multipartEncodingElement==null){
return;
}
multipartEncoding = multipartEncodingElement.getText();
}
package web;
import java.io.InputStream;
/**
* 存储文件上传时的文件参数信息
*/
public class MultipartFile {
private String fileName;
private long size;
private String contentType;
private InputStream inputStream;
public MultipartFile() {}
public MultipartFile(String fileName, long size, String contentType, InputStream inputStream) {
this.fileName = fileName;
this.size = size;
this.contentType = contentType;
this.inputStream = inputStream;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
}