OGNL表达式的使用方法

OGNL表达式的使用方法

定义:

OGNL是对象图导航语言(即该表达式访问的是对象及对象的属性)

知识点:

1.基本属性的访问

1.1 访问值栈中action的普通属性

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="username"/>

1.2 访问值栈中对象的普通属性

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="student.age"/>

1.3 访问值栈中对象(对象包含对象)的普通属性

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="cat.friend.name"/>

1.4 访问值栈中对象的普通方法

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="cat.friend.say().length()"/>

1.5 访问值栈中action的普通方法

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="execute()"/>

1.6 访问静态方法

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="@com.wj.struts2.util.OGNLUtil@getString()"/>

1.7 访问静态属性

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="@com.wj.struts2.util.OGNLUtil@URL"/>

1.8 访问Math类的属性

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="@@max(5,3)"/>

1.9 访问普通类的构造方法

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="newcom.wj.struts2.action.model.Dog()"/>

2.访问容器

2.1 访问List

2.1.1 访问list

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="list"/>

2.1.2 访问list中的某个元素

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="list[2]"/>

2.1.3 访问list中某个元素属性的集合

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="list.{no}"/>

2.1.4 访问list中某个元素的属性

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="list[2].no"/>

2.2 访问Set

2.2.1 访问set

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="set"/>

2.2.2 访问set中的某个元素(不可访问,set无顺序)

2.3 访问Map

2.3.1 访问Map

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="map"/>

2.3.2 访问Map中的某个元素

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="map['key']"/>

2.3.3 访问Map中的所有key

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="map.keys"/>

2.3.4 访问Map中的所有value

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="map.values"/>

2.3.5 访问容器的大小

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="map.size()"/>

3.投影

3.1 通过投影访问list中年龄为25的学生的姓名

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="list.{?#this.age==25}[0].{no}[0]"/>

3.2 通过投影访问list中年龄大于25的集合中的首元素的姓名

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="list.{^#this.age>20}.{no}"/>

3.3 通过投影访问list中年龄大于25的集合中的尾元素的姓名

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="list.{$#this.age>20}.{no}"/>

3.4 通过投影判断list中年龄大于25的集合是否为空

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="list.{?#this.age>25}==null"/>

4.栈

用[]来访问栈中的元素,注意:[0]表示从栈中的开始位置进行遍历其中的元素

[xhtml:nogutter] view plain copy
  1. <s:propertyvalue="[1][0].execute()"/>

示例代码

OGNLAction.java

[java:nogutter] view plain copy
  1. /**
  2. *OGNL表达式
  3. *@author健
  4. */
  5. publicclassOGNLActionextendsActionSupport{
  6. /**
  7. *序列化
  8. */
  9. privatestaticfinallongserialVersionUID=1L;
  10. /**
  11. *猫
  12. */
  13. privateCatcat;
  14. /**
  15. *List
  16. */
  17. privateList<Student>list;
  18. /**
  19. *Map
  20. */
  21. privateMap<String,Dog>map;
  22. /**
  23. *密码
  24. */
  25. privateStringpassword;
  26. /**
  27. *Set
  28. */
  29. privateSet<Dog>set;
  30. /**
  31. *学生
  32. */
  33. privateStudentstudent;
  34. /**
  35. *用户名
  36. */
  37. privateStringusername;
  38. publicOGNLAction(){
  39. this.list=newArrayList<Student>();
  40. Studentstudent1=newStudent("zhangsan",20);
  41. Studentstudent2=newStudent("lisi",25);
  42. Studentstudent3=newStudent("wangwu",28);
  43. Studentstudent4=newStudent("zhaoliu",24);
  44. Studentstudent5=newStudent("xiaotaoqi",18);
  45. list.add(student1);
  46. list.add(student2);
  47. list.add(student3);
  48. list.add(student4);
  49. list.add(student5);
  50. this.set=newHashSet<Dog>();
  51. Dogdog1=newDog("bandeng");
  52. Dogdog2=newDog("zhuozi");
  53. Dogdog3=newDog("yizi");
  54. set.add(dog1);
  55. set.add(dog2);
  56. set.add(dog3);
  57. this.map=newHashMap<String,Dog>();
  58. map.put("0001",dog1);
  59. map.put("0002",dog2);
  60. map.put("0003",dog3);
  61. }
  62. /**
  63. *控制器
  64. *@return跳转的页面
  65. */
  66. @Override
  67. publicStringexecute(){
  68. return"success";
  69. }
  70. /**
  71. *取得cat
  72. *@returncat
  73. */
  74. publicCatgetCat(){
  75. returncat;
  76. }
  77. /**
  78. *取得list
  79. *@returnlist
  80. */
  81. publicList<Student>getList(){
  82. returnlist;
  83. }
  84. /**
  85. *取得map
  86. *@returnmap
  87. */
  88. publicMap<String,Dog>getMap(){
  89. returnmap;
  90. }
  91. /**
  92. *取得password
  93. *@returnpassword
  94. */
  95. publicStringgetPassword(){
  96. returnpassword;
  97. }
  98. /**
  99. *取得set
  100. *@returnset
  101. */
  102. publicSet<Dog>getSet(){
  103. returnset;
  104. }
  105. /**
  106. *取得student
  107. *@returnstudent
  108. */
  109. publicStudentgetStudent(){
  110. returnstudent;
  111. }
  112. /**
  113. *取得username
  114. *@returnusername
  115. */
  116. publicStringgetUsername(){
  117. returnusername;
  118. }
  119. /**
  120. *设置cat
  121. *@paramcatcat
  122. */
  123. publicvoidsetCat(Catcat){
  124. this.cat=cat;
  125. }
  126. /**
  127. *设置list
  128. *@paramlistlist
  129. */
  130. publicvoidsetList(List<Student>list){
  131. this.list=list;
  132. }
  133. /**
  134. *设置map
  135. *@parammapmap
  136. */
  137. publicvoidsetMap(Map<String,Dog>map){
  138. this.map=map;
  139. }
  140. /**
  141. *设置password
  142. *@parampasswordpassword
  143. */
  144. publicvoidsetPassword(Stringpassword){
  145. this.password=password;
  146. }
  147. /**
  148. *设置set
  149. *@paramsetset
  150. */
  151. publicvoidsetSet(Set<Dog>set){
  152. this.set=set;
  153. }
  154. /**
  155. *设置student
  156. *@paramstudentstudent
  157. */
  158. publicvoidsetStudent(Studentstudent){
  159. this.student=student;
  160. }
  161. /**
  162. *设置username
  163. *@paramusernameusername
  164. */
  165. publicvoidsetUsername(Stringusername){
  166. this.username=username;
  167. }
  168. }

ChainAction.java

[java:nogutter] view plain copy
  1. /**
  2. *OGNL表达式
  3. *@author健
  4. */
  5. publicclassChainActionextendsActionSupport{
  6. /**
  7. *序列化
  8. */
  9. privatestaticfinallongserialVersionUID=1L;
  10. /**
  11. *控制器
  12. *@return跳转的页面
  13. */
  14. @Override
  15. publicStringexecute(){
  16. return"success";
  17. }
  18. }

OGNLUtil.java

[java:nogutter] view plain copy
  1. /**
  2. *工具类
  3. *@author健
  4. */
  5. publicclassOGNLUtil{
  6. /**
  7. *静态常量
  8. */
  9. publicstaticfinalStringURL="staticproperty";
  10. /**
  11. *静态方法
  12. *@return字符串
  13. */
  14. publicstaticStringgetString(){
  15. return"staticmethod";
  16. }
  17. }

Cat.java

[java:nogutter] view plain copy
  1. /**
  2. *猫
  3. *@author健
  4. */
  5. publicclassCat{
  6. /**
  7. *名字
  8. */
  9. privateStringname;
  10. /**
  11. *朋友
  12. */
  13. privateDogfriend;
  14. /**
  15. *取得name
  16. *@returnname
  17. */
  18. publicStringgetName(){
  19. returnname;
  20. }
  21. /**
  22. *设置name
  23. *@paramnamename
  24. */
  25. publicvoidsetName(Stringname){
  26. this.name=name;
  27. }
  28. /**
  29. *取得friend
  30. *@returnfriend
  31. */
  32. publicDoggetFriend(){
  33. returnfriend;
  34. }
  35. /**
  36. *设置friend
  37. *@paramfriendfriend
  38. */
  39. publicvoidsetFriend(Dogfriend){
  40. this.friend=friend;
  41. }
  42. /**
  43. *类方法
  44. *@return返回字符串
  45. */
  46. publicStringsay(){
  47. return"miaomiao";
  48. }
  49. /**
  50. *构造
  51. */
  52. publicCat(){
  53. System.out.println("catconstructor");
  54. }
  55. /**
  56. *重写toString方法
  57. */
  58. publicStringtoString(){
  59. return"catnameis"+this.name;
  60. }
  61. }

Dog.java

[java:nogutter] view plain copy
  1. /**
  2. *狗
  3. *@author健
  4. */
  5. publicclassDog{
  6. /**
  7. *名字
  8. */
  9. privateStringname;
  10. /**
  11. *构造
  12. */
  13. publicDog(){
  14. System.out.println("dogconstructor");
  15. }
  16. /**
  17. *构造
  18. */
  19. publicDog(Stringname){
  20. this.name=name;
  21. }
  22. /**
  23. *取得name
  24. *@returnname
  25. */
  26. publicStringgetName(){
  27. returnname;
  28. }
  29. /**
  30. *设置name
  31. *@paramnamename
  32. */
  33. publicvoidsetName(Stringname){
  34. this.name=name;
  35. }
  36. /**
  37. *类方法
  38. *@return返回字符串
  39. */
  40. publicStringsay(){
  41. return"miaomiao";
  42. }
  43. /**
  44. *重写toString方法
  45. */
  46. publicStringtoString(){
  47. return"dognameis"+this.name;
  48. }
  49. }

Student.java

[java:nogutter] view plain copy
  1. /**
  2. *学生类
  3. *@author健
  4. */
  5. publicclassStudent{
  6. /**
  7. *学号
  8. */
  9. privateStringno;
  10. /**
  11. *年龄
  12. */
  13. privateintage;
  14. /**
  15. *构造方法
  16. */
  17. publicStudent(){
  18. System.out.println("进入学生类的构造方法");
  19. }
  20. /**
  21. *构造方法
  22. */
  23. publicStudent(Stringno,intage){
  24. this.age=age;
  25. this.no=no;
  26. }
  27. /**
  28. *取得no
  29. *@returnno
  30. */
  31. publicStringgetNo(){
  32. returnno;
  33. }
  34. /**
  35. *设置no
  36. *@paramnono
  37. */
  38. publicvoidsetNo(Stringno){
  39. this.no=no;
  40. }
  41. /**
  42. *取得age
  43. *@returnage
  44. */
  45. publicintgetAge(){
  46. returnage;
  47. }
  48. /**
  49. *设置age
  50. *@paramageage
  51. */
  52. publicvoidsetAge(intage){
  53. this.age=age;
  54. }
  55. /**
  56. *重写toString方法
  57. */
  58. publicStringtoString(){
  59. return"Student:"+this.no+","+this.age;
  60. }
  61. }

struts.xml

[xhtml:nogutter] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEstrutsPUBLIC
  3. "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <!--配置开发模式:修改不用重启服务器-->
  7. <constantname="struts.devMode"value="true"/>
  8. <!--配置允许静态方法的访问-->
  9. <constantname="struts.ognl.allowStaticMethodAccess"value="true"/>
  10. <!--包含的文件-->
  11. <includefile="ognl.xml"></include>
  12. </struts>

ognl.xml

[xhtml:nogutter] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEstrutsPUBLIC
  3. "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <packagename="ognl"namespace="/ognl"extends="struts-default">
  7. <actionname="ognl"class="com.wj.struts2.action.OGNLAction">
  8. <resultname="success">/result.jsp</result>
  9. </action>
  10. <actionname="chain"class="com.wj.struts2.action.ChainAction">
  11. <resulttype="chain">
  12. <paramname="actionName">ognl</param>
  13. <paramname="namespace">/ognl</param>
  14. </result>
  15. </action>
  16. </package>
  17. </struts>

index.jsp

[xhtml:nogutter] view plain copy
  1. <%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
  2. <%@tagliburi="/struts-tags"prefix="s"%>
  3. <%
  4. Stringpath=request.getContextPath();
  5. StringbasePath=request.getScheme()+"://"
  6. +request.getServerName()+":"+request.getServerPort()
  7. +path+"/";
  8. %>
  9. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  10. <html>
  11. <head>
  12. <basehref="<%=basePath%>">
  13. <title>Struts2_OGNL</title>
  14. <metahttp-equiv="pragma"content="no-cache">
  15. <metahttp-equiv="cache-control"content="no-cache">
  16. <metahttp-equiv="expires"content="0">
  17. <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  18. <metahttp-equiv="description"content="Thisismypage">
  19. <!--
  20. <linkrel="stylesheet"type="text/css"href="styles.css"mce_href="styles.css">
  21. -->
  22. </head>
  23. <body>
  24. <div>
  25. 访问基本元素
  26. <li><ahref="ognl/ognl?username=wangjian&password=123456"mce_href="ognl/ognl?username=wangjian&password=123456">1.访问值栈中action的普通属性</a></li>
  27. <li><ahref="ognl/ognl?student.age=20&student.no=0001"mce_href="ognl/ognl?student.age=20&student.no=0001">2.访问值栈中对象的普通属性</a></li>
  28. <li><ahref="ognl/ognl?cat.friend.name=oudy"mce_href="ognl/ognl?cat.friend.name=oudy">3.访问值栈中对象(对象包含对象)的普通属性</a></li>
  29. <li><ahref="ognl/ognl?cat.friend.name=oudy"mce_href="ognl/ognl?cat.friend.name=oudy">4.访问值栈中对象的普通方法</a></li>
  30. <li><ahref="ognl/ognl"mce_href="ognl/ognl">5.访问值栈中action的普通方法</a></li>
  31. <li><ahref="ognl/ognl"mce_href="ognl/ognl">6.访问静态方法</a></li>
  32. <li><ahref="ognl/ognl"mce_href="ognl/ognl">7.访问静态属性</a></li>
  33. <li><ahref="ognl/ognl"mce_href="ognl/ognl">8.访问Math类的属性</a></li>
  34. <li><ahref="ognl/ognl"mce_href="ognl/ognl">9.访问普通类的构造方法</a></li>
  35. </div>
  36. <br>
  37. <br>
  38. <div>
  39. 访问容器<br>
  40. (一)访问List<br>
  41. <li><ahref="ognl/ognl"mce_href="ognl/ognl">1.访问list</a></li>
  42. <li><ahref="ognl/ognl"mce_href="ognl/ognl">2.访问list中的某个元素</a></li>
  43. <li><ahref="ognl/ognl"mce_href="ognl/ognl">3.访问list中某个元素属性的集合</a></li>
  44. <li><ahref="ognl/ognl"mce_href="ognl/ognl">4.访问list中某个元素的属性</a></li><br>
  45. (二)访问Set<br>
  46. <li><ahref="ognl/ognl"mce_href="ognl/ognl">1.访问set</a></li>
  47. <li><ahref="ognl/ognl"mce_href="ognl/ognl">2.访问set中的某个元素(不可访问,set无顺序)</a></li><br>
  48. (三)访问Map<br>
  49. <li><ahref="ognl/ognl"mce_href="ognl/ognl">1.访问Map</a></li>
  50. <li><ahref="ognl/ognl"mce_href="ognl/ognl">2.访问Map中的某个元素</a></li>
  51. <li><ahref="ognl/ognl"mce_href="ognl/ognl">3.访问Map中的所有key</a></li>
  52. <li><ahref="ognl/ognl"mce_href="ognl/ognl">4.访问Map中的所有value</a></li>
  53. <li><ahref="ognl/ognl"mce_href="ognl/ognl">5.访问容器的大小</a></li>
  54. <br>
  55. </div>
  56. <br>
  57. <br>
  58. <div>
  59. 投影<br>
  60. <li><ahref="ognl/ognl"mce_href="ognl/ognl">1.通过投影访问list中年龄为25的学生的姓名</a></li>
  61. <li><ahref="ognl/ognl"mce_href="ognl/ognl">2.通过投影访问list中年龄大于25的集合中的首元素的姓名</a></li>
  62. <li><ahref="ognl/ognl"mce_href="ognl/ognl">3.通过投影访问list中年龄大于25的集合中的尾元素的姓名</a></li>
  63. <li><ahref="ognl/ognl"mce_href="ognl/ognl">4.通过投影判断list中年龄大于25的集合是否为空</a></li><br>
  64. </div>
  65. <br>
  66. <br>
  67. <div>
  68. <br>
  69. <li><ahref="ognl/chain"mce_href="ognl/chain">用[]来访问栈中的元素,注意:[1]表示从栈中的开始位置进行遍历其中的元素</a></li>
  70. </div>
  71. </body>
  72. </html>

result.jsp

[xhtml:nogutter] view plain copy
  1. <%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
  2. <%@tagliburi="/struts-tags"prefix="s"%>
  3. <%
  4. Stringpath=request.getContextPath();
  5. StringbasePath=request.getScheme()+"://"
  6. +request.getServerName()+":"+request.getServerPort()
  7. +path+"/";
  8. %>
  9. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  10. <html>
  11. <head>
  12. <basehref="<%=basePath%>">
  13. <title>Struts2_OGNL</title>
  14. <metahttp-equiv="pragma"content="no-cache">
  15. <metahttp-equiv="cache-control"content="no-cache">
  16. <metahttp-equiv="expires"content="0">
  17. <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  18. <metahttp-equiv="description"content="Thisismypage">
  19. <!--
  20. <linkrel="stylesheet"type="text/css"href="styles.css"mce_href="styles.css">
  21. -->
  22. </head>
  23. <body>
  24. 访问值栈中action的普通属性:<br>
  25. <li>username:<s:propertyvalue="username"/></li>
  26. <li>password:<s:propertyvalue="password"/></li>
  27. <br>
  28. ----------------------------------------
  29. <br>
  30. 访问值栈中对象的普通属性<br>
  31. <li>student:<s:propertyvalue="student"/></li>
  32. <li>no:<s:propertyvalue="student.no"/></li>
  33. <li>age:<s:propertyvalue="student.age"/></li>
  34. <br>
  35. ----------------------------------------
  36. <br>
  37. 访问值栈中对象(对象包含对象)的普通属性<br>
  38. <li>friendName:<s:propertyvalue="cat.friend.name"/></li>
  39. <br>
  40. ----------------------------------------
  41. <br>
  42. 访问值栈中对象的普通方法<br>
  43. <li>method01:<s:propertyvalue="cat.friend.say().length()"/></li>
  44. <li>method02:<s:propertyvalue="cat.say()"/></li>
  45. <br>
  46. ----------------------------------------
  47. <br>
  48. 访问值栈中action的普通方法<br>
  49. <li>method:<s:propertyvalue="execute()"/></li>
  50. <br>
  51. ----------------------------------------
  52. <br>
  53. 访问静态方法<br>
  54. <li>staticmethod:<s:propertyvalue="@com.wj.struts2.util.OGNLUtil@getString()"/></li>
  55. <br>
  56. ----------------------------------------
  57. <br>
  58. 访问静态属性<br>
  59. <li>staticproperty:<s:propertyvalue="@com.wj.struts2.util.OGNLUtil@URL"/></li>
  60. <br>
  61. ----------------------------------------
  62. <br>
  63. 访问静态属性<br>
  64. <li>Mathmethod:<s:propertyvalue="@@max(5,3)"/></li>
  65. <br>
  66. ----------------------------------------
  67. <br>
  68. 访问普通类的构造方法<br>
  69. <li>Constructermethod:<s:propertyvalue="newcom.wj.struts2.action.model.Dog()"/></li>
  70. <br>
  71. ----------------------------------------
  72. <br>
  73. <br>
  74. <br>
  75. 访问容器<br>
  76. (一)访问List<br>
  77. <li>1.访问list----<s:propertyvalue="list"/></li>
  78. <li>2.访问list中的某个元素----<s:propertyvalue="list[2]"/></li>
  79. <li>3.访问list中某个元素属性的集合----<s:propertyvalue="list.{no}"/></li>
  80. <li>4.访问list中某个元素的属性----<s:propertyvalue="list[2].no"/></li><br>
  81. (二)访问Set<br>
  82. <li>1.访问set----<s:propertyvalue="set"/></li>
  83. <li>2.访问set中的某个元素(不可访问,set无顺序)----<s:propertyvalue="set[1]"/></li><br>
  84. (三)访问Map<br>
  85. <li>1.访问Map----<s:propertyvalue="map"/></li>
  86. <li>2.访问Map中的某个元素----<s:propertyvalue="map['0001']"/></li>
  87. <li>3.访问Map中的所有key----<s:propertyvalue="map.keys"/></li>
  88. <li>4.访问Map中的所有value----<s:propertyvalue="map.values"/></li>
  89. <li>5.访问容器的大小----<s:propertyvalue="map.size()"/></li>
  90. <br>
  91. ----------------------------------------
  92. <br>
  93. <br>
  94. <br>
  95. <div>
  96. 投影<br>
  97. <li>1.通过投影访问list中年龄为25的学生的姓名----<s:propertyvalue="list.{?#this.age==25}[0].{no}[0]"/></li>
  98. <li>2.通过投影访问list中年龄大于25的集合中的首元素的姓名----<s:propertyvalue="list.{^#this.age>20}.{no}"/></li>
  99. <li>3.通过投影访问list中年龄大于25的集合中的尾元素的姓名----<s:propertyvalue="list.{$#this.age>20}.{no}"/></li>
  100. <li>4.通过投影判断list中年龄大于25的集合是否为空----<s:propertyvalue="list.{?#this.age>25}==null"/></li><br>
  101. </div>
  102. ----------------------------------------
  103. <br>
  104. <br>
  105. <br>
  106. <div>
  107. <br>
  108. <li>用[]来访问栈中的元素,注意:[0]中0表示从栈中的开始位置进行遍历其中的元素----<s:propertyvalue="[1][0].execute()"/></li>
  109. </div>
  110. <s:debug></s:debug>
  111. </body>
  112. </html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值