基于SpringMVC进行REST服务开发

背景

REST的概念这里不多过多阐述。在REST中,资源通过URL进行识别和定位。一般来说,以下这些HTTP方法通常会匹配为如下的CRUD动作:

Create:POST

Read:GET

Update:PUT或PATCH

Delete:DELETE


@ResponseBody:此注解会告知Spring,我们要将返回的对象作为资源发送给客户端,并将其转化为客户端可接受的表现形式。如果客户端的Accept头部信息表明它接受"application/json",并且jackson JSON库位于应用程序的路径下,那么会将返回结果列表转化为json格式。

@RestController:此注解能为控制器的所有处理方法应用消息转化功能。不必为每个方法都添加@ResponseBody了。

@ResponseEntity:作为@ResponseBody的替代方案,@ResponseEntity中可以包含响应相关的元数据(如头部信息和状态码)以及要转换成资源表述的对象。

@ResponseStatus:此注解可以指定状态码。

 


环境搭建相关

SpringMVC相关的jar包全部引入便是

                               

c3p0相关jar包:

                              

jackson相关jar包:

                            

oracle jdbc 相关jar包:

                             

spring.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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">  <!-- 定义要扫描 controller的包 --><context:component-scan base-package="cn.com.restapi.controller" /><context:component-scan base-package="cn.com.restapi.daoimpl"/><context:component-scan base-package="cn.com.restapi.serviceimpl"/><mvc:default-servlet-handler /> <!-- 启动注解驱动 SpringMVC 功能 --><mvc:annotation-driven /><!-- 引用配置文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 配置视图解析器解析路径 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"><!-- 定义视图存放路径 --><property name="prefix" value="/WEB-INF/jsp/" /><!-- 定义视图后缀 --><property name="suffix" value=".jsp" /></bean><!-- 1、声明数据源对象:C3P0连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><!-- 加载jdbc驱动 --><property name="driverClass" value="${driverClass}"></property><!-- jdbc连接地址 --><property name="jdbcUrl" value="${jdbcUrl}"></property><!-- 连接数据库的用户名 --><property name="user" value="${user}"></property><!-- 连接数据库的密码 --><property name="password" value="${password}"></property><!-- 数据库的初始化连接数 --><property name="initialPoolSize" value="3"></property><!-- 数据库的最大连接数 --><property name="maxPoolSize" value="10"></property><!-- 数据库最多执行的事务 --><property name="maxStatements" value="100"></property><!-- 连接数量不够时每次的增量 --><property name="acquireIncrement" value="2"></property>           </bean><!--  创建jdbcTemplate对象 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean></beans>

 jdbc.properties 配置文件如下图所示:

               

 

整个项目的目录如下图所示:

                                

实体类Employee.java代码:

package cn.com.restapi.model;public class Employee {private int employeeID;private String employeeName;private int age;private String address;private String sex;@Overridepublic String toString(){return "Employee[EMPLOYEE_ID=" + employeeID + ",EMPLOYEENAME=" + employeeName + ",AGE=" + age + ",ADDRESS=" + address + ",SEX=" + sex + "]";}//get and set........
}

 

dao层代码:

import java.util.List;
import cn.com.restapi.model.Employee;public interface EmployeeDao {public List<Employee> getEmployees();public Employee getEmployeeByID(int id);public int createEmployee(Employee employee);public int updateEmployee(Employee employee);public int deleteEmployee(Employee employee);public boolean ifEmployeeExist(Employee employee);
}

daoimpl层代码,此处使用c3p0数据源和Spring中的JdbcTemplate模板。

package cn.com.restapi.daoimpl;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import cn.com.restapi.dao.EmployeeDao;
import cn.com.restapi.model.Employee;@Repository
public class EmployeeDaoImpl implements EmployeeDao{@Autowiredprivate JdbcTemplate jdbcTemplate;private Log log = LogFactory.getLog(EmployeeDaoImpl.class.getName());@Overridepublic List<Employee> getEmployees() {// TODO Auto-generated method stubString sql = "SELECT EMPLOYEE_ID,EMPLOYEE_NAME,AGE,ADDRESS,SEX FROM EMPLOYEE";log.info(sql);return jdbcTemplate.query(sql, new EmployeeRowMapper());}@Overridepublic Employee getEmployeeByID(int id) {// TODO Auto-generated method stubString sql = "SELECT EMPLOYEE_ID,EMPLOYEE_NAME,AGE,ADDRESS,SEX FROM EMPLOYEE WHERE EMPLOYEE_ID = ?";log.info(sql);List<Employee> employees = this.jdbcTemplate.query(sql, new EmployeeRowMapper(),id);if (employees.isEmpty()) {return null;}return employees.get(0);}@Overridepublic int createEmployee(Employee employee) {// TODO Auto-generated method stubString sql = "INSERT INTO EMPLOYEE(EMPLOYEE_ID,EMPLOYEE_NAME,AGE,ADDRESS,SEX) VALUE(?,?,?,?,?)";log.info(sql);int rowNum = this.jdbcTemplate.update(sql,employee.getEmployeeID(),employee.getEmployeeName(),employee.getAge(),employee.getAddress(),employee.getSex());return rowNum;}@Overridepublic int updateEmployee(Employee employee) {// TODO Auto-generated method stubString sql  = "UPDATE EMPLOYEE SET EMPLOYEE_NAME = ?,AGE = ?,ADDRESS = ?,SEX = ? WHERE EMPLOYEE_ID = ?";log.info(sql);int rowNum = this.jdbcTemplate.update(sql,employee.getEmployeeName(),employee.getAge(),employee.getAddress(),employee.getSex(),employee.getEmployeeID());return rowNum;}@Overridepublic int deleteEmployee(Employee employee) {// TODO Auto-generated method stubString sql = "DELETE EMPLOYEE WHERE EMPLOYEE_ID = ?";log.info(sql);int rowNum = this.jdbcTemplate.update(sql,employee.getEmployeeID());return rowNum;}public class EmployeeRowMapper implements RowMapper<Employee>{@Overridepublic Employee mapRow(ResultSet rSet, int rowNum) throws SQLException {// TODO Auto-generated method stubEmployee employee = new Employee();employee.setEmployeeID(rSet.getInt("EMPLOYEE_ID"));employee.setEmployeeName(rSet.getString("EMPLOYEE_NAME"));employee.setAddress(rSet.getString("ADDRESS"));employee.setAge(rSet.getInt("AGE"));employee.setSex(rSet.getString("SEX"));return employee;}}@Overridepublic boolean ifEmployeeExist(Employee employee) {// TODO Auto-generated method stubEmployee employee2 = this.getEmployeeByID(employee.getEmployeeID());if (employee2 == null) {return true;}return false;}}

Service层代码:

package cn.com.restapi.service;import java.util.List;
import cn.com.restapi.model.Employee;public interface EmployeeService {public List<Employee> getEmployees();public Employee getEmployee(int id);public int createEmployee(Employee employee);public int updateEmployee(Employee employee);public int deleteEmployee(Employee employee);public boolean ifEmployeeExist(Employee employee);
}

ServiceImpl层代码:

package cn.com.restapi.serviceimpl;import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.com.restapi.dao.EmployeeDao;
import cn.com.restapi.model.Employee;
import cn.com.restapi.service.EmployeeService;@Service
public class EmployeeServiceImpl implements EmployeeService{@Autowiredprivate EmployeeDao employeeDao;@Overridepublic List<Employee> getEmployees() {// TODO Auto-generated method stubList<Employee> employees = employeeDao.getEmployees();return employees;}@Overridepublic Employee getEmployee(int id) {// TODO Auto-generated method stubEmployee employee = employeeDao.getEmployeeByID(id);return employee;}@Overridepublic int createEmployee(Employee employee) {// TODO Auto-generated method stubint rowNum = employeeDao.createEmployee(employee);return rowNum;}@Overridepublic int updateEmployee(Employee employee) {// TODO Auto-generated method stubint rowNum = employeeDao.updateEmployee(employee);return rowNum;}@Overridepublic int deleteEmployee(Employee employee) {// TODO Auto-generated method stubint rowNum = employeeDao.deleteEmployee(employee);return rowNum;}@Overridepublic boolean ifEmployeeExist(Employee employee) {// TODO Auto-generated method stubboolean b = employeeDao.ifEmployeeExist(employee);return b;}}

 Controller层代码,分别对Employee表实现CRUD操作:

package cn.com.restapi.controller;import java.net.URI;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.UriComponentsBuilder;
import cn.com.restapi.model.Employee;
import cn.com.restapi.model.EmployeeNotFoundException;
import cn.com.restapi.model.Error;
import cn.com.restapi.service.EmployeeService;@RestController
public class EmployeeController {@Autowiredpublic EmployeeService employeeService;public Log log = LogFactory.getLog(EmployeeController.class.getName());@RequestMapping(value="/employee",method = RequestMethod.GET)public ResponseEntity<List<Employee>> getEmployees(){log.info("getEmployee method called");List<Employee> employees = employeeService.getEmployees();if (employees.isEmpty()) {return new ResponseEntity<List<Employee>>(employees,HttpStatus.NO_CONTENT);}return new ResponseEntity<List<Employee>>(employees,HttpStatus.OK);}@RequestMapping(value="/employee/{id}",method = RequestMethod.GET)public Employee getEmployeeByID(@PathVariable("id") int id){log.info("getEmployeeByID method called");Employee employee = employeeService.getEmployee(id);if (employee == null) {throw new EmployeeNotFoundException(id);}return employee;}@ExceptionHandler(EmployeeNotFoundException.class)@ResponseStatus(HttpStatus.NOT_FOUND)public ResponseEntity<Error> EmployeeNotFound(EmployeeNotFoundException e){int employeeId = e.getEmployeeId();Error error = new Error(4, "Employee [" + employeeId + "] not found");return new ResponseEntity<Error>(error,HttpStatus.NOT_FOUND);}@RequestMapping(value="/employee",method = RequestMethod.POST,consumes="application/json")public ResponseEntity<?> creatEmployee(@RequestBody Employee employee,UriComponentsBuilder ucb){if (employeeService.ifEmployeeExist(employee)) {Error error = new Error(4, "Employee [id=" + employee.getEmployeeID() + "] already exist");return new ResponseEntity<Error>(error,HttpStatus.CONFLICT);}employeeService.createEmployee(employee);HttpHeaders headers = new HttpHeaders();URI locationUri = ucb.path("/RESTAPI/").path(String.valueOf(employee.getEmployeeID())).build().toUri();headers.setLocation(locationUri);ResponseEntity<Employee> responseEntity = new ResponseEntity<Employee>(employee,headers,HttpStatus.CREATED);return responseEntity;}@RequestMapping(value="/employee",method = RequestMethod.PUT,consumes="application/json")public ResponseEntity<?> updateEmployee(@RequestBody Employee employee,UriComponentsBuilder ucb){if (!employeeService.ifEmployeeExist(employee)) {Error error = new Error(4, "Employee [id=" + employee.getEmployeeID() + "] not found");return new ResponseEntity<Error>(error,HttpStatus.NOT_FOUND);}employeeService.updateEmployee(employee);HttpHeaders headers = new HttpHeaders();URI locationUri = ucb.path("/RESTAPI/").path(String.valueOf(employee.getEmployeeID())).build().toUri();headers.setLocation(locationUri);ResponseEntity<Employee> responseEntity = new ResponseEntity<Employee>(employee,headers,HttpStatus.OK);return responseEntity;}@RequestMapping(value="/employee",method=RequestMethod.DELETE,consumes="application/json")public ResponseEntity<?> deleteEmployee(@RequestBody Employee employee){if (!employeeService.ifEmployeeExist(employee)) {Error error = new Error(4, "Employee [id=" + employee.getEmployeeID() + "] not found");return new ResponseEntity<Error>(error,HttpStatus.NOT_FOUND);}employeeService.deleteEmployee(employee);return new ResponseEntity<Employee>(HttpStatus.NO_CONTENT);}}

 Controller层中有两个实体类Error,EmployeeNotFoundException。用于返回错误信息:

package cn.com.restapi.model;public class Error {private int code;private String message;public Error(int code,String message){this.code = code;this.message = message;}public int getCode(){return code;}public String getMessage(){return message;}
}
package cn.com.restapi.model;public class EmployeeNotFoundException extends RuntimeException{private int EmployeeId;public EmployeeNotFoundException(int employeeId){this.EmployeeId = employeeId;}public int getEmployeeId(){return EmployeeId;}
}

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU-1569 方格取数(2) 最小割最大流

题义很简单&#xff0c;还记得方格取数(1)的时候&#xff0c;使用状态压缩写的&#xff0c;这里由于行列数太大&#xff0c;因此无法进行压缩。所以要运用的最小割最大流的思想来解这道题。 大概是这样分析的&#xff0c;题义是要我们求在一个方格内取出N个点&#xff0c;使得这…

通俗易懂的讲SOA

<微服务设计>1.3节&#xff1a;SOA是一种设计方法&#xff0c;其中包含多个服务&#xff0c;而服务之间通过配合最终会提供一系列功能。一个服务通常以独立的形式存在于操作系统进程中。服务之间通过网络调用&#xff0c;而非采用进程内调用的方式。 通俗易懂的讲SOA …

PCI总线原理(二)

http://blog.c114.net/html/15/562315-75227.html PCI即Peripheral Component Interconnect&#xff0c;中文意思是“外围器件互联”&#xff0c;是由PCISIG (PCI Special Interest Group)推出的一种局部并行总线标准。在现在电子设备中应用非常广泛&#xff0c;下面我详细介绍…

Windows环境中在同一个Tomcat下发布不同端口号的不同web程序

一、修改Tomcat路径下的conf文件下的 server.xml 文件。增加一个service 节点。 原service节点如下图所示&#xff1a; 新增service节点如下图所示&#xff0c;注意红色标注的是要修改的地方&#xff1a; 二、根据service.xml配置文件信息中对应的Engine节点的name属性&#…

java开发_Runtime

在java中经常需要获取一些系统信息&#xff0c;如系统的资源空间等。下面就是一些Runtime的应用&#xff1a; 1 public static void main(String[] a){2 Runtime runtime Runtime.getRuntime();3 long freeMemoery runtime.freeMemory();4 long tota…

Mybatis逆向工程自动生成代码文件

一般来说都会新建另外一个项目&#xff0c;用于生成代码文件&#xff0c;然后拷贝到需要的项目中。新建maven项目用于生成代码文件&#xff0c;项目目录如下所示&#xff1a; pom.xml内容如下&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" x…

LAMP平台架构浅析

LAMP是一个缩写&#xff0c;它指一组常用于来搭建动态网站或者服务器的开源软件&#xff0c;包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;PHP、Perl或者 Python编程语言(本文以php为例)。 下面就介绍一下如何基于rpm包的形式…

流程工业MES特点

流程行业的生产过程与离散制造业有很大的不同&#xff0c;一般为批量连续生产&#xff0c;主要通过对原料的混合、反应、分离、粉碎、加热等物理或化学的变化&#xff0c;是原料增值。 流程行业的生产过程与离散制造业有很大的不同&#xff0c;一般为批量连续生产&#xff0c;主…

掌握Android中的进程和线程

进程和线程是现代网络操作系统的核心概念。Android作为一种优秀的、承袭Linux的移动操作系统&#xff0c;其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介绍Android中的进程、线程以及相关的技术问题。进程和线程的基本概念 当一个应用程序开始运行…

高温津贴:关键是消除劳动者“权利贫困”

每年6月至10月期间&#xff0c;劳动者从事露天岗位工作以及用人单位不能采取有效措施将作业场所温度降低到33℃以下的&#xff0c; 用人单位应当按月向劳动者发放高温津贴&#xff0c;违反者处 2000 元以上 10000 元以下罚款。 据报道&#xff0c;目前广州一些建筑工地、搬家公…

Log4j.properties的简单配置

一、首先导入jar包&#xff1a;log4j-1.2.17.jar 二、新增log4j.properties配置文件并输入以下内容&#xff1a; 三、在测试代码总中进行测试&#xff1a; Service public class CKKuCunServiceImpl implements CKKuCunService{Autowiredpublic CKKuCunMapper ckKuCunMapper;…

oracle中保留2位小数的写法

select to_char(1.5678,99.99) from dual 输出&#xff1a;1.57 select to_char(1.5,00.00) from dual 输出&#xff1a;01.50

C#中事务的简单使用

在C#中开启事务的步骤 一、调用SqlConnection对象的BeginTransaction()方法&#xff0c;创建一个SqlTransaction对象&#xff0c;标志事务开始。 二、将创建的SqlTransaction对象分配给要执行的SqlCommand的Transaction属性。 三、调用相应的方法执行SqlCommand命令。 四、调…

建立openstack quantum开发环境 .

建立openstack quantum开发环境 作者&#xff1a;张华 发表于&#xff1a;2012-4-6 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 上篇中讲了如何建立openstack的最小开发环…

使用Jquery插件bTabs实现多页签打开效果

官网地址&#xff1a;点击这里进入官网 资源导入 <link rel"stylesheet" href"b.tabs.css" type"text/css"> <!-- 插件核心脚本 --> <script type"text/javascript" src"b.tabs.js" ></script> &l…

体验Office 2013预览版

微软目前刚发布新版本的office2013,暂时没有中文版。Windows 8下搭配64位office 2013效果非常不错&#xff0c;具体浏览下方的视频。 X86&#xff08;32位&#xff09; 英文版&#xff1a;http://care.dlservice.microsoft.com/download/4/7/1/4712B4E1-4DD9-4468-B8A4-507D7F9…

iframe父页面与子页面之间的元素获取与方法调用

JS 父页面调用子页面子页面调用父页面元素window.frames[iframe的name属性值];① window.parent.document.getElementById("父页面元素ID"); ②window.parent.document.getElementsByTagName("父页面元素标签名")[i]; ③window.parent.document.getElement…

网络营销第四课:网络营销需要掌握的网页代码(2)

1、<hr>水平线标记&#xff1a;<HTML> <HEAD> <TITLE>HR的用法</TITLE> </HEAD> <BODY> <H3>插画中国论坛:漫画 卡通 吉祥物 游戏 海报(原创) </H3> <HR size 15 align left width 80%> <HR color"…

PDA手持终端WinCE系统连接SqlServer数据库

引言&#xff1a;因项目需求需要通过使用PDA手持终端对条码进行数据采集&#xff0c;并将数据传输到SqlServer进行增删改查操作&#xff0c;一般来说&#xff0c;跟sqlserver的版本没有特别大的关系&#xff0c;我见过用05的、08的、我自己用的2014版本。PDA用的是基恩士的&…

一些算法题,欢迎来改进

第一题&#xff0c;关键字&#xff1a;字符串翻转 Reverse the words in a given English sentence (string) in C or C without requiring a separate buffer to hold the reversed string (programming) For example: Input: REALLY DOGSDISLIKE MONKEYSOutput: MONKEYS DIS…