5.映射请求-映射动态资源-**获取参数
    浏览器传递的参数主要包括两类,①普通的请求传参,只传字符串,使用req.getParameter()方法
    ②文件上传时的传参,传递两种参数:普通参数(字符串)和文件参数;通过fileupload文件上传组件接收参数
    注意,浏览器传递参数时可能存在同名情况(例如复选框)**

    1. private void handleDynamicResource(MappingInfo info,HttpServletRequest request,HttpServletResponse response) {
    2. //获得参数
    3. Map<String,Object> paramMap=receiveParams(request);
    4. //处理参数
    5. //调用mappinginfo中的对象的方法,传递参数
    6. }
    1. /*
    2. 接受请求传递的参数,将参数处理后装入map
    3. map.key就是请求传递参数key
    4. map.value可能是一个String[] 也可以是一个文件[]--Object表示
    5. */
    6. private Map<String, Object> receiveParams(HttpServletRequest request) {
    7. Map<String, Object> paramMap = new HashMap<>();
    8. //参数有两种可能(普通请求、文件上传请求)
    9. //普通请求按照文件上传方式处理,会抛出异常(选择这种为突破口)
    10. //文件上传请求按照普通请求处理会得不到参数
    11. try {
    12. //假设是文件上传方式传递参数
    13. DiskFileItemFactory factory = new DiskFileItemFactory();
    14. ServletFileUpload upload = new ServletFileUpload(factory);
    15. List<FileItem> fis = upload.parseRequest(request);//如果不是文件上传请求会抛出异常
    16. for (FileItem fileItem : fis) {
    17. //拿到了一个参数
    18. if (fileItem.isFormField()) {
    19. //是一个普通参数
    20. String key = fileItem.getFieldName();
    21. String value = fileItem.getString(multipartEncoding);
    22. String[] values=(String[]) paramMap.get(key);
    23. if(values==null){
    24. values=new String[]{value};
    25. }else {
    26. values= Arrays.copyOf(values,values.length+1);
    27. values[values.length-1]=value;
    28. }
    29. paramMap.put(key,values);
    30. }else {
    31. //是一个文件参数
    32. String key=fileItem.getFieldName();
    33. String fileName=fileItem.getName();//文件名
    34. long size=fileItem.getSize();//文件大小
    35. String contentType=fileItem.getContentType();//文件类型
    36. InputStream is= fileItem.getInputStream();//文件内容
    37. MultipartFile multipartFile=new MultipartFile(fileName,size,contentType,is);
    38. MultipartFile[] mf=(MultipartFile[]) paramMap.get(key);
    39. if(mf==null){
    40. mf=new MultipartFile[]{multipartFile};
    41. }else {
    42. mf=Arrays.copyOf(mf,mf.length+1);
    43. mf[mf.length-1]=multipartFile;
    44. }
    45. paramMap.put(key,mf);
    46. }
    47. }
    48. } catch (FileUploadException | UnsupportedEncodingException e) {
    49. //出现异常表示不是文件上传请求方式,按照普通请求方式处理
    50. Enumeration<String> names = request.getParameterNames();
    51. while (names.hasMoreElements()) {
    52. String name = names.nextElement();
    53. String[] values = request.getParameterValues(name);
    54. paramMap.put(name, values);
    55. }
    56. } catch (IOException ioException) {
    57. ioException.printStackTrace();
    58. }
    59. return paramMap;
    60. }

    image.png
    image.png

    1. //读取xml中<multipart-encoding>信息
    2. private void parseMultipartEncodingElement(Document document) {
    3. //按照标签的嵌套规则,找到需要的所有mapping标记
    4. Element multipartEncodingElement = (Element) document.selectSingleNode("mvc/multipart-encoding");
    5. if(multipartEncodingElement==null){
    6. return;
    7. }
    8. multipartEncoding = multipartEncodingElement.getText();
    9. }
    1. package web;
    2. import java.io.InputStream;
    3. /**
    4. * 存储文件上传时的文件参数信息
    5. */
    6. public class MultipartFile {
    7. private String fileName;
    8. private long size;
    9. private String contentType;
    10. private InputStream inputStream;
    11. public MultipartFile() {}
    12. public MultipartFile(String fileName, long size, String contentType, InputStream inputStream) {
    13. this.fileName = fileName;
    14. this.size = size;
    15. this.contentType = contentType;
    16. this.inputStream = inputStream;
    17. }
    18. public String getFileName() {
    19. return fileName;
    20. }
    21. public void setFileName(String fileName) {
    22. this.fileName = fileName;
    23. }
    24. public long getSize() {
    25. return size;
    26. }
    27. public void setSize(long size) {
    28. this.size = size;
    29. }
    30. public String getContentType() {
    31. return contentType;
    32. }
    33. public void setContentType(String contentType) {
    34. this.contentType = contentType;
    35. }
    36. public InputStream getInputStream() {
    37. return inputStream;
    38. }
    39. public void setInputStream(InputStream inputStream) {
    40. this.inputStream = inputStream;
    41. }
    42. }