spring mvc搭建web services

公良理
2023-12-01

问题背景

        这两日在处理上司交给的任务的时候接触到了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.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的小伙伴都看的出来这里没有什么不一样。

配置spring-mvc.xml

        从上面我们可以看到,在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层的书写

        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进行测试的,在路径输入:

http://localhost:8080/testpost

然后提交请求即可,具体的图就不在这里放出来了,对了,代码里面的Customer类是我本地的一个POJO类,这个不是什么重点问题。就不在多言了。

总结

        我发现在网上写这个方面的资料都是一笔带过,很不适合我这样的小白。其实在做的过程中遇到了很多坑,比如说:

1:在配置spring-mvc.xml文件的时候就因为缺少了xsd文件吃亏了。
2:在方法中输出到pWriter的时候没有设置编码格式导致乱码。
3:以为这个方法必须返回,要不然Client拿不到数据。其实完全不是这样的。

        当然,有一颗折腾的心,有啥问题解决不了呢?你说是吧?这篇文章只是一个大概的总结,到时候会对web services在进行比较详细的总结的。

题外话

        欢迎大家到我的个人博客HenryMemory’s Blog。谷歌一下wangmeng1314也可以偶!

HenryMemory’s Blog

 类似资料: