导航

二、 Maven 建立简单的 Restful Web Service 工程

Posted on 2014-11-20 23:33  MatchBoxy  阅读(295)  评论(0)    收藏  举报

本文涉及到的内容:

Maven 建立 webapp 

Restful 结构的 spring mvc 简单程序(只涉及 controller ,没有包含 model view)

本地作为服务器,局域网同网段 IP 机器根据 uri 请求本机服务器数据

 

步骤一:建立工程

1、打开 Eclipse -> File -> New -> Maven Project -> Use default Workspace location 选择工程存放路径,我的目录为 F:\Code\Java\Eclipse_javaee_workspace -> Next -> Filter 输入 webapp ,选择 maven-archetype-webapp -> Next -> Group Id : com.matchbox.test , Artifact Id : TestServer4 即为工程名 -> Finish

2、添加Source Folder。 Maven 规定,工程目录要有一下四个 Source Folder : src/main/java、src/main/resources、src/test/java、src/test/resources,右键工程名 -> New -> Source Folder -> Folder name 填以上四个中工程里没有的,比如填写 src/main/resources ,直到四个都加上。

注:一个有组织的目录,一般来讲还要建立一个配置文件夹, src/main/config ,存放 .xml 文件,除了 web.xml 在外面,其余的放到这里面。一般来讲,属性 .properties 文件建立在 resources 文件夹下。

3、配置 Build Path 。右键工程名, Build Path -> Configure Build Path -> Java Build Path -> Source 中的四个 Output folder 分别双击,修改路径,对应关系为 : src/main/java---target/classes、src/main/resources---target/classes、src/test/java---target/test-classes、src/test/resources---target/test-classes 。 然后 Libraries 选项卡中的 JRE System Library 双击修改为 Workspace default JRE (JDK1.7.0_40) 。

注: src/main/config 文件夹也指向 target/classes ,这样在 .xml 文件中就可以用 classpath*:___.xml 作为 value 直接定位 .xml 文件了,不用填写完整的相对目录。

4、配置完以上步骤后,转换工程为 Dynamic Web Project 。右键工程名, Properties -> Project Facets -> Dynamic Web Module 2.3、Java 为当前项目用的 JDK 版本 1.7 。

5、这步很重要。 Properties -> Deployment Assembly -> 删除 test 的两项(发布不需要测试),删除 target ,加入 /src/main/webapp 和 Maven Dependencies 。然后 OK

 

6、加入服务器。 Servers -> Tomcat v8.0 Server at localhost (上篇文章建立的 Server 名字) -> 右键 -> Add and Remove -> 双击左侧 TestServer4 -> Finish。双击服务器名字 -> Modules -> 选择 TestServer4 工程 -> Edit -> 取消 Auto reloading enabled -> OK -> Ctrl + S 保存

 

步骤二:填写类、配置文件

1、添加 applicationContext.xml 文件。工程目录 -> Java Resources -> src/main/config -> 右键 -> New -> Other -> XML File -> 输入文件名 applicationContext.xml ,建完后,输入以下代码,保存。

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
5 
6     <!-- 配置文件 -->
7 
8 </beans>
applicationContext.xml

2、修改 pom.xml 文件。此文件在工程根目录下,它配置了项目工程需要用到的 jar 包,比如 spring 包。其中的 <groupId> <name> <finalName> 中定义的值与你工程相对应。项目工程中需要用到的 jar 包通过 <dependency> 标签来引入。

  1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3     <modelVersion>4.0.0</modelVersion>
  4     <groupId>com.matchbox.test</groupId>
  5     <artifactId>TestServer4</artifactId>
  6     <packaging>war</packaging>
  7     <version>0.0.1-SNAPSHOT</version>
  8     <name>TestServer4 Maven Webapp</name>
  9     <url>http://maven.apache.org</url>
 10 
 11     <properties>
 12         <org.springframework.version>3.2.5.RELEASE</org.springframework.version>
 13     </properties>
 14   
 15     <dependencies>
 16         <!-- spring -->    
 17         <dependency>
 18             <groupId>org.springframework</groupId>
 19             <artifactId>spring-core</artifactId>
 20             <version>${org.springframework.version}</version>
 21         </dependency>
 22         <dependency>
 23             <groupId>org.springframework</groupId>
 24             <artifactId>spring-beans</artifactId>
 25             <version>${org.springframework.version}</version>
 26         </dependency>
 27         <dependency>
 28             <groupId>org.springframework</groupId>
 29             <artifactId>spring-expression</artifactId>
 30             <version>${org.springframework.version}</version>
 31         </dependency>
 32         <dependency>
 33             <groupId>org.springframework</groupId>
 34             <artifactId>spring-context-support</artifactId>
 35             <version>${org.springframework.version}</version>
 36         </dependency>
 37         <dependency>
 38             <groupId>org.springframework</groupId>
 39             <artifactId>spring-context</artifactId>
 40             <version>${org.springframework.version}</version>
 41         </dependency>
 42         
 43         <dependency>
 44             <groupId>org.springframework</groupId>
 45             <artifactId>spring-jdbc</artifactId>
 46             <version>${org.springframework.version}</version>
 47         </dependency>
 48         <dependency>
 49             <groupId>org.springframework</groupId>
 50             <artifactId>spring-orm</artifactId>
 51             <version>${org.springframework.version}</version>
 52         </dependency>
 53         <dependency>
 54             <groupId>org.springframework</groupId>
 55             <artifactId>spring-oxm</artifactId>
 56             <version>${org.springframework.version}</version>
 57         </dependency>
 58         <dependency>
 59             <groupId>org.springframework</groupId>
 60             <artifactId>spring-web</artifactId>
 61             <version>${org.springframework.version}</version>
 62         </dependency>
 63         <dependency>
 64             <groupId>org.springframework</groupId>
 65             <artifactId>spring-webmvc</artifactId>
 66             <version>${org.springframework.version}</version>
 67         </dependency>
 68         <dependency>
 69             <groupId>org.springframework</groupId>
 70             <artifactId>spring-aop</artifactId>
 71             <version>${org.springframework.version}</version>
 72         </dependency>
 73         <dependency>
 74             <groupId>org.aspectj</groupId>
 75             <artifactId>aspectjweaver</artifactId>
 76             <version>1.7.4</version>
 77         </dependency>
 78         <dependency>
 79             <groupId>org.springframework</groupId>
 80             <artifactId>spring-tx</artifactId>
 81             <version>${org.springframework.version}</version>
 82         </dependency>
 83         <dependency>
 84             <groupId>org.springframework.security.oauth</groupId>
 85             <artifactId>spring-security-oauth2</artifactId>
 86             <version>1.0.5.RELEASE</version>
 87         </dependency>
 88         <dependency>
 89             <groupId>org.springframework</groupId>
 90             <artifactId>spring-test</artifactId>
 91             <version>${org.springframework.version}</version>
 92             <scope>test</scope>
 93         </dependency>
 94         
 95         <!-- servlet-->
 96         <dependency>
 97             <groupId>javax.servlet</groupId>
 98             <artifactId>servlet-api</artifactId>
 99             <version>3.0-alpha-1</version>
100         </dependency>
101        
102         <!-- MessageConverter-->
103         <dependency>
104             <groupId>com.fasterxml.jackson.core</groupId>
105             <artifactId>jackson-core</artifactId>
106             <version>2.3.0</version>
107         </dependency>
108         <dependency>
109             <groupId>com.fasterxml.jackson.core</groupId>
110             <artifactId>jackson-databind</artifactId>
111             <version>2.3.0</version>
112         </dependency>
113         
114         <!-- log4J -->
115         <dependency>
116             <groupId>commons-logging</groupId>
117             <artifactId>commons-logging</artifactId>
118             <version>1.1.3</version>
119         </dependency>
120         <dependency>
121             <groupId>log4j</groupId>
122             <artifactId>log4j</artifactId>
123             <version>1.2.17</version>
124         </dependency>
125         <dependency>
126             <groupId>org.apache.httpcomponents</groupId>
127             <artifactId>httpclient</artifactId>
128             <version>4.3.1</version>
129         </dependency> 
130     </dependencies>
131   
132 
133     <build>
134         <finalName>TestServer4</finalName>
135     </build>
136 </project>
pom.xml

3、修改 web.xml 文件。此文件为工程根配置文件,在 src/main/webapp/WEB-INF/web.xml 路径下,里面声明了前置 servlet 、监听器、首页、环境配置文件等等信息。比如里面的 <servlet> 声明的前置 servlet 为 dispatcher ,默认情况下加载时会寻找 WEB-INF 目录下的 {servlet_name}-servlet.xml 文件,即 dispatcher-servlet.xml 文件。这个默认目录可以通过 <init-param> 标签来改变,找不到时会自动建立,这里我们指定它的名字,叫 spring-api.xml ,前置 servlet 对于 spring mvc 工程来说相当于一个入口转发器,需要在 {servlet_name}-servlet.xml 文件中定义规则,所以我们后面要手动建立这个配置文件。再看 <servlet-mapping> ,它承接 <servlet> 来做映射,即规定哪些 uri 需要经过 servlet 来进行转发,比如 /myapi/* 表示 ___:8080/TestServer4/myapi/* 的 uri 可以经过 dispatcher 过滤转发,当然也可以设置 <url-pattern> 为 / 或者 /* 表示所有的 ___:8080/TestServer4/* 的uri 都可以通过 dispatcher 进行转发。

注:___表示服务器地址,比如本地的为 http://localhost , http://192.168.1.105 等等,以下同。

 1 <web-app xmlns="http://java.sun.com/xml/ns/javaee" 
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 4     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 5     version="2.5">
 6     
 7       <display-name>Archetype Created Web Application</display-name>
 8   
 9       <listener>
10         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
11     </listener>
12     
13     
14     <context-param>
15         <param-name>contextConfigLocation</param-name>
16         <param-value>
17             classpath*:applicationContext.xml,
18             classpath*:spring-api.xml
19         </param-value>
20     </context-param>
21     
22    
23     <servlet>
24         <servlet-name>dispatcher</servlet-name>
25         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
26         <init-param>
27             <param-name>contextConfigLocation</param-name>
28             <param-value>classpath*:spring-api.xml</param-value>
29         </init-param>
30         <load-on-startup>1</load-on-startup>
31     </servlet>
32  
33     <servlet-mapping>
34         <servlet-name>dispatcher</servlet-name>
35         <url-pattern>/myapi/*</url-pattern>
36     </servlet-mapping>
37  
38     
39     <listener>
40         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
41     </listener>
42  
43  
44      <welcome-file-list>
45         <welcome-file>index.jsp</welcome-file>
46     </welcome-file-list>
47     
48 </web-app>
web.xml

4、添加 controller.java 文件。完成上面两步之后,我们创建一个控制器文件,此文件针对前置 servlet 过滤的 uri 信息来进行业务处理,比如我们对浏览器请求的 uri 进行响应,给与回应信息。项目工程 -> Java Resources -> src/main/java -> 右键 -> New -> Class

建好后,输入以下代码,保存。@controller 注解指定它为前置 servlet 转发的一个控制器,下面的 @RequestMapping("/controller") 表示类的 uri 解析路径为 /controller (这个是相对于 servlet 的 <url-pattern> 路径来讲的,即完整类 uri 为 ___:8080/TestServer4/myapi/controller),而类中的每个方法如果不指定 mapping 便和类的一样,如果指定,就是在类路径下面添加一个路径,比如 doShow() 方法的 uri 过滤器为 /controller/test1 。其中需要注意的是,doShow() 样式的请求,带返回值,需要加 @ResponseStatus 和 @ResponseBody 注解。hello() 样式的请求,不带返回值,可不用加以上注解。 

 1 package com.matchbox;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 import org.springframework.http.HttpStatus;
10 import org.springframework.stereotype.Controller;
11 import org.springframework.web.bind.annotation.RequestMapping;
12 import org.springframework.web.bind.annotation.RequestMethod;
13 import org.springframework.web.bind.annotation.ResponseBody;
14 import org.springframework.web.bind.annotation.ResponseStatus;
15 
16 @Controller
17 @RequestMapping("/controller")
18 public class controller {
19     
20     
21     @RequestMapping(value="/test1", method=RequestMethod.GET)
22     @ResponseStatus(HttpStatus.OK)
23     @ResponseBody
24     public String doShow()
25     {
26         System.out.println("abc");
27         return "ABC";
28     }
29     
30     @RequestMapping(value="/test2", method=RequestMethod.GET)
31     public void hello(HttpServletRequest request, HttpServletResponse response) throws IOException 
32     {                 
33         response.setContentType("text/html;charset=GB2312");
34         
35         PrintWriter out = response.getWriter();
36         
37         out.println("<html><head><title>Result</title></head> <body><b> LT's Home Server From Controller </b></body></html>");
38         out.close();
39     }   
40 
41 }
controller.java

5、添加 spring-api.xml 文件,因为上面我们定义将 dispatcher-servlet.xml 重命名为 spring-api.xml 。上面的控制器文件建好后,我们需要对 spring-api.xml 文件进行配置,用来说明要从那些地方查找控制器文件来进行托管转发。项目工程目录 -> Java Resources -> src/main/config -> 右键 -> New -> Other -> XML File -> 输入文件名为 spring-api.xml -> 建好后,输入以下代码,保存。其中的 <context:component-scan base-package="com.matchbox" /> 为你的控制器文件所在的包, <mvc:annotation-driven /> 为注册驱动器,即 spring mvc 需要进行查找转发。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:mvc="http://www.springframework.org/schema/mvc"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
 7 
 8     <context:component-scan base-package="com.matchbox" />
 9     
10     <!-- http.get 的时候,如果uri中带中文参数,需要设置get方法的header的Content-Type为utf-8 -->
11     <mvc:annotation-driven>
12         <mvc:message-converters> 
13             <!-- StringHttpMessageConverter 默认采用的是 text/plain;charset=ISO-8859-1 -->
14                <!-- RESTClient 响应 Content-Type: text/plain;charset=UTF-8 -->
15             <bean class="org.springframework.http.converter.StringHttpMessageConverter">
16                 <property name="supportedMediaTypes">
17                     <list>
18                         <value>text/plain;charset=UTF-8</value>
19                     </list>
20                 </property>
21             </bean>
22             
23             <!-- json格式的自动转换-->
24             <!-- RESTClient 响应 Content-Type: application/json;charset=UTF-8 -->
25             <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
26         </mvc:message-converters> 
27     </mvc:annotation-driven>  
28     
29 </beans>
spring-api.xml

6、运行。按照步骤一中的第6点把项目连接到服务器后,如下图 TestServer4 已经在里面,点击右面的绿色运行按钮,启动服务器。

启动过程中, Console 窗口会一直输出控制台信息,正常情况下不出什么错误,成功启动服务器后,会输入如下内容表示启动成功

(1) 打开浏览器,在地址栏输入 http://localhost:8080/TestServer4/myapi/controller/test1 ,浏览器显示如下, Console 输入如下 abc

(2) 再次地址栏输入 http://localhost:8080/TestServer4/myapi/controller/test2 浏览器返回如下

(3) 通过另外电脑A访问本地服务器B,测试的两台电脑位于同一个局域网下同网段内,  A 端的 IP 为 192.168.1.106 ,服务器 B 的 IP 配置如下:

 

在 A 中的浏览器地址栏,按照(1)(2)的步骤进行操作,结果和上面一样, Console 多输出了一行 abc

至此,表示我们搭建的服务器完全成功,可以开始写复杂的服务器程序了。