[置顶] spring-mvc的初步认识
2017-01-11 10:28
357 查看
1.整体框架和流程
首先是跟spring-mvc没有直接关系但是是系统整体的流程的说明。以user管理为例,最外层是UserController结构,这个结构是跟spring-mvc直接关联的,之后会细讲。这个结构的主要是分配url的处理函数。当用户在浏览器中输入url时,spring-mvc把url和表单信息引导到UserController的某个函数中处理,然后返回对应的view表示物。该view有多种返回形式。权限验证都在这一层,能够判断哪些view有权限访问。
controller中有一个SystemService,基本就是传统ssh框架中的service了,负责某一功能的业务逻辑实现。service中还有各种DAO的实体,能够通过DAO访问数据库。除此之外,还有SystemAuthorizingRealm以及IdentityService,前者能在执行处理的过程中管理认证信息,特别是一些缓存信息;后者则跟Activiti,也就是工作流有关,具体细节还待摸索。总而言之,service直接操作数据实体,提供所需的各种业务逻辑实现。这些相关类都通过spring的自动装配导入。Transaction都在这一层。
此外就是User类和UserDAO,hibernate的内容,不用赘述。
2.spring-mvc的annotation
2.1 annotaton
@Autowired:@Autowired注解标签可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。可以写在成员变量之上,也可以在变量对应的set方法上。
2.2 常用spring的anootation
@Service用于标注业务层组件@Repository用于标注数据访问组件,即DAO组件
@Controller用于标注控制层组件,如Struts中的Action或者springmvc的controller
@Component泛指组件,当组件不好归类时,可以使用这个注解进行标注
@Entity 实体类注解标签
@Table 实体类对应的数据库实际的表名,不设置表名默认数据库表名与类名一致。
2.3 RequestMapping
1)最基本的,方法级别上应用,例如:2)参数绑定
/departments?departmentId=23就可以触发访问findDepatment方法了
3) REST风格的参数
/departments/23,其中用(@PathVariable接收rest风格的参数
4) REST风格的参数绑定形式之2
先看例子,这个有点象之前的:
@PathVariable("departmentId") String someDepartmentId,将其绑定为
someDepartmentId,所以这里someDepartmentId为23
5) url中同时绑定多个id
6) 支持正则表达式
Textual part: sometext, numeric part: 123
2.4 RequestParam
springmvc提供了@RequestParam注释帮助我们获取参数。用法@RequestParam("接收的参数名")
要注意,提交的username参数和password参数不可以是null,即一定要传这两个参数,不然会抛异常。
另外,@RequestParam可以省略参数名,那么就会以它注释的变量名作为参数名。
2.5 ModelAttribute
@ModelAttribute一个具有如下三个作用:①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
②暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;
③暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。
2.5.1 绑定请求参数到命令对象
如用户登录,我们需要捕获用户登录的请求参数(用户名、密码)并封装为用户对象,此时我们可以使用@ModelAttribute绑定多个请求参数到我们的命令对象。
绑定请求参数到命令对象支持对象图导航式的绑定,如请求参数包含“?username=zhang&password=123&workInfo.city=bj”自动绑定到user中的workInfo属性的city属性中。
2.5.2 暴露表单引用对象为模型数据
首先执行@ModelAttribute注解的方法,准备视图展示时所需要的模型数据;@ModelAttribute注解方法形式参数规则和@RequestMapping规则一样,如可以有@RequestParam等;
执行@RequestMapping注解方法,进行模型绑定时首先查找模型数据中是否含有同名对象,如果有直接使用,如果没有通过反射创建一个,因此②处的user将使用①处返回的命令对象。即②处的user等于①处的user。
2.5.3 暴露@RequestMapping方法返回值为模型数据
此时又有问题了,@RequestMapping注解方法的入参user暴露到模型数据中的名字也是user2,其实我们能猜到:
@ModelAttribute注解的返回值会覆盖@RequestMapping注解方法中的@ModelAttribute注解的同名命令对象。
2.5.4 匿名绑定命令参数
其他情况一律都是使用简单类名(首字母小写)作为模型对象属性名,如Map<String, UserModel>类型的模型对象属性名为“map”。
3.前后台交互
3.1 通过注释ModelAttribute来进行。这部分已经在上文介绍过。
3.2 方法返回参数
在低版本的 Spring MVC 中,请求处理方法的返回值类型都必须是 ModelAndView。而在 Spring 2.5 中,你拥有多种灵活的选择。通过下表进行说明:void:
String:
org.springframework.ui.ModelMap:
ModelAndView:
3.3 按契约绑定URL 参数
Controller 的方法标注了 @RequestMapping 注解后,它就能处理特定的 URL 请求。我们不禁要问:请求处理方法入参是如何绑定 URL 参数的呢?在回答这个问题之前先来看下面的代码:ModelAndView 中的过程中存在一套潜在的规则,不熟悉这个规则就不可能很好地开发基于注解的请求处理方法,因此了解这个潜在规则无疑成为理解 Spring MVC 框架基于注解功能的核心问题。
我们不妨从最常见的开始说起:请求处理方法入参的类型可以是 Java 基本数据类型或 String 类型,这时方法入参按参数名匹配的原则绑定到 URL 请求参数,同时还自动完成 String 类型的 URL 请求参数到请求处理方法参数类型的转换。下面给出几个例子:
另外,请求处理方法的入参也可以一个 JavaBean,如下面的 User 对象就可以作为一个入参:
使用 JavaBean 作为请求处理方法的入参
topicId URL 参数将绑定到 topicId 入参上,而 userId 和 userName URL 参数将绑定到 user 对象的 userId 和 userName 属性中。和 URL 请求中不允许没有 topicId 参数不同,虽然 User 的 userId 属性的类型是基本数据类型,但如果 URL 中不存在 userId 参数,Spring 也不会报错,此时 user.userId 值为 0。如果 User 对象拥有一个 dept.deptId 的级联属性,那么它将和 dept.deptId
URL 参数绑定。
3.3 通过注解指定绑定 URL 参数
如果我们想改变这种默认的按名称匹配的策略,比如让 listBoardTopic(int topicId,User user) 中的 topicId 绑定到 id 这个 URL 参数,那么可以通过对入参使用 @RequestParam 注解来达到目的:3.4 绑定模型对象中某个属性
Spring 2.0 定义了一个 org.springframework.ui.ModelMap 类,它作为通用的模型数据承载对象,传递数据供视图所用。我们可以在请求处理方法中声明一个 ModelMap 类型的入参,Spring 会将本次请求模型对象引用通过该入参传递进来,这样就可以在请求处理方法内部访问模型对象了。来看下面的例子:对象的支持,我们可以在一个不依赖 Servlet API 的 Controller 中向 request 中添加属性。
在默认情况下,ModelMap 中的属性作用域是 request 级别是,也就是说,当本次请求结束后,ModelMap 中的属性将销毁。如果希望在多个请求中共享 ModelMap 中的属性,必须将其属性转存到 session 中,这样 ModelMap 的属性才可以被跨请求访问。
相关文章推荐
- 用eclipse导出webserver客户端代码
- No plugin found for prefix 'spring-boot' ...的问题解决方法
- JAVA 中BIO,NIO,AIO的理解
- Spring和MyBatis环境整合
- idea常用快捷键设置(改为eclipse相似)
- SpringMVC-redirect重定向传值
- java 线程详解及线程与进程的区别
- JavaNio——Channel
- java中四种引用类型
- Java Number类
- Java 中的标识符
- IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; java.
- struts2 或 spring mvc上传图片生成高清缩略图,亲测可以用哦!
- 关于RxJava的简单用法(四)
- eclipse上sonarlint插件安装
- RabbitMQ的Java应用(2) -- 使用Spring AMQP开发消费者应用
- 安装Gradle
- java 类型信息 instanceof 和 isInstance区别
- spring boot application.properties 配置
- java 枚举的实现方法