1. ArrayList
ArrayList<String> c = new ArrayList<String>(); c.add("hello"); c.add("world"); String a = new String("aya"); c.add(a); for( Object obj : c ) { System.out.println( (String)obj ); } c.set(2, "111"); Iterator<String> it = c.iterator(); while(it.hasNext()) { System.out.println( (String)it.next() ); } ArrayList 的迭代器还有 ListIterator 可以有正反两种查询,先hasNext知道最后 hasPrevious才能有值 [java] view plaincopy ListIterator<String> it2 = c.listIterator(); while(it2.hasNext()) { System.out.println( "hasNext " + (String)it2.next() ); } while(it2.hasPrevious()) { System.out.println( "hasPrevious " + (String)it2.previous() ); } |
2. HashSet 集合是无序的。
HashSet集合判断两个元素相等的标准是两个对象通过equals 方法比较相等,并且两个对象的hashCode()方法返回值也相等。
向HashSet中添加可变对象时,必须小心,如果修改HashSet集合中的对象有可能导致该对象与集合中其他对象相等,从而导致Hashset无法准确访问该对象。
3. TreeSet 集合有序
由于TreeSet有序, 所有有访问第一个,前一个,后一个,最后一个并可以截取子集。
排序的顺序并不是根据插入的顺序,而是根据元素实际值来排序。
TreeSet<Integer> nums = new TreeSet<Integer>(); nums.add(4); nums.add(3); nums.add(2); nums.add(1); System.out.println(nums); //整个集合 System.out.println(nums.first()); System.out.println(nums.last()); System.out.println(nums.headSet(3)); //小于3,但不包括3 System.out.println(nums.tailSet(3)); //大于等于3 System.out.println(nums.subSet(1, 3)); 大于等于1,小于3 |
结果为
[1, 2, 3, 4]
1
4
[1, 2]
[3, 4]
[1, 2]
TreeSet自然排序:根据元素大小,升序排列。 对于TreeSet判断两个元素相等的标准是,两个对象通过equals方法比较返回true,并且通过compareTo(Object obj)比较 返回0。
和HashSet一样集合中为可变对象时,修改对象值后可能容易出错,为了健壮性,HashSet和TreeSet推荐放入不可变对象。
TreeSet定序排列: 使用comparator接口帮助。
4. EnumSet 是一个专为枚举类设计的集合类,其中所有的值都是指定枚举类型的枚举值。没有暴露构造器,必须用静态方法创建。
enum Season { SPRING,SUMMER,FALL,WINTER; } public class Main { public static void main(String[] args) { EnumSet es1 = EnumSet.allOf(Season.class); //创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值 System.out.println(es1); EnumSet es2 = EnumSet.noneOf(Season.class); //空集合,但指定其中的元素是Season类的枚举值 System.out.println(es2); es2.add(Season.SPRING); es2.add(Season.SUMMER); System.out.println(es2); EnumSet es3 = EnumSet.of(Season.SPRING, Season.SUMMER); // 以指定枚举值创建EnumSet System.out.println(es3); EnumSet es4 = EnumSet.range(Season.SPRING, Season.FALL); // 范围值 System.out.println(es4); EnumSet es5 = EnumSet.complementOf(es4); //Season中 除去es4里剩下的部分 为es5 System.out.println(es5); } } |
输出结果:
[SPRING, SUMMER, FALL, WINTER]
[]
[SPRING, SUMMER]
[SPRING, SUMMER]
[SPRING, SUMMER, FALL]
[WINTER]
5. LinkedList 不仅可以当做双向队列使用,还可以当做“栈”使用,其包含有 pop出栈 和 push入栈 方法
LinkedList<String> books = new LinkedList<String>(); books.offer("test1"); //加入队列尾部 books.push("test2"); //入栈 books.offerFirst("test3"); //放入头部 for(int i=0; i<books.size(); i++) { System.out.println( books.get(i) ); } System.out.println( books.peekFirst() ); //访问不删除 System.out.println( "log1: " + books ); System.out.println( books.pollFirst() ); //访问并删除 System.out.println( "log2: " + books ); |
输出结果:
test3
test2
test1
test3
log1: [test3, test2, test1]
test3
log2: [test2, test1]
6. Map
HashMap 和 HashTable 判断Value相等的条件只需要equals方法返回true即可,判断Key相等的条件是equals()和hashCode()返回值都相等。
LinkedHashMap以链表来维护内部顺序。性能低于HashMap,消耗低于TreeMap。
TreeMap key的排序也是根据红黑树排列,有两种排序方式,自然排序和定制排序。
WeekHashMap 只保留key对应对象的弱引用,可能被垃圾回收。
enum Season { SPRING,SUMMER,FALL,WINTER; } public class Main { public static void main(String[] args) { HashMap<Integer, String> map1 = new HashMap<Integer, String>(); map1.put(1, "hello"); map1.put(2, "world"); System.out.println(map1); System.out.println(map1.containsKey(3)); System.out.println(map1.containsValue("world")); map1.put(2, "aya"); System.out.println(map1); for(Map.Entry<Integer, String> m : map1.entrySet()) { System.out.println(m); System.out.println(m.getKey()); } EnumMap map2 = new EnumMap(Season.class); map2.put(Season.SPRING, "spring"); map2.put(Season.SUMMER, "summer"); System.out.println(map2); } } |
1、进入sql serverconfiguration manager,启动sqlserver(SQLEXPRESS)和SQL
Server Browser,如果SQL Server Browser无法启动,参看链接 http://blog.csdn.net/xtm_rongbing/article/details/13614169
为了防止防火墙禁止1433端口和Server Browser.exe程序,需要将以上两个加入到防火墙允许程序中,win8中操作如链接所示,http://blog.csdn.net/xtm_rongbing/article/details/13614259
2、启动TCP/IP,并设置端口号为1433,一般SQL SERVER的默认端口号为1433
3、SQL ServerManagement Studio中启用远程连接
使用windows默认用户登录,查看属性
其实下文讲了这么多,主要就是进入BIOS中将电脑的虚拟化(VT/Virtualization)打开,它在Advanced BIOS Features选项下
最近在家里折腾VM,遇到64位系统无法在VM中安装的问题,一开始还以为下载的软件有问题。试了几次发现,不管是
Linux还是
Windows,只要是64位系统就不行。
VM有这么一个提示:
This virtual machine is configured for 64-bit guest operating systems. However, 64-bit operation is not possible. This host is VT-capable, but VT is disabled. VT might be disabled if it has been disabled in the BIOS settings or the host has not been power-cycled since changing this setting. (1) Verify that the BIOS settings enable VT and disable 'trusted execution.' (2) Power-cycle the host if either of these BIOS settings have been changed. (3) Power-cycle the host if you have not done so since installing VMware Workstation. (4) Update the host's BIOS to the latest version. For more detailed information, see http://vmware.com/info?id=152. Continue without 64-bit support? |
这段提示的关键就是“VT”, VT就是“Virtualization Technology(虚拟化)。
第一,CPU要为64位。
第二,CPU要支持VT技术。
第三,主板Bios设置要打开VT。
前两项可以用securable来检测。
“hardware D.E.P”,此项与VM安装64位操作系统无关。简而言之,DEP(数据执行保护),是windows针对溢出的一种保护措施。
“64 Maximum bit length”,是指该CPU为64位的CPU;有的CPU虽是32位的,但用“securable”检测出来也是64,这说明该CPU也支持64位系统,可以安装64位系统。
“YES Hardware virtualization”,是指该CPU支持硬件虚拟化,如果此项显示为“YES”的话,说明你的CPU支持VT技术,如果还不能在VM中安装64位系统的话,就说明BIOS中此CPU VT功能没有开启。(有的securable版本会显示“Locked ON、Locked Off”,意思类似。)
这时就需要在“主板Bios当中要打开VT”功能。
可能目前使用WebDriver的绝大多数人还没有接触到Remote WebDriver,所以对Remote WebDriver没有一个概念,其实可以把Remote WebDriver理解成为在远程PC上执行WebDriver用例。
那么远程的好处在哪里呢?除了可以更方便的进行跨平台、浏览器的
测试外,最重要的一点是排除我们本地环境的污染,因为我们
工作用的PC其实我们安装了很多的软件,那么在coding的时候这些软件对环境的污染就难免不对我们的代码产生影响,最后就很容易造成代码在我这运行良好,但是到了别人那就跑不起来了或者结果有差异,这时我们就需要一个干净的PC环境作为一个验证机,在自己的PC上编写完代码后在验证机上进行Remote执行验证(当然有犟嘴的说我可以把代码拷过去执行啊,不需要Remote WebDriver啊,对于这样的人我们就不强求他了。。。)。下面直接搭建Remote环境:
需要另外一个PC, 在这个PC上安装JDK以及需要执行的浏览器的driver(安装方法看我前面的如何搭建
Selenium环境那章)
将这个 selenium-server-standalone-2.35.0.jar (这里的2.35.0不是固定的可以是其他版本)拷贝到任意一个目录下,用控制台进入这个目录执行:
java -jar selenium-server-standalone-2.35.0.jar 如果看到如下图就证明Remote PC 的
Server 配置成功了
下面直接编写Remote WebDriver代码了(这里用到了JUnit4估计都会我就不细说了,以后可能会写点TestNG快速入门的
文章)
package org.coderinfo.demo; import java.net.URL; import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.AssertJUnit; /** * @author CoderInfo * @E-mail coderinfo@163.com * */ public class RemoteWebDriverDemo { private static final String URL = "http://www.baidu.com"; private static WebDriver driver; @Before public void setUp() throws Exception { DesiredCapabilities dc = DesiredCapabilities.chrome(); // 设置需要驱动的浏览器,其他的浏览器都是以此类推 driver = new RemoteWebDriver(new URL( "http://10.127.206.130:4444/wd/hub"), dc); // 这个URL // 10.127.206.130 // 是要remote PC 的IP // Address,需要改为你自己的 driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS); // 设置页面加载超时的最大时长 } @After public void tearDown() throws Exception { driver.quit(); } @Test public void test() throws InterruptedException { driver.get(URL); // 访问度娘首页 driver.findElement(By.id("kw")).sendKeys("CoderInfo"); driver.findElement(By.id("su")).click(); Thread.sleep(10000); AssertJUnit.assertEquals("CoderInfo_百度搜索", driver.getTitle()); } } |
相关文章:
采用
LoadRunner工具Run-time settings或按键盘F4,选择LOG设置,选择Extended log->Data returned by
server和Parameter substitution,就可以搞定,但是这里设置是记录所有请求的日志。
详细介绍Extended log中Data returned by server、Parameter substitution、Advanced trace的作用:
(1)、选择Data returned by server,记录或打印指定给脚本的所有参数及其相应的值
(2)、选择Parameter substitution,记录或打印服务器返回的所有数据
(3)、选择Advanced trace(高级跟踪),记录Vuser在会话期间发送的所有函数和消息
2、 查看某个请求日志和请求响应信息:
采用lr_set_debug_message()函数,可以单独记录某个请求或某行脚本回放的日志,函数具体详情如下:
int lr_set_debug_message (unsigned int message_level, unsigned int on_off);
解释:lr_set_debug_message函数是设置脚本在执行的调试消息级别message_level。通过设置消息级别,可以确定记录哪些信息。启动设置的方法是将LR_SWITCH_ON作为on_off传递,反之禁用设置的方法是LR_SWITCH_OFF作为on_off传递,以下为lr_set_debug_message()函数中对应的参数值:
参数on_off说明:
【LR_SWITCH_ON】为启用设置,对应值为:
【LR_SWITCH_OFF】为禁用设置,对应值为:0
案例(回放脚本过程中,记录或打印该请求脚本从服务器返回的所有数据):
lr_set_debug_message( 16 | 2,1 ); web_submit_data("loginAction", "Action=http://{IP}/TLTP/loginAction", "Method=POST", "RecContentType=text/html", "Referer=http://{IP}/TLTP/", "Snapshot=t9.inf", "Mode=HTTP", ITEMDATA, "Name=userName", "Value=test", ENDITEM, "Name=password", "Value=123456", ENDITEM, LAST); lr_set_debug_message( 16 | 2,0 ); 或者 lr_set_debug_message(LR_MSG_CLASS_EXTENDED_LOG | LR_MSG_CLASS_RESULT_DATA, LR_SWITCH_ON ); web_submit_data("loginAction", "Action=http://{IP}/TLTP/loginAction", "Method=POST", "RecContentType=text/html", "Referer=http://{IP}/TLTP/", "Snapshot=t9.inf", "Mode=HTTP", ITEMDATA, "Name=userName", "Value=test", ENDITEM, "Name=password", "Value=123456", ENDITEM, LAST); lr_set_debug_message(LR_MSG_CLASS_EXTENDED_LOG | LR_MSG_CLASS_RESULT_DATA, LR_SWITCH_OFF); |
以上两种案例方法,结果一致,只是一种采用对应日志级别的值,一种采用对应日志级别的参数名标示。。。。
第一单元
1、为何软件缺陷难以避免?试谈谈你的观点。
答:软件需求分析不够全面 准确是导致软件缺陷的最主要原因,需求分析,软件设计和编码的过程中的失误也会导致软件缺陷. 各种
操作系统、各种硬件、各种软件都可能对所编制的软件造成影响。编制软件时不可能把所有的环境状态都拿来
测试。所以就会出现某些情况下的不兼容,也就是BUG(漏洞)。
2、测试和调试有何不同?区别?
答:测试是一个有计划、可重复的过程,目的是为了发现软件中的潜在错误和缺陷;而调试是一个随机的、不可重复的过程,目的是寻找错误的原因和具体位置,并修复错误。调试一般在测试后进行,当然,调试之后很可能又要进行测试,所以两者常交叉进行。
第二单元
答:1>按开发阶段,软件测试可划分为
单元测试、集成测试、确认测试、
系统测试和验收测试。2>按照实施测试的组织,可将测试分为α测试、β测试和第三方测试。3>根据测试实施策略的不同,软件测试可分为
白盒测试、
黑盒测试和灰盒测试。4>根据软件测试的执行方式,可将软件测试分为静态测试和动态测试两种。5>按其他测试方法和技术,软件测试可划分为回归测试、迭代测试、
功能测试、
性能测试、安全性测试、可靠性测试、兼容性测试、可移植性测试、冒烟测试、用户界面测试、随机测试、引导测试、本地化测试等。
4、α测试和β测试的含义分别是什么?两者有何区别和联系?
答:1>α测试属于开发方进行的测试,指
软件开发组织公司内部人员模拟各类用户对即将交付的软件产品进行测试,以发现其中的错误并改正。β测试是用户进行的测试。2>α测试的目的是评价软件产品的FLURPS,即功能、局域化、可使用性、可靠性、性能和支持,尤其注重产品的界面和特色。经过α测试调整的软件产品称为β版本。β测试的目的在于帮助开发方在正式发布软件产品前对其进行最后的改进。β测试一般在α测试之后进行,是由于大量用户在实际操作环境下对软件的β版本进行的测试。(或者:α测试是开发公司内部人员模拟各类用户所进行的软件产品测试 β测试是用户进行的测试,但是不同于验收测试即决定是否接受软件并不是β测试的目的. β测试的目的帮助开发方在产品发布前做最后的改进.
两者的测试人员不同目的不同.联系: α测试调整的软件产品是β测
第三单元
5、白盒测试、黑盒测试、灰盒测试三者有何区别?
答:白盒测试,又称结构测试或者逻辑驱动测试,其代码对测试人员可见;黑盒测试,又称功能测试或者数据驱动测试,其代码对测试人员不可见。灰盒测试是介于白盒测试和黑盒测试之间的测试。
6、H模型倡导的理念是什么?它为何能弥补W模型的不足?
答:将测试活动完全独立出来,形成一个完整独立的流程,以将测试准备活动和测试执行活动清晰地体现出来。
H模型中,软件测试不仅指测试的执行,还包括测试的准备等活动;软件测试是一个独立的流程,可贯穿到软件产品整个生命周期中的任一流程,与之并发地进行;只要某个测试达到准备就绪点,测试执行活动就可以开展;不同的测试活动可以是按照某个次序先后进行的,也可能是反复的。
这克服了W模型要求软件的开发过程中需求分析、设计、编码等活动串行而带来的不足
第四单元
8、白盒测试的含义是什么?有何优缺点?
白盒测试也称结构测试,逻辑测试,驱动测试或基于程序本身的测试。
优点:与黑盒测试相比,白盒测试深入到程序的内部进行测试,更由于定位错误的原因和具体位置,拟补了
你黑盒测试只能从程序外不进行测试的不足。
白盒测试不能查出程序的设计缺陷。不能查出程序是否遗漏了功能或路径。发现不了一些与数据相关的错误。
第五单元
9、单元测试的依据是什么?进行单元测试的目的何在?
答:1>单元测试的依据是软件的详细设计描述、源程序清单、编码标准等。2>1.验证代码能否达到详细设计的预期要求;2.发现代码中不符合编码规范的地方;3.准确定位发现的错误,以便排出错误.
10、驱动模块和桩模块的含义分别是什么?在单元测试中,一定要开发驱动模块和桩模块吗?为什么?
答:1>驱动模块式用来代替被测试单元的上层模块的.驱动模块能接收测试数据,调用被测单元,也就是将数据传递给被测单元,最后打印测试的执行结果。 桩模块,又称存根模块,它用来代替被测单元的子模块.其目的是模拟现实被测试单元的接口。2>不一定要开发驱动模块和桩模块,由于驱动模块和桩模块不是最终可提交的模块,所以在进行单元测试时应尽量避免开发驱动模块和桩模块。
1、单元测试应主要从哪些方面对被测单元进行检查?
答:单元测试应主要从单元接口、局部数据结构、独立路径、出错处理、边界条件几个方面对被测单元进行检查。
12、在单元测试的动态测试活动中,白盒和黑盒测试方法测试用例的使用有什么样的关系?试谈谈你的观点。
答:白盒为主,黑盒为辅。
第六单元
13、集成测试的测试对象是什么?
答:集成测试的测试对象包括单元间的接口,以及集成后的功能和性能(其中以对功能的测试为主)。
14、自底向上集成方法的优缺点分别是什么?
优点:
(1)大大减少了桩模块的开发,虽然需要开发大量的驱动模块,但其开发成本毕竟比开发桩模块的成本小。
(2)涉及复杂算法和真正输入/输出的模块往往在底层,它们最容易出现问题的模块,最先对底层的模块进行测试,减少了回归测试的成本。当然,若在集成测试后期又对底层模块进行修改,则必须对其上层模块进行回归测试,但这样的情况毕竟是少数。
(3)在集成的早期很可能实现对模块的并行测试,这提高了集成测试的效率。
(4)支持故障隔离。
缺点:
(1)需要开发大量的驱动模块,故带来一定的测试成本。但通过对底层模块的复用可以减少驱动模块的开发。
(2)不能及早的发现和修复模块结构中的主要控制点存在的问题,在集成的后期修复此类问题将花费较大的成本,故此法不适合于那些控制结构对整个体系至关重要的软件产品。
(3)随着测试的逐步推进,组装的系统愈加复杂,对底层模块的异常很难测试到。
第七单元
15、性能测试主要包括哪几种类型?分别解释它们的含义?
答:1>压力测试,负载测试,疲劳测试,强度测试,容量测试。2>1.压力测试是改变应用程序的输入,以对应用程序施加越来越大的负载,通过综合分析交易执行指标和资源监控指标,评测和评估应用系统在不同负载条件下的性能行为。2.疲劳测试是采用系统稳定运行情况下能够支持的最大并发用户数。3.强度测试强度测试的目的是找出因资源不足或资源争用而导致的错误。4.容量测试容量测试通常与数据库有关,其目的在于使系统承受超额的容量来确定系统的容量瓶颈,进而优化系统的容量处理能力。
16、用户界面测试、文档测试及安装测试的目的的分别是什么?
答:1.用户界面测试的目的是图形用户界面的正确性、易用性和视觉效果。2.文档测试的目的是提高易用性和可靠性,降低技术支持费用,尽量使用户通过文档自行解决问题。3.安装测试的目的是确认安装程序能够正确运行,软件安装是否正确,软件安装后能够正常运行。
17、何时应进行回归测试?回归测试的作用是什么?
答:1.系统测试阶段应进行回归测试。2.回归测试就是重新运行现有测试用例测试原有功能,以便确定变更是否达到了预期的目的,检查变更是否损害了原有的正常功能。每当软件发生变化时就应进行回归测试。
18、在不断进行回归测试的过程中,如何对测试用例库进行维护?
答:随着软件的改变,测试用例库中的一些测试可能会推动针对性和有效性,还有一些测试用例将完全不能运行,必须删除测试用例库中这一类测试用例。
同时,被修改的或新增加的软件功能,仅仅靠重新运行以前的测试用例不足以揭示其中的问题,有必要追加新的测试任命来测试这些新的功能或特征。因此,测试用例库的维护工作还应包括开发新测试用例。
此外,随着项目的发展,测试用例库中的用例会不断增加,其中会出现一些对输入或运行状态十分敏感的测试用例。这些测试不容易重复且结果难以控制,会影响回归测试的效率需要进行改进,使其达到可重复和可控制的要求。
第八单元
19、面向对象软件的测试模型主要包括哪几种测试?它们的执行顺序如何?
答:基于状态的类测试、基于UML的类测试、基于数据流的类测试、基于规范的类测试、基于方法序列的类测试
20、为什么说面对象软件的最小可测试单元不是单个方法,而是类或对象?
答:类是对若干方法和数据进行封装后形成的模块 对象的状态不仅仅取决于方法 还取决于该对象之前的状态即它的各属性的取值。因此面向对象软件的单元测试不能脱离类中的数据仅对方法进行测试 最小可测试单元不是单个方法而是类或对象。
21、类测试关注的内容是什么?
答:类测试关注的内容主要为 对类中单个方法的测试 即测试类中的单个方法能否在消息的触发下实现正确的状态转移 对类中方法间协作的测试 即测试类中的方法是否能够通过对象的状态正确地通信。
步骤
(1) 复制
ORACLE的JDBC驱动JAR包文件(ojdbc14.jar)到JMeter的lib目录下。
(2) 运行jmeter.bat
(3) 建立线程组:右键
测试计划->添加->Threads->线程组
(4) 建立JDBC Connection Configuration:右击线程组->添加->配置原件->JDBC Connection Configuration
(5) 在Database Connection Configuration输入Virable Name Bound to Pool的Variable Name内容
(6) 在Database Connection Configuration输入
数据库配置信息
例如:
Database URL: jdbc:oracle:thin:@192.168.1.168:1521:ptoracl JDBC Driver class: oracle.jdbc.driver.OracleDriver Username: lianggzone Password:lianggzone |
附注:
Database URL 格式:jdbc:oracle:thin:@[IP地址]:[端口号]:[实例名]
用户名、密码就是连接数据库的用户名和密码
(7) 建立JDBC Request:右击线程组->添加->Sampler->JDBC Request
Variable Name:和上面的 JDBC Connection Configuration填写同样的内容。
LigerUI的两种分页方式
如果数据量不是很大,就直接采用local分页,一次性的把数据全部发送到前台来,之后LigerUI自身的grid会自动分页。说一下total,在后台传送jsonString时传送定义好的total(总条数),你可以定义多少都可以,但是到前台它会自动将总条数赋值给total,这是local下的方式。
而如果数据量很大,一次性加载直接不显示数据或反应很慢的,就需要用server分页了,当用server分页时,每次请求都会比local时多发送两个参数:page和pagesize,不需要自己去发送,只需要在后台获取就行,
intpage=Integer.parseInt(request.getParameter("page"));
intpagesize=Integer.parseInt(request.getParameter("pagesize"));
inttotal;
这时你可以把page和pagesize写进你的sql语句:
sql=".........";
sql+="limit"+(page*pagesize-pagesize)+","+pagesize;
这样查出的结果放入jsonString中,这里要注意total了,total需要自己定义,需要自己重新查一下结果的总条数后赋值给total传到页面,其他的LigerUI会帮你搞定!
以下为实现部分内容
============
1.js页面
userGrid=$("#userGrid").ligerGrid({ method:'GET', height:580, width:'100%', usePager:true, columns:[ {display:Resource.userName,name:"userName",align:'left',width:100,minWidth:60}, {display:Resource.email,name:"email",align:'left',width:250,minWidth:60}, {display:Resource.deparentment,name:"deparentment",align:'left',width:100,minWidth:60}, //{display:Resource.password,name:"password",align:'left',width:100,minWidth:60}, {display:Resource.userType,name:"privilege",align:'left',width:100,minWidth:60, render:function(item){ varprivilege=item.privilege; if(privilege=='1'){ returnResource.tempUser; }elseif(privilege=='2'){ returnResource.commonUser; }elseif(privilege=='4'){ returnResource.advancedUser; }elseif(privilege=='8'){ returnResource.knowledgeManager; }elseif(privilege=='16'){ returnResource.administrator; } } }, {display:Resource.accountState,name:"accountState",align:'left',width:100,minWidth:60, render:function(item){ varaccountState=item.accountState; if(accountState=='1'){ returnResource.normal; }elseif(accountState=='2'){ returnResource.unactive; }elseif(accountState=='4'){ returnResource.stopped; } } }, {display:Resource.accountExpireDate,name:"accountExpireDate",align:'left',width:100,minWidth:60} ], url:$('#initPath').val()+'/UserController.do?method=getUserPaging&privilege=-1',//必须这样,否则不能传page等参数 pageSize:10,rownumbers:true, |
2.action
publicModelAndViewgetUserPaging(DYRKBUseruser,HttpServletRequestrequest){ intpage=Integer.parseInt(request.getParameter("page")); intpagesize=Integer.parseInt(request.getParameter("pagesize")); if(user.getUserName()==null){ user.setUserName("");//空串时可以搜索到所有此类用户 } Integerprivilege=user.getPrivilege(); if(privilege==-1){ user.setPrivilege(null); } List<DYRKBUser>userList=userService.getUserPaging(user,page,pagesize); inttotal=userService.getUserTotalNum(); Map<String,Object>model=newHashMap<String,Object>(1); model.put("Rows",userList);//数据要的就是Rows项 model.put("Total",total); returnnewModelAndView(Constants.JSON_VIEW,model); } |
考虑下述页面走向:
1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6
当内存块数量分别为3时,试问FIFO、LRU、OPT这三种置换算法的缺页次数各是多少?
答:缺页定义为所有内存块最初都是空的,所以第一次用到的页面都产生一次缺页。
当内存块数量为3时:
发生缺页中断的次数为16。
在FIFO算法中,先进入内存的页面被先换出。当页6要调入时,内存的状态为4、1、5,考查页6之前调入的页面,分别为5、1、2、4,可见4为最先进入内存的,本次应换出,然后把页6调入内存。
发生缺页中断的次数为15。
在LRU算法中,最近最少使用的页面被先换出。当页6要调入时,内存的状态为5、2、1,考查页6之前调入的页面,分别为5、1、2,可见2为最近一段时间内使用最少的,本次应换出,然后把页6调入内存。
发生缺页中断的次数为11。
在OPT算法中,在最远的将来才被访问的页面被先换出。当页6要调入时,内存的状态为1、2、5,考查页6后面要调入的页面,分别为2、1、2、…,可见5为最近一段时间内使用最少的,本次应换出,然后把页6调入内存。
OPT算法因为要知道后面请求的页框,因此我觉得这个算法有个小小的bug,如果在某个请求中,若在该请求的页框之后的页框序列中至少存在一个和当前内存块中不匹配的页框,则按照内存块的顺序(从上往下)替换没有出现的页框。比如上面那个OPT例子。对于最后一个页框请求,因为6未命中,且6之后没有请求的序列,因此应该替换3,所以替换后的序列为6 , 2 ,1 当然,这只是针对做题而言。