Coin163

首页 > springMVC+json构建restful风格的服务

springMVC+json构建restful风格的服务

相关标签: rest web服务 spring-mvc

2020腾讯云双十一活动,全年最低!!!(领取3500元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1073

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
入口地址https://www.aliyun.com/minisite/goods

首先,要知道什么是rest服务,什么是rest服务呢? REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。 rest是以资源为中心,将一个一个请求作出的响应以资源的形式返回,可能你请求的是一个xml,一个html,rest都把它归类为资源,也就是说所有的响应都是基于资源的。 而REST的web service 设计原则是基于CRUD,其支持的四种操作分别为: GET – 获取信息/请求信息内容,绝大多数浏览器获取信息时使用该方式。 POST – 增加信息内容,显示以前的信息内容,可以看作是insert操作 PUT – 更新信息内容,相当与update DELETE – 删除信息内容可以看作是delete 我们平时一般只用上面的get和post方法,而很少使用其他方法,其实http还有put、delete、head方法。 并且REST 的请求和响应也是使用http的request和response俩实现的。 在这里我将使用springMVC+json的形式构建一个restful风格的demo。 首先springMVC环境搭建: 相关jar包: spring配置文件applicationContext.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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

<!-- 加载外部的properties配置文件 -->

<context:property-placeholder location="classpath:/config/jdbc.properties" />

<context:component-scan base-package="com.gisquest"/>

<!-- 配置数据库连接池 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

<!-- 连接数据库驱动 -->

<property name="driverClass" value="${driverClass}"></property>

<!-- 数据库url -->

<property name="jdbcUrl" value="${jdbcUrl}"></property>

<!-- 数据库用户名 -->

<property name="user" value="${user}"></property>

<!-- 数据库密码-->

<property name="password" value="${password}"></property>

<!-- 其他配置-->

<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->

<property name="initialPoolSize" value="3"></property>

<!--连接池中保留的最小连接数。Default: 3 -->

<property name="minPoolSize" value="3"></property>

<!--连接池中保留的最大连接数。Default: 15 -->

<property name="maxPoolSize" value="5"></property>

<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->

<property name="acquireIncrement" value="3"></property>

<!-- 控制数据源内加载的PreparedStatements数量。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 -->

<property name="maxStatements" value="8"></property>

<!-- maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->

<property name="maxStatementsPerConnection" value="5"></property>

<!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->

<property name="maxIdleTime" value="1800"></property>

</bean>

<!-- 配置SqlsessionFactory-->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"/>

<property name="mapperLocations" value="classpath:/config/mapper/*Mapper.xml"/>

<property name="typeAliasesPackage" value="com.gisquest.bean"></property>

</bean>

<!-- mapper扫描器 -->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->

<property name="basePackage" value="com.gisquest.dao"></property>

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

</bean>

<!-- 配置事务管理器 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

<tx:annotation-driven transaction-manager="transactionManager"/></beans> springMVC配置文件: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

<!-- 注解驱动 -->

<mvc:annotation-driven />

<!-- 激活spring注解方式:自动扫描,并注入bean -->

<context:component-scan base-package="com.gisquest"/>

<bean

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<!-- 配置jsp路径的前缀 -->

<property name="prefix" value="/WEB-INF/pages/"/>

<!-- 配置jsp路径的后缀 -->

<property name="suffix" value=".jsp"/>

</bean>

<bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter">

<property name="supportedMediaTypes">

<list>

<value>text/plain;charset=UTF-8</value>

</list>

</property>

</bean>

<!-- 输出对象转JSON支持 -->

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

<property name="messageConverters">

<list>

<ref bean="stringConverter"/>

<ref bean="jsonConverter" />

</list>

</property>

</bean>

<!-- 文件上传 --></beans> web.xml文件: <?xml version="1.0" encoding="UTF-8"?><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_3_0.xsd" id="WebApp_ID" version="3.0">

<welcome-file-list>

<welcome-file>WEB-INF/pages/index.jsp</welcome-file>

</welcome-file-list>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:config/applicationContext.xml</param-value>

</context-param>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- springmvc配置 -->

<servlet>

<servlet-name>springmvc</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<description>spring mvc 配置文件</description>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:config/springmvc.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>

<filter>

<description>字符集过滤器</description>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<description>字符集编码</description>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<!-- 解决HTTP PUT请求Spring无法获取请求参数的问题 -->

<filter>

<filter-name>HiddenHttpMethodFilter</filter-name>

<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>HiddenHttpMethodFilter</filter-name>

<servlet-name>springMVC3</servlet-name>

</filter-mapping>

</web-app> 该demo使用了mybatis来操作持久层,下面是mapper文件,userMapper.xml: <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址 --><mapper namespace="com.gisquest.dao.UserMapper">

<!-- sql片段 -->

<sql id="sql_where_dymatic">

<if test="username!=null">

AND username=#{username}

</if>

<if test="address!=null">

AND address=#{address}

</if>

</sql>

<resultMap type="User" id="aliasResultMap">

<id column="id_" property="id"/>

<result column="name_" property="username"/>

<result column="address_" property="address"/>

</resultMap>

<!-- sql综合查询 -->

<select id="findDynamic" resultType="User" parameterType="map">

SELECT * FROM user

<where>

<include refid="sql_where_dymatic"></include>

</where>

</select>

<!-- 通过id查找 -->

<select id="findByUserId" resultType="User" parameterType="Long">

SELECT * FROM user WHERE id=#{id}

</select>

<!-- 通过id查找,但是查找的列名是别名 -->

<select id="findByAlias" resultType="String" parameterType="Long">

SELECT username name FROM user u WHERE u.id=#{id}

</select>

<!-- 通过resultMap输出 -->

<select id="findByMap" resultMap="aliasResultMap" parameterType="Long">

SELECT id id_ ,username name_ ,address address_ FROM user u WHERE u.id=#{id}

</select>

<!-- 插入数据 -->

<insert id="insertUser" parameterType="User">

<!-- 本来主键是自增的,在插入数据时还没有插入主键,所以将插入的主键返回到user对象中 -->

<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">

SELECT LAST_INSERT_ID()

</selectKey>

INSERT INTO user(username,sex,birthday,address) VALUE(#{username},#{sex},#{birthday},#{address})

</insert>

<!-- 更新数据 -->

<update id="updateUser" parameterType="User">

UPDATE user SET username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} WHERE id=#{id}

</update>

<delete id="deleteUserById" parameterType="Long">

DELETE FROM user WHERE id=#{id}

</delete>

<resultMap type="User" id="UserOderResultMap">

<id column="id" property="id"/>

<result column="username" property="username"/>

<result column="sex" property="sex"/>

<result column="birthday" property="birthday"/>

<result column="address" property="address"/>

<collection property="ordersList" ofType="Orders">

<id column="userId" property="userId"/>

<result column="createtime" property="createtime"/>

<result column="number" property="number"/>

<result column="createtime" property="userId"/>

<result column="note" property="note"/>

</collection>

</resultMap>

<select id="findUserOrderMap" resultMap="UserOderResultMap">

select user.*,orders.number,orders.note,orders.createtime from orders, user where orders.userId=user.id

</select></mapper> javabean: package com.gisquest.bean;import java.util.List;public class User {

private Long id;

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

private String username;

private int sex;

public int getSex() {

return sex;

}

public void setSex(int sex) {

this.sex = sex;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

private String birthday;

public String getBirthday() {

return birthday;

}

public void setBirthday(String birthday) {

this.birthday = birthday;

}

private String address;

private List<Orders> ordersList;

public List<Orders> getOrdersList() {

return ordersList;

}

public void setOrdersList(List<Orders> ordersList) {

this.ordersList = ordersList;

}

@Override

public String toString() {

return "User [id=" + id + ", username=" + username + ", sex=" + sex

+ ", birthday=" + birthday + ", address=" + address + "]";

}} dao层: package com.gisquest.dao;import java.util.List;import java.util.Map;import org.springframework.stereotype.Repository;import com.gisquest.bean.User;@Repositorypublic interface UserMapper {

public User findByUserId(Long id);

public void insertUser(User user);

//更新user

public void updateUser(User user);

//删除特定user

public void deleteUserById(Long id);

//使用sql片段动态查询

public List<User> findDynamic(Map paramMap);

//使用别名查

public String findByAlias(Long id);

public User findByMap(Long id);

//userorders关联查询

public List<User> findUserOrderMap();} service层: /** * @Project : test Maven Webapp * @Title : UserService.java * @Package com.gisquest.service * @Description : * @author laiyao * @Copyright : 2015 zhejiang shine Technology Co. Ltd All right reserved. * @date 2015年6月26日 下午12:40:45 * @version V1.0 */package com.gisquest.service;import com.gisquest.bean.User;/** * @ClassName: UserService * @Description: * @author: laiyao * @date: 2015年6月26日下午12:40:45 */public interface UserService {

public User findByUserId(Long id);

public void insert(User user);

public void update(User user);

public void delete(Long id);} service实现类: /** * @Package com.gisquest.service.Impl * @Description : * @author laiyao * @Copyright : 2015 zhejiang shine Technology Co. Ltd All right reserved. * @date 2015年6月26日 下午12:42:04 * @version V1.0 */package com.gisquest.serviceImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.gisquest.bean.User;import com.gisquest.dao.UserMapper;import com.gisquest.service.UserService; /** * @ClassName: UserServiceImpl * @Description: * @author: laiyao * @date: 2015年6月26日下午12:42:04 */@Service@Transactionalpublic class UserServiceImpl implements UserService{

@Autowired

private UserMapper userMapper;

public void findByUserId1() {

// TODO Auto-generated method stub

User user=userMapper.findByUserId(1L);

System.out.println(user);

}

public User findByUserId(Long id) {

// TODO Auto-generated method stub

return userMapper.findByUserId(id);

}

@Override

public void insert(User user) {

// TODO Auto-generated method stub

userMapper.insertUser(user);

}

@Override

public void update(User user) {

// TODO Auto-generated method stub

userMapper.updateUser(user);

}

@Override

public void delete(Long id) {

userMapper.deleteUserById(id);

}} controller层: package com.gisquest.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; 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.ResponseBody; import com.gisquest.bean.User; import com.gisquest.service.UserService; @Controller @RequestMapping(“/”) public class UserController { @Autowiredprivate UserService userService;@RequestMapping(value="/show",method=RequestMethod.POST)public String show(Model model){

User user=userService.findByUserId(1L);

model.addAttribute("user", user);

return "index";}/** *

* @description : 查询 * @author :laiyao * @date :2015年8月17日 */@RequestMapping(value="/show2",method=RequestMethod.GET)public @ResponseBody User show2(Model model,HttpServletRequest request){

User user=userService.findByUserId(1L);

model.addAttribute("user", user);

return user;}/** *

* @description : 插入一条数据 * @author :laiyao * @date :2015年8月17日 */@RequestMapping(value="/insert",method=RequestMethod.POST,produces = "application/json")public @ResponseBody String insert(@RequestBody User user,HttpServletRequest request){

userService.insert(user);

return "保存user成功";}/** *

* @description : 更新user * @author :laiyao * @date :2015年8月17日 */@RequestMapping(value="/update/{id}",method=RequestMethod.PUT,produces = "application/json")public @ResponseBody User update(@PathVariable Long id,@RequestBody User user,HttpServletRequest request){

User users=userService.findByUserId(id);

users.setAddress(user.getAddress());

users.setBirthday(user.getBirthday());

users.setSex(user.getSex());

users.setUsername(user.getUsername());

userService.update(users);

return users;}/** *

* @description : 删除user * @author :laiyao * @date :2015年8月17日 */@RequestMapping(value="/delete/{id}",method=RequestMethod.DELETE,produces="application/json")public @ResponseBody String delete(@PathVariable Long id,HttpServletRequest request){

userService.delete(id);

return "delete user has finished";} } 在这里面最重要的是@ResponseBody和@RequestBody这两个注解,这两个注解就是来获取请求参数和返回资源用的。 接着再测试一下: 删除: 新增: 更新:

原文

首先,要知道什么是rest服务,什么是rest服务呢? REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fiel

------分隔线----------------------------