JavaWeb笔记(29)-SpringMVC深入

  1. SpringMVC的响应数据
1. 返回值为字符串:
    * 无关键字:表示跳转到对应的jsp页面,通过视图解析器查找相应资源
    * 关键字:
        forward:/WEB-INF/pages/success.jsp
        redirect:/index.jsp
2. 返回值为void:
    表示默认跳转到该RequestMapping中path属性值的jsp页面
    * 参数列表传入HttpServletRequest和HttpServletResponse对象,然后调用重定向或者转发方法
        request转发需要手动写全资源文件在本项目的路径
        response重定向构建路径时需要加上request》getContextPath()前缀
3. 返回值为ModelAndView对象:
    ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
    * 在方法中创建一个ModelAndView对象
    * 使用ModelAndView对象的addObject方法可以将属性和值存入到request域中
    * 使用ModelAndView对象的setViewName方法可以跳转到指定页面(通过视图解析器来查找指定页面)
  1. SpringMVC实现异步请求
1. 出现问题:
    a. DispatcherServlet控制器拦截了所有请求,此时需要释放关于静态资源的请求
        在/resource/springmvc.xml配置中前端控制器,相应静态资源不拦截
        <!-- 设置静态资源不过滤 -->
        <mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
        <mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
        <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
2. 加载jQuery文件
3. 导入jar包,用于解析json数据
    ackson-databind.jar
    jackson-core.jar
    ackson-annotations.jar
4. 使用@RequestBody注解可以自动调用相应jar包将json字符串封装到Bean对象中
5. 使用@ResopnseBody注解可以自动调用相应jar包将Bean对象转化为json格式字符串
6. 使用:
    //页面加载后发送异步请求
    $(function(){
        // 绑定点击事件
        $("#btn").click(function(){
            $.ajax({
                url:"user/testJson",
                contentType:"application/json;charset=UTF-8",
                data:'{"addressName":"哈哈","addressNum":100}',
                dataType:"json",
                type:"post",
                success:function(data){
                    alert(data);
                    alert(data.addressName);
                }
            });
        });
    });
    //在方法中使用注解自动调用相应jar包来转化
    @RequestMapping("/testJson")
    public @ResponseBody Address testJson(@RequestBody Address address) {
        System.out.println(address);
        //可以修改对象属性
        address.setAddressName("上海");
        return address;
    }
  1. SpringMVC实现文件管理
1. 前提:
    a. enctype属性:表单请求正文的类型
        form表单的enctype取值必须是:multipart/form-data
        默认值为:application/x-www-form-urlencoded
    b. method属性:表单提交方式
        必须为post(可以上传不限制大小的文件)
    c. 提供一个文件选择域:
        <input type="file" />
2. 导入相关jar包
    commons-fileupload.jar
    commons-io.jar
3. 传统方式实现文件上传:
    @Controller
    @RequestMapping(value="/fileupload")
    public String fileupload(HttpServletRequest request) throws Exception {
        // 先获取到要上传的文件目录
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        // 创建File对象,一会向该路径下上传文件
        File file = new File(path);
        // 判断路径是否存在,如果不存在,创建该路径
        if(!file.exists()) {
            file.mkdirs();
        }
        //存在该路径时,创建磁盘文件项工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        // 解析request对象
        List<FileItem> list = fileUpload.parseRequest(request);
        // 遍历
        for (FileItem fileItem : list) {
            // 判断文件项是普通字段,还是上传的文件
            if(fileItem.isFormField()) {
            }else {
                // 上传文件项
                // 获取到上传文件的名称
                String filename = fileItem.getName();
                // 上传文件
                fileItem.write(new File(file, filename));
                // 删除临时文件
                fileItem.delete();
            }
        }
        return "success";
    }
4. 基于SpringMVC框架实现文件上传
    * 配置好文件解析器后,不再需要自己去解析request域来获取文件对象
    * 文件解析器配置的id值必须为multipartResolver
    * 直接在对应的方法参数中传入MultipartFile对象作为参数,框架自动封装文件对象到该变量中去
    * 此时,要求表单中file类型的input标签其name属性值必须与MultipartFile类型变量名相同
    /resource/springmvc.xml
    <!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/>
    </bean>
    
    /Upload.java
    @RequestMapping(value="/fileupload2")
    public String fileupload2(HttpServletRequest request,MultipartFile upload) throws Exception {
        System.out.println("SpringMVC方式的文件上传...");
        // 先获取到要上传的文件目录
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        // 创建File对象,一会向该路径下上传文件
        File file = new File(path);
        // 判断路径是否存在,如果不存在,创建该路径
        if(!file.exists()) {
            file.mkdirs();
        }
        // 获取到上传文件的名称
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        // 把文件的名称唯一化
        filename = uuid+"_"+filename;
        // 上传文件
        upload.transferTo(new File(file,filename));
        return "success";
    }
  1. springmvc跨服务器方式文件上传
1. 实际应用过程中,可能需要不同功能的服务器:
    * 应用服务器:部署应用
    * 数据库服务器:运行数据库
    * 缓存和消息服务器:处理大并发访问的缓存和消息
    * 文件服务器:存储用户上传的文件
2. 跨服务器文件上传相关jar包:
    jersey-client.jar
    jersey-core.jar
3. 使用步骤:
    * 跨服务器上传不再需要创建本地文件夹,但是需要指明文件服务器的存储路径(url)
    * 由应用服务器获取到upload文件后,向文件服务器上传
        a. 创建客户端对象
        b. 和文件服务器建立连接
        c. 上传文件
    @RequestMapping("/fileupload")
    public String fileupload3(MultipartFile upload) throws Exception {
        System.out.println("SpringMVC跨服务器方式的文件上传...");
        // 定义图片服务器的请求路径
        String path = "http://localhost:9090/fileService/uploads/";
        // 获取到上传文件的名称
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        // 把文件的名称唯一化
        filename = uuid+"_"+filename;
        // 向图片服务器上传文件
        // 创建客户端对象
        Client client = Client.create();
        // 连接文件服务器
        WebResource webResource = client.resource(path+filename);
        // 上传文件的字节形式
        webResource.put(upload.getBytes());
        return "success";
    }
  1. SpringMVC中的异常处理
1. 由Controller处理器将异常抛给前端控制器后,可以配置异常处理器组件处理异常,而不是抛给浏览器显示
2. 异常处理步骤:
    a. 编写自定义异常类(用于显示提示信息),继承自Exception类
    b. 在可能出现异常的代码上包裹try/catch,在catchthrow new 自定义异常类()
    c. 编写异常处理器类,需要实现HandlerExceptionResolver接口,并实现抽象方法(处理异常业务)
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, 
                                                        Object handler, Exception ex) { 
            CustomException customException = null; //如果抛出的是系统自定义异常则直接转换 
            if(ex instanceof CustomException){ 
                customException = (CustomException)ex; 
            }else{ 
                //如果抛出的不是系统自定义异常则重新构造一个系统错误异常。 
                customException = new CustomException("系统错误,请与系统管理 员联系!"); 
            } 
            ModelAndView modelAndView = new ModelAndView(); 
            modelAndView.addObject("message", customException.getMessage()); 
            modelAndView.setViewName("error"); 
            return modelAndView; 
        }
    d. 配置异常处理器
        使用bean标签将自定义异常处理类配置到springmvc.xml中
        <bean id="xxx" class="自定义异常处理器类全路径"></bean>
  1. SpringMVC中的拦截器
1. 拦截器与过滤器
    过滤器是servlet规范中的一部分,任何java web工程都可以使用。
    拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
    
    过滤器在url-pattern中配置了("/*")之后,可以对所有要访问的资源拦截。
    拦截器它是只会拦截访问的Controller中的方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
    它也是AOP思想的具体应用。 
    我们要想自定义拦截器, 要求必须实现:HandlerInterceptor接口。
2. HandlerInterceptor接口内部已经实现了其方法的默认形式
    对其中的方法进行重写可以自定义拦截器的功能
    * preHandle方法是controller方法执行前拦截的方法
        1. 可以使用request或者response跳转到指定的页面
        2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
        3. return false不放行,不会执行controller中的方法。
    * postHandle是controller方法执行后执行的方法,在JSP视图执行前。
        1. 可以使用request或者response跳转到指定的页面
        2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
    * afterCompletion方法是在JSP页面执行后执行
        1. request或者response不能再跳转页面了
3. 在spring.xml文档中配置拦截器
    /resource/sprinmvc.xml
    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 哪些方法进行拦截 -->
            <mvc:mapping path="/user/*"/>
            <!-- 
                或者配置哪些方法不进行拦截
                <mvc:exclude-mapping path=""/>
            -->
            <!-- 注册拦截器对象 -->
            <bean class="cn.itcast.demo1.MyInterceptor1"/>
        </mvc:interceptor>
        
        <mvc:interceptor>
            <!-- 哪些方法进行拦截 -->
            <mvc:mapping path="/**"/>
            <!-- 注册拦截器对象 -->
            <bean class="cn.itcast.demo1.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章