当前位置:文档之家› 通过代码实例跟我学Struts2框架从入门到精通——对Action类进行单元测试和访问Servlet API

通过代码实例跟我学Struts2框架从入门到精通——对Action类进行单元测试和访问Servlet API

通过代码实例跟我学Struts2框架从入门到精通——对Action类进行单元测试和访问Servlet API
通过代码实例跟我学Struts2框架从入门到精通——对Action类进行单元测试和访问Servlet API

1.1通过代码实例跟我学Struts2框架从入门到精通——对Action类进行单元测试和访问Servlet API

1.1.1回顾有关单元测试的一些概念

1、什么是单元测试

“容器外”(在服务器程序——在Tomcat之外)对某个Java类中的某个功能方法(也就是单元测试中的工作单元)所实现的测试。实施单元测试的目的是“验证”该功能方法是否正常(是否满足要求)。

2、什么是单元测试中的“单元”

能够“独立”完成某个功能的方法。经常与单元测试联系起来的另外一些开发活动包括代码走读(Code review),静态分析(Static analysis)和动态分析(Dynamic analysis)。

静态分析就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行。动态分析就是通过观察软件运行时的动作,来提供执行跟踪,时间分析,以及测试覆盖度方面的信息。

3、为什么要进行单元测试

我们编写代码时,一定会反复检查和调试保证它能够编译通过。如果没有通过编译,该代码是无法执行。但尽管代码通过了编译,也只能说明它没有语法错误;但无法保证它的语义或者逻辑、功能也一定正确。如何验证或者发现代码中这些方面的错误?单元测试可以轻易地发现代码中这些方面的错误。

4、由谁具体实施单元测试的工作

由于单元测试本身是编码工作的一部分,当然应该由该程序的开发人员(程序员)完成;也就是说,经过了单元测试的代码才是已完成的代码,提交产品代码时也要同时提交测试代码和单元测试的结果。

5、如何进行单元测试

(1)采用什么框架——JUnit(https://www.doczj.com/doc/6416266440.html,)

MyEclipse中有它的系统库

(2)如何编程测试程序(类)——测试用例(Test Case),包含有一系列的测试方法测试用例(Test Case)是为某个特殊目标而编制的一组测试程序——该程序包括测试中所需要的输入参数、执行条件以及预期结果,并通过该测试用例验证某个程序或核实是否满足某个特定需求。

(3)如何编程测试用例——采用MyEclipse中的可视化向导

6、区分单元测试和集成测试

(1)单元测试

它是在开发过程中的对类中的方法测试——小规模的测试,功能测试,并且由开发人员完成;

(2)集成测试

它是在系统在装配过程中的测试,接口和配合测试,并且由测试小组中的测试人员7、集成测试

(1)集成测试

也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图〕组装成为子系统或系统,进行集成测试。

(2)为什么还要进行集成测试

由于单元测试具有不彻底性,实践表明,一些模块虽然能够单独地工作(通过单元测试),但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来。

另外的原因是,模块相互调用时接口会引入许多新问题。例如,数据经过接口可能丢失;一个模块对另一模块可能造成不应有的影响;几个子功能组合起来不能实现主功能;误差不断积累达到不可接受的程度;全局数据结构出现错误,等等。

(3)集成测试中的主要考虑的问题

1)在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失;

2)各个子功能组合起来,能否达到预期要求的父功能;

3)一个模块的功能是否会对另一个模块的功能产生不利的影响;

4)全局数据结构是否有问题;

5)单个模块的误差积累起来,是否会放大,从而达到不可接受的程度。

1.1.2对Action类进行单元测试

单元测试困难是Struts一大缺点。现在让我们在体验一下,在Struts 2.0中是如何进行测试的。

1、添加一个测试项目——遵守测试项目和被测试项目(应用系统项目)相互分离

由于测试用例的代码是在开发过程中产生的,不属于最终的产品的一部分。

(1)新增加一个Java项目

(2)测试项目的名称为TestSSHWebCRM

2、在测试项目中引用被测试项目和添加JUnit系统包(本项目采用JUnit4)

(1)在测试项目中引用被测试项目——能够在测试项目中访问被测试项目中的代码

(2)在测试项目中添加JUnit系统包(本项目采用JUnit4,https://www.doczj.com/doc/6416266440.html,)

(3)下载Junit4.8.1版本的系统库文件

(4)在测试项目中添加Junit的系统库文件

(5)也可以直接采用Eclipse中的JUnit4.X的系统库

(6)将出现下面的结果

3、在测试项目中添加与Struts2有关的系统包文件

4、在测试项目中添加JUnit的TestCase(测试用例——也就是测试的功能类)(1)新增加测试用例类

(2)下载Junit Test Case菜单项目

(3)输入包名称为com.px1987.sshwebcrm.testaction,类名称为Test UserInfoManageActionModel,被测试的类选择为https://www.doczj.com/doc/6416266440.html,erInfoManageActionModel

(4)选择所需要测试的方法

(5)将自动地创建出下面的模板形式的测试用例类

5、编程该测试用例

(1)理解测试用例类中的各个标准方法的执行过程

(2)编程测试用例——针对UserInfoManageActionModel类的测试用例package com.px1987.sshwebcrm.testaction;

import static org.junit.Assert.*;

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.Test;

import com.opensymphony.xwork2.Action;

import https://www.doczj.com/doc/6416266440.html,erInfoManageActionModel; import https://www.doczj.com/doc/6416266440.html,erInfoActionForm;

public class TestUserInfoManageActionModel {

private static UserInfoManageActionModel userInfoManageAction =null;

@BeforeClass

public static void setUpBeforeClass() throws Exception {

userInfoManageAction=new UserInfoManageActionModel();

}

@AfterClass

public static void tearDownAfterClass() throws Exception {

userInfoManageAction=null;

}

@Before

public void setUp() throws Exception {

}

@After

public void tearDown() throws Exception {

}

@Test

public void testDoUserLogin() {

UserInfoActionForm oneUserInfo=new UserInfoActionForm(); //(1)构建测试参数

oneUserInfo.setVerifyCodeDigit("UFO123");

oneUserInfo.setUserName("yang1234");

oneUserInfo.setUserPassWord("12345678");

oneUserInfo.setType_User_Admin(1);

userInfoManageAction.setOneUserInfo(oneUserInfo); //模拟Struts2的拦截器参数注入

String resultMessage = userInfoManageAction.doUserLogin(); //(2)对被测试方法进行调用

// Assert.assertTrue(resultMessage.equals(ActionSupport.SUCCESS));

assertTrue(resultMessage.equals(Action.SUCCESS));//(3)断言(判断返回的值是否为期望的值)

}

(3)编程测试用例——针对UserInfoAction 类的测试用例——作为课后作业package com.px1987.sshwebcrm.testaction;

import junit.framework.Assert;

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.Test;

import com.opensymphony.xwork2.ActionSupport;

import com.px1987.sshwebcrm.action. UserInfoAction;

public class TestUserInfoAction {

static UserInfoAction oneUserInfoAction =null;

@BeforeClass

public static void setUpBeforeClass() throws Exception {

oneUserInfoAction=new UserInfoAction();

}

@AfterClass

public static void tearDownAfterClass() throws Exception {

oneUserInfoAction=null;

}

@Before

public void setUp() throws Exception {

@After

public void tearDown() throws Exception {

}

@Test

public void testDoUserLogin() {

//(1)给出测试过程中所需要的参数

oneUserInfoAction.setUserName("yang");

oneUserInfoAction.setUserPassWord("1234");

oneUserInfoAction.setVerifyCodeDigit("123456");

oneUserInfoAction.setType_User_Admin(1);

//(2)对被测试方法进行调用

String returnResult=oneUserInfoAction.doUserLogin();

//(3)检查返回值是否为所期望的值(利用断言语句)

Assert.assertTrue(returnResult.equals(ActionSupport.SUCCESS)); //断言}

@Test

public void testDoUserRegister() {

oneUserInfoAction.setUserName("yang");

oneUserInfoAction.setUserPassWord("1234");

oneUserInfoAction.setVerifyCodeDigit("123456");

oneUserInfoAction.setType_User_Admin(1);

String returnResult=oneUserInfoAction.doUserRegister();

Assert.assertTrue(returnResult.equals(ActionSupport.SUCCESS)); //断言}

@Test

public void testDoUpdateUser() {

}

@Test

public void testDoDeleteUser() {

}

注意:

如果在Action类中涉及request/response/session则不能采用该方式。

6、执行该测试用例

(1)TestUserInfoManageActionModel类的执行结果

将出现下面成功的提示

(2)TestUserInfoAction类的执行结果

struts2 strus.xml中result类型及含义

struts2strus.xml中result类型及含义 一个提交到服务器的处理通常可以分为两个阶段,第一个阶段查询服务器状态(查询或者更新数据库),第二个阶段选择一个合适的结果页面其返回给用户(这里要讲的Result的内容)。 Struts2提供了对不同种类返回结果的支持,常见的有JSP,FreeMarker,Velocity等。 Struts2支持的不同类型的返回结果为: 名字说明 Chain Result用来处理Action链 Dispatcher Result用来转向页面,通常处理JSP FreeMarker Result处理FreeMarker模板 HttpHeader Result用来控制特殊的Http行为 Redirect Result重定向到一个URL Redirect Action Result重定向到一个Action Stream Result向浏览器发送InputSream对象,通常用来处 理文件下载 Velocity Result处理Velocity模板 XLS Result处理XML/XLST模板 PlainText Result显示原始文件内容,例如文件源代码 结合Tile使用 S2PLUGINS:Tiles Result 另外第三方的Result类型还包括JasperReports Plugin,专门用来处理JasperReport类型的报表输出。 在struts-default.xml文件中已经有了对于所有类型Result的定义:

Java多方式实现文件上传

在Struts 2中实现文件上传 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题,所以今天我们就来讨论一下这个问题。 实现原理 Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。 具体实现 前段时间Apache发布了Struts 2.0.6 GA,所以本文的实现是以该版本的Struts 作为框架的。以下是例子所依赖类包的列表: 清单1 依赖类包的列表 首先,创建文件上传页面FileUpload.jsp,内容如下: <% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncodi ng = " utf-8 " %> <% @ taglib prefix = " s " uri = " /struts-tags " %> Struts 2 File Upload

struts2复习题(含答案)

Struts2复习题 1.以下属于struts2的控制器组件是: 2.以下属于struts2的体系结构的是:(多选) 控制器组件配置文件 3.以下属于struts2配置文件中的配置元素是:(多选) A. B. C. D. 4.关于struts1和struts2对比的说法正确的是: 要求Action类继承struts1框架中的Action父类,struts2中则不一定需要继承,可以是POJO 类 中的Action不是线程安全的,而struts2中的Action是线程安全的 和struts2中都使用ActionForm对象封装用户的请求数据 使用OGNL表达式语言来支持页面效果,struts2通过ValueStack技术使标签库访问值 5.以下关于ValueStack说法正确的是:(多选) A.每个Action对象实例拥有一个ValueStack对象 B.每个Action对象实例拥有多个ValueStack对象 中封装了需要传入下一个页面的值,这些值封装在ValueStack对象中 会在请求开始时被创建,请求结束时消亡 6.关于struts2配置文件说法正确的是: A.必须在WEB-INF/classes目录下 B.名字必须为 C.配置Action时,必须配置包信息 D.使用元素配置转发 7.在struts2配置中用()元素来配置常量: A. B. C. D. 8.关于struts2包的说法正确的是: 框架使用包来管理常量 框架定义包时必须指定name属性 框架中配置包时,必须继承自struts-default包,否则会报错 框架中使用包来管理Action 9.struts2中获取Servlet API的方法正确的是:(多选) A.使用ActionContext对象以解耦合的方法访问Servlet API B.使用ServletActionContext对象以解耦合的方式访问Servlet API C.使用ActionContext对象以耦合的方式访问Servlet API D.使用ServletActionContext对象以耦合的方式访问Servlet API 10.struts2动态调用的格式为: ! 11.如果要实现struts2的数据校验功能 A.普通Action类可以实现 B.继承自Action接口可以实现 C.继承自ActionSupport类可以实现 D.继承自ActionValidate类可以实现

Struts2标签使用

Struts2标签使用 (1): ---- 文本输入框 使用: (2): ----- 文本域输入框 使用: (3): ----- 密码输入框 使用: 前三个基本都是一样的。如果是要显示值的话可以这样:value = “实体Bean。Get***()”。 (4): ---- 单选按钮 使用:其中list 属性是必须要有的。 <1>:第一种方式:list = “#{‘male’:’男’,’female’:’女’}”

<2>:第二中方式:list = “#request/session.list”。 ---- 与action 结合起来了。 如果要默认选中的话后面加上value = “”.也可以通过javascript 的方式来默认选中。 (5): --- url连接 --- 超链接 这两个标签一般结合起来来使用。 使用: (6): --- 获取相应form的值 使用: <1>:

2016年最新版JavaEE学科课程大纲 黑马程序员官网

2016年最新版JavaEE学科课程大纲黑马程序员官网 2016年最新版JavaEE学科课程大纲 一、JavaWeb部分 第一阶段:JavaWEB 部分一之WEB前端技术 1、Html了解HTML语言,HTML语言背景知识,掌握HTML 的整体结构、文件标签、排版标签、块标签、字体标签、列表标签、图形标签、超链接标签、表格标签、表单标签(form 标签、input标签、select标签等)、分区标签、头标签。(1)CSSCSS介绍、CSS导入方式(内部样式表、内联样式表、外部样式表)、五大CSS选择器(ID选择器、类选择器、元素选择器、属性选择器、伪类等)、样式属性介绍。(2)JavaScript基础JavaScript编程,JavaScript语法、数据类型、运算符、表达式、流程控制,JavaScript内部对象、数组、字符串、日期时间、数学函数、正则表达式,JavaScript函数、自定义函数、全局函数,BOM介绍、window 对象、location对象、history对象使用。 DHTML编程,理解DOM树,DOM对象,常用DOM对象的属性、方法和事件,编写事件处理程序、使用DOM操作HTML文档、遍历文档树上的节点、搜索文档中特定的元素、修改文档内容、往文档添加新内容、使用DOM操作 XML文档。

(3)JQuery基础认识JQuery、选择器介绍、css选择器、jQuery选择器及其优势势、基本选择器、层次选择器、过滤选择器、表单选择器、选择器练习小案例等;JQuery操作DOM:DOM分类、查找元素/属性节点、创造元素/属性/文本节点、插入节点、删除节点、复制节点、替换节点、包裹节点、属性操作、样式操作、遍历节点、CSS-DOM操作; 动画和事件:jQuery中的事件、加载DOM、事件绑定、合成事件、事件冒泡、事件对象的属性、移除按钮上注册的事件、模拟操作、JQuery中的动画。 (4)BootStrap响应式页面的的开发与设计,强大的栅格布局,内置的CSS类库,JS插件,快速布局商城页面。第二阶段:JavaWEB部分二之服务器端技术 (1)Mysql及JDBC数据库使用,SQL语句介绍、数据库增删改操作DDL语句使用、表增删改操作DML语句使用、表查询操作DQL语句使用、以及查询语句条件、排序、聚合、分组操作。JDBC介绍、驱动的原理及使用、JDBC核心使用、DriverManager、Connection、Statement、ResultSet 详细使用,JDBC的CURD操作、防止SQL注入及PrepareStatement使用。连接池的介绍,自定义连接池。常用的开源连接池的DBCP 和C3P0的介绍和使用,JDBC 的工具类DBUtils的使用。 (2)JavaWEB 核心技术课程

第七章 struts2的上传下载

《开始Struts 2》 第七章 struts2的上传下载 序 文件上传是Web应用经常需要面对的问题,在大部分时候,用户的请求参数是在表单域输入的字符串,但如果为表单元素设置enctype="multipart/form-data”属性,则提交表单时不再以字符串方式提交请求参数,而是以二进制编码的方式提交请求,此时直接通过HttpServletRequest的getParamete:方法无法正常获取请求参数的值,我们可以通过二进制流来获取请求内容—通过这种方式,就可以取得希望上传文件的内容,从而实现文件的上传。

Struts 2 未提供自己的请求解析器,也就是说,Struts 2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts 2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。 在Struts 2的struts.properties配置文件中,我们看到了下面的配置代码,它们主要用于配置Struts 2上传文件时的卜传解析器。 #指定使用cos的文件上传解析器 # struts.multipart .parser=cos #指定使用Pell的文件上传解析器 #struts.multipart.parser=pell #Struts 2默认使用Jakarta的Common-FileUpload的文件上传解析器 struts.multpart .parser=jakarta Struts 2默认使用的是Jakarta的Common-FileUpload的文件上传框架,要使用Struts 2的文件上传功能,则需要在Web应用中增加两个commons-io-1.3. l .ja:和commons-fileupload-1.2. jar 文件上传 例子: 上传页面 上传的action private String fileDesc;//和前台的是同一个 private File file;//这是IO的File,回顾下strust1.x的FormFile //这两个字段是被注入进来的,前台页面并没有这两个表单域 private String fileFileName; private String fileContentType; /** * 获得保存的路径 */ private String getSaveDir(){ return ServletActionContext.getServletContext().getRealPath("/userDatas"); } @Override public String execute() throws Exception {

java基础试题1

一 1,对Struts2中的Action类描述不正确的是 ,Action类是一个特殊的类,它必须继承ActionSupport类 它可以是一个普通的类 为了简化程序员的编码过程,可以继承ActionSupport类 通过在struts.xml文件或注解来实现其Action的特殊性 ,0 2,在web.xml文件中,welcome-file元素的作用是? ,设定错误处理文件 设定欢迎文件 设定帮助文件 设定Web应用程序缺省的访问资源 ,3 3,JFinal中,@ClearInterceptor默认的作用是? ,清除所有的拦截器 清除上一级的拦截器 清除当前级别的拦截器 清除下一级别的拦截器 ,1 4,在JFinal中,使用下面哪个方法来配置对数据库的访问? ,configConstant configRoute configPlugin configInterceptor ,2 5,JFinal框架通常用来开发什么类型的程序? ,Java Web应用程序Java Application Android App IOS App ,0 6,什么叫抽象类 ,涉及到重载的类。 具有抽象函数的类。 涉及到多态性的类。 涉及到的类。,1 7,在JFinal中,通过下面哪个方法可以实现数据库表和Model的映射关系,addMapping add render invoke,0 8,在Struts2中,通过下面哪个注解可以用来配置action? ,@Package @Action@Before @Namespace ,1 9,在JFinal中配置了一个路由规则routes.add(""/hello"", HelloController.class); 下面的url是访问控制器类中的哪个方法? http://localhost:8080/hello/v0 ,HelloController.v0() HelloController.list() HelloController.save() HelloController.index() ,3 10,不属于Action 接口中定义的字符串常量的是? ,SUCCESS FAILURE ERROR INPUT,1

SSH实现上传下载

Struts Spring Hibernate实现上传下载 https://www.doczj.com/doc/6416266440.html, 2005年12月21日 10:06 天极yesky 引言 文件的上传和下载在J2EE编程已经是一个非常古老的话题了,也许您马上就能掰着指头数出好几个著名的大件:如SmartUpload、Apache的FileUpload。但如果您的项目是构建在Struts+Spring+Hibernate(以下称SSH)框架上的,这些大件就显得笨重而沧桑了,SSH提供了一个简捷方便的文件上传下载的方案,我们只需要通过一些配置并辅以少量的代码就可以完好解决这个问题了。 本文将围绕SSH文件上传下载的主题,向您详细讲述如何开发基于SSH的Web程序。SSH 各框架的均为当前最新版本: ·Struts 1.2 ·Spring 1.2.5 ·Hibernate 3.0 本文选用的数据库为Oracle 9i,当然你可以在不改动代码的情况下,通过配置文件的调整将其移植到任何具有Blob字段类型的数据库上,如MySQL,SQLServer等。 总体实现 上传文件保存到T_FILE表中,T_FILE表结构如下: 图 1 T_FILE表结构 其中:

·FILE_ID:文件ID,32个字符,用Hibernate的uuid.hex算法生成。 ·FILE_NAME:文件名。 ·FILE_CONTENT:文件内容,对应Oracle的Blob类型。 ·REM ARK:文件备注。 文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle 数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的差别,从而撤除程序在多数据库移植上的樊篱。 1.首先数据表中的Blob字段在Java领域对象中声明为byte[]类型,而非java.sql.Blob 类型。 2.数据表Blob字段在Hibernate持久化映射文件中的type为 org.springframework.orm.hibernate3.support.BlobByteArrayType,即Spring所提供的用户自定义的类型,而非java.sql.Blob。 3.在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。 通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。 以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts 通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。 综上所述,我们可以通过图 2,描绘出SSH处理文件上传的方案:

struts2多文件上传下载

struts2多文件上传下载 文件上传: 1,upload.jsp如下: <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <%@ taglib prefix="s" uri="/struts-tags"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> My JSP 'upload.jsp' starting page