SpringMVC学习笔记-04 注解开发

1.@Controller

@Controller用于标注处理器类,拥有这个注解的类,会在被容器扫描到后,自动实例化并注入到容器中。

2.@RequestingMapping

1. value属性

@RequestingMapping用value属性指定请求路径,当只有一个参数时,默认该值赋给value属性。

    @AliasFor("path")
    String[] value() default {};

A.@RequestingMapping置于方法上

package com.zzt.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyController {

    @RequestMapping("/some.do")
    public ModelAndView doSome(){
        ModelAndView modelAndView = new ModelAndView();

        // 存放数据 框架会自动将数据放到request作用域
        modelAndView.addObject("msg","hello-word");

        // 指定视图的路径 框架会自动通过forward进行请求转发 request.getRequestDispatcher("/show.jsp").forward(..)
        modelAndView.setViewName("show");

        return modelAndView;
    }

}

此时,如果请求想调用该控制器对象的doSome方法,则请求路径需要为some.do。

<a href="some.do">发起请求</a>
 

B.@RequestingMapping置于类上

package com.zzt.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/Test")
public class MyController {

    @RequestMapping("/some.do")
    public ModelAndView doSome(){
        ModelAndView modelAndView = new ModelAndView();

        // 存放数据 框架会自动将数据放到request作用域
        modelAndView.addObject("msg","hello-word");

        // 指定视图的路径 框架会自动通过forward进行请求转发 request.getRequestDispatcher("/show.jsp").forward(..)
        modelAndView.setViewName("show");

        return modelAndView;
    }

}

此时,如果请求想调用该控制器对象的doSome方法,则请求路径需要为/Test/some.do。

<a href="/Test/some.do">发起请求</a>

C.value属性指定多条映射

value是一个数组,可以存储多个路径映射;也就是说我们可以有多条请求路径映射到同一个方法。为了不让编译器误会这是两个属性的赋值,我们用{ }指明将值赋值给value[ ]。

    <a href="some.do">发起第一个请求</a>
    <a href="other.do">发起第二个请求</a>
package com.zzt.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyController {

    @RequestMapping(value = {"/some.do","/other.do"} )
    public ModelAndView doSome(){
        ModelAndView modelAndView = new ModelAndView();

        // 存放数据 框架会自动将数据放到request作用域
        modelAndView.addObject("msg","hello-word");

        // 指定视图的路径 框架会自动通过forward进行请求转发 request.getRequestDispatcher("/show.jsp").forward(..)
        modelAndView.setViewName("show");

        return modelAndView;
    }

}

2. method

method用于指定标注的方法需要相应的请求类型,常用get、post;若不指定,表示不限制请求类型。

在web中我们应该学过,get请求是不安全的,它会将传递的参数追加在url中,但是这并不代表get没有优势,实际上post请求,在回退的时候,需要重新提交表单,而get则不需要,在对于一些没有安全性要求的场合,用get足以。

package com.zzt.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value = "/test")
public class MyController {

    @RequestMapping(value = "/some.do" , method = RequestMethod.GET)
    public ModelAndView doSome(){
        ModelAndView modelAndView = new ModelAndView();

        // 存放数据 框架会自动将数据放到request作用域
        modelAndView.addObject("msg","hello-get");
        
        modelAndView.setViewName("show");

        return modelAndView;
    }

    @RequestMapping(value = "/other.do", method = RequestMethod.POST)
    public ModelAndView doOther(){
        ModelAndView modelAndView = new ModelAndView();

        // 存放数据 框架会自动将数据放到request作用域
        modelAndView.addObject("msg","hello-post");
        
        modelAndView.setViewName("show");

        return modelAndView;
    }

    @RequestMapping(value = "/noLimit.do")
    public ModelAndView doNoLimit(){
        ModelAndView modelAndView = new ModelAndView();

        // 存放数据 框架会自动将数据放到request作用域
        modelAndView.addObject("msg","hello-nolimit");
        
        modelAndView.setViewName("show");

        return modelAndView;
    }

}
    <p>第一个项目</p>
    <a href="test/other.do">发起some.do请求</a>
    <br>
    <form action="test/some.do" method="post">
        <input type="submit" value="post请求提交">
    </form>
    <a href="test/noLimit.do">noLimit.do-get方式</a>
    <form action="test/noLimit.do" method="post">
        <input type="submit" value="post提交noLimit">
    </form>

1

现在我们修改一下请求方式:

    <p>第一个项目</p>
    <a href="test/other.do">发起some.do请求</a>
    <br>
    <form action="test/some.do" method="post">
        <input type="submit" value="post请求提交">
    </form>

可以看到,如果我们使用了指定之外的请求方式,则会因为不支持而无法正常访问。

3. @RequestParam

        @RequestParam用于指定哪一个参数的值应该赋给当前指定的属性,用法同Mybatis里的@Param;仅能用在处理器方法上,当使用对象接收时,框架会根据实体类需要的属性查找请求参数。

A. value 用于指定请求中的参数名称

    <p>提交参数</p>
    <form action="test/receiveProperty.do" method="post">
        姓名:<input type="text" name="rname"><br>
        年龄:<input type="text" name="rage"><br>
        <input type="submit" value="提交参数">
    </form>
    @RequestMapping(value = "/receiveProperty.do")
    public ModelAndView doReceiveProperty(@RequestParam(value = "rname") String name,@RequestParam(value = "rage") Integer age){
        ModelAndView modelAndView = new ModelAndView();

        System.out.println("age = " + age);

        modelAndView.addObject("name",name);
        modelAndView.addObject("age",age);

        modelAndView.setViewName("showProperty");

        return modelAndView;
    }

B. required 用于指定该参数是否一定要存在

required默认值为true,表示请求中一定要有该参数,若不存在,则会发生错误。这样做的好处避免当我们知道请求路径时,不通过正常提交参数的流程直接访问:http://localhost:8080/SpringMVC_01/test/receiveProperty.do

如上图,即使知道了请求路径,由于没有正常提交参数,服务器也不会正常响应。

猜你喜欢

转载自blog.csdn.net/qq_39304630/article/details/112872236