5.映射请求-映射动态资源-**获取参数
浏览器传递的参数主要包括两类,①普通的请求传参,只传字符串,使用req.getParameter()方法
②文件上传时的传参,传递两种参数:普通参数(字符串)和文件参数;通过fileupload文件上传组件接收参数
注意,浏览器传递参数时可能存在同名情况(例如复选框)**
private void handleDynamicResource(MappingInfo info,HttpServletRequest request,HttpServletResponse response) {//获得参数Map<String,Object> paramMap=receiveParams(request);//处理参数//调用mappinginfo中的对象的方法,传递参数}
/*接受请求传递的参数,将参数处理后装入mapmap.key就是请求传递参数keymap.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;}}
