REST架构是一个抽象的概念,目前主要是基于HTTP协议实现,其目的是为了提高系统的可伸缩性、降低应用之间的耦合度、便于架构分布式处理程序。当使用多种语言进行开发的时候,每一种语言对URL的处理不同,这时候就需要统一处理,那么使用REST编程风格就很有必要了。REST只是一种设计模式,如果需要对安全性有要求,就是额外的功能代码了。

使用方式

在URL中设置使用如下方式: /{变量名1}/{变量名2}

在代码中向Controller方法注入参数:  (@PathVariable("变量名1") String str1,@PathVariable("变量名2") String str2) 
例如:

        @RequestMapping(value="/book/{bookid}",method=RequestMethod.POST)
@ResponseBody
public Object getBook(@PathVariable("bookid") String bookid){ return new Book();
}

Demo

bean类:

package cn.xdl.bean;

public class Book {

    private int bid;
private String bname;
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public Book(int bid, String bname) {
super();
this.bid = bid;
this.bname = bname;
}
public Book() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Book [bid=" + bid + ", bname=" + bname + "]";
} }

Book.java

Controller类:

package cn.xdl.c;

import java.util.HashMap;
import java.util.Map; import org.springframework.stereotype.Controller;
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.ResponseBody; import cn.xdl.bean.Book; @Controller
public class BookController { /**
* VALUE :请求的地址模版 (模版中使用大括号括住的部分, 属于变量)
* method: 请求的方式
* @return
*/
@RequestMapping(value="/book/{bookid}",method=RequestMethod.GET)
@ResponseBody
public Object insertBook(@PathVariable("bookid") String bookId) {
System.out.println("正在查询图书 , 请求的图书的编号为:"+bookId);
return new Book(Integer.parseInt(bookId), "欢乐颂");
}
@RequestMapping(value="book/{bookid}",method=RequestMethod.DELETE)
@ResponseBody
public Object deleteBook(@PathVariable("bookid")String bookid) {
System.out.println("正在删除图书:id:"+bookid);
Map<String,String> map = new HashMap<String,String>();
map.put("errorCode0", "0");
map.put("msg", "删除成功");
return map;
}
@RequestMapping(value="book/{bookid}/{bookname}",method=RequestMethod.PUT)
@ResponseBody
public Object updateBook(@PathVariable("bookid") String bookId,@PathVariable("bookname") String bookName) {
System.out.println("正在修改图书:id:"+bookId+", 要修改的新书名:"+bookName);
Map<String,String> map = new HashMap<String,String>();
map.put("errorCode0", "0");
map.put("msg", "修改成功");
return map;
} @RequestMapping(value="book/{bookid}/{bookname}",method=RequestMethod.POST)
@ResponseBody
public Object insertBook(@PathVariable("bookid") String bookId,@PathVariable("bookname") String bookName) {
System.out.println("正在添加图书:id:"+bookId+", 要添加的新书名:"+bookName);
Map<String,String> map = new HashMap<String,String>();
map.put("errorCode0", "0");
map.put("msg", "添加成功");
return map;
} }

BookController.java

这里的通信方式返回的结果是Object对象。在这个笔者使用了注解 @ResponseBody ,需要导入包 jackson-annotations.jar 、 jackson-core.jar 和 jackson-databind.jar包。

bean.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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd">
<!--
开启注解扫描
-->
<context:component-scan base-package="cn"></context:component-scan>
<!--
开启mvc注解扫描
-->
<mvc:annotation-driven/> <mvc:default-servlet-handler/> </beans>

bean.xml

在配置文件中一定需要指出:

<mvc:default-servlet-handler/>

否则会出现静态资源(如js、css等资源)拦截404的错误。

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" version="3.0"> <servlet>
<servlet-name>webmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:bean.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>webmvc</servlet-name>
<url-pattern>/</url-pattern> </servlet-mapping> </web-app>

web.xml

web.xml文件过滤的url必须写成 <url-pattern>/</url-pattern> ,因为采用REST编程风格,在url地址中只会出现/分割符号,所以只能写成这样 <url-pattern>/</url-pattern> ,以匹配所有的路径。

restTest.jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
function insertClick(){
$.ajax({
url:"book/10003/hahaha",
dataType:"JSON",
type:"POST",
success:function(data){
alert( JSON.stringify(data));
},
error:function(){ }
}); }
function deleteClick(){
$.ajax({
url:"book/10003",
dataType:"JSON",
type:"DELETE",
success:function(data){
alert( JSON.stringify(data));
},
error:function(){ }
}); }
function updateClick(){
$.ajax({
url:"book/10003/hahaha",
dataType:"JSON",
type:"PUT",
success:function(data){
alert( JSON.stringify(data));
},
error:function(){ }
}); }
function findClick(){
$.ajax({
url:"book/10003",
dataType:"JSON",
type:"GET",
success:function(data){
alert( JSON.stringify(data));
},
error:function(){ }
}); } </script>
</head>
<body>
<input onclick="insertClick()" type="button" value="增加"/><br><br>
<input onclick="deleteClick()" type="button" value="删除"/><br><br>
<input onclick="updateClick()" type="button" value="修改"/><br><br>
<input onclick="findClick()" type="button" value="查询"/><br><br>
</body>
</html>

restTest.jsp

这里通信方式是采用Ajax请求。

Rest请求地址中带有中文的处理

如果在Rest风格的请求中,请求的参数带有中文,就会出现映射错误。这时候需要进行如下的配置:

在SpringMVC的配置文件中将 <mvc:annotation-driven/> 改为:

<!--开始注解-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

除此之外还需要在tomcat 的 server.xml中,加入URIEncoding="UTF-8":

    <Connector connectionTimeout="20000" port="8081" URIEncoding="UTF-8" protocol="HTTP/1.1" redirectPort="8443"/>

这样就可以解决Rest请求中中文乱码的问题了。

【Spring】SpringMVC之REST编程风格的更多相关文章

  1. Spring+SpringMVC+Mybatis大整合(SpringMVC采用REST风格、mybatis采用Mapper代理)

    整体目录结构: 其中包下全部是采用mybatis自动生成工具生成. mybatis自动生成文件 <?xml version="1.0" encoding="UTF- ...

  2. Eclipse Meaven Spring SpringMVC Mybaits整合

    本示例是在:Ubuntu15上实现的:Windows上安装Maven将不太相同. Maven Install Run command sudo apt-get install maven, to in ...

  3. myBatis+Spring+SpringMVC框架面试题整理

    myBatis+Spring+SpringMVC框架面试题整理(一) 2018年09月06日 13:36:01 新新许愿树 阅读数 14034更多 分类专栏: SSM   版权声明:本文为博主原创文章 ...

  4. java web后台开发SSM框架(Spring+SpringMVC+MyBaitis)搭建与优化

    一.ssm框架搭建 1.1创建项目 新建项目后规划好各层的包. 1.2导入包 搭建SSM框架所需包百度云链接:http://pan.baidu.com/s/1cvKjL0 1.3整合spring与my ...

  5. myBatis,Spring,SpringMVC三大框架ssm整合模板

    整合步骤 创建web工程 导入整合所需的所有jar包 编写各层需要的配置文件 1) mybatis的全局配置文件 <configuration>    <!-- 批量别名的设置 -- ...

  6. Spring+SpringMVC+Mybatis+MAVEN+Eclipse+项目完整环境搭建

    1.新建一个Maven项目,创建父项目. 2.创建子项目模块 3.创建javaWeb项目 4.创建后的项目目录结构 5.Maven文件配置 parent父项目pom.xml文件配置 <?xml ...

  7. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)--S ...

  9. Spring+SpringMVC+MyBatis深入学习及搭建(十四)——SpringMVC和MyBatis整合

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7010363.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十三)--S ...

随机推荐

  1. 使用 mongodb 的 Docker Image 快速上手系列 lab

    Docker 主要的概念 Dockerfile => 用來產生 docker image 用的(介紹) Image => 可以用來產生 docker container Container ...

  2. php获取网址

    #测试网址: http://localhost/blog/testurl.php?id=5 //获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br> ...

  3. 获取js连接参数js_args

    获取js连接参数,如下以链接: <script src="js/jscript.js?skin=green" type="text/javascript" ...

  4. UBUNTU 字符界面来回切换

    图形界面切换到字符界面: 实体机:Ctrl + Alt + F1 VMware虚拟机:按下ALT+CTRL+SPACE(空格),ALT+CTRL不松开,再按F1.这样就可以切换到字符界面 字符界面切换 ...

  5. 算法笔记_203:第四届蓝桥杯软件类决赛真题(C语言B组)

    目录 1 猜灯谜 2 连续奇数和 3 空白格式化 4 高僧斗法 5 格子刷油漆 6 农场阳光   前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 猜灯谜 标题:猜灯谜 A 村的元宵节灯会上有一迷题: ...

  6. linux目录结构介绍

    目录 1.树状目录结构图 2./目录 3./etc/目录 4./usr/目录 5./var/目录 6./proc/目录 7./dev/目录 该文章主要来自于网络进行整理. 目录结构参考地址: http ...

  7. 让网络编程更轻松和有趣 t-io

    原文:https://www.oschina.net/p/t-io 注意:还是尽量去看原文,因为原文下面的评论也很有意思,可以参考大牛的讨论学习到新的东西 授权协议:Apache 开发语言:Java ...

  8. 使用 loop device 制作安装镜像

    看了下,手上的镜像中,文件系统才 100 多兆,但是整个镜像居然要 4G, 这意味着,我每次安装这个镜像到 SD 卡都要花很多没必要的时间. 所以,我提取了一些关键内容,然后,准备重新打包镜像. 1. ...

  9. 批量 ping 测试脚本(IP 扫描)

    是否会使用 vpn 工作,已经成为魔法师和麻瓜之间最重要的区分.使用 vpn 工作,也产生了其它一些奇奇怪怪的问题,比如,选择 vpn 服务器. 你要测试哪个 vpn 离你最近. 所以,就有了下面的脚 ...

  10. PowerDesigner使用笔记

    一:PDM模版使用 1:新建model:File——new model——选择PDM,填上名字.数据库类型 2:右侧工具类使用 3:创建表与配置 点击右侧工具栏中table控件,移动到模版面板内点击一 ...