(笔记)Spring MVC学习指南_基于注解的控制器

1.Spring MVC注解类型
使用基于注解的控制器的几个优点。其一,一个控制器类可以处理多个动作(而一个实现了Controller接口的控制器只能处理一个动作)。其二,基于注解的控制器的请求映射不需要存储在配置文件中。使用RequestMapping注释类型,可以对一个方法进行请求处理。
(1)Controller注解类型
org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器。
Spring使用扫描机制来找到应用程序中所有基于注解的控制器类。为了保证Spring能找到你的控制器,需要完成两件事情。首先,需要在Spring MVC的配置文件中声明spring-context
xmlns:context="http://www.springframework.org/schema/context"
然后,需要应用<component-scan/>元素
<context:component-scan base-package="basePackage">
(2)RequestMapping注解类型
要让Spring知道用哪一种方法来处理它的动作,需要使用org.springframework.web.bind.annotation.RequestMapping注解类型映射的URI与方法。
可以用@RequestMapping注释一种方法或类。
@RequestMapping(value=”/customer_input”)
@RequestMapping(“/customer_input”)
http://domain/context/customer_input
2.编写请求处理方法
每个请求处理方法可以有多个不同类型的参数,以及一个多种类型的返回结果。
3.应用基于注解的控制器

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

当URL模式设置为“/”时,意味着所有请求(包括那些用于静态资源)都被映射到dispatcher servlet。为了正确处理静态资源,需要在Spring MVC配置文件中添加<resources/>元素。

<?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="app04a.controller" />
    <mvc:annotation-driven />
    <mvc:resources location="/" mapping="/*.html" />
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

<resources/>元素指示Spring MVC哪些静态资源需要单独处理(不通过dispatcher servlet)。
注:如果没有<annotation-driven/><resources/>元素会阻止任意控制器被调用。若不需要使用resources,则不需要<annotation-driven/>元素。
5.重定向和Flash属性
转发比重定向快,因为重定向经过客户端,而转发没有。但是,有时采用重定向更好,若需要重定向到一个外部网站,则无法使用转发。另一个使用重定向的场景是避免在用户重新加载时再次调用同样的动作。

return "redirect:/product_view/" + savedProduct.getId();

这里,使用重定向,而不是转发来防止当用户重新加载页面时,saveProduct被二次调用。
使用重定向的一个不便的地方是:无法轻松地传值给目标页面。而采用转发,则可以简单地将属性添加到Model,使得目标视图可以轻松访问。
Spring 3.1版本以及更高版本通过Flash属性提供了一种供重定向传值的方法。要使用Flash属性,必须在Spring MVC配置文件中有一个<annotation-driven/>元素。然后,还必须在方法上添加一个新的参数类型org.springframework.web.servlet.mvc.support.RedirectAttributes。
6.请求参数和路径变量
请求参数和路径变量都可以用于发送值给服务器。二者是URL的一部分。请求参数采用key=value形式,并用“&”分隔。在传统的servlet编程中,可以使用HttpServletRequest的getParameter方法来获取一个请求参数。Spring MVC提供了一个更简单的方法来获取请求参数值:通过使用org.springframework.web.bind.annotation.RequestRaram注释类型来注释方法参数。

public void sendProduct(@RequestParam int productId)

@RequestParam注释的参数类型不一定是字符串。
路径变量类似请求参数,但没有key部分,只是一个值。例如:/product_view/productId
其中的productId是表示产品标识符的整数。在Spring MVC中,productId被称作路径变量,用来发送一个值到服务器。

    @RequestMapping("/product_view/{id}")
    public String viewProduct(@PathVariable Long id, Model model)
    {
        Product product = productService.get(id);
        model.addAttribute("product", product);
        return "ProductView";
    }

为了使用路径变量,首先需要在RequestMapping注解的值属性中添加一个变量,该变量必须放在花括号之间。然后在方法签名中添加一个同名变量,并加上@PathVariable注解。
路径变量的类型可以不是字符串。Spring MVC将尽力转换为非字符串类型。
可以在请求映射使用多个路径变量。

@RequestMapping("/product_view/{userId}/{orderId}")

7.@ModelAttribute
前面谈到Spring MVC在每次调用请求处理方法时,都会创建Model类型的一个实例。若打算使用该实例,则可以在方法中添加一个Model类型的参数。事实上,还可以使用在方法中添加ModelAttribute注释类型来访问Model实例。
可以用@ModelAttribute来注释方法参数或方法。

public String submitOrder(@ModelAttribute("newOrder") Order order,Model model)

输入或创建的Order实例将用newOrder键值添加到Model对象中。如果未定义键值名,则将使用该对象类型的名称。
@ModelAttribute的第二个用途是标注一个非请求的处理方法。被@ModelAttribute注释的方法会在每次调用该控制器类的请求处理方法时被调用。带@ModelAttribute注解的方法可以返回一个对象或一个void类型。如果返回一个对象,则返回对象会自动添加到Model中。

@ModelAttribute
public Product addProduct(@RequestParam String productId) {
    return productService.get(productId);
}

若返回void,则还必须添加一个Model类型的参数,并自行将实例添加到Model中。

@ModelAttribute
public void populateModel(@RequestParam String id,Model model) {
    model.addAttribute(new Account(id));
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值