使用spring MVC构建RESTful Web Services(一):准备

这个主题已经想了好久,拖拉的我终于准备动手来做这件事了,希望自己能坚持下去。

现在系统之间的交互越来越多,为实现跨语言访问,之前使用SOAP格式的webService,但接口开发比较复杂,且使用XML作中间语言,对XML的掌握也要求较高,最近这几年兴起了rest风格的webService调用,使用HTTP协议,接口不需要wsdl定义,数据传输格式既可以用JSON也可以用XML,简单了很多,它已经飞入寻常开发人员身边了,而且框架的选择也很多,甚至用原生的sevlet都能实现。

从spring MVC3开始,就支持REST风格的编程,配置更简单,可以全部用注解实现,这次就使用它来完成我们的功能。

一、使用框架

  1. Spring MVC :3.2.8.RELEASE 。spring4新功能还没看,就用这个版本吧

  2. 数据库访问:待定,前期不准备用数据库,如果有精力再加吧

  3. maven 这个不解释

二、spring MVC配置

    spring MVC的配置比较简单,主要配置两处:web.xml和spring自己的配置

    web.xml配置如下。有三处需要注意。

    1.web.xml有两处指定了spring配置文件路径,但作用不同。在context-param中指定的路径创建的是通用的spring管理bean,用来管理我们的service层及其以下的资源、事务、aop等。和我们在ssh中的配置一样。在servlet中定义的DispatcherServlet是spring MVC的定义,它用来管理web层资源。因为是自家东西,集成也比较方便。web层的spring application会继承通用层的spring application,方便我们调用底层服务。

    2.在定义DispatcherServlet的匹配模式的时候,不再使用常用的"*.action"或"*.do",而是使用"/",表示对所有资源的访问都会进入spring MVC,这样我们访问的时候不需要带后缀,直接以localhost:8080/restbucks/coffee这种url访问。而且后缀我们另做他用:客户端用后缀来标识想要的数据格式,我们会根据后缀返回对应格式的数据。比如请求的url带".xml"后缀表示你想要XML格式的数据,".json"后缀表示你想要JSON格式的数据,后面会讲到如何配置。

    3.在正常的web项目中,我们都免不了会有jsp页面和静态资源,为了能正常访问,我们需要做一些设置。有好几种解决办法,这里使用最简单,效率也最高的一种。将不需要spring MVC处理的文件后缀在web.xml里显示标识出来,让web服务器的默认servlet处理,不走spring MVC。也可以使用spring MVC提供的功能。参看<mvc:resources/>和<mvc:default-servlet-handler/>的使用。

    <!--Spring ApplicationContext 载入 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:applicationContext.xml
        </param-value>
    </context-param>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <!-- srping controller Mapping -->
    <servlet>
        <servlet-name>restBucks</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/restBucks-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>restBucks</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <!--default mapping-->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

    spring文件配置。有两个配置文件,一个是spring的,一个是spring MVC的。下面是spring的配置文件,指定扫描的包,并且扫描除了标注Controller注解之外的所有类。Controller这个注解是spring MVC用来标注一个类是否是web控制器。

<context:component-scan base-package="me.riverslob.restBucks">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

spring MVC的XML配置如下,使用<mvc:annotation-driven/>开启spring MVC的默认功能,随后会根据我们的需要来自定义。component-scan定义只扫描指定包的标注Controller注解的所有类。

<mvc:annotation-driven/>
<context:component-scan base-package="me.riverslob.restBucks" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

三、Controller

因为使用了注解,spring MVC控制器的定义也比较简单,下面是一个简单的例子。msgHandleService是底层提供的服务,可以看到spring MVC和spring整合的很好,我们用Autowired注解就框架就会自动帮我们注入进来。

spring MVC中,每个方法都是一个单独的控制器,处理一个web请求。所以我们常常把一个资源的CRUD请求放在一个类中。

在下面的例子中我们使用了这么几种注解:

注解名称注解范围说明
Controller标识类会被spring MVC扫描管理
RequestMapping
类或方法标识请求路径,放在类上,表示通用前缀,方法上的value值会与类上的value值拼接成全访问路径。参数:
value:请求路径
method:限制当前url的请求方式,有GET、POST、PUT等
RequestParam方法入参将request中的参数取出当作参数传入,可以处理简单类型,复杂类型可以自动转换
PathVariable方法入参可以看到RequestMapping的value值里可以有通配符,我们可以用PathVariable注解把通配符里的值取出当作参数传入.这种使用方法大家称为URL模板
@Controller
@RequestMapping(value = "/webChatReceive")
public class WebChatReceiveController {
    private static final Logger LOG = LoggerFactory.getLogger(WebChatReceiveController.class);
    @Autowired
    private WebChatMsgHandleService msgHandleService;
    @RequestMapping(method = RequestMethod.GET)
    public void checkSignature(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        //……
    }
    @RequestMapping(value = "/qrrecords",method = RequestMethod.GET)
    public ModelAndView showQrCodeRecords(@RequestParam("name") String param) {
        ModelAndView mv = new ModelAndView("/webchat/qrrecordlist.jsp");
        List<QrCodeScanRecord> data = msgHandleService.showQrCodeScanRecords();
        mv.addObject("data", data);
        return mv;
    }
    
    @RequestMapping(value = "/qrrecords/{id}")
    public ModelAndView showQrCodeRecords(@PathVariable("id") Long id) {
        ModelAndView mv = new ModelAndView("/webchat/qrrecordEdit.jsp");
        QrCodeScanRecord data = msgHandleService.showQrCodeScanRecordsById(id);
        mv.addObject("data", data);
        return mv;
    }
}

    spring MVC控制器方法的参数个数没有要求,可以随意增减,框架会根据参数类型自动为我们填充相应数据。参数可以有:@RequestParam标识的参数(从request里取得)、@PathVariable标识的参数(从URL模板中取得)、HttpServletRequest、HttpServletResponse、自己定义的POJO(框架会自动将request里的数据绑定成对象)、BindingResult(参数绑定失败的信息)

    spring MVC控制器方法的返回类型也没有要求,有下面几种:ModelAndView(视图和数据信息)、View(视图信息)、String(试图的路径)、void(不返回路径)

    除了上面说的,在做web服务时候,下面这种用法全比较多。可以看到,入参是我们自定义类型,且前面多了@RequestBody注解,方法直接返回我们生成的数据,且前面多了@ResponseBody注解。这两个注解会经常用到,它是框架自动帮我们做“java对象<--->JSON或XML格式数据”转换的标志。随后我们会说到:message converter 

    @RequestMapping(method = RequestMethod.POST)
    public @ResponseBody WsUser create(@RequestBody WsUser user) {
        WsUser user=wsUserService.create(user);
        return user;
    }


转载于:https://my.oschina.net/wuxianAbs/blog/266136

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值