惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - 敌后武工队

【攻克RabbitMQ】常见问题 MQ常问的问题 使用Docker在本地搭建Hadoop分布式集群 Centos7上安装docker VMware安装Centos7超详细过程 centos7配置IP地址 数据框架对比:Hadoop、Storm、Samza、Spark和Flink——flink支持SQL,待看 Centos版Linux 一些常用操作命令 Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五) Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三) Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二) Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一) Spring定时任务的几种实现 Hibernate中的query.setFirstResult(),query.setMaxResults(); 在MyEclipse中如何去掉JS或jsp语法错误提示! web.xml配置文件 taglib 高并发高流量网站架构 ASP.NET性能优化之分布式Session ASP.NET中如何实现负载均衡
Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解...
敌后武工队 · 2014-08-10 · via 博客园 - 敌后武工队

 这一章大象将详细分析web层代码,以及使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能。     之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使用Spring自带的spring-webmvc组件来实现同样的功能,而且比之以前更简单。另外,还省掉了整合两个框架带来的不稳定因素。     对于Spring MVC框架,我主要讲一下它的常用注解,再结合一些示例进行说明,方便大家能够快速理解。     一、Spring MVC常用注解说明     @Controller     在类上面定义,表明该类为控制器,返回字符串与redirect:xxx     @RequestMapping     在类或方法上面使用此注解,设置URL访问地址。它有两个属性,value指定访问路径,method指定指定请求方式,请求方式在RequestMethod这个类中,全部以常量形式定义,它默认使用GET请求。     @RequestParam     指定Request请求参数,在方法参数中定义,相当于传统的request.getParameter()。     @PathVariable     获取URL访问路径变量,这是Spring MVC 3.0框架才加入的特性,基于RESTful风格的URL访问路径。     @ModelAttribute 全局式的方法,在一组URL访问路径中,每次都会执行,方法返回结果保存在module会话中。     @Service     在类上面定义,指定被注解的类是业务逻辑组件,如果不指定具体的Bean ID,则采用默认命名方式,即类名的首字母小写。之前在SSH2中,大象曾对Dao组件使用@Repository,本例只有业务层,所以就只用@Service注解。     @Autowired     IoC自动注入功能,替换以前的set写法,在SSH2中就已经开始使用了。     @Qualifier     对同一接口类有不同实现指定具体的实现类。     @ResponseBody     同样定义在方法上,Ajax调用声明,指定方法返回结果为Ajax回调函数结果。这是Spring MVC 3.0框架中增加的一个新特性。     @InitBinder     初始化数据绑定与类型转换,将传入的参数转换为自定义类型,或者对参数进行自定义处理。     二、示例          @RequestMapping在类名上面定义,相当于指定的URL是此控制器内的所有其它访问路径的父路径。如果在某个方法上面定义@RequestMapping注解,则相对于父路径来说,是其子路径。如果不定义value值,那么按父路径访问就会被默认执行。但请注意,默认的访问方式只能有一个。     对于UserController的list方法REST访问URL为http://localhost:8080/ssm3/user,而且它同时接收GET和POST两种请求。另外,Spring MVC 3.0有一个很灵活的特性,可以自定义方法参数。看看list方法,我设定了两个参数,一个Model,一个User对象。Model是用来渲染数据,生成页面用的。相当于request.setAttribute,你可以这样理解,但不能就这样认为,Model以及另一个ModelMap,都是作为视图模型传递参数的,它们的作用域为request。除此之外,你还可以定义HttpServletRequest、HttpServletResponse等等各种各样的参数。 如果一个类还要定义其它资源访问怎么办呢?请看下面的RoleController          在RoleController上定义了全局路径/role,这样一来,对于和角色相关的资源都会以/role开头,比如创建角色/role/new;编辑角色/role/edit/{id}等等。     上图edit方法中的{id}写法,就是RESTful URL风格,与@PathVariable搭配来一起实现该功能。它表示所请求的URL中,可以将变量值作为参数进行动态的传递。例如:http://localhost:8080/ssm3/role/edit/1,另外,除了可以用数字,还可以用字符串,还可以多定义几个变量:/role/edit/{id}/{type}等等。     每个方法的返回值,其实都对应着一个结果页面,这一点和struts2-convention这个插件很相像。本例使用FreeMarker模板引擎作为展示层,页面的后缀为.html,页面中除了标准的HTML之外,其余的数据填充,条件判断之类,都要用到FreeMarker指令。     对于save方法返回值写法表示的是重定向,相当于执行http://localhost:8080/ssm3/role,而这个URL对应的其实就是RoleController这个类里面list方法。如果要带上参数之类的,一定要符合所定义的REST资源路径才可以。     
    @ResponseBody用来标识Ajax方法调用,在上面这个方法中,用到了@RequestParam注解,它的作用就和request.getParameter("name")一样。Spring MVC框架支持好几种返回格式,例如:String/JSON/XML等等。不过以这种格式的字符串值形式返回是最简便的一种方式,而且利用JavaScript解析也十分方便。页面调用的时候请用jQuery的$.ajax()这种原生方式来定义,这种写法不会出问题,也很灵活,而且其它几种方式最终也是调用它来完成请求。     

    对于拥有相同的一组访问规则的URL,如果都需要获得相同的数据,则使用@ModelAttribute注解。以RoleController为例,上面这个注解与方法的含义,相当于是在它里面所有的访问路径方法中都调用这个写法:module.addAttribute(“allRoles”,roleService.getRoles())。也即,不管是访问create还是edit,都会执行preperList,都会获得allRoles这个List。          注册自定义类型编辑器,在Spring MVC中,对于时间类型,框架不会自动帮你转换绑定,需要你自己来定义属性编辑器。除此之外,还可以对某些特殊字符进行转义符处理,都可以放在@InitBinder注解的方法中进行。如果所有的Controller都需要注册相同的属性编辑器,则可以实现WebBindingInitializer接口,定义一个全局的属性编辑器。     三、在web容器中部署     想要让Spring MVC框架帮助我们完成工作,就需要在Web容器中配置好它         DispatcherServlet是Spring MVC的核心,是处理一切请求转发的核心控制器。大象曾在本系列的第二篇文章中就详细描述了Spring MVC的流程结构,如果没什么印象的话请再去看看。     Spring MVC有一个默认规则,Web容器启动之后,会自动查找/WEB-INF/<servlet-name>.xml这个Spring类型的配置文件。如果想自定义配置文件路径,就按上面的写法,指定contextConfiglocation这个属性,大象采用maven构建项目,所以servlet-context.xml这个配置文件放在resource目录下。     四、MVC配置     Spring MVC 3.0对使用和配置作了较大的改进,除了提供注解来简化控制器的开发之外,在配置文件上面也进行了简化。          基于Spring MVC注解的配置就是上面这两行,还有一种更简化的配置写法是只写这一句:<mvc:annotation-driven/>就可以了,Spring启动的时候会自动注册上面这两个bean。为什么大象要在这里显示的注册两个bean呢?因为,我们在真正使用的时候,一般来说,使用默认的方式满足不了我们的系统或业务要求。比如拦截器,比如数据验证,比如返回消息格式转换等等一些自定义设置。他们都需要配置在这两个bean里面。因为本例是用来作为入门教程,所以这些东西都没有加进来。     DefaultAnnotationHandlerMapping这个类是将所有标注了@RequestMapping注解的Controller类,都放到了一个HandlerMapping对象中当有请求时,就在这个对象中进行查找是否有与之匹配的路径,AnnotationMethodHandlerAdapter是管理所有@RequestMapping注解的方法。     这部分的内容到这里就讲完了,下一篇将对本例使用的展示层FreeMarker进行一下简单介绍。