03.SpringMVC的常用注解、绑定、转换器、过滤器

SpringMVC的常用注解

  • @RequestMapping :
    1. 作用:实现访问路径的控制跳转
    2. 作用在类上,为一级访问目录,作用在方法上,为二级访问目录
    3. 例子:在类上@RequestMapping("/test"),在方法上@RequestMapping("/hello"),那么访问路径就是/test/hello
    4. 细节:若在类上加了,那么方法上的路径名称前一定要加/进行分割,其他情况可以不加,但一般来说加上
    5. 属性:
        path:指定请求的url
        value:和path属性一样
        method:指定该方法的请求方式
        params:指定限制请求参数的条件,它支持简单的表达式。要求请求参数必须和 配置的一模一样
  • @RequestParam
    1. 作用:把请求中的指定名称的参数传递给控制器中的形参赋值
    2. 一般在表单字段名称和形参名称不一样时使用
    3. 属性:
        value:请求参数中的名称
        name:和value相同
        required:请求参数中是否必须提供此参数,默认值是true,必须提供 ,如果设置为false是,但型参不能为null式(int)也会报错
    4. 例子:
public String useRequestParam(@RequestParam("name") String username, @RequestParam(value = "age", required = false) Integer uage)
  • @RequestBody
    1. 作用:用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。 get 请求方式不适用
    2. 属性:
        required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null
    3. 例子:
public String useRequestBody(@RequestBody(required = false) String body) {
	System.out.println(body);
    return "success";
}

在这里插入图片描述
在这里插入图片描述

  • @PathVariable
    1. 作用:拥有绑定url中的占位符的
    2. 例如:url中有/delete/{id},{id}就是占位符
    3. 属性:
        value:用于指定 url 中占位符名称
        required:是否必须提供占位符,默认值是true,必须提供
    4. 细节:
        required属性配置了false时,不代表路径的占位符可以为空,如果占位符为空也会报错
    5. 例子
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable(value = "id", required = false) Integer id)
  • @RequestHeader
    1. 作用:获取指定请求头的值
    2. 属性:
        value:指定消息头的名称
        required:是否必须有此消息头,默认值是true,必须提供
    3. 例子:
public String useRequestHeader(@RequestHeader(value = "Accept-Language", required = false) String head)
  • @CookieValue
    1. 作用:用于获取指定cookie的名称的值
    2. 属性:
        指定 cookie 的名称
        是否必须有此 cookie,默认值是true,必须提供
    3. 例子:
public String useCookieValue(@CookieValue(value = "JSESSIONID", required = false) String cookie)
  • @ModelAttribute
    1. 作用:
        出现在方法上:表示当前方法会在控制器方法执行前线执行
        出现在参数上:获取指定的数据给参数赋值
    2. 应用场景:
        当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据
    3. 例如:
        我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题
    4. 细节:
        当提交的表单有数据时,在方法上给数据赋值也是无效的,还是用回表单上面的值,例如表单有password值为123,我在方法上修改为123456,但是还是会输出123,有此注解的方法会比其他方法先执行
    5. 例子
	@RequestMapping("/testModelAttribute1")
    public String testModelAttribute1(User user) {
        System.out.println("控制器中处理请求的方法:修改用户:" + user);
        return "success";
    }
    
	// 若请求路径匹配到方法,此方法先执行
	// 此时表单只传了date、password、username,没有map和list
	// 该方法有返回值
    @ModelAttribute
    public User showModel() {
        //模拟去数据库查询
        User user = new User();
        List list = new ArrayList<String>();
        list.add(0, "bbb");
        user.setList(list);
        Map<String, String> map = new HashMap<>();
        map.put("one", "bbb");
        user.setMap(map);
        user.setPassword("123456");
        System.out.println("执行了 showModel 方法" + user);
        return user;
    }
	// 作用在形参上
    @RequestMapping("/testModelAttribute2")
    public String testModelAttribute2(@ModelAttribute("abc") User user) {
        System.out.println("控制器中处理请求的方法:修改用户:" + user);
        return "success";
    }
	// 该方法没有返回值
    @ModelAttribute
    public void showModel(String username, Map<String, User> map) {
        //模拟去数据库查询
        User user = new User();
        user.setUsername(username);
        List list = new ArrayList<String>();
        list.add(0, "bbb");
        user.setList(list);
        Map<String, String> map1 = new HashMap<>();
        map1.put("one", "bbb");
        user.setMap(map1);
        user.setPassword("123456");
        System.out.println("执行了 showModel 方法" + user);
        map.put("abc", user);
    }

在这里插入图片描述

在这里插入图片描述

  • @SessionAttributes
    1. 作用:用于多次执行控制器方法间的参数共享
    2. 属性:
        value:用于指定存入的属性名称
        type:用于指定存入的数据类型
    3. 细节:
        type属性并不是指定属性value的类型,而是与的关系,例如下面的,表示分别将username、password及类型为String的Model放进session中
    4. 例子:
@SessionAttributes(value = {"username", "password"}, types = {String.class})
public class SessionAttributeController {

    /**
     *  把数据存入 SessionAttribute
     *  Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
     *  该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
     * @param model
     * @return
     */
    @ResponseBody
    @RequestMapping(value="/testSessionAttributes")
    public String testSessionAttributes(Model model){
        System.out.println("testSessionAttributes...");
        // 底层会存储到request域对象中
        model.addAttribute("username","test");
        model.addAttribute("password","123");
        return "success";
    }

    /**
     * 获取值
     * @param modelMap
     * @return
     */
    @ResponseBody
    @RequestMapping(value="/getSessionAttributes")
    public String getSessionAttributes(ModelMap modelMap){
        System.out.println("getSessionAttributes...");
        String username = (String) modelMap.get("username");
        String password = (String) modelMap.get("password");
        System.out.println(username+","+password);
        System.out.println(modelMap.getAttribute("username"));
        return "success";
    }

    /**
     * 清除session
     * @param status
     * @return
     */
    @ResponseBody
    @RequestMapping(value="/delSessionAttributes")
    public String delSessionAttributes(SessionStatus status){
        System.out.println("delSessionAttributes...");
        status.setComplete();
        return "success";
    }
    
}

SpringMVC请求参数的绑定

  • 请求参数的绑定说明
    1. 绑定机制:
        表单提交的数据都是k=v格式的 username=haha&password=123
        SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
        提交表单的name和参数的名称是相同的
    2. 支持的数据类型:
         基本数据类型和字符串类型 (String)
        实体类型(JavaBean)
         集合数据类型(List、map集合等)
  • 基本数据类型和字符串类型
    1. 提交表单的name和参数的名称是相同的
    2. 区分大小写
  • 实体类型(JavaBean)
    1. 提交表单的name和JavaBean中的属性名称需要一致
    2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如: address.name
  • 给集合属性数据封装
    1. JSP页面编写方式:list[0].属性
  • 例子
	// 实体类User
    public class User implements Serializable {
    private String username;
    private String password;
    private Date date;
    private List<String> list;
    private Map<String,String> map;
}
	@RequestMapping("/getUser")
    public String testGetUser(User user) {
        System.out.println(user);
        return "success";
    }
<!--from表单-->
<form action="/user/getUser" method="post">
    <input type="text" name="username">
    <input type="text" name="password">
    <input type="text" name="date">
    <input type="text" name="list[0]">
    <input type="text" name="map['one']">
</form>

自定义转换器

  • 表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明 Spring框架内部会默认进行数据类型转换
  • 如果想自定义数据类型转换,可以实现Converter的接口
  • 例子:
/**
 * 自定义类型转换String转Date
 * Converter<String, Date>表示String转Date
 * 这方法会把原来的(yyyy/mm/dd)给覆盖
 */
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        if (s == null){
            throw new RuntimeException("参数不能为空");
        }
        try {
            DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
            return df.parse(s);
        } catch (Exception e) {
            throw new RuntimeException("类型转换错误");
        }
    }
}
	<!--springmvc.xml配置-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.zsc.utils.StringToDateConverter"/>
            </set>
        </property>
    </bean>
    <!--开启Spring对MVC注解的支持-->
    <mvc:annotation-driven conversion-service="conversionService"/>

过滤器(请求参数乱码问题)

  • 配置 web.xml
  <!-- 配置 springMVC 编码过滤器 -->
  <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>
  <!--所有路径都会被拦截,包括静态资源(图片、js等)
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 对静态资源放行(在springmvc.xml配置)
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->   <mvc:resources location="/css/" mapping="/css/**"/>   
<mvc:resources location="/images/" mapping="/images/**"/>   
<mvc:resources location="/scripts/" mapping="/javascript/**"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值