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