spring mvc入门笔记(二)

响应数据和结果视图
----controller 方法返回字符串String 
            响应数据可以借用request或者Model对象
        
            结果视图:
                可以指定逻辑视图名,“success”通过视图解析器解析为物理视图地址。 
                指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp 
            跳转方式:
                controller 方法在提供了 String 类型的返回值之后,默认就是请求转发
                如果用 return "forward:/WEB-INF/pages/success.jsp";:则路径必须写成实际视图 url
                使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法
                return "redirect:/testReturnModelAndView"; 它相当于“response.sendRedirect(url)”。
                需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不 能写在 WEB-INF 目录中,否则无法找到。 
        ----controller 方法返回void
             Servlet 原始 API 可以作为控制器中方法的参数
             response.sendRedirect("testRetrunString") //注意这里没有/加了就等于根路径
             response.sendRedirect("。。/testRetrunString")//这种方式是代表的上一级预防有上一级
            response.sendRedirect(request.getContextPath()+"/redirect.jsp");//个人感觉这样重定向更好
        ----controller 方法返回ModelAndView 
                    public ModelAndView testModelAndView() {
                ModelAndView mv = new ModelAndView();
                mv.addObject("user", user);
                mv.setViewName("success");//逻辑视图默认请求转发
                                            //可以实际路径都行"forward:/WEB-INF/pages/success.jsp"
                                                            "redirect:/testReturnModelAndView"
                return mv;
                
                    }

SpringMVC 实现文件上传
文件上传的必要前提
A form 表单的 enctype 取值必须是: multipart/form-data
(默认值是:application/x-www-form-urlencoded)
enctype:是表单请求正文的类型
B method 属性取值必须是 Post
C 提供一个文件选择域<input type=”file” />
文件上传的原理分析
当 form 表单的 enctype 取值不是默认值后, request.getParameter()将失效。
enctype=”application/x-www-form-urlencoded”时, form 表单的正文内容是:
key=value&key=value&key=value
当 form 表单的 enctype 取值为 Mutilpart/form-data 时,请求正文内容就变成:
每一部分都是 MIME 类型描述的正文
-----------------------------7de1a433602ac 分界符
Content-Disposition: form-data; name="userName" 协议头
aaa 协议的正文
-----------------------------7de1a433602ac
Content-Disposition: form-data; name="file";
filename="C:\Users\zhy\Desktop\fileupload_demofile\b.txt"
Content-Type: text/plain 协议的类型(MIME 类型)
传统文件上传部分代码

public String testUpload1(HttpServletRequest request,HttpServletResponse response) throws Exception {
                String realPath = request.getSession().getServletContext().getRealPath("/upload");
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                String dateTime = dateFormat.format(new Date());
                File file = new File(realPath,dateTime);
                if(!file.exists()) {
                    file.mkdirs();
                }
                    
                boolean b = ServletFileUpload.isMultipartContent(request);
                if(!b) {
                    throw new Exception("当前文件不支持上传");
                }
                DiskFileItemFactory factory = new DiskFileItemFactory();
                
                    ServletFileUpload fileUpload = new ServletFileUpload(factory);
                    List<FileItem> list = fileUpload.parseRequest(request);
                    for (FileItem fileItem : list) {
                        String fileName = fileItem.getFieldName();
                        String uuid = UUID.randomUUID().toString();
                        fileName=fileName+uuid;
                        fileItem.write(new File(file,fileName));
                        fileItem.delete();
                    }
                    return "success";
                    
                }

----MVC文件上传
    注意事项
    1<form>表单的文件上传name属性和MultipartFile对象的名称一摸一样
        MultipartFile : springMVC提供的对象
     *         包含了文件上传中的所有信息
     *         (字节流,文件名称)
    2.需要配置文件解析器
     *         <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
                <!-- 
                    设置最大上传的大小:
                    1M
             -->
        <property name="maxUploadSize" value="1000000"></property>
    </bean>
    <form action="${pageContext.request.contextPath }/MVCupload/testUpload2" method="post" enctype="multipart/form-data">
        <input type="file" name="multiPartFile"/><br/>
    
        <input type="submit" value="上传"/>
    </form>
    public String testUpload2(HttpServletRequest request,MultipartFile multiPartFile) throws Exception {
    String realPath = request.getSession().getServletContext().getRealPath("/upload2");
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    String dateTime = dateFormat.format(new Date());
    File file = new File(realPath,dateTime);
    if(!file.exists()) {
        file.mkdirs();
    }
    System.out.println("mvc上传");    
    String fileName = multiPartFile.getOriginalFilename();

    String uuid = UUID.randomUUID().toString();
    fileName=fileName+uuid;
    multiPartFile.transferTo(new File(file,fileName));
        return "success";
    

----跨服务器上传
        接收文件的目标服务器可以支持写入操作
          
    1<init-param>
      <param-name>readOnly</param-name>
      <param-value>false</param-value>
    </init-param>
    2String fileName = multiPartFile.getOriginalFilename();

    3String uuid = UUID.randomUUID().toString();
    4fileName=fileName+uuid;
    //5.创建 sun 公司提供的 jersey 包中的 Client 对象   Client client = Client.create(); 
  //6.指定上传文件的地址,该地址是 web 路径   WebResource resource = client.resource(FILESERVERURL+fileName);   
  //7.实现上传   String result = resource.put(String.class,multiPartFile.getBytes());  
        return "success"; 

猜你喜欢

转载自blog.csdn.net/minecodelife/article/details/81122062