MAVEN 手动创建SPRING 4.0 RESTful 项目
正式入驻简书,第一篇文章贡献给RESTful,在这个移动应用日益强大的年代,WEBSERVICES就变得越来越重要,而且也经常要用到,赶上最近接到的新项目,公司就让我们自己先分析下以前的源代码,去构建一个新的RESTful,这正好给了我机会去总结,工作六年了,一直没有整理过自己的所学和所用,希望之后的日子,会陆续把自己接触过的东西写下来,分享的同时,也希望收到反馈,同时资料也方便日后查询。
做项目,我一直坚持的原则是从最简单的着手,然后才由简转繁,像建房子一样,砖头一块一块的堆上去。所以,这篇文章就是从最简单的着手,一步步搭建一个服务。做这个项目,你可能需要额外安装git bash
手动创建 MAVEN项目
项目构建,从最原始的手动开始,不用IDE这些工具。
首先MAVEN最基本的项目结构是:src\test,src\main,main下面有包含java和resources两个目录文件。
由于现在公司的安全机制,我在用ECLIPSE创建MAVEN项目的时候,总是连接代理服务器出问题,也不能下载依赖包,不过在CMD模式和GIT BASH的模式下,我可以很好的用MAVEN的命令来下载依赖包和创建项目。
手动创建MAVEN项目有两个办法,第一是纯手动,自己创建MAVEN标准的项目结构。二就是在CMD窗口下使用MVN命令创建。
纯手动模式,在Git Bash下,或者其他你喜欢的工具下,运行两条UNIX命令,就可以创建完整的MAVEN格式的项目。
首先创建项目目录
mkdir spring4RESTful
之后CD spring4RESTful 进入该项目目录下, 运行
mkdir -vp src/{main/{java,resources},test/java}
简单的两条命令,你会看到一个完整的MAVEN结构的项目就建好了。

接下来,在工程目录下,创建MAVEN的基础文件,pom.xml,用到的schema可以在spring或者hibernate等开源文件或者你以前项目中搜索pom.xml(因为这些都是使用maven来进行管理的),将其拷贝过来即可。
POM的内容,你目前不需要填写很多内容,只需要添加你的基础项目信息到POM里面即可,如下

1.modelVersion :指的是模型的版本,目前值是固定的4.0.0
2.groupId :指定当前项目的项目名称,和包名相同
3.artifactId :指定当前项目中的哪一个模块,一般使用”项目名称_模块名称”这样的形式。
4.version :表示当前项目的版本
好了,至此,一个基本的项目就创建好了,现在你可以用ECLIPSE导入项目。导入之后,你应该会看到如下的目录结构

编辑JAVA类,并测试
现在我们可以添加两个类,和一个测试依赖包到POM中,测试下我们的MAVEN项目
需要注意的是,在maven中,我们的java文件默认都是存放在“src/main/java”这样的目录当中
这里我新创建一个Hello.java文件:

在pom.xml以及java文件都创建好了以后,我们就可以开始编译我们的maven项目了,命令行模式下进入pom.xml文件所在的目录,输入mvn compile

PS:在输入mvn compile以后,maven会从自己的中央仓库下载需要的文件,这里可能会失败,依赖于个人的网络好坏。或者你的公司有设置防火墙,需要使用代理,因此请设置你的proxy
当maven编译完成以后,会生成一个target文件夹,这个文件夹里边存放的就是编译生成的class文件。maven默认的下载是存放在“C:\Users\.m2”该路径下的。你也可以手动添加一个本地仓库,这样MAVEN会先去本地仓库下载资源,如果本地仓库没有,再去服务器下载。建议添加一个本地仓库,方便快速部署。本地仓库请修改MAVEN的settings.xml的localRepository属性。

编写测试类
好了,现在为止Hello类已经编译完成,下面编写test来测试该类中的sayHello方法。测试类和普通的类比较相似,所有的测试类都必须要放到”src/test/java”目录下。建立一个com.spring4RESTful.test用于存放测试类。
TestHello.java

用到了JUNIT的相关功能,所以需要在POM中添加依赖,依赖如下

运行MVN test

看到这里,至此,完整的一个基本MVN流程就结束了。
将java项目转换为web项目
这一步,我们需要将JAVA项目转为web项目,在ECLIPSE中,选中项目,然后鼠标右键选择属性Properties,在属性列表中选择Project Facets
勾选Dynamic Web Module

然后点击Further configuration available 选项,填入你要放置WEB文件的目录名,这里我没有修改,默认用的WebContent,你也可以自行修改,加入到比如src/webapp这样的路径当中去。

确认之后,一个WEB项目就建立好了。建好的项目,可能还会没有报错,但是无法访问的情况,因为之前是手动创建的项目,主要原因是ECLIPSE没有找到缺省的MAVEN依赖包和TOMCAT的依赖包,在属性的Java Bulid Path 里面添加即可。

创建好之后的ECLIPSE目录如下

现在来建立一个index.jsp测试一下,内容很简单,就是打印输出一行内容,对于这部分内容,不是必须的,只是习惯性有新的东西添加都要测试一下,缺了这个页面,服务器只是会提示找不到页面而已,但是后期的服务,我们依然可以直接调用。


添加完成以后,选中项目,选择RUN AS,RUN ON SERVER

选择你安装好的SERVER服务,这里我是TOMCAT 9

运行完毕,你就可以看到一个欢迎页面了,这样一个WEB项目的基础结构也建好了。

添加SPRING依赖
现在引入SPRING的相关依赖,直接修改POM文件,增加相关SPRING的dependencies,我们用的是spring 4.0来构建RESTful,POM文件内容如下

这里除了基本的SRPING依赖包,还需要添加一个JACKSON,用于将获得的对象自动转换为JSON,简单方便,不再需要自己去构建JSON格式的数据。
之后在src\main\resources下面添加applicationContext.xml配置,因为作为初始的基本RESTful项目,还不需要用到service层和DAO层,暂时不用添加任何内容,未来若我更新带数据版本的,我会更新。

在WEB-INFO下,修改web.xml的配置,添加org.springframework.web.servlet.DispatcherServlet的相关配置,如下

如此,一个基本的SPRING依赖添加完成,可以TOMCAT 启动在测试一下,看看是否有错误,检查下自己的配置是否正确。
这个时候如果你启动TOMCAT,后台应该会打印输出你缺失一个文件,这是我们配置RESTFUL服务的关键配置文件,所以我们WEB-INFO目录下创建Spring4RestfulServices-servlet.xml,并添加如下内容

context:component-scan 标签主要用来让SPRING确定你的Controller资源会放在哪个包路径,在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean,就不需要配置单独的BEAN在配置文件里面,这里我放在了resources里面。
而mvc:annotation-driven标签主要是确保这些注解可以正确使用,以及对jackson提供支持,具体可以参考相关文档。配置完成,可以运行下TOMCAT,看看是否正确启动项目。
创建RESTful类
一系列的配置文件完成后,我们开始正式编写RESTful的相关实现代码。创建一个com.spring4RESTful.bean的package用于存放bean类,
创建一个com.spring4RESTful.resources的package用于存放所有的webservices的controller类。
老规矩,先创建一个最简单的HELLO WORLD服务,在bean中,创建Greeting.java

然后在resouces中创建GreetingController.java

@RestController 注解用于通知spring,这是一个控制类,这个是SPRING 4.0里面的RESTful服务的关键,它包含了以前的@Controller and @ResponseBody.
@RequestMapping("/greeting"),这里的意思,就是将url的/greeting地址映射到greeting这个方法上面。这里我们没有使用@RequestMapping(method=Get)来限制只能接受GET方法,也就意味目前我们的greeting默认可以接受其他类型的http请求。
@RequestParam(value="name",defaultValue="World") String name,如果前端页面没有传值过来,这里默认就是World
好了,目前最基本的一个RESTful的服务已经写好,让我们正式看看效果,重新启动TOMCAT,输入链接
http://localhost:8080/spring4RESTful/greeting,你将看到一个JSON格式的hello,world

如果你带上参数,比如http://localhost:8080/spring4RESTful/greeting?name=haifeng

现在我们来写另外一个例子,看看@PathVariable如何使用,为了方便以后分析和修改代码,我单独建立了另外一个controller
首先是bean,Message.java

然后创建MessageRestController.java

@PathVariable 可以动态的接受页面传过来的参数值,然后完全按照RESTFUL的访问格式。如下
http://localhost:8080/spring4RESTful/say/haifeng

也可以用POSTMAN进行调试

至此,一个基本的SPRING 4.0 RESTful就完成了。需要源代码的,请去这里下载
https://github.com/thflove99/spring4RESTfull.git
如果什么问题,请留言我。谢谢大家耐心看完