发表于: 2018-03-29 23:46:15
1 588
今天重新定义一下我想实现的rest风格的url吧,在我的理解就是:
@requestmapping(/students/1 )可以实现对ID为1的学生的delete、update和select操作。
@requestmapping(/students )可以实现对所有学生的select和add操作。
那么这个过程应该如何实现呢?拿delete过程举例:
首先在jsp页面设置一个
<td><a href="student/${s.id}">删除</a></td>
超链接,如果你按了删除键url就会变为student/${s.id},这就是controller中需要获取的requestmapping,
@RequestMapping(value="/student/{id}",method= RequestMethod.POST,produces = "text/plain;charset=utf-8")
可以理解为如果在jsp有
"/student/{id}"
该url触发,那么就会到控制器找到对应的方法,id的值也被相对的传进来,然后执行该方法下的方法,即与数据库交互的部分,然后通过modelandview返回,这里modelandview我用了两种返回方式,其中这种比较特别:
ModelAndView modelAndView = new ModelAndView("redirect:/student");
return modelAndView;
即在删除数据之后会直接跳转到/student页面。
这就自然而然的产生了问题,如果都是同一个url即控制器接收到的url都相同,而方法也均为post,那么怎么执行3种方法?通过post一种方法肯定是无法办到的,我就去搜索了一下,虽然html只支持post和get两种方法,不过可以通过配置如下web文件过滤器:
-<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>
来让delete和put方法可以被识别,不仅需要在html中这样配置,还要对应在jsp文件中修改:
<form.... method="post"
<input type ="hidden" name="_method" value="put/delete">
实际上html提交的是post方法,不过在通过过滤器之后会将hidden中的method赋值,也就是说传到控制器的实际上是put/delete方法,如果我这样写控制器:
@RequestMapping(value="/student/1",method= RequestMethod.DELETE,produces = "text/plain;charset=utf-8")
那这个DELETE方法就会被执行,而不会报错说无法识别delete方法(如果没有过滤器和hiddenname的话是报错的,注意表单方法要写成post,因为delete和put需要提交post才能执行)。
这种方式很符合我的想法,在同一个url下可以通过delete、put、get实现3种操作,不过今天各种查资料得知tomcat8中已经废弃了delete和put方法,本来以为问题解决了的时候又发现一个问题,我用这种方式得到的put方法是可以实现的,这也是我昨天中文乱码的原因,我将put方法改为普通的post方法时输入中文就不再时乱码了,那么为什么put方法可以成功的输入英文数字却不能输入中文,而delete方法却完全无法执行?如果不用delete和put那如何在同一个url下实现不同的功能呢?我的REST理解是否正确?
今天的日报看起来内容很少,不过我也是努力的思考了一天,虽然结论可能是推翻了我这两天做的东西,还需要我重新考虑rest的实现,不过我觉得这也给了我一个警示,不确定的东西要及时找师兄确认而不是自己想来想去反而掉到了坑里。
评论