`
langgufu
  • 浏览: 2301928 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

填报监听类前后使用的实际用例(转载自润乾官网)

阅读更多

填报监听类前后使用的实际用例

第25章 填报监听类前后使用的实际用例 


1. 问题概述 

A:客户要在填报监听类中校验用户是否登陆。填报监听类中校验出错了就会抛出一个异常,返回后页面填入的数据就会丢失。客户希望像普通的单元格校验一样弹出一个警告窗口而不是跳到错误页面,页面的数据不会丢失。如果校验通过则提示数据保存成功。 
B:在填报提交后处理方法里,业务处理是需要判断哪些记录的数据有修改,哪些没有修改,有修改的才需要写入日志文件。


2. 案例 
南京世纪恒捷科技信息有限公司


3. 实现原理 
A:在填报监听类中写一个servlet类用来向页面输出JS代码弹出提示窗口。在校验未通过的情况下,执行这个doGet方法,并且抛出异常中止程序继续运行。在jsp页面中,写一个<iframe>放在隐藏的div中引入报表的标签中加入属性submitTarget=”test” (test是iframe 的id号)让页面保持填写后的状态,弹出个新的窗口(成功的页面或者是错误页面)在iframe中(隐藏了)。 
B:需要调用API接口获得单元格的原值和新录入的值,并进行比较.然后生成日志文件 

4. 流程步骤 
1.发布应用,访问报表路径(不带用户名): 
http://localhost:9090/Report4Test/jsp/ceshi/3.3.jsp 
2.修改数据,点击保存,会提示:警告:校验未通过,此次提交将不能执行! 


3.后台校验出错信息打印


 

4. 访问报表路径(带用户名): 
http://localhost:9090/Report4Test/jsp/ceshi/3.3.jsp?userName=zHouHuiHui


5.数据保存之后,只对修改过的值,C盘生成日志文件: 
 

5. 程序代码 

1.填报监听类InputListener.java代码: 

package api;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

import java.sql.Connection;

import java.text.SimpleDateFormat;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import com.runqian.base4.util.DBTypes;

import com.runqian.report4.usermodel.DataSourceConfig;

import com.runqian.report4.usermodel.INormalCell;

import com.runqian.report4.usermodel.input.AbstractInputListener;

import com.runqian.report4.usermodel.input.InputSQL;

public class InputListener extends AbstractInputListener {

 

SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

static PrintWriter out = null;

 

/**

* 数据保存前调用的方法

* @throws Exception

*/

public void beforeSave() throws Exception {

HttpSession session = request.getSession();

String username = (String) session.getAttribute(“userName”);

if (username == null) {

Cservlet ds = new Cservlet();

ds.doGet(request, response); // 执行这个方法弹出提示框(方法在下面定义)

throw new Exception(校验未通过!); // 终止程序继续执行。

}

}

public class Cservlet extends HttpServlet {

private static final long serialVersionUID = 1L;

 

public void doGet(HttpServletRequest req, HttpServletResponse res)

throws IOException, ServletException {

// request.getRequestDispatcher(“jsp/aa.jsp”).forward(request,response);

//跳转到其他页面,可能被当作弹出窗口拦截

res.setContentType(“text/html”);

PrintWriter out = res.getWriter();

out.println(“<body onload=javascript:alert(‘警告:校验未通过,此次提交将不能执行!‘)>”);

out.close();

}

}

/**

* 数据保存后调用方法

*/

public void afterSave() throws Exception {

// 获取用户录入的单元格值(包括非录入的隐藏格)

int colNum = report.getColCount();

int rowNum = report.getRowCount();

for (int i = 1; i < rowNum; i++) {

for (short j = 1; j < colNum; j++) {

INormalCell iCell = report.getCell(i, j);// 取得各单元格

// 只有存在填报属性对象的单元格,才有可能可写,可写,才可能填报前后的值不一样

if (iCell.getInputProperty() != null) {

Object value = iCell.getValue();

Object value2 = iCell.getInputValue();

if(!value.equals(value2)){

// InputSQL sql2 = (InputSQL)sqls.get(j);

//保存数据时生成的InputSQL对象列表,得到表名

String tableName = ((InputSQL) sqls.get(j)).getTableName();

log(日期:[" + format.format(new java.util.Date()) + "]表名:["

+ tableName + "]–[" + i + "]行第[" + j

+ "]原值是:[" + value + "]填报后的值是:[" + value2 + "]“);

}

}

}

}

// 以下代码获取系统正在使用的Connection对象,如果您使用了这个对象,请不要调用它的close方法,

// 系统会自己调用commitclose方法

this.getConnection(context.getDefDataSourceName());

}

 

/**

* 取指定的数据源

* @param 数据源名

* @return 数据源

* @throws Exception

*/

private Connection getConnection2(String dataSource) throws Exception {

if (dataSource == null || “”.equals(dataSource))

// 得到默认的系统连接

return context.getConnectionFactory(context.getDefDataSourceName())

.getConnection();

 

return context.getConnectionFactory(dataSource).getConnection();

}

 

private void setDefaultConnection2(String dataSource, Connection con) {

// 设置数据源,动态改变连接参数

context.setDefDataSourceName(dataSource);

// 设置数据连接,也可以设置连接池工厂,cxt.setConnectionFactory(sourceName,connectionFactory)

// 其中connectionFactory这个类必须implements IConnectionFactory,并且实现他的public

// java.sql.Connection getConnection() throws Exception 方法

context.setConnection(dataSource, con);

DataSourceConfig dsoc = new DataSourceConfig(DBTypes.UNKNOWN, true,

“GBK”, “GBK”, false);

context.setDataSourceConfig(dataSource, dsoc);

 

 

}

//日志保存路径

private void log(String info) throws Exception {

if (out == null) {

File logf = new File(“c:/runqianReport.log”);

if (logf.exists()) {

File lastlogf = new File(“c:/runqianReport”

+ format.format(new java.util.Date()) + “.log”);

logf.renameTo(lastlogf);

}

out = new PrintWriter(new FileOutputStream(logf));

}

out.println(info);

out.flush();

out.close();

}

 

}

2.jsp的关键性代码:

<%

String userName = request.getParameter(“userName”);//获取用户传过来的用户名

session.setAttribute(“userName”,userName);

%>

<body>

 

<report:html name=“report1″ reportFileName=“/ceshi/3.3.raq”

funcBarLocation=“top” needPageMark=“yes”

inputListener=“api.InputListener” insertRowLabel=<%=insertImage%>

appendRowLabel=<%=appendImage%>

deleteRowLabel=<%=deleteImage%>needSaveAsWord=“yes”

needSaveAsPdf=“yes” needImportExcel=“yes” wordLabel=<%=wordImage%>

pdfLabel=<%=pdfImage%>submit=<%=submitImage%>

importExcelLabel=<%=importExcelImage%>

submitTarget=“test”/>

 

<div style=“display: none”>

<iframe name=“test” id=“test”>

</iframe>

</div>

 

</body>

<br>

<font color=“red” size=“2″>保存之后日志文件生成在C:/runqianReport.log</font>

</html>

分享到:
评论

相关推荐

    基础代码测试用例用于自动测试相关代码

    2. 集合框架的使用:测试用例中使用了Java集合框架中的多种集合类,例如ArrayList、HashMap等。这些集合类用于存储和处理数据。 3. 输入输出操作:测试用例中使用了Scanner类来读取输入数据,并使用System.out....

    等价类划分,设计测试用例

    等价类划分是一种重要的软件测试方法,用于减少测试用例的数量,同时确保对软件功能的充分覆盖。...在实际软件开发过程中,等价类划分和设计测试用例是质量保证的重要步骤,对于保证软件的稳定性和可靠性至关重要。

    测试专业工具 用例生成 自动生成用例 内涵教程

    标题中的“测试专业工具 用例生成 自动生成用例 内涵教程”暗示了这是一个与软件测试相关的资源包,特别强调了自动化用例生成。在IT行业中,自动化测试用例生成是一种提高测试效率的方法,它能减少手动创建和执行...

    棋牌游戏测试用例

    棋牌游戏类测试用例。可根据测试用例模板,进行多种测试类型的用例编写

    p2p类网站测试用例

    互联网金融类web测试用例设计,p2p网站测试用例设计

    测试用例方法-等价类划分法

    等价类划分法是软件测试领域中一种广泛应用的测试用例设计方法,旨在高效地覆盖软件功能,确保软件质量。该方法的核心思想是将所有可能的输入数据或系统状态划分为若干个等价类,然后从每个等价类中选取一个代表性...

    软件测试用例自动生成技术研究

    软件测试用例自动生成技术研究 软件测试用例自动生成技术研究

    使用用例场景设计测试用例 场景法

    本文主要介绍了如何使用场景法来设计测试用例,以提高测试效率和发现潜在错误的能力。 首先,测试用例是对软件进行有效验证的精心选择的数据集合,目的是揭示程序中的错误。由于资源和时间的限制,我们无法进行全面...

    自动测试用例模板(测试用例模板)

    自动测试用例模板,自动测试用例模板,自动测试用例模板,

    需求规格说明、测试用例自动生成

    本话题将深入探讨如何利用自动化工具,如通过Excel用例列表来生成这两类文档。 首先,需求规格说明通常包含以下几个部分:项目背景、目标、范围、功能需求、非功能需求、接口定义、用户界面规范、数据需求等。编写...

    产品实际压测用例.xlsx

    压测用例,包含时延、吞吐率、tps、qps、cps、吞吐量,之前上班压测时的用例,感兴趣的朋友可以看看,不懂得可以私信我

    Java设计模式分类及测试用例代码

    Java设计模式分类及测试用例代码

    实际工作中的测试用例

    实际工作中,我们还需要考虑如何优化测试用例,例如通过探索性测试发现隐藏的问题,使用敏捷方法动态调整测试策略,以及利用持续集成工具自动化测试流程。同时,团队间的沟通和合作也至关重要,共同讨论和分享测试...

    自动生成测试用例

    "自动生成测试用例"是一种先进的技术,它利用特定的工具或算法来创建测试数据和执行步骤,以确保软件功能的正确性。本程序的核心就是实现这一目标,它能够生成默认格式的XML文档,这种文档通常用于定义测试场景、...

    转载 用例场景法设计

    用例场景法设计是一种基于用户实际操作流程的测试方法,它通过模拟用户可能遇到的各种场景来创建测试用例。这种方法的核心思想是将复杂的业务逻辑转化为可执行的步骤,以覆盖尽可能多的功能点和边界条件。 1. **...

    性能监听器的作用以及详细用例展示

    性能监听器的作用以及详细用例展示

Global site tag (gtag.js) - Google Analytics