SpringMVC---进阶篇

14.@ModelAttribute注解用于修饰方法,这个@ModelAttribute注解修饰的方法在我们每次请求目标方法之前都会被执行一次!
 
15.SpringMVC确定目标方法POJO类型入参的过程:
    1.确定一个key:
        1).若目标方法的POJO类型的参数木有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写。
        2).若使用@ModelAttribute修饰,则key为@ModelAttribute注解的value属性值.
    2.在implicitModel中查找key对应的对象,若存在,则作为入参传入。
        1).若在@ModelAttribute标记的方法中在Map保存过,且key和1确定的key一致,则会获取到!
    3.在implicitModel中不存在key对应的对象,则检查当前的Handler是否使用@SessionAttribute注解修饰,若使用了该主机,且@SessionAttributes注解的value属性值中包含了key,则会从HttpSession中来获取key所对应的value值,若存在则直接传入到目标方法的入参中,若不存在则将抛出异常。
    4.若Handler没有标识@SessionAttributes注解或者@SessionAttributes注解的value值中不包含key,则会通过反射来创建POJO类型的参数,传入为目标方法的参数。
    5.SpringMVC会把key和POJO对象保存到implicitModel中,进而会保存到request域中!
    注意:1.@ModelAttribute标记的方法,会在每个目标方法执行之前被SpringMVC调用!
            2.@ModelAttribute注解可以来修饰目标方法POJO类型的入参,其value属性值有如下作用:
              1).SpringMVC会使用value属性值在implicitModel中查找对应的对象,若存在则会直接传入到目标方法的入参中
              2)SpringMVC会以value为key,POJO类型的对象为value,存入到request域中。
 
16.@SessionAttributes注解只能标记在类上,可以使得多次请求共享某部一部分数据!
    value:指定放入session域中键
    types:指定放入Session域中的对象的字节码!
 
17.当出现遍历的情况我们就是用JSTL标签,
    当我们使用下拉菜单及单选按钮、多选按钮的时候我们就使用springmvc提供的表单标签,
    在表单标签中的path属性值相当于我们原生HTML中的name属性值!  

  使用 Spring 的表单标签

  通过 SpringMVC 的表单标签可以实现将模型数据 中的属性和 HTML 表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显。
  一般情况下,通过 GET 请求获取表单页面,而通过 POST 请求提交表单页面,因此获取表单页面和提交表单 页面的 URL 是相同的。只要满足该最佳条件的契 约,<form:form> 标签就无需通过 action 属性指定表单 提交的 URL

  可以通过 modelAttribute 属性指定绑定的模型属性,若 没有指定该属性,则默认从 request 域对象中读取 command 的表单 bean,如果该属性值也不存在,则会 发生错误
  SpringMVC 提供了多个表单组件标签,如<form:input/>、<form:select/> 等,用以绑定表单字段的属性值,它们的共有属性如下:
  – path:表单字段,对应 html 元素的 name 属性,支持级联属性
    form:input、form:password、form:hidden、form:textarea:对应 HTML 表单的 text、password、hidden、textarea标签
    form:radiobutton:单选框组件标签,当表单 bean 对应的 属性值和 value 值相等时,单选框被选中
    form:radiobuttons:单选框组标签,用于构造多个单选框
  –items:可以是一个 List、String[] 或 Map
  –itemValue:指定 radio 的 value 值。可以是集合中 bean 的一个 属性值
  –itemLabel:指定 radio 的 label 值
  –delimiter:多个单选框可以通过 delimiter 指定分隔符

  表单标签
     form:checkbox:复选框组件。用于构造单个复选框
     form:checkboxs:用于构造多个复选框。使用方式同 form:radiobuttons 标签
     form:select:用于构造下拉框组件。使用方式同 form:radiobuttons 标签
     form:option:下拉框选项组件标签。使用方式同 form:radiobuttons 标签
     form:errors:显示表单组件或数据校验所对应的错误
  – <form:errors path= “ *” /> :显示表单所有的错误
  –<form:errors path= “ user*” /> :显示所有以 user 为前缀的属性对应的错误
  –<form:errors path= “ username” /> :显示特定表单对象属性的错误


  当需要表单回显或者使用下拉列表的时候,就使用form表单标签,而如果使用遍历的标签就使用JSTL标签【导包】!

 
18.对于静态资源文件如【js/css/图片】的访问我们需要在spingmvc配置文件中配置一个标签,如下所示:
    
 <!-- 1.可以映射静态资源的访问请求 -->
     <mvc:default-servlet-handler/>
 
    <mvc:annotation-driven></mvc:annotation-driven>
 
19.   关于重定向

  一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
  如果返回的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理
    –redirect:/success.jsp:会完成一个到 success.jsp 的重定向的操作
    –forward:/success.jsp:会完成一个到 success.jsp 的转发操作

  视图解析器:
    图解析器的作用比较单一:将逻辑视图解析为一个具体 的视图对象。
    所有的视图解析器都必须实现 ViewResolver 接口

20.EmployeeCRUD:
    SpringMVC处理静态资源【导入js文件】:
     1.为什么出现这样的问题:
        优雅的REST风格的资源URL不希望带.html或.do等后缀,若将DispatcherServlet请求映射配置为/,
       则SpringMVC将捕获WEB容器的所有请求,包括静态资源的请求,SpringMVC会将他们当成一个普通请求处理,因此找不到对应处理器将导致错误。
     2.解决:在SpringMVC的配置文件中配置<mvc:default-servlet-handler>
 
21.当需要表单回显或者使用下拉列表的时候,就使用form表单标签,而如果使用遍历的标签就使用JSTL标签【导包】
 
22.视图和视图解析器【参见Springmvc如何解析视图流程图片】
       请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,SpringMVC 也会在内部将它们装配成一个 ModelAndView 对象,它包含了逻辑名和模型对象的视图
   Spring MVC 借助视图解析器(ViewResolver)得到最终 的视图对象(View),最终的视图可以是 JSP ,也可能是Excel、JFreeChart等各种表现形式的视图
 
      视图
    视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
         视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题。
 
   自定义视图
       1.自定义视图,实现view接口或者继承AbstractView抽象类,并加入到IOC容器中。
       2.在springmvc配置文件中配置BeanNameViewResolver视图解析器。
 
23.    数据格式化标签:
    1.在SpringMVC配置文件中配置<mvc:annotation-driven/>
    2.在目标POJO对象的属性上加上@NumberFormat 或者 @DateTimeFormat 注解!
         @DateTimeFormat
            –pattern 属性:类型为字符串。指定解析/格式化字段数据的模式, 如:”yyyy-MM-dd hh:mm:ss”
         @NumberFormat
            –pattern:类型为 String,自定义样式, 如patter="#,###";
 
24.数据类型转换以及数据格式化标签:
   数据类型转换【了解】
      1. 自定义类型转换器实现Converter<S,T>接口并加入到SpringMVC的IOC容器中,
         
 @Component
            public class EmployeeConverter implements Converter<String, Employee>{
                @Override
                public Employee convert(String source) {   
                    System.out.println(source);
                    if(source != null){
                        String[] vals = source.split("-");
                        if(vals != null && vals.length ==5){
                            String name = vals[0];
                            String email = vals[1];
                            Integer gender = Integer.parseInt(vals[2]);
                            Department department = new Department();
                            department.setId(Integer.parseInt(vals[3]));           
                            Employee employee = new Employee(null, name, email, gender, department);
                            return employee;
                        }
                    }
                    return null;
                }
            }
 
        2.配置自定义转换器到FormattingConversionServiceFactoryBean工厂中!
        
 <!-- 将ConversionService再作为annotation-driven的一个属性存在! -->
            <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
 
            <!-- 配置ConversionService -->
            <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
                <property name="converters">
                    <set>
                        <ref bean="employeeConverter"/>
                    </set>
                </property>
            </bean>

 
25.SpringMVC如何处理JSON数据?
   1.加入json的3个jar包【导包】
     jackson-annotations-2.1.5.jar
     jackson-core-2.1.5.jar
     jackson-databind-2.1.5.jar
 
    2. 编写目标方法,使其返回 JSON 对应的对象或集合
    3. 在方法上添加 @ResponseBody 注解
 
26.文件上传
    Spring MVC 上下文中默认没有为文件上传提供了直接的支持,因 此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 CommonsMultipartResovler:
 
    1.加入jar包【导包】
        commons-fileupload-1.3.1.jar
        commons-io-2.4.jar
 
    2.在SpringMVC配置文件中配置CommonsMultipartResovler
        <!-- 配置CommonsMultipartResolver -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="defaultEncoding" value="utf-8"></property>
            <!-- 以字节为单位 -->
            <property name="maxUploadSize" value="1024000<!--(文件大小)-->"></property>
        </bean>
 
    2.表单:POST请求,file类型,enctype="multipart/form-data"
        文件上传
    <form action="<!--(url)(请求路径) -->" method="post" enctype="multipart/form-data">     
    file:<input type="file" name="file"/>     
    <input type="submit" value="提交"/>
    </form>

          

 @RequestMapping(value="testUpload",method=RequestMethod.POST)
            public String testUpload(HttpServletRequest request,@RequestParam(value="desc",required=false) String desc,@RequestParam("photo") CommonsMultipartFile file) throws Exception{
                ServletContext servletContext = request.getServletContext();
                String realPath = servletContext.getRealPath("/upload");
                File file1 = new File(realPath);
                if(!file1.exists()){
                    file1.mkdir();
                }
                OutputStream out;
                InputStream in;
                //uuid_name.jpg
                String prefix = UUID.randomUUID().toString();
                prefix = prefix.replace("-","");
                String fileName = prefix+"_"+file.getOriginalFilename();
                System.out.println(fileName);
 
                out = new FileOutputStream(new File(realPath+"\\"+fileName));
                in = file.getInputStream();
                IOUtils.copy(in, out);
                out.close();
                in.close();
 
                return "success";

  

            }

posted on 2017-08-23 20:44  ....錇嗻妳  阅读(269)  评论(0编辑  收藏  举报

导航