【自学java笔记#第五十一天#】springmvc day02 文件上传和拦截器

一、springmvc响应数据和结果视图

 二、springmvc实现文件上传

1、传统方式(不跨服务器)上传文件

①提交的表单:

<form action="user/testDay02" method="post" enctype="multipart/form-data">
        文件:<input type="file" name="upload"><br>
        提交:<input type="submit" value="提交">
    </form>

②处理器代码:

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testDay02")
    public String testDay02(HttpServletRequest request) throws Exception {
        System.out.println("testDay02方法执行了...");
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        File file=new File(path);
        if(!file.exists()){
            file.mkdirs();
        }
        DiskFileItemFactory factory=new DiskFileItemFactory();
        ServletFileUpload upload=new ServletFileUpload(factory);
        List<FileItem> fileItems = upload.parseRequest(request);
        for(FileItem fileItem:fileItems){
            if(fileItem.isFormField()){

            }else{
                String name = fileItem.getName();
                file=new File(file,name);
                fileItem.write(file);
                fileItem.delete();
            }
        }
        return "success";
    }
}

③注意事项:

a.表单enctype属性取值必须是multipart/form-data

b.表单method属性取值必须是post

c.必须有一个文件选择域,即type的类型为file

2、Springmvc(不跨服务器)实现文件上传:

①提交的表单:

<form action="user/testDay02" method="post" enctype="multipart/form-data">
        文件:<input type="file" name="upload"><br>
        提交:<input type="submit" value="提交">
    </form>

②处理器代码:

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testDay02")
    public String testDay02(MultipartFile upload) throws Exception {
        System.out.println("testDay02方法执行了...");
        String path=request.getSession().getServletContext().getRealPath("/uploads");
        File file=new File(path);
        if(!file.exists()){
            file.mkdirs();
        }
        String filename = upload.getOriginalFilename();
        file=new File(path,filename);
        upload.transferTo(file);
        return "success";
    }
}

③配置文件解析器:

<!--配置文件解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"></property>
    </bean>

④注意事项:

文件解析器的id值是特定的,改成其他样式,就无法完成参数绑定。

3、Springmvc(跨服务器)实现文件上传:

①提交的表单:

<form action="user/testDay02" method="post" enctype="multipart/form-data">
        文件:<input type="file" name="upload"><br>
        提交:<input type="submit" value="提交">
    </form>

②应用服务器的处理器代码:

@Controller
@RequestMapping("/user")
public class FileUploadController {

@RequestMapping(value = "/fileUpload1") public String fileUpload1(MultipartFile upload) throws Exception { //定义文件服务器的请求路径 String path="http://localhost:8090/springmvctest2_war_exploded/uploads/"; //拿到文件的名称 String fileName = upload.getOriginalFilename(); //生成文件名的唯一标识码 String randomName = UUID.randomUUID().toString(); fileName=randomName+fileName; //创建客户端对象 Client client=Client.create(); //连接图片服务器 WebResource webResource = client.resource(path + fileName); //上传文件 webResource.put(upload.getBytes()); return "success"; } }

③配置文件解析器:

<!--配置文件解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"></property>
    </bean>

④注意事项:

a.文件解析器的id值是特定的,改成其他样式,就无法完成参数绑定。

b.文件服务器的目录结构一定要是完整的,否则Tomcat无法找到上传路径,会报404错误。

c.两个模块都要以带后缀expload的形式部署。

三、springmvc的异常处理

在实际开发中,如果持久层和业务层出现异常,是可以往上层抛出异常的。但是对于异常,我们不能放之不管。所以当它被抛到前端控制器,就需要进行处理。否则错误信息直接显示在页面上,会带给客户不好的体验感。一般按照以下步骤进行异常处理:

1、编写自定义异常类:

public class MyException extends Exception{
    private String message;

    public MyException(String message) {
        this.message=message;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2、编写异常处理器(必须要实现HandlerExceptionResolver接口):

public class ExceptionHandler implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        MyException myException=null;
        if(ex instanceof MyException){
            myException=(MyException)ex;
        }else{
           ex=new MyException("请联系管理员");
        }
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("message",myException.getMessage());
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

3、配置异常处理器

<bean id="myException" class="com.lulu.ExceptionHandler"></bean>

四、springmvc中的拦截器

springmvc的拦截器只对处理器中的方法起作用,并不能像过滤器一样拦截资源。使用拦截器的步骤如下:

1、编写拦截器类

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
        System.out.println("处理器前面的方法");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("处理器后面的方法");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("所有方法后面的方法");
    }
}

2、配置拦截器

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean id="myInterceptor" class="com.lulu.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

猜你喜欢

转载自www.cnblogs.com/yizhinailu/p/12953714.html