发表于: 2017-10-20 23:36:29

5 697


今日完成:

               1)完成增删改查的restFul接口

                      增加用户: /user   POST,

                      删除用户:/user/id   delete

                      修改用户:/user/id    PUT

                      查询某个用户:/user/id   GET 

               今天又学习了一下restFul,找到了一篇非常好的博客,用于作为restFul设计的指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

             2)spring对于restFul的支持,首先,必须明确一点,默认情况下,tomcat是无法通过put与delete 发送请求体中数据的。对于删除用户还好,只需要在url上加一个id,但是对于更新用户就会用问题。先看一下我之前的操作:

                   

$.ajax(
{
url:"/user/"+$("#ID_1").val(),
type:'PUT',
async:true,
data:{
"name":$("#name_1").val(),
"qq":$("#qq_1").val(),
"learn_type":$("#learn_type_1").val(),
"school":$("#school_1").val(),
"daily_url":$("#daily_url_1").val(),
"flag":$("#flag_1").val(),
"senior":$("#senior_1").val(),
"source":$("#senior_1").val()
},
success:function(data){
var value=JSON.stringify(data);
$("#con_update").val(value);
}
}

  

    这样后台User根本无法接受到数据

public @ResponseBody Boolean update(@PathVariable  Long id,User user){


为了解决这个问题,我今天尝试了一下,有两种方式:

                                1)通过PUT发送JSON数据

$.ajax(
{
url:"/user/"+$("#ID_1").val(),
type:'PUT',
async:true,
contentType: "application/json; charset=utf-8",
data:JSON.stringify({
"name":$("#name_1").val(),
"qq":$("#qq_1").val(),
"learn_type":$("#learn_type_1").val(),
"school":$("#school_1").val(),
"daily_url":$("#daily_url_1").val(),
"flag":$("#flag_1").val(),
"senior":$("#senior_1").val(),
"source":$("#senior_1").val()
}),
success:function(data){
var value=JSON.stringify(data);
$("#con_update").val(value);
}
}

                                这其中使用到了与springmvc整合的jackson

                                 对应表现层:

                  

@RequestMapping(value="/{id}",method = RequestMethod.PUT)

//@RequestBody的作用是将前台的json对象映射到User中去

public @ResponseBody Boolean update(@PathVariable  Long id,@RequestBody  User user){

                              但是这里面还有一个问题,今天一直困扰我,现在只能认为:jackson不支持前台的字符串转换为Long类型。因为,如果在前台ajax的data中加入“ID”字段,到后台后,会发现ID为null,无法自动映射过来。(希望师兄可以知道这是为什么)

                              不过,还好,在表现层直接加入了一个

user.setID(id);

                             直接将url中的id设置进来。

                            2)第二种方式:通过在web.xml文件中配置

HiddenHttpMethodFilter

这个拦截器,然后在ajax中这样写:

                                

$.ajax(
{
url:"/user/"+$("#ID_1").val(),
type:'POST',
async:true,
data:{
"_method":"PUT",
"name":$("#name_1").val(),
"qq":$("#qq_1").val(),
"learn_type":$("#learn_type_1").val(),
"school":$("#school_1").val(),
"daily_url":$("#daily_url_1").val(),
"flag":$("#flag_1").val(),
"senior":$("#senior_1").val(),
"source":$("#senior_1").val()
},
success:function(data){
var value=JSON.stringify(data);
$("#con_update").val(value);
}
}


                       不使用json,加入一个“_method”字段,设置为put,提交方式为POST

                     对应的web.xml

<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

                           它可以将_method中的内容到springmvc中的时候转换为对应的方式。这也支持delete提交的时候转换数据

                          3)第三种方式:直接在web.xml配置另外一个拦截器

 

<filter>
<filter-name>HttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

                                  这只对PUT生效,这样的话,就可以将PUT当POST使用了

                          

  希望今天的日报可以帮助那些与我有一样疑问的人。

  明日任务:

                       学习svn,好好看看@RequestMpping这个注解,学习jetty,加快进度。


返回列表 返回列表
评论

    分享到