[SpringMVC] SpringMVC注解

[白话] SpringMVC中可以在配置文件spring-mvc.xml中声明你要用的东西;
也可以用注解(@方式)的方式,告诉它 你写的这个东西 是 这个用途

SpringMVC注解类型

优点
一个控制器类可以处理多个动作
不需要存储在配置文件中

controller注解类型

org.springframework.stereotype.Controller注解类型用于指示spring类的实例是一个控制器
1. 设置控制器

    @Controller
    public class CustomerController{

    }

2. 声明spring-context
Spring使用扫描机制来找到应用程序中所有基于注解的控制器类
[白话]你写的注释要让他看到,你就要告诉他指定地方有,去那里找一遍
为了保证Spring能找到控制器,需要在SpringMVC配置文件中声明spring-context,应用

    <?xml version="1.0" encoding="utf-8"?>
    <beans ...
        xmlns:context="http://wwww.springframework.org/schema/context"
    ...>
    <context:compoent-scan base-package="com.example.controller" />
    //指定控制器类的基本包,所有控制器都在com.example.controller及其子包下
</beans>

requestMapping注解类型

要让Spring知道用哪一种方法类处理它的动作,需要使用
org.springframework.web.bind.annotation.RequestMapping注解类型映射的URL方法
RequestMapping映射一个请求和一种方法,并由调度程序在接收到对应URL请求时调用
[白话] 用户想要苹果,告诉它去柜台1拿;用户想要梨,告诉它去柜台2拿
用户要的动作即请求(request),要的是苹果,对应到 柜台1
此注释就是说 这个柜台(Controller) 是 放苹果的(处理相应请求)

使用

@Controller
public class CustomerController{
    @RequestMapping(value="/customer_input")
    public String inputCustomer() {
        return "CustomerForm";
    }
}

属性介绍

value属性将URL映射到方法,如果只有唯一的属性,则可以省略属性名称

@RequestMapping("/customer_input")
//methoed属性指定该方法仅处理那些HTTP方法
@RequestMapping(value="/order_process",
    method={RequestMethod.POST,RequestMethod.PUT}
)

url访问

url/类的RequestMapping/方法的ReqeustMapping

编写请求处理方法

每个请求处理方法可以有多个不同类型的参数,和一个多种类型的返回结果

参数类型

* javax.servlet.ServletRequest或javax.servlet.http.HttpServletRequest
* javax.servlet.ServletResponse或javax.servlet.http.HttpServletResponse
* javax.servlet.http.HttpSession
* org.springframework.web.context.request.WebRequest或org.springframework.web.context.request.NativeWebRequest
* java.util.Locale
* java.io.InputStream或java.io.Reader
* java.io.OutpoutStream或java.io.Writer
* java.security.Principal
* HttpEntity<?>
* java.util.Map/org.springframework.ui.Model/
* org.springframework.ui.ModelMap
* org.springframework.web.servlet.mvc.suppot.RedirectAttributes
* org.springframework.validation.Errors/
* org.springframework.validation.BindingResult

命令或表单对象

* org.springframework.web.bind.suppot.SessionStatus
* org.springframework.web.util.UriCompoentsBuilder
* 带@PathVariable,@MatrixVariable注解的对象
* @RequestParam,@RequestHeader,@RequestBody,@RequestPart

返回类型

* ModelAndView
* Model
* Map包含模型的属性
* View
* 代表逻辑视图名的String
* void
* 提供对Servlet的访问,以响应HTTP头部和内容HttpEntity或ResponseEntity对象
* Callable
* DeferredResult
* 其他任意类型,Spring将其视作输出给View的对象模型

△org.springframework.ui.Model类型,这不是一个Servlet API类型,而是一个包含Map的SpringMVC类型。每次调用请求处理方法时,SpringMVC都创建Model对象并将各种对象注入Map中

例子springmvc_first_b

新增了一个名为index.html的HTML文件,以便SpringMVCServlet的URL模式设置为/时,依然可以访问静态资源
ProdcutController的saveProduct方法的第二个参数时org.springframework.ui.Model类型;
无论是否使用,SpringMVC都会在每一个请求处理方法被调用时创建一个Model实例,使用Model的主要母的是添加需要在视图中显示的属性

应用@Autowired和@Service进行依赖注入

Autowired注解类型属于org.springframework.beans.factory.annotation包
为了能作为依赖注入,类必须要注明为@Service(org.springframework.stereotype)
Service注解类型指示类是一个服务,此外在配置文件中,需要添加一个扫描元素来扫描依赖基本包

重定向与转发

  • 重定向:
    你请求的东西我这里处理不了,你去B地办理
  • 转发:
    你这个东西我这里办理不了,不过我们公司别的部分可以做,我帮你给他们
  • 区别:
    1. 重定向经过客户端,而转发却没有,转发比重定向更快
    2. 若重定向到一个外部网站,则无法使用转发
    3. 避免在用户加载页面时再次调用同样的动作
      提交表单时候重新加载页面,保存的业务代码再次调用,保存两份数据
    4. 重定向无法轻松地传值给目标页面,而转发可以简单地将属性添加到Model,使得目标视图可以轻松访问
      重定向经过客户端,所以Model的一切都在重定向时丢失;
      Spring3.1版本开始通过flash属性提供了一种供重定向传值的方法
  • 使用
    1. SpringMVC配置文件中添加元素
    2. 在方法上添加一个新的参数类型
      org.springframework.web.servlet.mvc.support.RedirectAttributes

请求参数和路径变量

说明

两者都是url传参
①请求参数:url?key1=value1&key2=value2
取值 httpServletRequest.getParameter(“key”)
②路径变量:url/value1/value2
取值 public void sendProduct(@RequestParam int productId)
③问题:会与url冲突

使用路径变量

@ReqeustMapping("/product_view/{id}")
public String viewProduct(@PathVariable Long id,Model model) {
    Product product = productService.get(id);
    model.addAttribute("product",product);
    return "ProductView";
}
//可使用多个路径变量
@RequestMapping("/product_view/{userId}/{orderId}")

动作、路径变量、url冲突解决方案

<style type="text/css">@import url(css/main.css);</style>
-->
<style type="text/css">
    @import url("<c:url value="/css/main.css"/>");
</style>

例子springmvc_autowiredservice_test

应用@Autowried flash属性 路径变量

@ModelAttribute
@RequestMapping(method=Request.POST)
public String submitOrder(@ModelAttribute("newOrder") Order order,Model model) {
    ... //输入或创建Order实例将用newOrder键值添加到Model对象中
}

第二个用途:标注一个非请求的处理方法
被@ModelAttribute注解的方法会在每次调用该控制器类的请求处理方法时被调用
意味着,如果一个控制器类有两个请求处理方法,以及一个有@ModelAttribute注解方法
该方法的调用就回比每个处理请求方法更频繁
@ModelAttribute注解的方法可以返回一个对象或者一个void类型,如果返回一个对象,则返回的对象会自动添加到Model中

工程下载

链接:http://pan.baidu.com/s/1hrJhLi8 密码:1sdl
若链接失效请留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geodoer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值