• Spring MVC 之注解式开发


    1.案例:使用@Controller和@RequestMapping()实现欢迎程序

          @controller :用于标记在一个类上,使用它标记 的类就是一个Spring MVC Controller对象,分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。

          @RequesrMapping():用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

    @Controller
    public class FirstController {
    
        @RequestMapping("/first")   
        public String doFirst(){
          return "/second.jsp";
        }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           ">
    
    <!--包扫描器-->
    <context:component-scan base-package="cn.happy.day04"/>
    </bean?
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>Second</h1>
    </body>
    </html>
    

    2.一个处理类中定义N个处理器方法

    @Controller
    public class FirstController {
    
        @RequestMapping("/first")   
        public String doFirst(){
          return "/second.jsp";
        }
    
        @RequestMapping("/second")   
        public String doSecond(){
            return "/index.jsp";
        }
    

    3.注解式开发-----命名空间:用来区分不同类中的同名方法

    @Controller
    @RequestMapping("/user")
    public class FirstController {
    
        @RequestMapping("/first")   
        public String doFirst(){
          return "/second.jsp";
        }
    

    4.注解式开发-----请求方法中的通配符用法

     @RequestMapping("/first*")   //代表0个或多个字符,以first开头就行
        public String doFirst(){
          return "/second.jsp";
        }
    
        @RequestMapping("/**/second")   //0级或者无限极目录
        public String doSecond(){
            return "/index.jsp";
        }
    
        @RequestMapping("/*/third")   //有且只能有一级目录
        public String doThird(){
            return "/second.jsp";
    

    5.注解开发-----请求中方式的定义

         对于@RequestMapping,有一个属性method,用于对被注解方法所处理请求的提交方式进行限制,只有满足该method属性制定的提交方式,才会执行被注解方法。   

         method属性的取值为RequestMethod,是一个枚举常量。常用值为 RequestMethod.GET 与 RequestMethod.POST.

        @RequestMapping(value = "/first",method = RequestMethod.GET)    
        public String doFirst(){
          return "/second.jsp";
        }
    

    6.处理器方法的参数

    请求中所携带的请求参数

    01.零散参数

    <body>
         <form action="/second" method="post">
             登录名:<input name="uname"/>
             <input type="submit"/>
         </form>
    </body>
    
     @RequestMapping("/second")
     public String doFirst(String  uname){
            System.out.println(info.getUname()+"========");
            return "/first.jsp";
        }
    

    02.校正请求参数名

       //校验参数名称
    
        @RequestMapping("/second")
        public String doSecond(@RequestParam(value = "uname") String info){
            //value的值和表单元素的name属性保持一致,即可实现自动装配
            System.out.println(info+"--------");
            return "/second.jsp";
        }
    

    03.对象参数

    <body>
         <form action="/second" method="post">
             登录名:<input name="uname"/>
             <input type="submit"/>
         </form>
    </body>
    
    
        @RequestMapping("/second")
        public String doFirst(UserInfo info){
            System.out.println(info.getUname()+"========");
            return "/first.jsp";
        }
    

    04.域属性对象自动装配

    <body>
         <form action="/second" method="post">
             登录名:<input name="uname"/>
             汽车品牌1:<input name="car.brand"/>
             <input type="submit"/>
         </form>
    </body>
    
    
        @RequestMapping("/second")
        public String doFirst(UserInfo info){
            System.out.println(info.getUname()+"========");
            System.out.println(info.getCar().getBrand()+"----------");
            return "/first.jsp";
        }
    

    05.对象集合的自动绑定

    <body>
         <form action="/second" method="post">
             登录名:<input name="uname"/>
            汽车品牌1:<input name="userCars[0].brand"/>
             汽车品牌2:<input name ="userCars[1].brand"/>
             <input type="submit"/>
         </form>
    </body>
    
    
        @RequestMapping("/second")
        public String doFirst(UserInfo info){
            System.out.println(info.getUname()+"========");
            System.out.println(info.getUserCars().get(0).getBrand());
            System.out.println(info.getUserCars().get(1).getBrand());
            return "/first.jsp";
        }
    

    06.乱码解决

    <!--编码过滤器-->
      <filter>
        <filter-name>CharEncoding</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>
        
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      
      <filter-mapping>
        <filter-name>CharEncoding</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    

    07.路径变量@PathVariable  

         对于处理器方法中所接收的请求参数,可以来自于请求中所携带的参数,也可以来自于请求的url中所携带的变量,即路径变量。不过,此时需要借助@PathVariable注解

        @PathVariable在不指定参数的情况下,默认其参数名即路径变量名与用于接受其信息的属性名相同。若路径变量与用于接受其信息的属性名不同,则@PathVariable可通过参数指出路径变量名称。 

       //路径变量
        @RequestMapping(value="/{rname}/{age}/second")
        public String doThid(@PathVariable("rname") String name,@PathVariable int age){
            System.out.println(name);
            System.out.println(age);
            return "/second.jsp";
        }
    

    08.处理器方法的返回值

    001. void ajax

    1》引入jar包

        <!--alibaba的 fastjson-->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.31</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>2.8.1</version>
        </dependency>
    
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.5.1</version>
        </dependency>
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
        <script type="text/javascript" src="/js/jquery-1.8.3.js"></script>
        <script type="text/javascript">
            $(function(){
                $.ajax({
                    url:"/toJson",
                    type:"post",
                    data:"",
                    success:function(data){
                        alert(data.toString())
                    }
                })
            })
        </script>
    </head>
    <body>
    
    </body>
    </html>
    
        @RequestMapping("/toJson")
        public void doFirst(HttpServletRequest request ,HttpServletResponse response)  {
            List<User> list = new ArrayList<User>();
            User u1 = new User();
            u1.setAge(18);
            u1.setName("tom");
    
            User u2 = new User();
            u2.setName("lucy");
            u2.setAge(20);
    
            list.add(u1);
            list.add(u2);
            String result = JSON.toJSONString(list);
            try {
                response.getWriter().write(result);
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
    

    002.Object类型

        由于返回Object数据,一般都是将数据转化为JSON对象后传递给浏览器页面的。而这个由Object转换为Json,是有Json工具完成的。所以需要导入jar包(上述三个就是),将Object数据转化为json数据,需要Http消息转换器HttpMessageConverter完成,而转换的开启,需要由<mvc:anntation-driven/>来完成,当spring容器进行初始化过程中,在<mvc:anntation-driven/>处创建注解驱动是,默认创建了七个HttpMessageConverter对象。也就是说,我们注册<mvc:anntation-driven/>,就是为了让容器为我们创建HttpMessageConverter对象。  

    <!--注解驱动-->
       <mvc:annotation-driven/>
    
    @RequestMapping("/jsonObject")
        @ResponseBody
        public Object doSecond(){
            List<User> list = new ArrayList<User>();
            User u1 = new User();
            u1.setAge(18);
            u1.setName("tom");
    
            User u2 = new User();
            u2.setName("lucy");
            u2.setAge(20);
    
            list.add(u1);
            list.add(u2);
    
            return list;
        }
    

      

      

      

      

      

      

      

      

     

     

      

      

      

      

      

  • 相关阅读:
    IO模式 select、poll、epoll
    C++设计模式——SingleTon单件模式
    C和C++区别——前置自增与后置自增
    进程——父子进程共享
    一个例子理解c++函数模板的编译
    C/C++多参数函数参数的计算顺序与压栈顺序
    经常登录Linux,用户密码背后的知识了解一下
    一道值得思考的fork()面试题
    vim实用快捷键整理
    Linux硬链接与软连接
  • 原文地址:https://www.cnblogs.com/cn-930621/p/7768680.html
Copyright © 2020-2023  润新知