zoukankan      html  css  js  c++  java
  • JSPServlet精华笔记

    一、     JSP (Java Server Pages)

    JSP是指:

    ▶    在HTML中嵌入Java脚本代码

    ▶    由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码

    ▶    然后将生成的整个页面信息返回给客户端

    二、     JSP工作原理(执行流程)

    Web容器处理JSP文件请求需要经过3个阶段:

    ▶        翻译阶段(转译阶段)

                       .jsp → .java

    ▶        编译阶段

                       .java → .class

    ▶       执行阶段(运行)

                       运行.class

    注意:第一次请求之后,Web容器可以重用已经编译好的字节码文件。所以,第一次会比较慢。

    三、     JSP中的元素

    ▶        静态内容

                       HTML内容

    ▶        指令

                       以“<%@ ” 开始,以“%> ” 结束。

                       比如:<%@ include file = " Filename" %>

    ▶       表达式

                       <%=Java表达式 %>

                       注意:表达式后不要加分号。

                      相当于out. print(表达式);

    ▶       Java脚本 (Java Scriptlet)

                       <% Java 代码 %>

    ▶        声 明

                    <%! 方法 %>

                    <%! 变量 %>

    ▶        注释

                    <!-- 这是注释,但客户端可以查看到 -->  HTML、XML注释

                    <%-- 这也是注释,但客户端不能查看到 --%>  JSP注释

    四、     指令

    语法:<%@ 指令名 属性n="属性值n"%>

    常用的指令

    ▶        <%@ page %>

    ▶        <%@ include %>

    ▶        <%@ taglib %>

    4.1.           page指令

    ▶        通过设置内部的多个属性来定义整个页面的属性

    ▶        可以使用多次

    ▶        一般JSP页面中,第一行就是page指令

    ▶        page指令常用属性

    4.2.           Java脚本(Scriptlet)

                          语法 :<% Java代码 %>

                          写在Java脚本中的代码,事实上,都是在JSP转译成.java后的同一个方法(_jspService())中的代码。

                          请思考:内置对象从哪来的?

    4.3.           声明

                          语法 :<%! 变量或方法%>

                          注意:声明中不可以使用内置对象,请说明和记住原因。

    五、     九大内置对象

    在JSP的脚本中,可以直接使用的对象。

    ▶        PageContext pageContext ;

    ▶        HttpSession session ;

    ▶        ServletContext application ;

    ▶        ServletConfig config ;

    ▶        JspWriter out ;

    ▶        Object page;

    ▶        HttpServletRequest request;

    ▶        HttpServletResponse response

    ▶        Throwable exception    只有isErrorPage=”true”的页面才拥有

     5.1 request对象

        客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。

        方法摘要:

    [java] view plain copy
     
     print?
    1. object getAttribute(String name)             //返回指定属性的属性值  
    2. Enumeration getAttributeNames()        //返回所有可用属性名的枚举  
    3. String getCharacterEncoding()             // 返回字符编码方式  
    4. int getContentLength()                             //返回请求体的长度(以字节数)  
    5. String getContentType()                          // 得到请求体的MIME类型  
    6. ServletInputStream getInputStream()   //得到请求体中一行的二进制流  
    7. String getParameter(String name)        //返回name指定参数的参数值  
    8. Enumeration getParameterNames()    //返回可用参数名的枚举  
    9. String[] getParameterValues(String name) //返回包含参数name的所有值的数组  
    10. String getProtocol()                         // 返回请求用的协议类型及版本号  
    11. String getScheme()                          //返回请求用的计划名,如:http.https及ftp等  
    12. String getServerName()                  //返回接受请求的服务器主机名  
    13. int getServerPort()                            //返回服务器接受此请求所用的端口号  
    14. BufferedReader getReader()         //返回解码过了的请求体  
    15. String getRemoteAddr()                  //返回发送此请求的客户端IP地址  
    16. String getRemoteHost()                  //返回发送此请求的客户端主机名  
    17. void setAttribute(String key,Object obj) //设置属性的属性值  
    18. String getRealPath(String path)    //返回一虚拟路径的真实路径  

    5.2 response对象

        response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。

        方法摘要:

    [java] view plain copy
     
     print?
    1. String getCharacterEncoding()        //返回响应用的是何种字符编码  
    2. ServletOutputStream getOutputStream()  //返回响应的一个二进制输出流  
    3. PrintWriter getWriter()                       // 返回可以向客户端输出字符的一个对象  
    4. void setContentLength(int len)        //设置响应头长度  
    5. void setContentType(String type)    //设置响应的MIME类型  
    6. sendRedirect(java.lang.String location) //重新定向客户端的请求  

    重定向和转发

    [java] view plain copy
     
     print?
    1. response.sendRedirect("main.jsp");//重定向  
    2.   
    3. request.getRequestDispatcher("main.jsp").forward(request,response);    //转发  

    重定向:

           又称为客户端跳转

    1、 请求会丢失

    2、 地址会改变

    转发:

           又称为服务端跳转。

    1、 请求不会丢失

    2、 地址栏不改变

    • 转发是在服务器端发挥作用,通过forward方法将提交信息在多个页面间进行传递。
    • 转发是在服务器内部控制权的转移,客户端浏览器的地址栏不会显示出转向后的地址
    • 重定向是在客户端发挥作用,通过请求新的地址实现页面转向
    • 重定向是通过浏览器重新请求地址,在地址栏中可以显示转向后的地址

    关于路径:

    •               重定向:basePath+完整路径
    •               转发:/+完整径

    5.3 session对象

        session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,
        直到客户端与服务器断开连接为止。它是HttpSession类的实例.

        方法摘要:

    [java] view plain copy
     
     print?
    1. long getCreationTime()        //返回SESSION创建时间  
    2. public String getId()              // 返回SESSION创建时JSP引擎为它设的惟一ID号  
    3. long getLastAccessedTime()   // 返回此SESSION里客户端最近一次请求时间  
    4. int getMaxInactiveInterval()   //返回两次请求间隔多长时间此SESSION被取消(ms)  
    5. String[] getValueNames()    //返回一个包含此SESSION中所有可用属性的数组  
    6. void invalidate()                     // 取消SESSION,使SESSION不可用  
    7. boolean isNew()                   // 返回服务器创建的一个SESSION,客户端是否已经加入  
    8. void removeValue(String name)  //删除SESSION中指定的属性  
    9. void setMaxInactiveInterval()  //设置两次请求间隔多长时间此SESSION被取消(ms)  

    5.4 out对象

        out对象是JspWriter类的实例,是向客户端输出内容常用的对象

        方法摘要:

    [java] view plain copy
     
     print?
    1. void clear()             // 清除缓冲区的内容  
    2. void clearBuffer()   //清除缓冲区的当前内容  
    3. void flush()             // 清空流  
    4. int getBufferSize()  //返回缓冲区以字节数的大小,如不设缓冲区则为0  
    5. int getRemaining() //返回缓冲区还剩余多少可用  
    6. boolean isAutoFlush() //返回缓冲区满时,是自动清空还是抛出异常  
    7. void close()               //关闭输出流  

    5.5 page对象

        page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例

        方法摘要:

    [java] view plain copy
     
     print?
    1. class getClass              //返回此Object的类  
    2. int hashCode()              //返回此Object的hash码  
    3. boolean equals(Object obj) //判断此Object是否与指定的Object对象相等  
    4. void copy(Object obj)   // 把此Object拷贝到指定的Object对象中  
    5. Object clone()               // 克隆此Object对象  
    6. String toString()             //把此Object对象转换成String类的对象  
    7. void notify()                    //唤醒一个等待的线程  
    8. void notifyAll()                // 唤醒所有等待的线程  
    9. void wait(int timeout)    //使一个线程处于等待直到timeout结束或被唤醒  
    10. void wait()                      // 使一个线程处于等待直到被唤醒  
    11. void enterMonitor()        //对Object加锁  
    12. void exitMonitor()           //对Object开锁  

    5.6 application对象

        application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,
        在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,
        以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。
        服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。

        方法摘要:

    [java] view plain copy
     
     print?
    1. Object getAttribute(String name)       //返回给定名的属性值  
    2. Enumeration getAttributeNames()    //返回所有可用属性名的枚举  
    3. void setAttribute(String name,Object obj)  //设定属性的属性值  
    4. void removeAttribute(String name)    //删除一属性及其属性值  
    5. String getServerInfo()                           //返回JSP(SERVLET)引擎名及版本号  
    6. String getRealPath(String path)         //返回一虚拟路径的真实路径  
    7. ServletContext getContext(String uripath)  //返回指定WebApplication的application对象  
    8. int getMajorVersion()                             //返回服务器支持的Servlet API的最大版本号  
    9. int getMinorVersion()                             //返回服务器支持的Servlet API的最大版本号  
    10. String getMimeType(String file)           //返回指定文件的MIME类型  
    11. URL getResource(String path)           //返回指定资源(文件及目录)的URL路径  
    12. InputStream getResourceAsStream(String path) //返回指定资源的输入流  
    13. RequestDispatcher getRequestDispatcher(String uripath) //返回指定资源的RequestDispatcher对象  
    14. Servlet getServlet(String name)            //返回指定名的Servlet  
    15. Enumeration getServlets()                    //返回所有Servlet的枚举  
    16. Enumeration getServletNames()        //返回所有Servlet名的枚举  
    17. void log(String msg)                             // 把指定消息写入Servlet的日志文件  
    18. void log(Exception exception,String msg)  // 把指定异常的栈轨迹及错误消息写入Servlet的日志文件  
    19. void log(String msg,Throwable throwable)  // 把栈轨迹及给出的Throwable异常的说明信息 写入Servlet的日志文件  

    5.7 exception对象

        exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。
        如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象

        方法摘要:

    [java] view plain copy
     
     print?
    1. String getMessage()               //返回描述异常的消息  
    2. String toString()                        //返回关于异常的简短描述消息  
    3. void printStackTrace()            //显示异常及其栈轨迹  
    4. Throwable FillInStackTrace() //重写异常的执行栈轨迹  

    5.8 pageContext对象

        pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,
        也就是说他可以访问到本页所在的SESSION,
        也可以取本页面所在的application的某一属性值,
        他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。

        方法摘要:

    [java] view plain copy
     
     print?
    1. JspWriter getOut()                                   //返回当前客户端响应被使用的JspWriter流(out)  
    2. HttpSession getSession()                     //返回当前页中的HttpSession对象(session)  
    3. Object getPage()                                      //返回当前页的Object对象(page)  
    4. ServletRequest getRequest()               //返回当前页的ServletRequest对象(request)  
    5. ServletResponse getResponse()        //返回当前页的ServletResponse对象(response)  
    6. Exception getException()                        //返回当前页的Exception对象(exception)  
    7. ServletConfig getServletConfig()           //返回当前页的ServletConfig对象(config)  
    8. ServletContext getServletContext()        //返回当前页的ServletContext对象(application)  
    9. void setAttribute(String name,Object attribute) //设置属性及属性值  
    10. void setAttribute(String name,Object obj,int scope) //在指定范围内设置属性及属性值  
    11. public Object getAttribute(String name)    //取属性的值  
    12. Object getAttribute(String name,int scope)     //在指定范围内取属性的值  
    13. public Object findAttribute(String name)       //寻找一属性,返回起属性值或NULL  
    14. void removeAttribute(String name)         //删除某属性  
    15. void removeAttribute(String name,int scope)   // 在指定范围删除某属性  
    16. int getAttributeScope(String name)        //返回某属性的作用范围  
    17. Enumeration getAttributeNamesInScope(int scope) //返回指定范围内可用的属性名枚举  
    18. void release()                    //释放pageContext所占用的资源  
    19. void forward(String relativeUrlPath)        //使当前页面重导到另一页面  
    20. void include(String relativeUrlPath)        //在当前位置包含另一文件  

    5.9 config对象

        config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,
        此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)
        以及服务器的有关信息(通过传递一个ServletContext对象)

        方法摘要:

    [java] view plain copy
     
     print?
    1. ServletContext getServletContext()      //返回含有服务器相关信息的ServletContext对象  
    2. String getInitParameter(String name)    // 返回初始化参数的值  
    3. Enumeration getInitParameterNames()  //返回Servlet初始化所需所有参数的枚举  

    六、JSP状态管理(会话跟踪)

    1. Cookie

          Cookie是Web服务器保存在客户端的一系列文本信息。

    Cookie的作用

    •       对特定对象的追踪
    •       统计网页浏览次数
    •       简化登录

    安全性能

         容易信息泄露

    常见的方法

    [java] view plain copy
     
     print?
    1. String getComment() //返回cookie中注释,假如没有注释的话将返回空值.   
    2. String getDomain() //返回cookie中Cookie实用的域名. 应用getDomain() 方法可以唆使浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完整雷同的服务器。留心域名必须以点开端   
    3. int getMaxAge() //返回Cookie过期之前的最大时间,以秒盘算。   
    4. String getName() //返回Cookie的名字   
    5. String getPath() //返回Cookie实用的路径。假如不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。   
    6. boolean getSecure() //假如浏览器通过安全协议发送cookies将返回true值,假如浏览器应用标准协议则返回false值。   
    7. String getValue() //返回Cookie的值。笔者也将在后面具体先容getValue/setValue。   
    8. int getVersion() //返回Cookie所屈服的协议版本。   
    9. void setComment(String purpose) //设置cookie中注释   
    10. void setDomain(String pattern) //设置cookie中Cookie实用的域名    
    11. void setMaxAge(int expiry) //以秒盘算,设置Cookie过期时间。   
    12. void setPath(String uri) //指定Cookie实用的路径。   
    13. void setSecure(boolean flag) //指出浏览器应用的安全协议,例如HTTPS或SSL。   
    14. void setValue(String newValue) //cookie创立后设置一个新的值。   
    15. void setVersion(int v) //设置Cookie所屈服的协议版本   
    [java] view plain copy
     
     print?
    1. //获取客户端发送所有的Cookie  
    2.             <%  
    3.             //获取客户端发送所有的Cookie  
    4.             Cookie[] cookies = request.getCookies();  
    5.   
    6.             if (null != cookies) {  
    7.         %>  
    8.         <table width="600" border="1">  
    9.             <tr>  
    10.                 <td>  
    11.                     名称  
    12.                 </td>  
    13.                 <td>  
    14.                     值  
    15.                 </td>  
    16.                 <td>  
    17.                     有效时长  
    18.                 </td>  
    19.             </tr>  
    20.             <%  
    21.                 for (Cookie cookie : cookies) {  
    22.             %>  
    23.             <tr>  
    24.                 <td>  
    25.                     <%=cookie.getName()%>  
    26.                 </td>  
    27.                 <td>  
    28.                     <%=cookie.getValue()%>  
    29.                             </td>  
    30.                 <td>  
    31.                     <%=cookie.getMaxAge()%>  
    32.                 </td>  
    33.             </tr>  
    34.             <%  
    35.                 }  
    36.                                 //创建Cookie  
    37.                             Cookie nameCookie = new Cookie("username", "accp");  
    38.                             Cookie pwdCookie = new Cookie("password", "123");  
    39.                       
    40.                             //设置有效时长(秒)  
    41.                             nameCookie.setMaxAge(60);  
    42.                                 pwdCookie.setMaxAge(60);  
    43.                       
    44.                             //向客户端手动写入Cookie  
    45.                             response.addCookie(nameCookie);  
    46.                             response.addCookie(pwdCookie);  
    47.                          %>   

    2.session(会话)

          会话就是浏览器与服务器之间的一次通话,包含浏览器与服务器之间的多次请求、响应过程 。

           常用方法

    [java] view plain copy
     
     print?
    1.   getId //此方法返回唯一的标识,这些标识为每个session而产生。当只有一个单一的值与一个session联合时,或当日志信息与先前的sessions有关时,它被当作键名用。  
    2. GetCreationTime //返回session被创建的时间。最小单位为千分之一秒。为得到一个对打印输出很有用的值,可将此值传给Date constructor 或者GregorianCalendar的方法setTimeInMillis.  
    3. GetLastAccessedTime //返回session最后被客户发送的时间。最小单位为千分之一秒。  
    4. GetMaxInactiveInterval //返回总时间(秒),负值表示session永远不会超时。  
    5. //getAttribute 取一个session相联系的信息。(在jsp1.0中为 getValue)  
    6. Integer item = (Integer) session.getAttribute("item") //检索出session的值并转化为整型  
    7. //setAttribute 提供一个关键词和一个值。会替换掉任何以前的值。(在jsp1.0中为putValue)  
    8. session.setAttribute("ItemValue", itemName); // ItemValue 必须不是must简单类型   

    七、     JavaBean

                         符合规范的Java类都是JavaBean

    JavaBean的分类

    •        封装数据
    1.             按照OO原则,属性与数据库表字段相对应
    2.             属性私有
    3.             public的无参的构造方法
    4.             具有public的set/get方法
    •         封装业务
    1.             具有实现特定功能的方法和方法实现
    2.             通常与一个封装数据的JavaBean对应

    优势

    1.         解决代码重复编写,减少代码冗余
    2.         功能区分明确,避免业务逻辑处理与页面显示处理集中在一起造成混乱
    3.         提高了代码的维护性

    八、     Tomcat配置连接池

    1、 将驱动jar包拷贝到%TOMCAT_HOME%lib目录下

    2、 打开%TOMCAT_HOME%confcontext.xml文件,在<Context>元素下配置:

    [java] view plain copy
     
     print?
    1. <Resource name="jdbc/books"  
    2.   
    3.        auth="Container"type="javax.sql.DataSource"  maxActive="100"   
    4.   
    5.        maxIdle="30" maxWait="10000" username="scott"   password="tiger"  
    6.   
    7.       driverClassName="oracle.jdbc.OracleDriver"   
    8.   
    9.      url="jdbc:oracle:thin:@192.168.3.80:1521:accp"/>  



    3、 在web.xml中配置(可选)

    [java] view plain copy
     
     print?
    1. <resource-ref>  
    2.   
    3.     <res-ref-name> jdbc/ pro</res-ref-name>  
    4.   
    5.     <res-type> javax.sql.DataSource </res-type>  
    6.   
    7.     <res-auth> Container </res-auth>  
    8.   
    9.   </resource-ref>  



    4、 通过JNDI获取数据源,并从数据源得到连接

    [java] view plain copy
     
     print?
    1. Context ic = new InitialContext();  
    2.   
    3. DataSource source = (DataSource)ic.lookup("java:comp/env/jdbc/news");  
    4.   
    5. Connection connection = source.getConnection();  

    九、     Serlvet基础

    Servlet 是一个 Java程序,是在服务器上运行以处理客户端请求并做出响应的程序。

    必须实现Servlet接口。

    13.1.      Servlet的生命周期

    1、 客户端发出HTTP请求,默认情况下,当第一次请求Servlet时,容器创建Servlet实例。否则进入第3步。

    2、 调用Servlet的init()方法进行初始化。

    3、 调用Servlet的service()方法处理请求和响应。

    4、 然后Servlet常驻内存,等待下一次调用。

    5、 应用程序停止,调用Servlet的destroy()释放占用的资源。

    注意:在整个应用程序的生命周期中,Servlet的实例只有一个。它以多线程的方式进行服务。

    记住JSP与Servlet的生命周期及区别

    13.2.      Servlet的体系结构

    HttpServlet中的doGet()和doPost()由service()方法根据提交请求的方式(GET/POST)来调用。默认为GET

    13.3.      常用API

          ServeltConfig接口

    •       在Servlet初始化过程中获取配置信息
    •       一个Servlet只有一个ServletConfig对象

          ServeltConfig接口的常用方法

    方法名称

             功能描述

    String getInitParameter(String name)

    获取web.xml中设置的以name命名的初始化参数值

    ServletContext getServletContext()

    返回Servlet的上下文对象引用

          ServeltConText接口

    •       获取Servlet上下文
    •       即JSP中的application内置对象

          ServeltConText接口的常用方法

    方法名称

             功能描述

    ServletContext getContext(String path)

    返回服务器上与指定URL相对应的ServletContext对象

    void setAttribute(String name,Object obj)

    设置Servlet中的共享属性

    Object getAttribute(String name)

    获取Servlet中设置的共享属性

          GenericServlet抽象类

    •       提供了Servlet与ServletConfig接口的默认实现方法
    •       HttpServlet继承于GenericServlet
    •       处理HTTP协议的请求和响应

    13.4.      Servlet的配置

    [java] view plain copy
     
     print?
    1. <!-- 注册Servlet -->  
    2.   
    3. <servlet>  
    4.   
    5.     <servlet-name>servlet03</servlet-name>  
    6.   
    7.     <servlet-class>com.accp.jspservlet.servlet.Servlet03</servlet-class>  
    8.   
    9.     </servlet>  
    10.   
    11.      
    12.   
    13.     <!-- 映射 -->  
    14.   
    15. <servlet-mapping>  
    16.   
    17.     <servlet-name>servlet03</servlet-name>  
    18.   
    19.     <url-pattern>/servlet03</url-pattern>  
    20.   
    21. </servlet-mapping>     



    13.5.      初始化参数

    [java] view plain copy
     
     print?
    1. <servlet>  
    2.   
    3.    <description>读取初始化参数</description>  
    4.   
    5.    <servlet-name>InitParamServlet</servlet-name>    <servlet-class>com.accp.jspservlet.servlet.InitParamServlet</servlet-class>  
    6.   
    7.    <!-- 初始化参数,可以配置多个,只有该Servlet能够读取 -->  
    8.   
    9.    <init-param>  
    10.   
    11.        <param-name>encoding</param-name>  
    12.   
    13.        <param-value>UTF-8</param-value>  
    14.   
    15.    </init-param>  
    16.   
    17. </servlet>  



    读取:

    [java] view plain copy
     
     print?
    1. //获取所有的初始化参数的名称  
    2.   
    3.     Enumeration<String> paramNames = config.getInitParameterNames();  
    4.   
    5.        while(paramNames.hasMoreElements()){  
    6.   
    7.            String paramName = paramNames.nextElement();  
    8.   
    9.            String paramValue = config.getInitParameter(paramName);  
    10.   
    11.            System.out.println(paramName+"="+paramValue);  
    12.   
    13.        }  



    13.6.      Servlet上下文参数

    [java] view plain copy
     
     print?
    1. <!-- Servlet上下文(ServletContext)参数 -->  
    2.   
    3.  <context-param>  
    4.   
    5.     <param-name>hello</param-name>  
    6.   
    7.     <param-value>world</param-value>  
    8.   
    9.  </context-param>  



    读取:

    [java] view plain copy
     
     print?
      1. Enumeration<String> paramNames = context.getInitParameterNames();  
      2.   
      3.        System.out.println("Servlet上下文参数,所有的Servlet都可以访问");  
      4.   
      5.        while(paramNames.hasMoreElements()){  
      6.   
      7.            String paramName = paramNames.nextElement();  
      8.   
      9.            String paramValue = context.getInitParameter(paramName);  
      10.   
      11.            System.out.println(paramName+"="+paramValue);  
      12.   
      13.        }  
  • 相关阅读:
    Web 日志分析过程
    nginx系列之九:lua服务
    Linux网络编程之IO模型
    从URL输入到页面展现到底发生什么
    CentOS 日常运维十大技能
    以MySQL为例,详解数据库索引原理(1)
    Elasticsearch的特点以及应用场景
    Ubuntu1804编译安装LNMP
    golang 高级
    Centos7 安装 Redis
  • 原文地址:https://www.cnblogs.com/hoobey/p/6100957.html
Copyright © 2011-2022 走看看