牛骨文教育服务平台(让学习变的简单)
博文笔记

Spring框架之基于Restful风格实现的SpringMVC

创建时间:2016-12-21 投稿人: 浏览次数:14029

如果说现在你要做一个系统,假设说有一个模块属于公告管理,那么我们可能安排路径的时候会这样安排NewsAction路径: 
· 增加新闻:/pages/back/admin/news/add.action; 
· 新闻列表:/pages/back/admin/news/list.action 
随着技术的发展,有一种新型的架构设计思想:Restful风格,也就是说利用一个简单的路径,而后根据HTTP提交模式不同。那么可以完成不同的功能,也就是说: 
· 看一个新闻内容:/news/1,GET; 
· 删除新闻:/news/1,DELETE。

基础整合配置 
如果现在希望Spring MVC运行的时候可以以Restful的风格进行执行,那么首先需要添加一些依赖程序库,修改pom.xml文件,追加如下的配置:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.3</version>
<version>2.8.3</version>
  • 1
  • 2
  • 3
  • 4
  • 5

在pom.xml里配置


        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.3</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

随后还需要修改web.xml文件,因为如果要想实现Restful风格的开发,那么对于所有的Action请求路径就必须做出修改

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
  • 1
  • 2
  • 3
  • 4

建立一个MemberAction程序类,定义有如下的一个程序操作:

public class MemberAction {
// 定义该方法的访问路径,而后表示该方法返回的数据类型为普通的文本类型(MIME)
    @RequestMapping(value="/info",produces="text/plain;charset=UTF-8")
    public @ResponseBody String info() { // 该方法的返回值即回应的主题消息
    return "www.mldnjava.cn" ;
    }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在未使用restful操作的时候要想实现这样的输出则必须利用response对象完成处理,但是如果使用了restful之后整个的操作利用注解可以直接将方法的返回内容变为一个具体的文本数据出现。

    @RequestMapping(value = "/echo/{msgParam}", produces = "text/plain;charset=UTF-8")
    public @ResponseBody String echo(@PathVariable("msgParam") String msg) {
        return "ECHO : " + msg;
    }
  • 1
  • 2
  • 3
  • 4

也就是说整个在Restful处理过程之中,这些路径的控制会更加的全面,可以表述的含义也更加的丰富。

Spring MVC本身支持restful风格操作,但是在整个的Restful风格里面大部分的情况都是与JSON的结合处理。所以首先需要配置JSON相关的程序开发包

<dependency>
    <groupId>net.sf.ezmorph</groupId>
    <artifactId>ezmorph</artifactId>
    <version>1.0.6</version>
</dependency>
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.2</version>
</dependency>
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

这个时候还需要使用到JSON的开发包,但是对于这个开发包建议自己单独配置。

实现数据的追加处理

Restful风格的主题操作都表示可以直接进行信息的接收与处理,利用Spring MVC中提供的自动VO接收处理,以及返回JSON处理结果为方式进行一个增加的操作实现。 1、 建立一个Member.java的VO类,这个VO类需要考虑到后期针对于JSON转换输出操作。

package cn.mldn.vo;
import java.io.Serializable;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
@SuppressWarnings("serial")
@XmlRootElement
public class Member implements Serializable {
    private Integer mid ;
    private String name ;
    private Double salary ;
    private Date hiredate ;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在MebmerAction程序里面建立一个处理方法; · 增加日期的处理转换器:

private Logger log = Logger.getLogger("MemberAction.class");

    @InitBinder
    public void initBinder(WebDataBinder wdb){
        wdb.registerCustomEditor(java.util.Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }

    @RequestMapping(value="/member",method=RequestMethod.POST,produces="application/json;charset=UTF-8")
    public @ResponseBody Object add(Member vo){
        log.info("member的add方法");
        log.info("member:" + vo);
        JSONObject obj = new JSONObject();
        obj.put("flag", true);
        return obj;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

建立一个JSP以及JS操作通过jQuery尽心调用处理:

<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/restful_demo.js"></script>
  • 1
  • 2
<div id="butDiv">
<button id="addMember"> </button>
</div>
<div id="showDiv"></div>
  • 1
  • 2
  • 3
  • 4

定义一个restful_dempo.js文件,来进行数据验证等操作:

$(function(){
    $(addMember).on("click",function(){
        $.ajax({
            url : "member",
            type : "post",
            dataType : "json",
            data : {
                mid : 1001,
                name : "史密斯",
                salary : 9888.2,
                hiredate : "1999-10-12"
            },
            success : function(data){
                $(showDiv).append("<p>增加处理结果"+data.flag+"</p>");
            },
            error : function(data){
                $(showDiv).append("<p>对不起出错了     !!!!!!!!!!!!</p>");
            }
        });
    });
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

数据更新处理

数据的更新处理主要是值得是修改增加删除,其中对于增加处理已经完成了,
实现修改操作:
在MemberAction里面最佳一个新的方法:
    @RequestMapping(value="/member",method=RequestMethod.PUT,produces="application/json;charset=UTF-8")
    public @ResponseBody Object edit(Member vo){
        JSONObject obj = new JSONObject();
        log.info("edit" + vo);
        obj.put("flag", true);
        return  obj;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

随后在restful_demo.js文件里面对editMember文件里面为按钮绑定时间:

$(editMember).on("click",function(){
        $.ajax({
            url : "member?mid=1111&name=阿伦&salary=999.99&hiredate=1999-90-90",
            type : "put",
            dataType : "json",
            success : function(data){
                $(showDiv).append("<h1>修改处理操作 "+ data.flag +"</h1>");
            },
            error : function(data){
                $(showDiv).append("<h1>修改页面出错了</h1>");
            }
        });
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

删除用户处理: 
在MemberAction只中定义相关的删除处理方法

    @RequestMapping(value="/member/{mid:\d+}",method=RequestMethod.DELETE,produces="application/json;charset=UTF-8")
    public @ResponseBody Object delete(@PathVariable("mid") int mid){
        JSONObject obj = new JSONObject();
        obj.put("flag", true);
        log.info("delete" + mid);
        return obj;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在js里面需要发送的是DELETE请求模式:

    $(removeMember).on("click",function(){
        $.ajax({
            url : "member/1001",
            type : "delete",
            dataType : "json",
            success : function(data){
                $(showDiv).append("<h1>删除处理操作 "+ data.flag +"</h1>");
            },
            error : function(data){
                $(showDiv).append("<h1>删除页面出错了</h1>");
            }
        });
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在Restful里面增加使用POST模式,修改使用PUT模式,删除使用DELETE模式:

之后进行数据的查询操作: 
对于数据的查询操作最多的形式就是进行单的信息查询,以及数据的分页查询操作: 
取得单个用户信息: 
在MemberAction里面定义一个根据id取得用户信息的处理操作:

@RequestMapping(value="/member/{mid:\d+}",method=RequestMethod.GET,produces="application/json;charset=UTF-8")
    public @ResponseBody Object get(@PathVariable("mid") int mid){
        Member vo = new Member();
        vo.setMid(mid);
        vo.setName("史密斯");
        vo.setSalary(199.11);
        vo.setHiredate(new Date());
        return vo;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在前台页面之中使用js进行调用,把返回的结果直接进行输出:

$(listMember).on("click",function(){
        $.ajax({
            url : "member/mid",
            type : "patch",
            dataType : "json",
            success : function(data){
                $(showDiv).append("<h1> "+data.condition+" </h1>");
                $(showDiv).append("<h1> "+data.memberCount+" </h1>");
                console.log(data.allMembers.length);
                for(var x = 0 ; x < data.allMembers.length ; x ++){
                    $(showDiv).append("<h1> 修改处理操作"+ data.allMembers[x].mid +", "+data.allMembers[x].name+" "+data.allMembers[x].salary+" "+new Date(data.allMembers[x].hiredate).format("yyyy-MM-dd hh:mm:ss")+"</h1>");
                }
            },
            error : function(data){
                $(showDiv).append("<h1>分页查找页面出错了</h1>");
            }
        });
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在js页面之中对时间日期函数进行处理:

Date.prototype.format = function(fmt) {
    var o = {
        "M+" : this.getMonth() + 1, //
        "d+" : this.getDate(), //
        "h+" : this.getHours(), //
        "m+" : this.getMinutes(), //
        "s+" : this.getSeconds(), //
        "q+" : Math.floor((this.getMonth() + 3) / 3), //
        "S" : this.getMilliseconds()
        //
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "")
                .substr(4 - RegExp.$1.length));
    for ( var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k])
                    : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}

  • 1
  • 2
  • 3
  • 4
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。