---------------第三章 SpringMVC 常用的注解------------
- @RequestParam注解
作用: 获取请求中指定名称的参数值作为控制器方法中参数的值 属性: value:请求参数的名称 required:请求参数中是否必须提供此参数,默认值 true,表示必须提供,如果不提 供 示例: <h3>注解@RequestParam</h3> <a href="app/rp?userName=xiaoming">测试</a> @Controller //此注解意思就是交给Spring容器来管理 @RequestMapping(value ="/app") public class HelloWorldController { @RequestMapping("/rp") public String requestParamMethod(@RequestParam(value ="userName",required =true)String name){ System.out.println("===========name:"+name); return "success"; } |
- @RequestBody注解
作用: 用于获取请求体的内容,key=value&key=value get 请求无效 属性: required:是否必须由请求体,默认值是 true,所以使用 get 方式请求是会报错 <h3>注解@RequestBody</h3> <form action="app/body" method="post"> 用户的id:<input type="text" name="id"></br> 用户名:<input type="text" name="userName"></br> 用户性别:<input type="text" name="gender"></br> <input type="submit" value="提交"/> </form> @RequestMapping("/body") public String requestBodyMethod(@RequestBody(required = true)String body){ System.out.println(body); return "success"; } |
- @PathVariable注解
作用:用于绑定 url 中的占位符,例如:/delete/{id},这个{id}就是 url 中的占位符 Spring3 之后的版本才开始支持 URL 占位符,这也是 spring 支持 reset 风格的 URL 的一个标志 属性: value:用于指定 URL 中的占位符 required:是否必须的 <h3>注解@PathVariable</h3> <a href="app/pvm/1001">删除</a> @RequestMapping("/pvm/{id}") public String pathVarMethod(@PathVariable("id")Integer id){ System.out.println("==========>"+id); return "success"; } |
-
- 什么是 reset
1 ST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统,
比如 Web 应用程序。它首次出现在 2000 年 Roy Fielding 博士在他的博士论文中提出来的
一种软件架构风格,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交
互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XMLRPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。它本身并没哟什么实用性,其核心价值在于如何设出符合 REST 风格的网络接口。
3.2 resetful 特征
基于 REST 构建的 API 就是 Resetful 风格
它结构清晰、符合标准、易于理解、扩展方便,所以得到越来越多网站的采用。
- 资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。
- 是一段文本、一张图片、一首歌曲、一种服务、总之就是一个就具体的
存在,可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的
URI,要获取这个资源,访问它的 URI 就可以,因此 URI 即为每个资源的独一无
二的识别符。
- 表现层(Representational):把资源具体呈现出来的形式,叫做它的表现层
- 文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式
表现,甚至可以采用二进制格式。
- 状态转化 (State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互
过程。
- HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”,
而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。具体说,
就是 HTTP 协议里面,四个表示操作方式的动词,GET、POST、PUT、DELETE。
他们分别对应四种基本操作,GET 用来获取资源,POST 用来新建资源,PUT 用
来更新资源,DELETE 用来删除资源。 Restful 的示例
/account/1 HTTP GET, 得到 id=1 的 account
/account/1 HTTP ELETE 删除 id=1 的 account
/account/1 HTTP UT 更新 id=1 的 account
/account HTTP OST 增 account
-
- HiddentHttpMethodFilter 来实现 RESTFul 风格
作用: 由于浏览器 form 表单只支持 GET 与 POST 请求,而 DELETE、PUT 等 method 值并不 支持,Spring3.x 增加了一个过滤器,可以将浏览器的请求更改为指定的请求方式,发送给 控制器的方法,使得间接的支持 GET、POST、PUT、DELETE 请求。 使用步骤: 1、 在 web.xml 中配置该过滤器 2、 请求方法必须使用 POST 请求 3、 按照要求提供_method 请求参数,该参数的取值就是我们需要的请求方式 源码: public class HiddenHttpMethodFilter extends OncePerRequestFilter { private static final List<String> ALLOWED_METHODS; public static final String DEFAULT_METHOD_PARAM = "_method"; private String methodParam = "_method"; public HiddenHttpMethodFilter() { } public void setMethodParam(String methodParam) { Assert.hasText(methodParam, "'methodParam' must not be empty"); this.methodParam = methodParam; } protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { HttpServletRequest requestToUse = request; if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) { String paramValue = request.getParameter(this.methodParam); if (StringUtils.hasLength(paramValue)) { String method = paramValue.toUpperCase(Locale.ENGLISH); if (ALLOWED_METHODS.contains(method)) { requestToUse = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method); } 配置restful风格的过滤器 <!--配置Result过滤器--> <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> |
- 准备JSP的页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Reset风格API</title> </head> <body> <h3>RESET 风格的 API--------添加</h3><hr/> <form action="user" method="post"> 用户名:<input type="text" name="userName"><br/> <input type="submit" value="保存"> </form>
<h3>RESET 风格的 API--------修改</h3><hr/> <form action="user/1001" method="post"> 用户名:<input type="text" name="userName"><br/> <input type="hidden" name="_method" value="PUT"> <input type="submit" value="修改"> </form>
<h3>RESET 风格的 API--------删除</h3><hr/> <form action="user/1001" method="post"> 用户名:<input type="text" name="userName"><br/> <input type="hidden" name="_method" value="DELETE"> <input type="submit" value="删除"> </form> <h3>RESET 风格的 API--------查询</h3><hr/> <form action="user/1001" method="get"> 用户名:<input type="text" name="userName"><br/> <input type="submit" value="查询"> </form> </body> </html> |
- 控制器
mport com.bdit.entify.User; 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;
@Controller public class RestfulControllerDemo { @RequestMapping(value = "/user",method = RequestMethod.POST) public String saveUser(User user){ System.out.println("=======添加=========="+user); return "success"; } @RequestMapping(value = "/user/{id}",method = RequestMethod.PUT) public String putUser(@PathVariable("id")Integer id){ System.out.println("=======修改=========="+id); return "success"; } @RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE) public String DeleteUser(@PathVariable("id")Integer id){ System.out.println("=======删除=========="+id); return "success"; } @RequestMapping(value = "/user/{id}",method = RequestMethod.GET) public String UpdateUser(@PathVariable("id")Integer id){ System.out.println("=======更新=========="+id); return "success"; } } |
来源:oschina
链接:https://my.oschina.net/u/4244602/blog/3195885