本文涉及到的内容:
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>
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>
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>
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 }
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>
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
至此,表示我们搭建的服务器完全成功,可以开始写复杂的服务器程序了。
浙公网安备 33010602011771号