博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC简单构造restful, 并返回json
阅读量:5747 次
发布时间:2019-06-18

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

hot3.png

 

文章要要点:

  1. 快速搭建构造restful的StringMvc

  2. GET, POST , PUT , DELETE的各种调用

  3. 同一资源 多种表述 (ContentNegotiatingViewResolver解析器),既可以返回对象给JSP, 也可以返回JSON

快速搭建构造restful的StringMvc

首现搭建一个简单的restfulMvc框架,  并上配置文件, 后期会增加带JSON返回值的配置

JAR包

123445_SDP3_2272916.png

web.xml配置

    
spring
    
org.springframework.web.servlet.DispatcherServlet
    
    
        
contextConfigLocation
        
classpath:config/spring-servlet.xml
    
    
1
   
   
     
spring
     
/api/*
 
  
 
     
org.springframework.web.context.ContextLoaderListener
 
  
 
     
contextConfigLocation
     
classpath:config/applicationContext-*.xml
 

spring-servlet.xml配置

 
               
    
    
    
          
    
      

applicationContext.xml暂时没写东西

该配置的配置完了,下面就是写第一个HelloWord

package com.dsp.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;@Scope("prototype")@Controller@RequestMapping("/products")public class TestController{  /**  * 测试方法,HelloWord  * @param request  * @param response  * @return  * @throws Exception  */ @RequestMapping(value="/list",method=RequestMethod.GET)    public String getProducts(HttpServletRequest request,HttpServletResponse response) throws Exception {          request.setAttribute("name", "helloWord");                return "products/list";            }}

@Scope("##") : spring默认的Scope是单列模式(singleton),顾名思义,肯定是线程不安全的.  而@Scope("prototype")

    可以保证每个请求都会创建一个新的实例,  还有几个参数: session  request

    @Scope("session")的意思就是,只要用户不退出,实例就一直存在,

    request : 就是作用域换成了request

@Controller : 不多做解释 , 标注它为Controller

@RequestMapping :是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是   以该地址作为父路径。 比如现在访问getProducts方法的地址就是 :

   项目名/上面web.xml配置(api)/products/list

  l

暂时先介绍两个属性 value和method

具体可以参考我参考的文章

value: 就是映射的实际地址,这个上面有说过,  而重要的是里面的值 , 有几个比较感兴趣的

   1. 正常的 /list                          访问地址类似 项目名/api/products/list

   2. 带参数的 /info/{proId}          访问地址类似 项目名/api/products/info/0001

method: 请求的method类型 GET POST PUT DELETE等

好,做个测试 JSP代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
 你好${name }

地址栏输入

得到结果

154105_wiYR_2272916.png

 

 

GET, POST , PUT , DELETE的各种调用

刚才写的是第一种GET, 第二种GET:

@RequestMapping(value="/info/{proId}",method=RequestMethod.GET)    public String getProductInfo(@PathVariable String proId, HttpServletRequest request,HttpServletResponse response) throws Exception {            request.setAttribute("name", proId);                    return "products/list";            }

@PathVariable注解获取的就是大括号里的值

测试 : 输入地址

测试结果为

160138_2rdw_2272916.png

如果不用@PathVariable接收大括号里的值,也可以用bean来接收:

public String getProductInfo(Product pro, HttpServletRequest request,HttpServletResponse response)...

而且也可以设置多个参数

@RequestMapping(value="/info/{pid}/{pname}",method=RequestMethod.GET)

让我们看下面这段代码

@RequestMapping(value="/info/{pid}/{pname}",method=RequestMethod.GET)    public String getProductInfo(Product pro, HttpServletRequest request,HttpServletResponse response) throws Exception {    request.setAttribute("name", pro.getPid()+"___"+pro.getPname());    return "products/list";            }

访问地址:

得到的结果为 :

161214_dt0T_2272916.png

 

下面介绍POST的调用

list.jsp新增form表单如下

    ${name }    
<%=basePath%>/api/products/info" method="post">         
          
          
    

JAVA代码

@RequestMapping(value="/info",method=RequestMethod.POST)    public String insertProduct(Product pro, HttpServletRequest request,HttpServletResponse response) throws Exception {          request.setAttribute("name", pro.getPid()+"___"+pro.getPname());                return "products/list";            }

form提交后结果为

162020_FgPl_2272916.png

执行成功.

正常的FORM提交 , 只需要用对象接就可以了

 

补上 PUT DELETE 就和表单不一样了, 因为表单只支持GET和POST

这时候就需要用到ajax,  或者nodejs调用

贴上jsp代码

function savepro(){ var saveData = {"pid":"aa"}; //发送给服务器的JSON $.ajax({  type : "PUT",  url : "/RestFulMvc/api/products/info.json",  data:JSON.stringify(saveData),  contentType:"application/json",  //发送至服务器的类型  dataType : "json",     //预期服务器返回类型  success: function(data){   alert(data);  }   })}
 

 后台代码

@RequestMapping(value="/info",method=RequestMethod.PUT)    public ModelAndView updateProduct(@RequestBody Product pro, HttpServletRequest request,HttpServletResponse response) throws Exception {    Map
 map1 = new HashMap
();  map1.put("pid", pro.getPid());    ModelAndView mav=new ModelAndView("products/list",map1);    return mav;            }

和以往不一样的是, 后台接收参数的对象前面 加了个@RequestBody , 这个是用于把传来的JSON 转换成接收的对象, 如果是form提交就不需要了, 但如果前台用的是application/json类型传进来,就一定要加@RequestBody

得到的结果:

173544_a9ty_2272916.png

 

同一资源 多种表述

如果写完一个方法,返回request到JSP, 可同时手机端需要调接口怎么办, 如果前台的一层皮换成了以nodejs为服务的框架调用怎么办

可以每个需求再写一个方法返回JSON, 可下面这个可以同一资源,多种返回

spring-servlet.xml加入如下配置

 
 
            
   
         
   
         
        
          
           
          
            
  
        
          
                 
                         
             
                
                                     
             

 

这样同一个地址,只要在后面加 .json  mediaTypes就可以把 的 .json映射到application/json

值得注意的是, 如果不加 <property  name="extractValueFromSingleKeyModel" value="true" />

得出来的Product对象的JSON为

{"product":{"pid":"00001","pname":"23123"}}

如果想要的结果为

{"pid":"00001","pname":"23123"}

则不要前面的对象名称包在外面时, 请加上它

 

后台代码

@RequestMapping(value={"/info/{pid}"},method=RequestMethod.GET)    public ModelAndView getProductInfo(@PathVariable String pid, HttpServletRequest request,HttpServletResponse response) throws Exception {            Map
 map = new HashMap
();                    Product pro = new Product();          pro.setPid(pid);          map.put("name", pid);          map.put("pro", pro);                    ModelAndView mav=new ModelAndView("products/list",map);                    return mav;            }

 

测试: 输入地址 :  

 

得到的结果为

{"pro":{"pid":"00001","pname":null},"name":"00001"}

 

ModelAndView是springmvc自带的重定向方法

第一个参数是返回的地址,和以往一样,  第二个参数以后, 是传给前台的值 .

如果有第二个参数, 没有第三个参数 , 那第二个参数只能是map的

也可以第二个参数为建, 第三个参数为值的方式传给前台,  具体大家可以new一个ModelAndView看看它提供的构造方法

 

 

最后 如果是nodejs  ajax提交的数据,以application/json格式提交时,

接收参数可以在参数前加 @@RequestBody

public ModelAndView getProductInfo(@RequestBody Product pro, HttpServletRequest request .....

它可以把json转换为对象里的属性

转载于:https://my.oschina.net/u/2272916/blog/352297

你可能感兴趣的文章
【C语言】03-第一个C程序代码分析
查看>>
斐波那契数列 Php练手
查看>>
ArcGIS Server 10 for java 注册SOE出现的问题
查看>>
jquery ajax 不执行赋值,return没有返回值的解决方法
查看>>
与众不同 windows phone (48) - 8.0 其它: C# 调用 C++
查看>>
Zookeeper Tutorial 2 -- Programmer's Guide
查看>>
树形结构 DropDownList
查看>>
RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)
查看>>
Lua的function、closure和upvalue
查看>>
[转]学习C#:Attribute与Property
查看>>
Error opening zip file or JAR manifest missing : D:\play-1.2.5/framework/play-1.2.5.jar
查看>>
MySQL自定义查询字段排序
查看>>
JS思维之路菜鸟也能有大能量(1)--模拟push
查看>>
Imatest 崩溃
查看>>
领域驱动设计之单元测试最佳实践(二)
查看>>
Python实现C代码统计工具(三)
查看>>
CentOS下安装LAMP环境
查看>>
2015年最全的移动WEB前端UI框架
查看>>
[工具] 将Sublime Text 3配置为Java代码编辑器
查看>>
iOS开发UI篇—APP主流UI框架结构
查看>>