这两日在处理上司交给的任务的时候接触到了web services,感觉这个跨越语言还有环境的接口调用方式真的是非常之优雅,于是就想着自己能不能试着实现一下。
在技术的选型上初期的话遇到了比较多的问题,也看到了网上非常多的技术方案,在茫茫的信息流中还是看到了一款非常适合我的方案,那就是spring mvc。
当然,第一件需要我们做的事情就是首先将项目需要依赖的jar包全部引入,在此奉送我的pom.xml文件的内容。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.9.RELEASE</version>
</dependency>
废话不多说,进入我们今天的主题,如何利用spring mvc搭建web services。建立项目什么的鄙人就不在多言。主要说的是:如何配置。
配置web.xml文件,因为我们的web项目一旦部署到web容器中去,首先加载的就是这个文件,可以说,这是我们配置的起点,俗话说得好,打蛇打七寸,我们就首先从这里入手:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_3.xsd"
id="WebApp_ID" version="2.3">
<display-name>web services</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 服务器启动即自动加载 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 指定配置文件的位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
这里其实也没有什么好配置的,基本就是老一套,但凡跑过spring mvc的小伙伴都看的出来这里没有什么不一样。
从上面我们可以看到,在springmvc默认的dispatcherservlet中我们读取了spring-mvc.xml,这个文件其实才是我们本次的重点,下面就一起看到其如何配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.5.xsd">
<!-- 使能注解 -->
<context:annotation-config />
<!-- 制定扫描注解的base包 -->
<context:component-scan base-package="com.weimob.webservices.controller" />
<!-- 配置mvc的注解映射 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<!-- 配置适配器 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
</beans>
从上面的配置我们可以看到,出现了两个在以往的配置中不会出现的类,那就是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter,这里的话这两个类主要是用来做返回参数的适配的,也就是说你返回一个对象的话,其会自动适配为json格式的字符串。但是,今天我们并没有采取这样的方式,下面将会详细说明。其实着重强调这里的原因是这里体现了java的一种设计模式,适配器模式。
Controller层的书写是最后的重中之重,下面,让我们来看看:
package com.weimob.webservices.controller;
/**
* proxy</br>
* @author fulei.yang
*
*/
@Controller
public class TestController {
private static final String DEFAULT_CHARSET = "UTF-8";
private static final String DEFAULT_CONTENT_TYPE_NAME = "content-type";
private static final String DEFAULT_CONTENT_TYPE_VALUE = "application/json;charset=UTF-8";
@RequestMapping(method = RequestMethod.POST, value = "/testpost")
public void testPost(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
// 输出的时候规范编码格式
httpResponse.setCharacterEncoding(DEFAULT_CHARSET);
httpResponse.setHeader(DEFAULT_CONTENT_TYPE_NAME, DEFAULT_CONTENT_TYPE_VALUE);
// 写入传送到客户端的内容
try {
PrintWriter pWriter = httpResponse.getWriter();
Customer customer = new Customer("fulei", "man", "age");
pWriter.print(JSON.toJSONString(customer));
pWriter.flush();
pWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
从上面的内容我们可以看到这样的几个注解,下面一一说明:
注解名 | 作用 |
---|---|
@Controller | 确定这个类属于Controller层,这个层级化主要负责处理外来请求 |
@RequestMapping | 这个就是Base_url后面跟的path,也就是资源所在的路径。(value代表path,前面的参数代表如何请求) |
到了这一步,我们的开发任务也就已经做完了,接下来进入测试阶段。
首先将我们的应用部署到服务器上去,我在这里使用的是postman进行测试的,在路径输入:
然后提交请求即可,具体的图就不在这里放出来了,对了,代码里面的Customer类是我本地的一个POJO类,这个不是什么重点问题。就不在多言了。
我发现在网上写这个方面的资料都是一笔带过,很不适合我这样的小白。其实在做的过程中遇到了很多坑,比如说:
1:在配置spring-mvc.xml文件的时候就因为缺少了xsd文件吃亏了。
2:在方法中输出到pWriter的时候没有设置编码格式导致乱码。
3:以为这个方法必须返回,要不然Client拿不到数据。其实完全不是这样的。
当然,有一颗折腾的心,有啥问题解决不了呢?你说是吧?这篇文章只是一个大概的总结,到时候会对web services在进行比较详细的总结的。
欢迎大家到我的个人博客HenryMemory’s Blog。谷歌一下wangmeng1314也可以偶!