spring mvc学习(7):springmvc学习笔记(常用注解)

1. @Controller

@Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如下特点:

  1. 不需要继承任何类, 也不需要实现任何接口
  2. 可以处理多个请求
  3. 可以使用Servlet的相关特性

spring自动扫描所有基于注解的类, 并将其注册为spring的bean, DispatcherServlet自动扫描注解为@Controller的类, 查找其中使用了@RequestMapping的方法, 这些方法是真正处理请求方法.

<!-- 扫描包路径com.lizj.controller下的所有类, 将带有注解的类注册到spring容器中 -->
<context:component-scan base-package="com.lizj.controller" /><!-- 视图解释器 -->
<!-- 配置的视图解析器为InternalResourceViewResolver, 并为其添加了前缀prefix和后缀suffix属性 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 前缀 --><property name="prefix" value="/WEB-INF/jsp/" /><!-- 后缀 --><property name="suffix" value=".jsp" />
</bean>

此示例中没有配置处理映射器和处理器适配器, spring将使用默认的处理映射器和处理器适配器来处理请求.

下面是使用@Controller注解定义的控制器

/*** 基于注解的控制器*/
@Controller
public class HelloController {}

2. @RequestMapping

2.1 @RequestMapping注解

@RequestMapping注解用来表示请求具体由哪个类的哪个方法来处理. 即
@RequestMapping既可以用来注解一个类, 也可以用来注解一个方法. 当用来注解一个类的时候, 所有方法都将映射为相对于类级的请求.

/*** 基于注解的控制器*/
@Controller
public class HelloController {@RequestMapping("/hello")public String sayHello(HttpServletRequest request) {model.addAttribute("message", "Hello World");return "helloworld";}
}

@RequestMapping注解支持的属性

属性类型是否必要说明
nameString映射地址别名, 一般不设置
valueString[]指定请求的地址映射到方法上
methodRequestMethod[]请求的方法类型, 包括GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE,TRACE
consumesString[]指定处理请求的提交内容类型(Content-Type),例如application/json
producesString[]指定返回的内容类型, 返回的内容类型必须是request请求头(Accept)中包含的类型
paramsString[]指定request中必须包含某些参数值时, 此方法才处理此请求
headerString[]指定request中必须包含某些指定的header值, 此方法才处理此请求
pathString[]In a Servlet environment... 就是value属性的别名, value属性没有含义不确切, path含义更明确

常用的@RequestMapping属性:

  1. value
    value属性用于将请求映射到方法上. value属性是@RequestMapping的默认属性, 当只有唯一的属性时, 则可以省略属性名, 如下两个注解含义是一样的:
@RequestMapping("/user")
@RequestMapping(value="/user")
多个请求地址映射到同一个方法
@RequestMapping(value={"/user", "/customer"})
  1. method
    method属性指定此方法只处理哪些HTTP请求. 例如:
// 此方法只处理POST请求.
@RequestMapping(value="/user", method=RequestMethod.POST)
// 此方法既支持POST请求, 又支持GET请求
@RequestMapping(value="/user", method={RequestMethod.POST,RequestMethod.GET})

如果没有配置method属性, 则此方法可以处理任意的HTTP请求.

两个示例:

  1. 示例类: com.lizj.controller_01.HelloController01
    访问地址: http://127.0.0.1:8080/springmvc03/hello

  2. 示例类: com.lizj.controller_01.HelloController02
    访问地址: http://127.0.0.1:8080/springmvc03/hello/hello


2.2 支持的方法参数类型

每个请求处理方法都可以有多个参数, 参数类型可以为以下类型, 可根据需要添加方法声明参数.

  • javax.servlet.ServletRequestjavax.servlet.http.HttpServletRequest
  • javax.servlet.ServletResponsejavax.servlet.http.HttpServletResponse
  • javax.servlet.http.HttpSession
  • org.springframework.web.context.request.WebRequestorg.springframework.web.context.request.NativeWebRequeset
  • java.util.Locale
  • java.io.InputStreamjava.io.Reader 用于访问请求正文, 这两个对象与通过Servlet API拿到的InputSteam和Reader对象是一样的
  • java.io.OutputSteamjava.io.Writer 用于生成响应正文, 这两个对象与通过Servlet API拿到的OutputSteam和Writer对象是一样的
  • java.security.Principal 包装了当前被谁的用户信息
  • org.springframework.http.HttpEntity<T> 其提供了对HTTP请求头和请求内容的存取
  • org.springframework.web.servlet.mvc.support.RedirectAttributes 用以指定重定向下要使用到的属性集以及添加flash属性(暂存在服务端的属性,它们会在下次重定向请求的范围中有效)
  • org.springframework.validation.Errorsorg.springframework.validation.BindingResult 验证结果对象,用于存储前面的命令或表单对象的验证结果(紧接其前的第一个方法参数)
  • org.springframework.web.bind.support.SessionStatus 用以标记当前的表单处理已结束
  • org.springframework.web.util.UriComponentsBuilder 构造器对象, 用于构造当前请求URL相关的信息, 比如主机名、端口号、资源类型(scheme)、上下文路径、servlet映射中的相对部分(literal part)等
  • @PathVariable @MatrixVariable
  • java.util.Maporg.springframework.io.Modelorg.springframework.ui.ModelMap 用以增强默认暴露给视图层的模型(model)的功能
  • 带有@RequestParam注解的参数, 其存放了Servlet请求中所指定的参数. 参数的值会被转换成方法参数所声明的类型
  • 带有@RequestHeader注解的参数, 其存放了Servlet请求中所指定的HTTP请求头的值. 参数的值会被转换成方法参数所声明的类型
  • 带有@RequestBody注解的参数, 提供了对HTTP请求体的存取. 参数的值通过HttpMessageConverter被转换成方法参数所声明的类型
  • 带有@RequestPart注解的参数, 提供了对一个"multipart/form-data请求块(request part)内容的存取
  • 命令或表单对象, 它们用于将请求参数直接绑定到bean字段(可能是通过setter方法)

在参数列表中, ErrorsBindingResult参数必须紧跟在其所绑定的验证对象后面. 这是因为, 在参数列表中允许有多于一个的模型对象, spring会为它们创建不同的BindingResult实例

所有方法参数中, 最重要的是org.springframework.ui.Model, 它是一个接口, 功能类似于java.util.Map, 用于存储模型数据. springmvc调用处理方法前, 会创建一个隐含的模型对象, 作为模型数据的存储容器. 如果处理方法的方法参数为Model, 那么springmvc会将模型的引用传递给此参数. 那么在方法内部就可以访问模型中的数据, 也可以向模型中添加新的属性数据.

/** springmvc中controller中的方法参数, 支持大多数常用的数据类型, * 如: String, int.... */
// 需要注意的是, 此处请求参数名必须与方法参数名一致, 否则获取不到参数值, 后面@RequestParam再做详细解释
@RequestMapping("/get")
public String getUser(String id, Model model) {User user = null;for(int i=0; i<userList.size(); i++) {User u = userList.get(i);if(u.getId().equals(id)) {user = u;break ;}}if(user == null) {user = new User();user.setId("001");user.setName("张三");user.setAge(18);user.setSex("男");}// 向model中添加数据model.addAttribute("user", user);// 返回视图名称return "user/oneuser";
}

两个示例:

  1. 示例类: com.lizj.controller_02.UserController01
    访问地址: http://127.0.0.1:8080/springmvc003/user01/get

  2. 示例类: com.lizj.controller_02.UserController02
    访问地址: http://127.0.0.1:8080/springmvc003/user02/get?userId=2


2.3 支持的方法返回类型

请求处理方法的返回类型如下:

  • org.springframework.web.servlet.ModelAndView
  • org.springframework.ui.Model
  • java.util.Map<K, V>
  • org.springframework.web.servlet.View
  • java.lang.String
  • HttpEntity<?>ResponseEntity<?>
  • java.util.concurrent.Callable
  • org.springframework.web.context.request.async.DeferredResult<?>
  • void

如果控制器处理方法的返回值是ModelAndView类型, 其既包括模型数据, 又包括视图信息, 那么springmvc就可以使用包含的视图对模型数据进行渲染, 而且可以非常方便的访问模型数据. ModelAndview对象常用的添加模型数据和设置视图的方法如下:

// 添加模型数据
addObject(String attributeName, Object attributeValue);
// 设置视图
setViewName(String viewName);

示例类: com.lizj.controller_02.UserController03
访问地址: http://127.0.0.1:8080/springmvc003/user03/get?userId=3


3. @RequestParam

@RequestParam注解用于将指定的请求参数赋值给方法的参数.

@RequestParam注解支持的属性
| 属性 | 类型 | 是否必要 | 说明 |
| :-------- | :-------- | :-------- | :-------- |
| name | String | 否 | 指定请求参数绑定的名称 |
| value | String | 否 | name属性的别名 |
| required | boolean | 否 | 指示参数是否必须绑定 |
| default | String | 否 | 没有参数时使用的默认值 |

请求处理的方法的参数的类型为Java基本类型和String.

@RequestMapping(value="/add", method=RequestMethod.POST)
public String add(@RequestParam("name") String name, @RequestParam("author") String author) {}

当方法参数没有用@RequestParam修饰时, 那么会默认绑定同名的参数.

示例类: com.lizj.controller_03.BookController
访问地址: http://127.0.0.1:8080/springmvc003/book/books


4. @PathVariable

@PathVariable注解可以方便的从URL中获取请求的参数.
它只支持一个类型为String的属性, 表示绑定的请求参数的名称, 省略则默认绑定同名的参数.

@RequestMapping(value="/book/{bookId}")
public ModelAndView get(@PathVariable int bookId)

示例类: com.lizj.controller_04.BookController04
访问地址: http://127.0.0.1:8080/springmvc003/book04/books


5. @RequestHeader

@RequestHeader注解用于将请求的头信息区数据映射到请求处理方法的参数上.

@RequestHeader注解支持的属性

属性类型是否必要说明
nameString指定请求头绑定的名称
valueStringname属性的别名
requiredboolean指示参数是否必须绑定
defaultString没有参数时使用的默认值
public void testRequestHeader(@RequestHeader("User-Agent") String userAgent,@RequestHeader("Accept") String[] accepts) {// ...
}

示例类: com.lizj.controller_05.HeaderAndCookieController
访问地址: http://localhost:8080/springmvc003/hac/show

关于http请求的header头信息
参考: http://www.cnblogs.com/printN/p/6534529.html


6. @CookieValue

@CookieValue注解将Cookie数据映射到请求处理方法的参数上.

@CookieValue注解支持的属性

属性类型是否必要说明
nameString指定请求头绑定的名称
valueStringname属性的别名
requiredboolean指示参数是否必须绑定
defaultString没有参数时使用的默认值

示例类: com.lizj.controller_05.HeaderAndCookieController
访问地址: http://localhost:8080/springmvc003/hac/show


7. @SessionAttributes

@SessionAttributes注解指定Model中哪些数据需要转存到session中.

@SessionAttributes注解支持的属性

属性类型是否必要说明
namesString[]Model中属性的名称, 储存在session中也会用此名称
valuesString[]names属性的别名
typesClass<?>[]根据指定参数的类型, 将模型中对应类型的参数存储到session中

@SessionAttributes注解只能声明在类上, 不能声明在方法上.

示例类: com.lizj.controller_06.LoginController
访问地址: http://localhost:8080/springmvc003/login


8. @ModelAttribute

@ModelAttribute注解用于将请求参数绑定到Model对象上.
@ModelAttribute只支持一个类型为String的属性value, 表示绑定的属性名称.

需要注意的是, @ModelAttribute注解修饰的方法会在Controller的每个请求处理方法执行前被执行, 如果一个Controller映射了多个URL要注意这一问题.

示例类: com.lizj.controller_06.PageController
访问地址: http://127.0.0.1:8080/springmvc003/mac/testPage
可结合示例, 阅读下面几种情况的介绍.

  1. @ModelAttribute注解修饰的方法有返回值

示例:

@ModelAttribute("paramName")
public String getParam(@RequestParam("param") String param) {return param;
}

此方法将先于其他请求处理方法执行, 并且将请求参数param的值, 以paramName为名称, 指定为model的一个属性, 此时model并没有显示的定义出来.

示例:

@ModelAttribute
// 这次没有使用@ModelAttribute注解的value属性
public User getUserById(String userId) {return userService.getUserById(userId);
}

示例中没有显示的使用@RuquestParam注解, 而是使用了默认绑定同名参数.

本示例中, 方法的返回值类型为User, 且没有使用@ModelAttribute注解的value属性. 此时, value的默认名称为方法返回值类型(首字母小写), 即模型中的属性名为方法返回值类型(首字母小写). 也可以显示的定义value属性.

  1. @ModelAttribute注解修饰的方法有返回值, 返回值类型为void

示例:

@ModelAttribute
public void getUserById(String userId, Model model) {model.addAttribute("user", userService.getUserById(userId));
}

这种写法的前提是在请求处理方法中加入了一个Model参数.

  1. @ModelAttribute@RequestMapping修饰同一个方法

示例:

@RequestMapping("/show")
@ModelAttribute("username")
public String show(String userId) {User user = userService.getUserById(userId);return user.getName();
}

示例中, @ModelAttribute@RequestMapping共同修饰了show方法. 此时方法的返回值不再是视图名称, 而是Model的属性值, Model属性的名称由@ModelAttributevalue设置, 即username;
@RequestMappingvalue/show除了是请求映射之外, 还将作为视图名称, 即此请求处理方法将跳转至名称为show的页面.

  1. @ModelAttribute修饰一个请求处理方法的参数

示例:

@ModelAttribute
public User getUserById(String userId) {return userService.getUserById(userId);
}@RequestMapping("/show")
public String show(@ModelAttribute User user) {return "mac/test05";
}

示例中, @ModelAttribute修饰的getUserById()方法仍旧在Model中添加user属性, 其值为一个User对象.
而在show方法中, 参数也被@ModelAttribute修饰, 表示参数user的值就是Model中的属性值.


9. @RequestBody 和 @ResponseBody

9.1 @RequestBody

springmvc提供了处理JSON格式请求和响应的功能, 可以方便的使服务端的请求处理方法和客户端JSON格式消息进行交互, 这时就用到了@RequestBody注解.

@RequestBody注解用于读取request请求的body部分的数据, 解析后, 把相应的数据绑定到请求处理方法的参数上.

前台页面使用GET或POST请求提交数据时, 数据编码格式会由请求头的ContentType来指定, 可分为以下几种情况:

  • application/x-www-form-urlencoded, 此时可以使用@RequestParam, @ModelAttribute来处理参数, 也可以使用@RequestBody.
  • multipart/form-data, 此时不能使用@RequestBody处理.
  • application/jsonapplication/xml, 只能使用@RequestBody处理.

9.2 @ResponseBody

@ResponseBody注解用于将Controller的请求处理方法返回的数据对象, 转换为指定格式后, 写入到response对象的的body数据区. 一般地, 返回的数据不是某个具体的视图页面, 而是某种格式的数据(json, xml等).

9.3 示例

示例类: springmvc004项目中, com.lizj.controller_08.BookController08
访问地址: http://127.0.0.1:8080/springmvc004/book08/books

简单说明:

9.3.1 springmvc-servlet.xml

springmvc-servlet.xml配置文件中, 添加加了两项配置:

<!-- 自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter -->
<mvc:annotation-driven /><!-- DispatcherServlet会拦截所有请求, 会将静态文件(如js文件)的请求看成路径, 就会找不到对应的静态文件 -->
<!-- 此配置将使用默认的servlet响应静态文件, 避免出现上述情况 -->
<mvc:default-servlet-handler/>

springmvc4.x默认使用的HandlerMapping和HandlerAdapter为:

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMappingorg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

详情见:
spring-webmvc-4.2.3.RELEASE.jar
org.springframework.web.servlet包下的DispatcherServlet.properties文件.

9.3.2 pom.xml

引用Jackson

<!-- jackson -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.6.2</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.6.2</version>
</dependency>

Jackson用来实现json对象与Java对象之间的转换.

示例下载:
https://files.cnblogs.com/files/lzj0616/springmvc%E5%B8%B8%E7%94%A8%E6%B3%A8%E8%A7%A3%E7%A4%BA%E4%BE%8B.rar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模板——树状数组求逆序对

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P1908 1 #include <map>2 #include <set>3 #include <cmath>4 #include <queue>5 #include <string>6 #include <cstdio>7 #include <cstring>8 #include <iostream&…

818. Race Car

文章目录1 题目理解2 BFS3 dp3.1 基本情况3.2 递归方程分析3.2.1 先超过target再调头3.2.2 不超过target4 说明1 题目理解 先讲规则。一辆小汽车停在位置0&#xff0c;并且方向朝向右侧&#xff0c;并且速度为1。小汽车每次可以选择加速A&#xff0c;那加速一次&#xff0c;新…

spring mvc学习(8):springmvc常用注解代码

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

找了好久的BUG

找了好久的BUG <rsp:WEBPAGE id"PageContainer" TabSectionID"*****" runat"server"></rsp:WEBPAGE> <rsp:PLACEHOLDER id"AdminPage_Title" runat"server">公文流转流程工作点定义</rsp:PLACEHOLDER&…

python-if条件判断与while/for循环

条件判断if 让计算机像人一样&#xff0c;能判断是非对错&#xff0c;根据条件做一些事情。 if ------ if代码结构&#xff1a;------- if 条件:代码体tips&#xff1a;同一缩进范围内的代码被视作同一代码体,python官方推荐python缩进一次为4个空格is_happy True if is_happ…

第八十二期:掌握这些监控报警优化技巧,百万年薪不在话下!

运维工程师面试者第一个问题是&#xff1a;需要值班吗?笔者自己也曾经历过月入十万的时期&#xff0c;在那个时候&#xff0c;数个系统同时发布下一代版本&#xff0c;而老系统还需要过渡很长时间&#xff0c;工作量直接翻倍。 作者&#xff1a;焦振清 运维工程师面试者第一…

dp按照规模分类总结

本文章的内容来源于花花酱dp2。 做多了dp的题目之后总觉得有什么规律&#xff0c;但是自己没总结出来。花花酱按照输入规模、子问题个数、在解决一个问题的时候需要依赖的子问题个数为特征对题目做了分类。 其中绿色是比较简单的 &#xff0c;黄色是中等的&#xff0c;粉色是…

看了交大自产的电影《我的太阳》

呵呵&#xff0c;现在大学生自导自拍自演的电影越来越多了&#xff0c;不知道算是中国第几代导演&#xff1a;&#xff09; 我看电影一般比较关注情节&#xff0c;演技暂且不提。因为是校园电影&#xff0c;本片自然比较接近大学生生活&#xff0c;总体情节比较浪漫曲折(虽然部…

【BZOJ4559】【JLOI2016】—成绩比较(拉格朗日插值+dp)

传送门 dpdpdpf[i][j]f[i][j]f[i][j]表示前iii门课&#xff0c;有jjj个人没有被碾压的方案数 考虑f[i−1][j]f[i-1][j]f[i−1][j]转移到f[i][w](j≤w)f[i][w](j\le w)f[i][w](j≤w) 首先要选出w−jw-jw−j个新的没被他碾压的人 由于之前已经有一些没被碾压的人,所以方案数为(n−…

中兴通讯 基于定位的技术和市场分析

中兴通讯 基于定位的技术和市场分析 (2004-08-10 09:04:27) 8月5日&#xff0c;由中国联通和中兴通讯联合举办的“中国联通位置业务研讨会”在海口举行。中国联通总部及多个省的分公司领导&#xff0c;应用中兴通讯PN4747定位系统开展定位业务的多家集团客户代表以及华好…

第八十三期:这些高性能负载均衡架构知识点,90%的人分不清!

单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。 作者&#xff1a;马天池 单服务器无论如何优化&#xff0c;无论采用多好…

15. 3Sum-数组

文章目录1题目理解2 排序双指针1题目理解 输入&#xff1a;int数组nums 规则&#xff1a;查找数组中任意三个数的和等于0 输出&#xff1a;符合条件的解&#xff0c;不包含重复的解 例子&#xff1a; nums [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1…

第八十四期: Java、Web 和移动程序员学习的 12 个框架

今天的文章中&#xff0c;我将分享一些你可以学习的框架&#xff0c;以提升你在移动和Web开发以及大数据技术方面的知识。 作者&#xff1a;芒果教你学编程 在今天的文章中&#xff0c;我将分享一些你可以学习的框架&#xff0c;以提升你在移动和Web开发以及大数据技术方面的…

关于mysql无法添加中文数据的问题以及解决方案

所有能设置的地方我都设置了&#xff0c;都设置的是ut8。然后&#xff0c;我执行了一下insert语句&#xff0c;报错了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 这个错误纠结了一天&#xff0c;最后&#xff0c;看到…

第八十五期:一文彻底搞懂cookie和session

在Web发展史中&#xff0c;我们知道浏览器与服务器间采用的是 http协议&#xff0c;而这种协议是无状态的&#xff0c;所以这就导致了服务器无法知道是谁在浏览网页&#xff0c;所以为了解决这一问题&#xff0c;先后出现了四种技术&#xff0c;分别是隐藏表单域&#xff0c;UR…

141. Linked List Cycle

文章目录1 题目理解2 分析13 分析21 题目理解 输入&#xff1a;一个单向链表。 输出&#xff1a;如果链表中有环&#xff0c;输出true。否则输出false。 规则&#xff1a;单向链表只能向前移动。 2 分析1 可以把节点放入map中&#xff0c;不断遍历。如果碰到已经遍历的节点&…

Microsoft Updater Application Block 1.5.3 服务器端manifest文件设计 [翻译]

Microsoft Updater Application Block 服务器端manifest文件设计 译者&#xff1a;Tony Qu Manfest文件用于列出一次升级所需要的所有的文件&#xff0c;它与验证签名相关联&#xff0c;验证签名可用于验证manifest文件的真实性。这个将介绍应用程序升级器的以下几个方面&#…

第八十六期:“程序员锁死服务器导致公司倒闭”案正式开庭审理

11 月 1 日&#xff0c;据微博网友爆料&#xff0c;此前程序员锁死服务器致创业游戏公司倒闭一案已经开庭审理&#xff0c;公司创始人“螃了个蟹” 提交了对方莫名失联&#xff0c;跑路的证据。 作者&#xff1a;51CTO 11 月 1 日&#xff0c;据微博网友爆料&#xff0c;此前…

delphi 参数化sql

曾经查过资料&#xff0c;后来忘了&#xff0c;现在做一下记录。 --------- 在 sql 语句里占位使用 一个冒号和一个用来表示这个位置的符号, 例如&#xff1a;SELECT * FROM aTableName WHERE aCol :ColVal SELECT * FROM aTableName WHERE aCol :ColVal 对占位了的地方赋值…

20 Valid Parentheses

1 题目理解 输入&#xff1a;一个字符串s&#xff0c;只包含( ) { } [ ]这六种字符。 输出&#xff1a;字符串是否有效 规则&#xff1a;一个有效的字符串需要括号对应匹配&#xff0c;并且要左括号在前。 举例&#xff1a; 1 输入s"()"&#xff0c;输出true 2 Inpu…