`
congpeixue
  • 浏览: 275469 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

Click framework 的 Page类(五)

阅读更多
Direct Rendering

Pages支持直接呈现页面的方式。具体如下: 你可以直接呈现servlet响应、绕过page模板。 这对于你发送无HTML的上下文到响应到很有用, 例如: PDF、Excel文档。 步骤如下:

  • 获得servlet响应对象
  • 设置响应的类型
  • 获得响应输出流
  • 写入输出流
  • 关闭输出流
  • 将页面path设置为null, 以此来告知ClickServlet页面已经绘制完成


如下提供了一个直接绘制页面的例子:

  
 /**
     * Render the Java source file as "text/plain".
     *
     * @see Page#onGet()
     */
    public void onGet() {
        String filename = ..

        HttpServletResponse response = getContext().getResponse();

        response.setContentType("text/plain");
        response.setHeader("Pragma", "no-cache");

        ServletContext context = getContext().getServletContext();

        InputStream inputStream = null;
        try {
            inputStream = context.getResourceAsStream(filename);

            PrintWriter writer = response.getWriter();

            BufferedReader reader =
                new BufferedReader(new InputStreamReader(inputStream));

            String line = reader.readLine();

            while (line != null) {
                writer.println(line);
                line = reader.readLine();
            }
            
            setPath(null);

        } catch (IOException ioe) {
            ioe.printStackTrace();

        } finally {
            ClickUtils.close(inputStream);
        }
    } 


Stateful Pages


Click支持能保存用户请求之间状态的有状态page。Stateful pages 在如下场合下是很重要的:

  1 查找页面和修改页面交互时。
  有时你需要从一个有状态的查找页面跳转到编辑页面, 在这个过程中, 查找页面将过滤器应用到
  编辑页面上。 一旦编辑页面上的更新操作完成, 用户被重定向到查找页面,过滤器仍是可用的。
 
  2 含有多表单或多表格的复杂页面在交互是需要保存他们的状态时。
 
为了使一个页面变成有状态的, 你需要将 stateful属性设置成true, 并且是Page实现Serializable 接口。
例如:

package com.mycorp.page;

import java.io.Serializable;

import net.sf.click.Page;
 
public class SearchPage extends Page implements Serializable {

    public SearchPage() {
        setStateful(true);
        ..
    }
} 



状态页面的实例使用页面的class类名做为键值存放在 HttpSession中。 在上面的例子,page使用类名
com.mycorp.page.SearchPage 被保存在用户session中。

Page创建
stateful pages 仅被创建一次, 之后便从session中获取它们。 尽管每次请求都会执行page时间处理器,
包括onInit()方法,
  
当你创建stateful pages 时, 通常你需要将你的控件生成代码放在Page的构造方法里,因此控件
生成代码只执行一次。不将控件的生成代码放在Page的init()方法里是很重要的, 如果放在onInit() 方法里,
在每次request请求时,控件的生成代码都将会被执行。

如果你需要动态的控件生成代码, 通常你需要把这些代码放在onInit() 方法里, 但是, 你需要确保page里
还不存在这些控件和模型。


Page处理
默认的Click page处理是线程安全的, 因为在每次请求和每个线程中都会创建一个新的page实例。
对于stateful pages, 用户可以将一个page重用于多个请求和线程中, 为了确保page的处理是线程安全的,
用户page实例被设置为同步的(synchronized ), 这样在同一时刻, 一个page实例仅且只能被一个请求线程
执行。

Page 销毁
当正常的page被执行完毕之后, 它们应该被销毁并被JVM垃圾收集。 但是,  stateful pages 存在于用户的
HttpSession 中,所以你不能将太多的对象放在stateful pages里, 这样可能导致内存溢出。

当page完成了它们的执行方法后, Page的所有控件都将调用onDestroy()方法, 之后, Page的onDestroy()
方法被调用。 这里也是你销毁大的集合和图的地方。 例如: Table控件在它的onDestroy()方法里销毁rowList 。

Error Handling

当执行一个page对象的处理时或绘制一个模板时, 如果抛出异常, 该异常会被委托给注册的处理器。 默认的
Click错误处理器是 ErrorPage, 它被自动配置如下:
 <page path="click/error.htm" classname="net.sf.click.util.ErrorPage"/> 



为了注册另外一个错误处理器, 你必须继承ErrorPage , 并使用路径click/error.htm来定义路径, 例如:

 <page path="click/error.htm" classname="com.mycorp.page.ErrorPage"/> 


当ClickSevlet 启动后, ClickServlet会检查在web子目录click下是否存在error.htm 模板。 如果
找不到该页面, ClickServlet会自动部署一个。 为适合你的需求你也可以自定义你的click/error.htm , 
ClickServlet 不会覆盖它。
当程序被设置为development 或 debug 模式, 默认的错误模板会显示大量的debug信息。 包括:

引用
NullPointerException - in a page method
ParseErrorException - in a page template


当程序被设置为production 模式, 将只显示简单的错误信息。 


Page Not Found


如果ClickServlet 不能在click.xml配置文件里找到一个对应请求的page,那么将会使用not-found.htm
page。 

Click not found page被自动配置如下:
 
<page path="click/not-found.htm" classname="net.sf.click.Page"/> 



你可以覆写默认的配置文件, 并指定你自己的类, 但不能改变路径。
当ClickSevlet 启动后, 会首先检查在web目录click下是否存在not-found.htm。 如果不能找到, 会自动
部署一个。

你也可以定义click/not-found.htm 。 

消息属性

Page 类提供了一个消息属性, 本质上, 该属性是一个对应于page的本地化信息的MessagesMap。使用messages
作为键来呈现页面时, 在VelocityContext 范围内, 这些信息是可用的。  如果你有一个page的title信息, 
在你的page模板中, 你可以这样访问:
   
<h1> $messages.title </h1> 

   
该信息map被从page类对应的属性文件中加载。 例如:如果你有一个page类, com.mycorp.page.CustomerList,
那么你就可以在如下文件中设置你的本地化信息。
/com/mycorp/page/CustomerList.properties

我们也可以定义一个全局的信息文件:
/click-page.properties

该信息文件可以适用于你的程序的所有页面。 注意:对应class类的信息文件可以覆盖全局的信息文件。


Page信息也被用于覆盖控件信息,可用从 控件 Message Properties主题中 获得更详尽的信息。
分享到:
评论

相关推荐

    click-book apache click framework介绍

    ### Apache Click Framework 介绍 #### 一、简介 Apache Click 是一个用于开发 Web 应用程序的 Java 框架,旨在提供一个简洁且高效的 API 来构建动态 Web 页面。Click 的设计目标是减少开发时间并提高代码的可读性...

    RobotFramework中实现PageObject模式的轻量级关键字库_Python_RobotFramework.zip

    在Robot Framework中,我们可以创建一个PageObject类,包含页面上的各个元素和相关的关键词。例如,我们可以定义一个`LoginPage`类,包含用户名输入框、密码输入框和登录按钮等元素,并提供`EnterUsername`、`Enter...

    robot framework +selenium

    #### 五、常见问题与解决方法 - **问题 1:浏览器驱动未找到**: - 确保已经正确安装了对应的浏览器驱动,并将其添加到系统的 PATH 环境变量中。 - **问题 2:页面元素定位失败**: - 尝试更换不同的定位方式(如 ...

    RobotFramework-Selenium2Library

    5. **Wait Until Page Contains**:等待页面包含特定文本,例如`Wait Until Page Contains 搜索结果`。 **四、Selenium2Library的优势** 1. **易读性**:Robot Framework的基于关键字的语法使脚本易于阅读和理解,...

    robotframework自动化测试demo实例

    5. **变量**:在示例中,${page title} 和 ${variable_name} 代表变量,Robot Framework支持多种类型的变量,包括全局变量、测试套件变量、测试用例变量等。 6. **数据驱动测试**:Robot Framework支持数据驱动测试...

    robotframework安装包

    Page Should Contain 欢迎,tester ``` 8. **学习资源**: 要深入了解Robot Framework,可以参考其官方文档,以及各种在线教程和社区讨论。同时,熟悉Python基础和测试驱动开发概念会帮助你更好地运用这个框架。...

    robot framework 32bit【32位】

    Page Should Contain Welcome, tester! ``` 这个例子展示了如何打开浏览器,输入用户名和密码,然后点击登录按钮,并验证是否看到欢迎消息。 在安装和使用32位Robot Framework时,确保你的操作系统和Python环境也...

    RobotFramework Tool

    Should Contain ${PAGE TITLE} Robot Framework - Google Search ``` 这段脚本中,`Open Browser`、`Input Text`、`Click Button`和`Should Contain`都是关键词,它们对应了打开浏览器、输入文本、点击按钮和验证...

    Python库 | robotframework_browser-2.4.1-py3-none-any.whl

    Wait Until Page Contains Example Domain Click Element xpath://a[@href='/'] Sleep 2s # 给页面加载时间 Close Browser ``` 6. **最佳实践** - 使用变量存储重复使用的URL和元素选择器,提高代码可读性...

    robotframework-selenium2library-1.8.0

    Robot Framework Selenium2Library 1.8.0 是一个专门用于自动化Web应用程序测试的库,它建立在Robot Framework之上,利用Selenium 2 (现称为Selenium WebDriver) 的功能。Robot Framework是一个通用的自动化框架,而...

    WPF多页面Page导航实例

    首先,让我们深入了解WPF的Page类。Page是WPF中的一个用户界面元素,可以视为应用程序中的一个独立视图或“页面”。每个Page可以包含各种控件、布局容器和其他UI元素,用于展示不同的内容或功能。在WPF中,Page通常...

    Robot Framework-Selenium2Library 常用关键字

    在 Robot Framework 的 Selenium2Library 中,管理和控制浏览器及窗口是自动化测试中的基础操作。 3.3.2 Cookie管理 Cookie 是一种用于存储用户状态的小型文本数据,常用于网站的身份验证和个性化设置。在 Selenium...

    Apache Click User Guide

    - **页面类**:讨论了 Apache Click 中页面类的设计原则及其实现细节。 - **页面执行**:解释了页面的执行过程,包括页面加载、处理用户输入及渲染结果等步骤。 - **请求参数自动绑定**:描述了如何自动将请求参数...

    robotframework-zoomba:扩展的Robot Framework库使测试GUI,RESTSOAP API,Mobile和Windows Desktop更加容易

    RobotFramework-Zoomba 介绍 Robotframework-Zoomba是使用跨越GUI,REST API,SOAP API,移动和Windows桌面(WinAppDriver)自动化的库的集合。 这些库是现有库 , , 和。...Click Element locator

    RobotFramework-Selenium2Library中文版_V1.1.pdf

    - **ClickButton/ClickElement/ClickElementAtCoordinates/ClickImage/ClickLink** (P16-17): 执行各种点击操作。 - **CloseAllBrowsers/CloseBrowsers/CloseWindow** (P17-18): 关闭浏览器窗口的操作。 - **...

    RobotFramework常见语法.pdf

    4. **截屏 (Capture Page Screenshot)**:这个关键字用于捕获当前页面的屏幕快照,可用于测试失败时的调试。 5. **执⾏JS (Execute JavaScript)**:允许执行JavaScript代码,通常用于与页面上的JavaScript元素进行...

    基于Robot-Framework+Selenium2用户操作手册

    Wait Until Page Contains Welcome back, admin Close All Browsers ``` 通过以上介绍,您可以根据自己的需求选择合适的元素定位策略和Selenium2Library关键词来构建自动化测试脚本。此外,还提供了数据库操作的...

    auto_framework_demo_screenshot.zip

    这个压缩包可能是某个教程或项目的截图,用于展示如何构建和使用Page Object Model (POM) 模式来设计自动化测试框架。下面我们将深入探讨Python和Selenium框架设计以及POM模式。 Python是一种广泛使用的编程语言,...

    Robot+Framework+WD+培训-吴穹++ChinaTest2012.pdf

    2. **元素操作**:使用关键词如`Open Browser`启动浏览器,`Go To`导航到URL,`Click Element`点击页面元素,`Input Text`输入文本等。 3. **等待和断言**:`Wait Until Page Contains`确保页面元素出现,`Should Be...

    使用RobotFramework测试AJAX

    在自动化测试领域,使用Robot Framework进行AJAX应用的测试需要特别的策略,因为Robot Framework的Selenium库默认假设点击事件会导致页面重载。本文将详细介绍如何利用Robot Framework有效地测试使用AJAX技术的Web...

Global site tag (gtag.js) - Google Analytics