JAVA--高级基础开发

你说的曾经没有我的故事 提交于 2020-03-16 13:27:46

某厂面试归来,发现自己落伍了!>>>

---------------第三章  SpringMVC  常用的注解------------

  1. @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";

    }

  1. @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";

    }

  1. @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";

    }

    1. 什么是 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):网络上的一个实体,或者说是网络上的一个具体信息。
  1. 是一段文本、一张图片、一首歌曲、一种服务、总之就是一个就具体的

存在,可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的

URI,要获取这个资源,访问它的 URI 就可以,因此 URI 即为每个资源的独一无

二的识别符。

  • 表现层(Representational):把资源具体呈现出来的形式,叫做它的表现层
  1. 文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式

表现,甚至可以采用二进制格式。

  • 状态转化 (State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互

过程。

  1. HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”,

而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。具体说,

就是 HTTP 协议里面,四个表示操作方式的动词,GETPOSTPUTDELETE

他们分别对应四种基本操作,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

    1. HiddentHttpMethodFilter 来实现 RESTFul 风格

作用:

由于浏览器 form 表单只支持 GET POST 请求,而 DELETEPUT method 值并不

支持,Spring3.x 增加了一个过滤器,可以将浏览器的请求更改为指定的请求方式,发送给

控制器的方法,使得间接的支持 GETPOSTPUTDELETE 请求。

使用步骤:

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>

  1. 准备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>

  1. 控制器

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";

    }

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!