构建Spring Web应用程序
Spring的Web框架 SpringMVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,它能够帮你构建像Spring框架那样灵活和松耦合的Web应用程序。
跟踪Spring MVC的请求
每当用户在Web浏览器中点击链接或提交表单时,请求就开始工作了。在请求离开浏览器时,会带着用户所请求内容的信息,至少包含请求的URL,但是也有可能带有其他信息,如用户提交的表单信息。
1.请求首先来到DispatcherServlet,(与大多数基于Java的Web框架一样使用前端控制器)它是Spring MVC的一个前端控制器(front controller)Servlet,它的任务是将请求发送给Spring MVC控制器(controller)。
2.DispatcherServlet需要知道应该将请求发送给哪个控制器,所以DispatcherServlet会查询一个或者多个处理器映射(handler mapping)来确定请求的下一站在哪里。处理器映射会根据请求所携带的URL信息来进行决策。
3.选择了合适的控制器,DispatcherServlet会将请求发送给选中的控制器,请求会卸下其负载(用户提交的信息)并耐心等待控制器处理这些信息。
4.控制器处理完这些信息后,会将产生的模型数据打包,并标示出渲染输出的视图名,它接下来会将请求连同模型和视图名发送回DispatcherServlet。
5.传递给DispatcherServlet的视图名仅仅是一个逻辑名称,DispatcherServlet会使用视图解析器(view resolver)来将逻辑视图匹配为一个特定的视图实现。
6.最后,请求到达视图的实现,将模型数据渲染输出。
配置DispatcherServlet的方式
1.配置在web.xml
2.配置在Servlet容器
启动Spring MVC的方式
1.xml中使用<mvc:annotion-driven>
2.使用@EnableWebMvc注解
SpringMVC控制器
1.@Controller注解,基于@Component注解,组件扫描会找到该Controller,并将其声明为Spring应用上下文中的一个bean
2.@RequestMapping(value=,method=)
方法级别:value属性指定了这个方法要处理的请求路径,method属性细化了它所处理的HTTP方法
类级别:注解会应用到控制器的所有方法上,而方法上@RequestMapping注解会对类级别伤的@RequestMapping声明进行补充
传递模型数据到视图中
1.使用Model传递数据,当调用addAttribute()方法并且不指定key的时候,key会根据值的对象类型推断确定。
2.可以使用java.util.Map代替Model。
3.如果没有返回视图名称,也没用显示地设定模型,处理器方法像这样直接返回对象或集合时,这个值会放到模型中,模型的key会根据类型推断出,而逻辑视图的名称会根据请求路径推断出。
接收请求的输入
SpringMVC允许以多种方式将客户端中的数据传送到控制器方法中。
1.查询参数(Query Parameter)
带有查询参数的请求: /spittles?count=50
接收: @RequestParam(value="count",default="20") int count
注意:查询参数都是String类型,因此defaultValue属性需要String类型的值,当绑定到方法参数时,会转换成方法参数对应的类型。
2.路径变量(Path Variable)
构建面向资源的Controller时使用b
带有路径变量的请求: /spittles/12345
接收:
a.RequestMapping(value="/spittles/{spittleId}")
{spittleId}中的值表示占位符名,可以是任意值。
b.@PathVariable("spittleId") long spittleId
若RequestMapping的占位符名,@PathVariable中的属性名,方法中的参数名,则可以去掉@PathVariable中的属性名,简化代码。
3.表单参数(Form Parameter)
适合传递很多数据时使用
接收:
@RequestMapping(value="/register",method=POST)
public String register(Spitter spitter)
接收一个对象作为参数,对象中的属性将会使用请求同名参数进行填充。
redirect和froward
处理POST类型请求,在请求处理完成后,最好进行一下重定向,这样浏览器的刷新就不会重复提交表单。
redirect: 解析为重定向规则,而不是视图名称,重新去请求那个地址,所以地址栏显示的是新的地址
froward: 前往指定的URL路径,服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。
表单校验
1.对象属性添加注解如@NotNull @Size等
2.接收参数添加@Valid注解public String register(@Valid Spitter spitter,Errors errors)
3.Errors.hasErrors()检查是否有错