博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
maven+SpringMVC搭建RESTful后端服务框架
阅读量:5823 次
发布时间:2019-06-18

本文共 11261 字,大约阅读时间需要 37 分钟。

 今天来尝试一下搭建基于SpringMVC的RESTful标准的后端服务。

首先,什么是MVC?M-model,模型,指业务数据层,具体一点就是业务逻辑与数据库的交互;V-view,视图,用来展示数据,传统SpringMVC中控制器有返回类型ModelAndView,即返回含有数据模型与页面视图的jsp文件;C-controller,控制器,通常负责处理与用户间的交互,控制从数据库取数与返回结果到用户等。

那么,什么是REST风格的服务呢?REST(Representational State Transfer),中文可以叫表述性状态转移,有以下几个特点

  • Resources expose easily understood directory structure URIs.资源通过URI结构直接对外展示
  • Representations transfer JSON or XML to represent data objects and attributes.通过JSON或者XML来传递数据对象或者属性
  • Messages use HTTP methods explicitly (for example, GET, POST, PUT, and DELETE).信息通过HTTP请求传递
  • Stateless interactions store no client context on the server between requests. State dependencies limit and restrict scalability. The client holds session state.无状态的交互,服务器在交互过程中不存储任何客户端有关的上下文。session的状态通过客户端来存储。

简单来说,传统的MVC框架,后端和前端是部署在一起的,服务器接受请求,去数据库(缓存实质也是非关系型的键值对数据库)查询然后计算,然后和jsp进行组装渲染,直接返回一个完整的html给浏览器。而RESTful的结构下,前端和后端是可以分离部署的,浏览器访问一个页面,前端根据需要向后端发送HTTP请求,后端接收请求然后同样查询数据库再计算,把结果封装为JSON报文后返回给前端,前端把数据组装到静态页面中,生成最终展示给用户的页面。

从个人在开发中的理解,RESTful相比之下有以下几个优点:

  1. 前后端分离解耦合,尤其是在现在前端一天一个样,动不动就啥啥啥的已经不适合这个版本了的背景下,后端需要输出一个标准化的结果,给前端开发留下足够的灵活性。你要什么,我给什么,这是面向服务的设计方式,在企业开发中这样子的灵活性较好,不容易造成前后端相互之间成为开发瓶颈。
  2. 部署与性能上的可扩展性更好。我们都知道在用户量增大的时候,最容易产生压力的资源在数据库,而前端服务器是较容易通过负载均衡增加机器的方式来解决压力问题。所以,从后端到数据库所需的资源数量和前端是不同的,前后端的分离部署与面向服务的分布式系统对于提升系统承载并发量是有利的。同时,要扩展系统功能时,可以直接通过新增一个相关服务的服务器或集群,让前端新增该请求,不需要修改其他后端服务器。
  3. 开发测试更加方便。更加便于模块的划分,容易进行接口测试,不同模块之间的耦合度非常低。

 下面正式开始环境的搭建,因为主要是讲环境搭建,一下配置内容分析先不写了,留到深入研究spring之后

首先编辑pom.xml,把需要的jar包先弄进来,如果没有自动下载的话,手动在工程项目上右键maven->update project,注意要把forcre那行勾上。

列表可以参考下面这个,这里建议spring这样一个系列的包的版本号统一在最上方以参数写入,便于集体版本替换,这点在企业开发中也是非常常用的。

4.0.0
com.graywind
webdemo
0.0.1-SNAPSHOT
war
4.1.6.RELEASE
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
log4j
log4j
1.2.17
junit
junit
4.10
org.aspectj
aspectjweaver
1.8.9
javax.servlet
jstl
1.2
com.fasterxml.jackson.core
jackson-annotations
2.5.0
com.fasterxml.jackson.core
jackson-core
2.5.0
com.fasterxml.jackson.core
jackson-databind
2.5.0
com.fasterxml.jackson.jr
jackson-jr-all
2.5.0
com.alibaba
fastjson
1.2.46
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
1.8
1.8

然后修改些项目属性,右键项目properties->prject facts确定设置如下。若web module不是3.0可把勾去掉,应用后再修改到3.0.

然后到deployment assembly,设置如下

修改web.xml如下,这里有两个配置文件的路径是以classpath开头,根据上方的设置classpath会从WEB-INF/classes开始寻找,而src/main/java和src/main/resources下的内容会被装配至该路径下。

mybatis
index.jsp
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
springmvc
org.springframework.web.servlet.DispatcherServlet
spring mvc 配置文件
contextConfigLocation
classpath:springmvc.xml
1
springmvc
/
字符集过滤器
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
字符集编码
encoding
UTF-8
encodingFilter
/*
log4jConfigLocation
classpath:log4j.properties
org.springframework.web.util.Log4jConfigListener

现在添加application.xml和springmvc.xml以及log4j.properties至resources目录下

/WEB-INF/pages/
.jsp
text/plain;charset=UTF-8
text/html;charset=UTF-8
text/plain;charset=UTF-8
application/json;charset=UTF-8
### set log levels ###log4j.rootLogger = debug,stdout,D,Elog4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%nlog4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = ${catalina.home}/logs/webdemo-info.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = INFOlog4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%nlog4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File =${catalina.home}/logs/webdemo-error.loglog4j.appender.E.Append = truelog4j.appender.E.Threshold = ERRORlog4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
${catalina.home}表示日志文件会产生到tomcat的文件目录下 然后添加controller与bean
package webdemo.hello;import java.util.ArrayList;import java.util.List;import org.apache.log4j.Logger;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/")public class UserController {        private static final Logger log = Logger.getLogger(UserController.class);    @RequestMapping("/hello")    public String hello(){                return "hello";    }        @RequestMapping(value = "/user/{id}", method = RequestMethod.GET, produces = "application/json")    public User getUser(@PathVariable("id") int id){                log.info("get user " + id);        User user = new User();        user.setId(id);        user.setName("Hello");        return user;    }        @RequestMapping(value = "/userlist", method = RequestMethod.GET, produces = "application/json")    public List
getUserlist(){ System.out.println("get userlist"); List
list = new ArrayList
(); for(int i=1;i<10;i++){ User user = new User(); user.setId(i); user.setName("Hello"); list.add(user); } return list; }}
package webdemo.hello;public class User {    private String name;    private int id;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }}

现在启动服务器,测试下接口,因为我把server设置那里的path去掉了,所以直接输入IP与端口

现在网页上显示的就是json报文了,基本的环境也就搭建完成了。但是以网站开发角度来说,后续还有很多需要扩展的地方,比如权限控制过滤器,ajax报文的组装,错误控制,日志切面等等,后续会进一步在这个基础上扩展。

转载于:https://www.cnblogs.com/graywind/p/8451918.html

你可能感兴趣的文章
HCNA——RIP的路由汇总
查看>>
zabbix监控php状态(四)
查看>>
实战Django:小型CMS Part2
查看>>
原创]windows server 2012 AD架构试验系列 – 16更改DC计算机名
查看>>
统治世界的十大算法
查看>>
linux svn安装和配置
查看>>
SSH中调用另一action的方法(chain,redirect)
查看>>
数据库基础
查看>>
表格排序
查看>>
关于Android四大组件的学习总结
查看>>
java只能的round,ceil,floor方法的使用
查看>>
由于无法创建应用程序域,因此未能执行请求。错误: 0x80070002 系统找不到指定的文件...
查看>>
新开的博客,为自己祝贺一下
查看>>
【CQOI2011】放棋子
查看>>
采用JXL包进行EXCEL数据写入操作
查看>>
一周总结
查看>>
将txt文件转化为json进行操作
查看>>
线性表4 - 数据结构和算法09
查看>>
C语言数据类型char
查看>>
Online Patching--EBS R12.2最大的改进
查看>>