导航

公墓网

当前位置: 首页 > 公墓资讯

page对象(page对象属于作用域通信对象类对象)

更新时间:2025 08 17 12:53:43 作者 :庆美网 围观 : 86次

大家好,关于page对象(page对象属于作用域通信对象类对象)很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!

方法:

1. void clear() ;

清除输出缓冲区的内容,但是不输出到客户端。

page对象(page对象属于作用域通信对象类对象)

2. void clearBuffer() ;

清除输出缓冲区的内容,并输出到客户端。

3. void close() ;

关闭输出流,清除所有内容。

4. void flush() ;

输出缓冲区里面的数据。

5. int getBufferSize() ;

获取以kb为单位的目前缓冲区大小。

6. int getRemaining() ;

获取以kb为单位的缓冲区中未被占用的空间大小。

7. boolean isAutoFlush() ;

是否自动刷新缓冲区。

8. void newLine() ;

输出一个换行字符。

9. void print( boolean b ) ;

void print( char c ) ;

void print( char[] s ) ;

void print( double d ) ;

void print( float f ) ;

void print( int i ) ;

void print( long l ) ;

void print( Object obj ) ;

void print( String s ) ;

将指定类型的数据输出到Http流,不换行。

10. void println( boolean b ) ;

void println( char c ) ;

void println( char[] s ) ;

void println( double d ) ;

void println( float f ) ;

void println( int i ) ;

void println( long l ) ;

void println( Object obj ) ;

void println( String s ) ;

将指定类型的数据输出到Http流,并输出一个换行符。

11. Appendable append( char c ) ;

Appendable append( CharSequence cxq, int start, int end ) ;

Appendable append( CharSequence cxq ) ;

将一个字符或者实现了CharSequence接口的对象添加到输出流的后面。

成员:

int DEFAULT_BUFFER = 0 – 缺省缓冲区大小

int NO_BUFFER = -1 – writer是否处于缓冲输出状态

int UNBOUNDED_BUFFER = -2 – 是否限制缓冲区大小

② request – javax.servlet.http.HttpServletRequest

request对象包含所有请求的信息,如请求的来源、标头、cookies和请求相关的参数值等。

方法:

1. Object getAttribute( String name ) ;

返回由name指定的属性值,该属性不存在时返回null。

2. Enumeration getAttributeNames() ;

返回request对象的所有属性名称的集合。

3. String getAuthType() ;

返回用来保护servlet的认证方法的名称,未受保护时返回null。

4. String getCharacterEncoding() ;

返回请求中的字符编码方法,可以在response对象中设置。

5. int getContentLength() ;

返回请求的BODY的长度,不能确定长度时返回-1。可以在response中设置。

6. String getContentType() ;

返回在response中定义的内容类型。

7. String getContentPath() ;

返回请求的路径。

8. Cookie[] getCookies() ;

返回客户端所有的Cookie的数组。

9. Enumeration getHeaderNames() ;

返回所有HTTP头的名称的集合。

10. Enumeration getHeaders( String name ) ;

返回指定HTTP头的所有值的集合。

11. String getHeader( String name ) ;

返回指定名称的HTTP头的信息。

12. long getDateHeader( String name ) ;

返回指定名称的Data类型的HTTP头的信息。

13. int getIntHeader( String name ) ;

返回指定名称的Int类型的HTTP头的信息。

14. ServletInputStream getInputStream() ;

返回请求的输入流。

15. Locale getLocale() ;

返回当前页的Locale对象,可以在response中设定。

16. Enumeration getLocales() ;

返回请求中所有的Locale对象的集合。

17. String getLocalName() ;

获取响应请求的服务器端主机名。

18. String getLocalAddr() ;

获取响应请求的服务器端地址。

19. int getLocalPort() ;

获取响应请求的服务器端端口

20. String getMethod() ;

获取客户端向服务器端发送请求的方法(GET、POST)。

21. String getParameter( String name ) ;

获取客户端发送给服务器端的参数值。

22. Map getParameterMap() ;

该方法返回包含请求中所有参数的一个Map对象。

23. Enumeration getParameterNames() ;

返回请求中所有参数的集合。

24. String[] getParameterValues( String name ) ;

获得请求中指定参数的所有值。

25. String getQueryString() ;

返回get方法传递的参数字符串,该方法不分解出单独的参数。

26. String getPathInfo() ;

取出请求中处于ServletPath和QueryString之间的额外信息。

27. String getPathTranslated() ;

返回用getPathInfo()方法取得的路径信息的实际路径。

28. String getProtocol() ;

返回请求使用的协议。可以是HTTP1.1或者HTTP1.0。

29. BufferedReader getReader() ;

返回请求的输入流对应的Reader对象,该方法和getInputStream()方法在一个页面中只能调用一个。

30. String getRemoteAddr() ;

获取发出请求的客户端IP地址。

31. String getRemoteHost() ;

获取发出请求的客户端主机名

32. String getRemoteUser() ;

返回经过客户端验证的用户名,未经验证返回null。

33. int getRemotePort() ;

返回发出请求的客户端主机端口。

34. String getRealPath( String path ) ;

返回给定虚拟路径的物理路径。

35. RequestDispatcher getRequestDispatcher( String path ) ;

按给定的路径生成资源转向处理适配器对象。

36. String getRequestedSessionId() ;

返回请求的session的标识。

37. String RequestURI() ;

返回发出请求的客户端地址,但是不包括请求的参数字符串。

38. StringBuffer getRequestURI() ;

返回响应请求的服务器端地址

39. String getScheme() ;

获取协议名称,缺省值为HTTP协议。

40. String getServerName() ;

返回响应请求的服务器名称。

41. String getServletPath() ;

获取客户端所请求的脚本文件的文件路径。

42. int getServerPort() ;

获取响应请求的服务器端主机端口号。

43. void removeAttribute( String name ) ;

在属性列表中删除指定名称的属性。

44. void setAttribute( String name, Object value ) ;

在属性列表中添加/删除指定的属性。

45. void setCharacterEncoding( String name ) ;

设置请求的字符编码格式。

46. HttpSession getSession() ;

HttpSession getSession( boolean create ) ;

获取session,如果create为true,在无session的情况下创建一个。

47. boolean isRequestedSessionIdFromCookie() ;

检查请求的会话ID是否为通过Cookie传入。

48. boolean isRequestedSessionIdFromURL() ;

检查请求的会话ID是否为通过URL传入。

49. boolean isRequestedSessionIdValid() ;

检查请求的会话ID是否仍然有效。

50. boolean isSecure() ;

检查请求是否使用安全链接,如果HTTPS等。

51. boolean isUserInRole( String role ) ;

检查已经通过验证的用户是否在是role所指定的角色。

52. Principal getUserPrincipal() ;

返回包含用户登陆名的一个java.security.Principal对象。

成员:

String BASIC_AUTH = \”BASIC\” –

String CLIENT_CERT_AUTH = \”CLIENT_CERT\” –

String DIGEST_AUTH = \”DIGEST\” –

String FORM_AUTH = \”FORM\” –

③ response – javax.servlet.http.HttpServletResponse

response对象主要将JSP容器处理后的结果传回到客户端。

方法:

1. void addCookie( Cookie cookie ) ;

添加一个Cookie对象,保存客户端信息。

2. void addDateHeader( String name, long value ) ;

添加一个日期类型的HTTP头信息,覆盖同名的HTTP头信息。

3. void addHeader( String name, String value ) ;

添加一个HTTP头,覆盖同名的旧HTTP头。

4. void addIntHeader( String name, int value ) ;

添加一个整型的HTTP头,覆盖同名的旧HTTP头。

5. boolean containsHeader( String name ) ;

判断指定的HTTP头是否存在。

6. String encodeRedirectURL( String url ) ;

对sendRedirect()方法使用的URL进行编码。

7. String encodeURL( String url ) ;

将URL予以编码,回传包含session ID的URL。

8. void flushBuffer() ;

强制把当前缓冲区的内容发送到客户端。

9. int getBufferSize() ;

取得以kb为单位的缓冲区大小。

10. String getCharacterEncoding() ;

获取响应的字符编码格式。

11. String getContentType() ;

获取响应的类型。

12. Locale getLocale() ;

获取响应的Locale对象。

13. ServletOutputStream getOutputStream() ;

返回客户端的输出流对象。

14. PrintWriter getWriter() ;

获取输出流对应的writer对象。

15. boolean isCommitted() ;

判断服务器端是否已经将数据输出到客户端。

16. void reset() ;

清空buffer中的所有内容。

17. void resetBuffer() ;

情况buffer中所有的内容,但是保留HTTP头和状态信息。

18. void sendError( int xc, String msg ) ;

void sendError( int xc ) ;

发送错误,包括状态码和错误信息。

19. void sendRedirect( String locationg ) ;

把响应发送到另外一个位置进行处理。

20. void setBufferSize( int size ) ;

设置以kb为单位的缓冲区大小。

21. void setCharacterEncoding( String charset ) ;

设置响应使用的字符编码格式。

22. void setContentLength( int length ) ;

设置响应的BODY长度。

23. void setContentType( String type ) ;

设置响应的类型。

24. void setDateHeader( String name, long value ) ;

设置指定名称的Data类型的HTTP头的值。

25. void setHeader( String name, String value ) ;

设置指定名称的HTTP头的值。

26. void setIntHeader( String name, int value ) ;

设置指定名称的int类型的HTTP头的值。

27. void setStatus( int xc ) ;

设置响应状态码,新值会覆盖当前值。

成员(HTTP状态码):

int SC_CONTINUE = 100 int SC_SWITCHING_PROTOCOLS = 101

int SC_OK = 200 int SC_NON_AUTHORITATIVE_INFORMATION = 203

int SC_ACCEPTED = 202 int SC_CREATED = 201

int SC_NO_CONTENT = 204 int SC_RESET_CONTENT = 205

int SC_PARTIAL_CONTENT = 206 int SC_MULTIPLE_CHOICES = 300

int SC_MOVED_PERMANENTLY = 301 int SC_MOVED_TEMPORARILY = 302

int SC_FOUND = 302 int SC_SEE_OTHER = 303

int SC_NOT_MODIFIED = 304 int SC_USE_PROXY = 305

int SC_TEMPORARY_REDIRECT = 307 int SC_BAD_REQUEST = 400

int SC_UNAUTHORIZED = 401 int SC_PAYMENT_REQUIRED = 402

int SC_FORBIDDEN = 403 int SC_NOT_FOUND = 404

int SC_METHOD_NOT_ALLOWED = 405 int SC_NOT_ACCEPTABLE = 406

int SC_PROXY_AUTHENTICATION_REQUIRED = 407 int SC_REQUEST_TIMEOUT = 408

int SC_CONFLICT = 409 int SC_GONE = 410

int SC_LENGTH_REQUIRED = 411 int SC_PRECONDITION_FAILED = 412

int SC_REQUEST_ENTITY_TOO_LARGE = 413 int SC_REQUEST_URI_TOO_LONG = 414

int SC_UNSUPPORTED_MEDIA_TYPE = 415 int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416

int SC_EXPECTATION_FAILED = 417 int SC_INTERNAL_SERVER_ERROR = 500

int SC_NOT_IMPLEMENTED = 501 int SC_BAD_GATEWAY = 502

int SC_SERVICE_UNAVAILABLE = 503 int SC_GATEWAY_TIMEOUT = 504

int SC_HTTP_VERSION_NOT_SUPPORTED = 505

④ session – javax.servlet.http.HttpSession

session对象表示目前个别用户的会话状态,用来识别每个用户。

方法:

1. Object getAttribute( String name ) ;

获取与指定名字相关联的session属性值。

2. Enumeration getAttributeNames() ;

取得session内所有属性的集合。

3. long getCreationTime() ;

返回session的创建时间,最小单位千分之一秒。

4. String getId() ;

取得session标识。

5. long getLastAccessedTime() ;

返回与当前session相关的客户端最后一次访问的时间,由1970-01-01算起,单位毫秒。

6. int getMaxInactiveInterval( int interval ) ;

返回总时间,以秒为单位,表示session的有效时间(session不活动时间)。-1为永不过期。

7. ServletContext getServletContext() ;

返回一个该JSP页面对应的ServletContext对象实例。

8. HttpSessionContext getSessionContext() ;

9. Object getValue( String name ) ;

取得指定名称的session变量值,不推荐使用。

10. String[] getValueNames() ;

取得所有session变量的名称的集合,不推荐使用。

11. void invalidate() ;

销毁这个session对象。

12. boolean isNew() ;

判断一个session是否由服务器产生,但是客户端并没有使用。

13. void pubValue( String name, Object value ) ;

添加一个session变量,不推荐使用。

14. void removeValue( String name ) ;

移除一个session变量的值,不推荐使用。

15. void setAttribute( String name, String value ) ;

设置指定名称的session属性值。

16. void setMaxInactiveInterval( int interval ) ;

设置session的有效期。

17. void removeAttribute( String name ) ;

移除指定名称的session属性。

⑤ pageContext – javax.servlet.jsp.PageContext

pageContext对象存储本JSP页面相关信息,如属性、内建对象等。

方法:

1. void setAttribute( String name, Object value, int scope ) ;

void setAttribute( String name, Object value ) ;

在指定的共享范围内设置属性。

2. Object getAttribute( String name, int scope ) ;

Object getAttribute( String name ) ;

取得指定共享范围内以name为名字的属性值。

3. Object findAttribute( String name ) ;

按页面、请求、会话和应用程序共享范围搜索已命名的属性。

4. void removeAttribute( String name, int scope ) ;

void removeAttribute( String name ) ;

移除指定名称和共享范围的属性。

5. void forward( String url ) ;

将页面导航到指定的URL。

6. Enumeration getAttributeNamesScope( int scope ) ;

取得指定共享范围内的所有属性名称的集合。

7. int getAttributeScope( String name ) ;

取得指定属性的共享范围。

8. ErrorData getErrorDate() ;

取得页面的errorData对象。

9. Exception getException() ;

取得页面的exception对象。

10. ExpressionEvaluator getExpressionEvaluator() ;

取得页面的expressionEvaluator对象。

11. JspWriter getOut() ;

取得页面的out对象。

12. Object getPage() ;

取得页面的page对象。

13. ServletRequest getRequest() ;

取得页面的request对象。

14. ServletResponse getResponse() ;

取得页面的response对象。

15. ServletConfig getConfig() ;

取得页面的config对象。

16. ServletContext getServletContext() ;

取得页面的servletContext对象。

17. HttpSession getSession() ;

取得页面的session对象。

18. VariableResolver getVariableResolver() ;

取得页面的variableResolver对象。

19. void include( String url, boolean flush ) ;

void include( String url ) ;

包含其他的资源,并指定是否自动刷新。

20. void release() ;

重置pageContext内部状态,释放所有内部引用。

21. void initialize( Servlet servlet, ServletRequest request, ServletResponse response,

String errorPageURL, boolean needSession, int bufferSize, boolean autoFlush ) ;

初始化未经初始化的pageContext对象。

22. BodyContext pushBody() ;

BodyContext pushBody( Writer writer ) ;

保存当前的out对象,并更新pageContext中page范围内的out对象。

23. JspWrite popBody() ;

取出由pushBody()方法保存的out对象。

24. void handlePageException( Exception e ) ;

void handlePageException( Thrwoable t ) ;

成员:

int PAGE_SCOPE = 1 – 页面共享范围

int REQUEST_SCOPE = 2 – 请求共享范围

int SESSION_SCOPE = 3 – 会话共享范围

int APPLICATION_SCOPE = 4 – 应用程序共享范围

String PAGE = \”javax.servlet.jsp.jspPage\”

String PAGECONTEXT = \”javax.servlet.jsp.jspPageContext\”

String REQUEST = \”javax.servlet.jsp.jspRequest\”

String RESPONSE = \”javax.servlet.jsp.jspResponse\”

String CONFIG = \”javax.servlet.jsp.jspConfig\”

String SESSION = \”javax.servlet.jsp.jspSession\”

String OUT = \”javax.servlet.jsp.jspOut\”

String APPLICATION = \”javax.servlet.jsp.jspApplication\”

String EXCEPTION = \”javax.servlet.jsp.jspException\”

⑥ application – javax.servlet.ServletContext

application主要功用在于取得或更改Servlet的设定。

方法:

1. Object getAttribute( String name ) ;

返回由name指定的application属性。

2. Enumeration getAttributes() ;

返回所有的application属性。

3. ServletContext getContext( String uripath ) ;

取得当前应用的ServletContext对象。

4. String getInitParameter( String name ) ;

返回由name指定的application属性的初始值。

5. Enumeration getInitParameters() ;

返回所有的application属性的初始值的集合。

6. int getMajorVersion() ;

返回servlet容器支持的Servlet API的版本号。

7. String getMimeType( String file ) ;

返回指定文件的类型,未知类型返回null。一般为\”text/html\”和\”image/gif\”。

8. int getMinorVersion() ;

返回servlet容器支持的Servlet API的副版本号。

9. String getRealPath( String path ) ;

返回给定虚拟路径所对应物理路径。

10. RequestDispatcher getNamedDispatcher( String name ) ;

为指定名字的Servlet对象返回一个RequestDispatcher对象的实例。

11. RequestDispatcher getRequestDispatcher( String path ) ;

返回一个RequestDispatcher对象的实例。

12. URL getResource( String path ) ;

返回指定的资源路径对应的一个URL对象实例,参数要以\”/\”开头。

13. InputStream getResourceAsStream( String path ) ;

返回一个由path指定位置的资源的InputStream对象实例。

14. Set getResourcePaths( String path ) ;

返回存储在web-app中所有资源路径的集合。

15. String getServerInfo() ;

取得应用服务器版本信息。

16. Servlet getServlet( String name ) ;

在ServletContext中检索指定名称的servlet。

17. Enumeration getServlets() ;

返回ServletContext中所有servlet的集合。

18. String getServletContextName() ;

返回本web应用的名称。

19. Enumeration getServletContextNames() ;

返回ServletContext中所有servlet的名称集合。

20. void log( Exception ex, String msg ) ;

void log( String msg, Throwable t ) ;

void log( String msg ) ;

把指定的信息写入servlet log文件。

21. void removeAttribute( String name ) ;

移除指定名称的application属性。

22. void setAttribute( String name, Object value ) ;

设定指定的application属性的值。

⑦ config – javax.servlet.ServletConfig

config对象用来存放Servlet初始的数据结构。

方法:

1. String getInitParameter( String name ) ;

返回名称为name的促使参数的值。

2. Enumeration getInitParameters() ;

返回这个JSP所有的促使参数的名称集合。

3. ServletContext getContext() ;

返回执行者的servlet上下文。

4. String getServletName() ;

返回servlet的名称。

⑧ exception – java.lang.Throwable

错误对象,只有在JSP页面的page指令中指定isErrorPage=\”true\”后,才可以在本页面使用exception对象。

方法:

1. Throwable fillInStackTrace() ;

将当前stack信息记录到exception对象中。

2. String getLocalizedMessage() ;

取得本地语系的错误提示信息。

3. String getMessage()

取得错误提示信息。

4. StackTrackElement[] getStackTrace() ;

返回对象中记录的call stack track信息。

5. Throwable initCause( Throwable cause ) ;

将另外一个异常对象嵌套进当前异常对象中。

6. Throwable getCause() ;

取出嵌套在当前异常对象中的异常。

7. void printStackTrace() ;

void printStackTrace( printStream s ) ;

void printStackTrace( printWriter s ) ;

打印出Throwable及其call stack trace信息。

8. void setStackTrace( StackTraceElement[] stackTrace )

设置对象的call stack trace信息。

⑨ page – javax.servlet.jsp.HttpJspPage

page对象代表JSP对象本身,或者说代表编译后的servlet对象,

可以用( (javax.servlet.jsp.HttpJspPage)page )来取用它的方法和属性。

Excel常用技能分享与探讨(5-宏与VBA简介 VBA之用户窗体-多页控件)

书接上文,以下是VBA用户窗体中常用控件的详细解析,涵盖核心属性、关键事件、典型应用场景及代码示例,助您精准掌握每个控件的使用方法。

3.9.多页控件(MultiPage)

3.9.1、MultiPage 控件是什么?

  • 作用:用于在用户窗体(UserForm)中创建多个选项卡页面,每个页面可独立放置其他控件(如按钮、文本框等)。
  • 应用场景:当需要在一个窗体中分类展示不同功能或数据时(如设置向导、多步骤表单)。
  • 外观:默认显示为多个标签页(类似Excel的工作表标签),用户点击标签切换页面。

3.9.2、基础操作:创建与布局

1. 插入MultiPage控件

  • 打开VBA编辑器(Alt+F11),插入新的用户窗体(Insert → UserForm)。
  • 在工具箱中找到MultiPage控件(图标为多个重叠的卡片),拖动到窗体上。

2. 添加/删除页面

  • 设计时添加
    • 右键点击MultiPage控件 → 选择 New Page(新建页)。
    • 默认包含两个页面(Page1、Page2),可通过右键菜单删除或重命名。
  • 运行时动态添加(代码):

3. 切换页面

  • 设计时:直接点击标签页。
  • 运行时:通过代码 MultiPage1.Value = 索引号(索引从0开始)。

3.9.3、核心属性详解

一、MultiPage 控件属性

MultiPage 控件的属性分为外观控制布局控制行为控制杂项四大类。以下按功能分类详细说明:

1. 外观控制属性

2. 布局控制属性

3. 行为控制属性

4. 杂项属性

二、Page 对象属性(每个标签页的属性)

每个页面(Page)是独立的容器,拥有以下关键属性:

3.9.4、关键事件

1. Change 事件

  • 触发条件:用户切换页面时触发(无论是点击标签还是通过代码切换)。
  • 典型应用:动态加载数据、更新界面状态。

2. Click / DblClick 事件

  • 触发条件:用户单击(Click)或双击(DblClick)标签页时触发。
  • 典型应用:记录用户操作日志、快速编辑标签页标题。

3. MouseDown / MouseUp / MouseMove 事件

  • 触发条件:鼠标按下(MouseDown)、释放(MouseUp)或在控件上移动(MouseMove)时触发。
  • 参数:可获取鼠标坐标(X, Y)及按键状态(Button)。

4. KeyPress / KeyDown / KeyUp 事件

  • 触发条件:当控件获得焦点时,用户按下(KeyDown)、释放(KeyUp)键盘按键或输入字符(KeyPress)。
  • 典型应用:实现快捷键操作。

5. Scroll 事件

  • 触发条件:当页面内容被滚动时触发(需启用滚动条)。
  • 典型应用:动态加载分页数据。

6. BeforeDragOver / BeforeDropOrPaste 事件

  • 触发条件:拖放操作时触发(需启用拖放功能)。
  • 典型应用:实现文件拖放上传功能。

3.9.5、动态操作示例

1. 动态添加控件到指定页面

2. 删除指定页面

3. 遍历所有页面

4. 动态修改标签页标题

5. 隐藏指定页面

6. 为页面添加背景图片

3.9.6、实战案例:创建多页设置向导

1. 设计窗体

  • 添加MultiPage控件,包含3个页面:
    • Page1:用户信息(姓名、年龄)。
    • Page2:联系方式(邮箱、电话)。
    • Page3:确认页(显示汇总信息)。

2. 核心示例代码(具体需要自己绘制窗体和编写)

3.9.7、注意事项

1.容器层级:控件必须添加到具体的页面(MultiPage1.Pages(0)),而非直接放在MultiPage上。

2.索引陷阱:页面索引从0开始,操作时注意越界问题。

3.设计时优化:建议在设计阶段完成页面布局,减少动态加载的复杂性。

4.动态加载控件时的布局错乱:在运行时动态添加控件(如文本框、按钮),但控件位置偏移或大小不一致,导致页面显示混乱。

  • 原因分析
  • 未正确设置控件的 Left、Top、Width、Height 属性。
  • 动态添加控件时未考虑容器坐标系(相对于Page页面,而非整个窗体)。
  • 解决方案
  • 使用容器坐标系:控件的坐标是相对于所属 Page 页面的左上角。
  • 批量添加时使用循环布局

5.页面间数据传递与同步:在多个页面中填写数据后,如何在切换页面时保持数据共享或传递到其他页面。

  • 解决方案
  • 全局变量存储:在模块中定义公共变量存储数据。
  • 跨页面控件引用:直接访问其他页面的控件值。

3.9.8、总结

1.MultiPage 核心要点

2. 学习方法

  • 动手实践:通过案例驱动学习(如设置向导、多页报表生成器)。
  • 调试技巧:使用 Debug.Print 输出关键属性(如当前页面索引、页面标题)。
  • 查阅文档:利用VBA对象浏览器(F2)查看MultiPage和Page对象的完整属性和方法。
  • 模仿优秀代码:参考GitHub或论坛中的开源VBA项目,学习他人对MultiPage的应用。

Mybatis分页插件PageHelper的原理

mybatis的分页使用的关键字就是limit,插件分页的原理就是在sql语句中拼接limit关键字,进行数据的分页查询,所以pageHelper也不例外,底层处理的就是使用的代理对象拼接的sql,实现的分页。其实思想都离不开原始的分页的sql语句,虽然这样的分页插件好用,但是建议初学者最好不要使用,如果要使用,也要吃透底层的原理才可以加深理解, 否则的话,可能只会使用不能明白其中的原理。

pageHelper使用的是threadLocal本地线程变量的特性来进行存储分页的的部分数据,使用到分页查询的参数组装,而且在使用一次后,就会被remove,但是这个是必须的,一个是防止分页数据被其他sql误用,一个是防止内存泄露。使用的是mybatis的实现Interceptor接口,使用jdk动态代理的模式,增强Executor对象,实现的代理对象,组装count和limit分页数据的查询的sql语句,返回一个page对象,page对象其实就是继承了list对象,所以返回的List对象是父类,适应多态。

封装分页的pageNum pageSize以及orderFiled的一些数据

以上是可以看出,分页的数据是和ThreadLocal绑定的,也是将数据存放在ThreadLocal里面,提供给后续分页的时候使用

以上图你可以看出,清除数据的是在com.github.pagehelper.PageInterceptor#intercept方法中的finally中执行的,概述也说过,其实执行的原理就是利用的mybatis的intercept的进行的对象的代理

@Intercepts注解就是标注需要拦截代理的对象,type就是对象为Executor,方法是query,参数为两个重载的方法,PageInterceptor实现Interceptor并实现intercept和plugin方法,进行数据代理的处理,setProperties方法其实是可以设置配置参数来处理,实现接口原因是因为mybatis使用的jdk动态代理,必须是实现接口的才可以创建代理对象,下面就intercept方法进行分析分页的处理逻辑

就是使用原sql语句进行count查询总数

dialect.getPageSql就是拼接sql语句中的limit

看到这里,可能就可以明白了,这个分页到底是怎么做的 了,其实就是sql拼接了limit,总上图就可以看出,规归根结底就是代理了Excutor对象,然后执行count和拼接limit的sql语句,实现的插件的分页

以上可以看出来,其实就是一个Excutor代理对象的一系列处理,简单而言,pageHelper的分页逻辑处理,可以就这么理解,其实就是生成代理对象并代理增强,从ThreadLocal中获取到分页的参数,拼接sql和查询总数的sql并返回一个page对象

首先写分页插件的话,需要知道mybatis的原理,执行Sql的是四大对象:Executor,StatementHandler,ParameterHandler,ResultSetHandler。

一般都会获取SqlSession,获取途径一般都是SqlSessionFactory .openSession

从上面可以看出,其实Executor创建的过程就是执行了inteceptor中的链

OK,关于page对象(page对象属于作用域通信对象类对象)和的内容到此结束了,希望对大家有所帮助。

用户评论

旧事酒浓

这个Page Object模式真是太棒了!自从开始用它之后,代码组织得井井有条,而且页面交互更清晰简洁了。以前写测试用例总是像迷宫一样,现在简单明了很多!

    有5位网友表示赞同!

暖瞳

感觉网页自动化测试确实需要用到Page Object模式来规避部分不必要的代码重复。作用域通信对象类的概念理解起来有些费劲,还需要再深入研究一下。

    有8位网友表示赞同!

念旧是个瘾。

终于明白为什么那么多人推荐使用Page Object模式了!它能够有效地封装页面元素和交互逻辑,提高测试用例的可维护性和复用性。强烈推荐给想要写自动化测试的朋友们!

    有19位网友表示赞同!

残花为谁悲丶

个人认为作用域通信对象类这个概念有点过于抽象了,能不能说得再具体一点?我目前了解到它主要是为了控制变量的作用范围而设计的,但具体如何运用在代码中呢?

    有10位网友表示赞同!

轨迹!

这篇文章写得还不错,把Page Object模式的优点和缺点都介绍得很全面。我觉得它的局限性就是需要对页面结构有更深入的理解才能有效使用。

    有8位网友表示赞同!

tina

对于新人来说学习Page Object模式可能有点困难,因为涉及到面向对象编程和网页自动化测试的概念都需要先掌握。不过通过阅读这篇文章,初步了解了它的基本原理,下一步就需要多实践练习了!

    有8位网友表示赞同!

迷路的男人

说实话,我觉得这篇文章对Action和Helper两个类型的解释不够详细,而且图示有点少,看起没有那么清晰直观。如果能增加一些具体代码示例的话,对于理解该模式的读者将会更有帮助。

    有11位网友表示赞同!

墨城烟柳

我一直以为Page Object模式的作用只是简化测试用例,没想到它还能提升代码的可读性和可维护性!这篇文章让我对这个模式有了新的认识。

    有7位网友表示赞同!

一生荒唐

我试着用 Page Object 模式写过一个自动化测试项目,感觉确实能够提高效率。但如果页面结构频繁变化的话,需要重新定义 Element 对象,工作量可能会变得比较大。

    有6位网友表示赞同!

酒笙倾凉

我觉得文章中提到的"作用域通信对象类”这个说法太学术了一点,能不能换一个更通俗易懂的叫法?比如我们可以用“状态管理器”来替代它,这样更容易让人理解。

    有16位网友表示赞同!

折木

学习了Page Object模式之后,发现它不仅适用于自动化测试,也可以应用于前端开发中,比如可以将单个组件封装成 Page Object。非常实用!

    有14位网友表示赞同!

你瞒我瞒

我还在探索如何更好地使用Page Object模式,例如如何应对复杂页面结构和动态加载内容的问题。这篇文章给了我很大的启发,让我更加清晰地了解了该模式的优势和局限性。

    有15位网友表示赞同!

七夏i

对于一些小型项目来说,也许不需要过于复杂的Page Object模式,直接编写简洁的测试用例也足够了。如果规模太小,反而会增加代码复杂度和维护成本。

    有14位网友表示赞同!

玩味

我对作用域通信对象类的概念比较感兴趣。它是否可以用于解决不同模块之间数据共享的问题?希望能看到更多关于它的实际应用案例!

    有10位网友表示赞同!

恰十年

感觉Page Object模式确实能够提高测试效率,但我个人更倾向于使用更加简明的解决方案,比如直接操作DOM元素和事件监听。这种方式代码量可能会更小一些。

    有14位网友表示赞同!

回到你身边

这篇文章虽然讲解得不错,但还是缺乏针对性地介绍了不同类型页面结构如何应用Page Object模式。希望作者能够补充相应的案例分析,提高文章的实用价值!

    有5位网友表示赞同!

孤岛晴空

对Page Object模式的研究我一直在探索,之前主要关注它在自动化测试中的应用,现在开始了解它还可以应用于其他领域,这让我感到非常兴奋!

    有17位网友表示赞同!

金橙橙。-

感谢作者分享这篇文章!我已经开始了学习 Page Object 模式,希望能够熟练掌握这个模式,提高我的开发效率。

    有14位网友表示赞同!

标签: 公墓资讯
相关资讯
  • 备孕怎么备孕能生男孩?

    备孕怎么备孕能生男孩?这是许多准爸妈们都十分关心的话题。毕竟,作为一名男孩妈妈或者男孩爸爸,总是会有一些特别的期待和想法。但是,生男孩并不仅仅只是靠运气,还有许多科学的方

    2025-08-17 12:53:21 公墓资讯 
  • 备孕怀男宝宝的5个小技巧,让你成功率提升!

    备孕怀男宝宝,这是很多准爸妈都希望能实现的愿望。但是,你知道吗?男宝宝和女宝宝的受孕概率其实是有差别的哦!所以想要成功率提升,就得掌握一些小技巧。今天,我就给大家分享5个备

    2025-08-17 12:42:20 公墓资讯 
  • 备孕怀男孩的5个技巧,让你轻松实现心中的小幸福!

    男孩还是女孩?这是备孕期间最让人着迷的话题。每个准爸妈都希望能拥有自己心中理想的宝宝性别,而备孕阶段就是决定宝宝性别的关键时期。想要实现心中的小幸福,就要做好备孕工作

    2025-08-17 12:37:20 公墓资讯 
  • 备孕必读:哪些注意事项能帮你顺利怀上宝宝?

    备孕这件事对于每一对准备要宝宝的夫妻来说都是一件非常重要的事情。但是在备孕之前,我们需要了解一些必要的注意事项,以帮助我们顺利怀上宝宝。今天,我将为大家介绍备孕期的重

    2025-08-17 12:33:21 公墓资讯 
  • 备孕必知!这些碱性食物有助于提高生育能力

    备孕是每对夫妻都期待的一件大事,但是有些人可能会面临生育能力不足的问题。那么,如何提高生育能力成为备孕必知的重要内容。今天,我们将为您介绍一些备孕必知的碱性食物,在饮食

    2025-08-17 12:25:21 公墓资讯 
  • pspice-pspice怎么读

    设计和实现连续时间有源滤波器非常具有挑战性,需要使用多个高性能运放和精度很高的无源器件。设计挑战包括如何选择最优的滤波器架构,还需要使用专用的滤波器计算软件²。

    2025-08-17 12:18:29 公墓资讯