SpringMVCDay05

SpringMVCDay05

  1. 创建一个表单,将客户端传过来的多个数据封装到一个集合里面(前提是客户端传过来的名字和List集合里面的对象的属性名字一致,才会自动帮你封装)

    • 第一步:创建一个表单jsp

      <form action="${pageContext.request.contextPath}/user/quick15" method="post">  //表单提交地址
          <input name="userList[0].username" type="text" placeholder="请输入你的用户名"><br>
          <input name="userList[0].age" type="text" placeholder="年龄"><br>
          <input name="userList[1].username" type="text" placeholder="请输入你的用户名"><br>
          <input name="userList[1].age" type="text" placeholder="年龄"><br>
          <input type="submit" value="登录"><br>
    • 第二步:在pojo包下编写一个List集合的类,(提供set get方法)

      private List<User> userList;
    • 第三步:在 Controller类中编写代码测试

      @Controller
      @RequestMapping("/user")
      public class UserController {
      ​
          @RequestMapping("/quick15")
          @ResponseBody
           public void save11(Vo vo){
              System.out.println(vo);
      ​
           }
  2. 使用ajax,在ajax中将 对象转换成json字符串转发到服务器,这样就不需要自己创建一个集合类来封装,只需要将你想创建的集合 写进参数就行,注意在前面加一个@RequestBoby注解

    • 第一步:导入jquery-1.7.2.js

    • 第二步,在spring-mvc配置,不然无法成功加载jquery-1.7.2.js

      <mvc:resources mapping="/static/**" location="/static/"></mvc:resources>
    • 第三步:编写一个jsp程序

      <script type="text/javascript" src="${pageContext.request.contextPath}/static/jquery-1.7.2.js"></script>
      <script>
          var userList = new Array();
           userList.push({username:"张三",age:19});
          userList.push({username:"李四",age:30});
          /*采用ajax*/
      ​
          $.ajax({
              type:"Post",
              url:"${pageContext.request.contextPath}/user/quick17",
              data:JSON.stringify(userList),
                contentType:"application/json; charset=UTF-8"
          });
      ​
      </script>
    • 第四步:编写程序测试

      @RequestMapping("/quick17")
      @ResponseBody
      public void save13(@RequestBody List<User> userList)throws IOException  {
          System.out.println("quick启动");
                    System.out.println(userList);
      ​
      }

      为什么要在spring-mvc配置

      因为我们采用了前端控制器,这些资源都是由前端控制器帮你找,他一开始都跑去Controller这个类里面找@RequestMapping()这个路径, 但是你的jquery又不是路径,所以找不到,我们就加上了,表示开放static下面的,statuc目录下的权限, 如果要开放多个,在下面继续加

            <!--开放对哪些资源的访问权限-->
        <mvc:resources mapping="/static/**" location="/static/"></mvc:resources>
        <mvc:resources mapping="/img/**" location="/img/"></mvc:resources>
      <!--上面还可以写成下面(表示,如果前端控制器找不到对应资源,就交给tomcat服务器找)-->
        <mvc:default-servlet-handler></mvc:default-servlet-handler> 

解决post请求乱码

  1. 在web.xml文件配置全局过滤器

    <!--配置全局过滤器,解决乱码-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

客户端发来的请求名字与参数名字对应不上

  1. 客户端发来的请求名字与参数名字对应不上,那么就不会给参数赋值,但是如果我们加了@RequestParm注解,那么 就可以将传过来的值的名字和注解里面的名字对比,如果相同,就可以将值赋给参数 注意!加了这个注解之后,你在传过来参数名字的值,那么不会赋值,一句话:加了这个注解传过来的值的名只能跟注解里的名相同

    @RequestMapping("/quick18")
    @ResponseBody
    public void save14(@RequestParam(value="name" ,required = false,defaultValue ="张政" ) String username)throws IOException{
         //客户端如果发来的参数名字是username的话,就会自动帮你将username 的value赋给参数username
          //但是如果发来的值的名字和参数名不一样,就会输入null 匹配不上 于是我们加上@RequestParam注解 即使名字匹配不上,
        // 只要发来的参数名字和这个注解的名字一样,那也可以 将值赋给参数 但是注意加了这个注解之后,你在传入来username,那么与name对应不上就报错
        System.out.println(username);
    ​
    }

    required 表示:值对不上就报错,默认为true,可以手动改为false,不报错, defaultValue表示,你传过来的值对不上,那么就默认输出张政

url占位符

@RequestMapping("/quick19/{name}")
  1. {name}表示占位符, 出现在url地址中 http://localhost:8080/spring_test/user/quick19/%E5%BC%A0%E4%B8%89

       @RequestMapping("/quick19/{name}")
        @ResponseBody
          //将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username
        public void save15(@PathVariable(value="sname" ,required = false) String username)throws IOException  {
             System.out.println("quick启动");
              System.out.println(username);
    //
        }

    将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username ,required的作用跟上面一样, 这里 username和前面的注解的名字可以一样,也可以不一样,但是占位符的名和注解的名字必须一样

自己配置一个Date转换器

  1. 浏览器只能支持1999/11/11 这样的模式,不支持1999-11-11 所以我们自己顶一个时间转换器

    • 第一步:先创建一个DateConteter类去继承Conterter

      public class DateConverter implements Converter<String,Date> {
          public Date convert(String dateStr) {
      ​
               //这里来经行日期的转换
              SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
              Date date=null;
              try {
                  date = format.parse(dateStr);
                  System.out.println(date);
              } catch (ParseException e) {
                  e.printStackTrace();
              }
              return date;
          }
    • 第二步:去spring-mvc.xml文件配置,告诉自带的转换器,你的转换你

        <!--配置Date转换器-->
      <bean id="conversionServiceFactory" class="org.springframework.context.support.ConversionServiceFactoryBean">
         <property name="converters">
             <list>
                 <bean class="com.itheima.converter.DateConverter"></bean>
             </list>
         </property>
      </bean>
      ​
      <!--mvc的注解驱动 这样以来上面的配置处理器映射适配器就不用写了-->
      <mvc:annotation-driven conversion-service="conversionServiceFactory"/>

      注意! 这里要将你 的转换器的id传给驱动, 而且! 必须是在驱动前面写, 不然你驱动都注册了,还没扫描到你的转换器就会报错

    • 第三步:测试

         @RequestMapping("/quick20")
          @ResponseBody
          //将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username
          public void save16(Date date) throws IOException  {
                    //通过我们自定义的日期转换器来打印
              System.out.println(date);
      //
          }

获取请求头和cookie

  1. @CookieValue和@RequestHeader注解

        @RequestMapping("/quick22")
        @ResponseBody
        //将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username
        public void save18(@CookieValue(value="JSESSIONID") String jseeeionid) throws IOException  {
            //通过我们自定义的日期转换器来打印
            System.out.println(jseeeionid);
    //
        }
    ​
        @RequestMapping("/quick21")
        @ResponseBody
        //将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username
        public void save17(@RequestHeader(value="User-Agent") String user_age) throws IOException  {
            //通过我们自定义的日期转换器来打印
             System.out.println(user_age);
    //
        }

文件上传

  1. 文件上传客户端的三要数

    • type=file

    • method=post

    • 表单的enctype属性是多部份表单形式,enctype=“multipart/form-data”

  2. 第一步:先导入坐标

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.0</version>
    </dependency>
    ​
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2</version>
    </dependency>
    ​
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.4</version>
    </dependency>
  3. 第二步,在spring-mvc.xml文件配置 文件下载(注意这里的id存在而且必须是multipartResolver)

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="maxUploadSize" value="50000"></property>
            <property name="defaultEncoding" value="UTF-8"></property>
    </bean>
  4. 第三步,编写文件测试

    @RequestMapping("/xjj")
    @ResponseBody
    public void save13(String username, MultipartFile uploadFile){
        System.out.println(username);
        System.out.println(uploadFile);
    }
  5. 第四步:保存文件

    //将上传的文件保存到你想要去的地址
    String originalFilename = uploadFile.getOriginalFilename(); //这一步是获取你上传的文件的文件名字
    try {
        uploadFile.transferTo(new File("D:\\app\\Test\\"+originalFilename));
    } catch (IOException e) {
        e.printStackTrace();
    }
  6. 第五步:多文件上报保存(上述表单多加一个文件上传)

    <form action="${pageContext.request.contextPath}/user/quick13" method="post" enctype="multipart/form-data">
         用户名 <input type="text" name="username" ><br>
          上传文件<input type="file" name="uploadFile" ><br>
          上传文件<input type="file" name="uploadFile2" ><br>
            <input type="submit" value="提交" ><br>
    </form>
  7. 代码阶段

    public void save13(String username, MultipartFile uploadFile,MultipartFile uploadFile2){
        System.out.println(username);
        System.out.println(uploadFile);
        //将上传的文件保存到你想要去的地址
        String originalFilename = uploadFile.getOriginalFilename(); //这一步是获取你上传的文件的文件名字
        String originalFilename2 = uploadFile2.getOriginalFilename(); //这一步是获取你上传的文件的文件名字
        try {
            uploadFile.transferTo(new File("D:\\app\\Test\\"+originalFilename));
            uploadFile2.transferTo(new File("D:\\app\\Test\\"+originalFilename2));
        } catch (IOException e) {
            e.printStackTrace();
        }
    ​
    }
上一篇:Java日期时间API系列4-----Jdk7及以前的日期时间类的线程安全问题【转】


下一篇:numpy中np.array()与np.asarray的区别以及.tolist