为了让
学习者对
性能测试的整体思路有一个认识,本篇
文章将对性能测试的流程(如下图)中的各个步骤进行讲解。
注意:
1)上述性能测试流程中未包含“性能测试工具的选择”,各公司情况不同,大多数公司有固定的业务和测试工具,这样就可省去工具选择过程;若公司中有多款测试工具的话,可在使用工具实施测试前的任何阶段灵活进行选择。
2)在性能测试流程中会贯穿性能测试文档的编写,可编写在同一模板中,也可各阶段使用不同的模板,依据实际情况而定。
3)要求严格的公司,会在性能测试流程的每个阶段中设定评审,视公司及业务实际情况而定。
1.首先明确需求,确定性能测试目标,举例如下图。
2. 在需求确定的基础上进一步细化,进行业务建模,设计
测试用例及场景,举例如图所示。
3.在上述步骤基础上,搭建性能测试环境及创建所需的测试数据,如模拟出实际系统运行中的3层体系架构环境,在
数据库中创建批量的历史账户和帖子信息等。
4.结合上述设计,借助性能测试工具进行测试实施,同时进行资源监控及数据收集。
5.针对监控和收集到的大量数据、图表,进行分析。通常,这一步骤由多角色人员配合完成,如:对于数据库性能指标的分析可由DBA协助完成。
6.程序员及DBA等其他人员协作共同完成性能问题解决及性能调优,如:开发人员对代码逻辑中影响效率的地方进行代码调整。
7.回归测试,将测试结果和前阶段测试结果进行对比分析。
一. SVN 简单介绍
Subversion(SVN) 是一个开源的版本号控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库 (repository) 中。 这个档案库非常像一个普通的文件
server, 只是它会记住每一次文件的变动。 这样你就能够把档案恢复到旧的版本号, 或是浏览文件的变动历史。
SVN中的一些概念 :
(1). repository(源码库)
源码统一存放的地方
(2). Checkout (提取)
当你手上没有源码的时候,你须要从repository checkout一份
(3). Commit (提交)
当你已经改动了代码,你就须要Commit到repository
(4). Update (更新)
当你已经Checkout了一份源码, Update一下你就能够和Repository上的源码同步,你手上的代码就会有最新的变更
日常开发过程事实上就是这种(如果你已经Checkout而且已经
工作了几天):Update(获得最新的代码) -->作出自己的改动并调试成功 --> Commit(大家就能够看到你的改动了) 。
假设两个程序猿同一时候改动了同一个文件呢, SVN能够合并这两个程序猿的改动,实际上SVN管理源码是以行为单位的,就是说两个程序猿仅仅要不是改动了同一行程序,SVN都会自己主动合并两种改动。假设是同一行,SVN会提示文件Confict, 冲突,须要手动确认。
client软件:
(1)
Windows下经常使用的client软件经常使用TortoiseSVN。它是一个免费的开源的client。 下载地址:http://tortoisesvn.net/downloads.html
(2)向Myeclipse,也有一些SVN的插件。
Subversion提供下面主要功能:
(1)文件夹版本号控制
CVS 仅仅能跟踪单个文件的历史, 只是 Subversion 实作了一个 “虚拟” 的版本号控管文件系统, 可以依时间跟踪整个文件夹的变动。 文件夹和文件都能进行版本号控制。
(2)真实的版本号历史
自从CVS限制了文件的版本号记录,CVS并不支持那些可能发生在文件上,但会影响所在文件夹内容的操作,如同复制和重命名。除此之外,在CVS里你不能用拥有相同名字可是没有继承老版本号历史或者根本没有关系的文件替换一个已经纳入系统的文件。在Subversion中,你能够添加(add)、删除(delete)、复制(copy)和重命名(rename),不管是文件还是文件夹。全部的新加的文件都从一个新的、干净的版本号開始。
(3)自己主动提交
一个提交动作,不是所有更新到了档案库中,就是全然不更新。这同意开发者以逻辑区间建立并提交变动,以防止当部分提交成功时出现的问题。
(4)纳入版本号控管的元数据
每个文件与文件夹都附有一組属性keyword并和属性值相关联。你能够创建, 并儲存不论什么你想要的Key/Value对。 属性是随着时间来作版本号控管的, 就像文件內容一样。
(5)选择不同的网络层
Subversion 有抽象的档案库存取概念, 能够让人非常easy地实作新的网络机制。 Subversion 能够作为一个扩展模块嵌入到Apache HTTP server中。这个为Subversion提供了非常先进的稳定性和协同工作能力,除此之外还提供了很多重要功能: 举例来说, 有身份认证, 授权, 在线压缩, 以及文件库浏览等等。另一个轻量级的独立Subversionserver, 使用的是自己定义的通信协议, 能够非常easy地通过 ssh 以 tunnel 方式使用。
(6)一致的数据处理方式
Subversion 使用二进制差异算法来异表示文件的差异, 它对文字(人类可理解的)与二进制文件(人类无法理解的) 两类的文件都一视同仁。 这两类的文件都相同地以压缩形式储存在档案库中, 并且文件差异是以两个方向在网络上传输的。
(7)有效的分支(branch)与标签(tag)
在分支与标签上的消耗并不必一定要与项目大小成正比。 Subversion 建立分支与标签的方法, 就仅仅是复制该项目, 使用的方法就相似于硬连接(hard-link)。 所以这些操作仅仅会花费非常小, 并且是固定的时间。
(8)Hackability
Subversion没有不论什么的历史包袱; 它主要是一群共用的 C 程序库, 具有定义完好的API。这使得 Subversion 便于维护, 而且可被其他应用程序与程序语言使用。
二. SVN server搭建
2.1 使用yum 安装SVN包
关于YUM server的配置參考:
Linux 搭建 YUM server
http://blog.csdn.net/tianlesoftware/archive/2011/01/03/6113902.aspx
[root@singledb ~]# yum install -y subversion Loaded plugins: rhnplugin, security This system is not registered with RHN. RHN support will be disabled. Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package subversion.i386 0:1.4.2-4.el5_3.1 set to be updated --> Finished Dependency Resolution Dependencies Resolved ==================================================================================================== Package Arch Version Repository Size ==================================================================================================== Installing: subversion i386 1.4.2-4.el5_3.1 rhel-base 2.3 M Transaction Summary ==================================================================================================== Install 1 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 2.3 M Downloading Packages: subversion-1.4.2-4.el5_3.1.i386.rpm | 2.3 MB 00:00 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : subversion 1/1 Installed: subversion.i386 0:1.4.2-4.el5_3.1 Complete! |
[root@singledb ~]#
验证安装版本号:
[root@singledb ~]# svnserve --version svnserve, version 1.4.2 (r22196) compiled Aug 5 2009, 19:03:56 Copyright (C) 2000-2006 CollabNet. Subversion is open source software, see http://subversion.tigris.org/ This product includes software developed by CollabNet |
The following repository back-end (FS) modules are available:
* fs_base : Module for working with a Berkeley DB repository.
* fs_fs : Module for working with a plain file (FSFS) repository.
2.2 创建SVN 版本号库
[root@singledb ~]# mkdir /u02/svn
[root@singledb ~]# svnadmin create /u02/svn/davesvn --davesvn为版本号库名称
2.3 SVN 配置
创建版本号库后,在这个文件夹下会生成3个配置文件:
[root@singledb conf]# pwd
/u02/svn/davesvn/conf
[root@singledb conf]# ls
authz passwd svnserve.conf
(1)svnserve.conf: svn服务配置文件下。
(2)passwd: username口令文件。
(3)authz: 权限配置文件。
svnserve.conf 文件, 该文件配置项分为下面5项:
anon-access: 控制非鉴权用户訪问版本号库的权限。
auth-access: 控制鉴权用户訪问版本号库的权限。
password-db: 指定username口令文件名称。
authz-db:指定权限配置文件名称,通过该文件能够实现以路径为基础的訪问控制。
realm:指定版本号库的认证域,即在登录时提示的认证域名称。若两个版本号库的认证域同样,建议使用同样的username口令数据文件
Passwd 文件 :
我们在svnserve.conf文件中启用这个文件。然后配置例如以下:
[root@singledb conf]# cat passwd
### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.
[users]
# harry = harryssecret
# sally = sallyssecret
dave = davepwd
tianlesoftware = tianlesoftwarepwd
authz 文件 :
在网上找到一个非常好的配置样例:
[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak
--这里把不同用户放到不同的组里面,以下在设置文件夹訪问权限的时候,用文件夹来操作就能够了。
# 为全部库指定默认訪问规则
# 全部人能够读,管理员能够写,危急分子没有不论什么权限
[/] --相应我測试里的:/u02/svn 文件夹
* = r
@admin = rw
dangerman =
# 同意开发者能够全然訪问他们的项目版本号库
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw
# 文档编写人员对全部的docs文件夹有写权限
[/trunk/doc]
@docs = rw
# 培训人员能够全然訪问培训版本号库
[TrainingRepos:/]
@training = rw
以下我们来配置我们的authz文件:
[root@singledb conf]# cat authz
[groups]
admin = dave
dev=tianlesoftware
[davesvn:/]
@admin = rw
@dev = rw
[root@singledb conf]#
2.4 启动和停止SVN服务
(1)启动SVN服务:
[root@singledb conf]# svnserve -d -r /u02/svn
-d表示后台执行
-r 指定根文件夹是 /u02/svn
[root@singledb conf]# ps -ef | grep svn
root 4592 1 0 18:04 ? 00:00:00 svnserve -d -r /u02/svn
root 4594 3709 0 18:04 pts/1 00:00:00 grep svn
(2)停止SVN服务:
ps -aux |grep svn
kill -9 进程杀掉三. client连接SVN server
3.1 安装TortoiseSVN client
下载地址在第一节已说明。
3.2 找到自己项目的文件夹,右击,进行SVN 操作
(1)新建測试文件夹svn,进入后右键,点checkout:
SVN server的IP地址和版本号库名称。
新建个文件svn.txt. 把这个文件上传到SVNserver(add):
数据库的存储引擎就是管理数据存储的东西,它完成下面的
工作:
1)存储机制
2)索引方式
3)锁
4)等等
SQL语言:-----关系型数据库所使用的数据管理语言
1)数据定义语言(DDL):DROP、CREATE、ALTER等对数据对象发生操作的语言。
2)数据操作语言(DML):INSERT 、UPDATE、 DELETE,对数据本身发生更、删、改。
3)数据查询语言(DQL):SELECT,专门用于查找数据。
4)数据控制语言(DCL):GRANT/授权、REVOKE/收回授权、COMMIT/提交操作等等。
而非关系型数据库其操作语言就多种多样了。
数据库管理系统(DBMS):管理和维护数据库所使用的软件,为管理数据的方式和方法提供载体和支持。包含:
1)用户管理
2)处理数据库连接
3)缓存
4)查询
5)日志
6)等等
用于不同程序设计语言连接盒管理数据库的接口:
1)ODBC
2)JDBC
3)PDO
4)ADO.NET等等类型的接口
一个简单的例子学习hessian服务:服务端为
Java,客户端为C#。
先要准备好C#和Java的第三方类库:http://hessian.caucho.com/
Hssiancharp.dll
hessian-4.0.37.jar
Hessian服务端(java)
打开eclipse创建一个Dynamic Web Project,将hessian-4.0.37.jar放到lib下,大概如图所示:
创建一个通信接口IHello:
package hessian.test.server; import java.util.ArrayList; public interface IHello { String sayHello(String msg); void sayHello2(int bean); void print(String msg); HelloBean getData(HelloBean bean); ArrayList<HelloBean> getBeanList(); ComplexData getComplexData(); } |
IHello接口的一个实现:HelloImpl.java
package hessian.test.server; import java.util.ArrayList; public class HelloImpl implements IHello{ public String sayHello(String msg){ return "Hello " + msg; } public void sayHello2(int bean){ System.out.println("Hello " + bean); } public void print(String msg){ System.out.println(msg); } public HelloBean getData(HelloBean bean){ HelloBean result = new HelloBean(); result.setName("lu xiaoxun a new name"); result.setAge(26); System.out.print(bean.getName()); return result; } public ArrayList<HelloBean> getBeanList(){ ArrayList<HelloBean> beans = new ArrayList<HelloBean>(); HelloBean b1 = new HelloBean(); b1.setName("lu1"); b1.setAge(26); beans.add(b1); HelloBean b2 = new HelloBean(); b2.setName("lu2"); b2.setAge(27); beans.add(b2); return beans; } public ComplexData getComplexData(){ ComplexData data = new ComplexData(); ArrayList<HelloBean> beans = getBeanList(); data.setData(beans, beans.size()); return data; } } |
定义用来进行数据传输的类,两个类都必须实现Serializable接口:
HelloBean.java package hessian.test.server; import java.io.Serializable; public class HelloBean implements Serializable { private static final long serialVersionUID = 570423789882653763L; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } } ComplexData.java package hessian.test.server; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class ComplexData implements Serializable{ private static final long serialVersionUID = 1L; private ArrayList<HelloBean> helloBeans; //private Map<String, HelloBean> helloBeanMap; private int number; public int getNumber(){ return number; } public ArrayList<HelloBean> getHelloBeans(){ return helloBeans; } public void setData(ArrayList<HelloBean> beans, int num){ this.number = num; this.helloBeans = beans; // helloBeanMap = new HashMap<String, HelloBean>(); // for (HelloBean helloBean : beans) { // if(!helloBeanMap.containsKey(helloBean.getName())) // { // helloBeanMap.put(helloBean.getName(), helloBean); // } // } } } web.xml内容: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>hessian server</display-name> <servlet> <servlet-name>hessian</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>service-class</param-name> <param-value>hessian.test.server.HelloImpl</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hessian</servlet-name> <url-pattern>/hessian</url-pattern> </servlet-mapping> </web-app> |
Hessian客户端(c#)
定义一个与服务端对应的IHello接口:IHello.cs
public interface IHello
{
String sayHello(String msg);
void sayHello2(int bean);
void print(String msg);
HelloBean getData(HelloBean bean);
HelloBean[] getBeanList();
ComplexData getComplexData();
}
定义与服务器端一致的的通信数据类:
HelloBean.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hessian.test.server { public class HelloBean { public String Name { set { name = value; } get { return name; } } private String name; //类型和名称需要和服务器端一致 public int Age { set { age = value; } get { return age; } } private int age; //类型和名称需要和服务器端一致 public override String ToString() { return "Name: "+ name + " Age: " + age; } } } ComplexData.cs: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hessian.test.server { public class ComplexData { private HelloBean[] helloBeans; //private Dictionary<String, HelloBean> helloBeanMap; private int number; public int GetNumber() { return number; } public HelloBean[] GetBeans() { return helloBeans; } //public Dictionary<String, HelloBean> GetBeansDic() //{ // return helloBeanMap; //} } } |
在主项目中添加Hessiancsharp.dll引用。
测试代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using hessiancsharp.client; using hessian.test.server; namespace HessianClientTest { class Program { static void Main(string[] args) { string url = @"http://localhost:8080/HessianServerTest/hessian"; CHessianProxyFactory factory = new CHessianProxyFactory(); IHello test = (IHello)factory.Create(typeof(IHello), url); //Test function Console.WriteLine(test.sayHello("lu")); //打印从服务器端获取的字符串 test.sayHello2(12); //在服务器端控制台打印 "Hello 12" test.print("hessian"); //在服务器端控制台打印 "hessian" //Test Object HelloBean bean = new HelloBean(); //bean.setName("lu xiaoxun"); bean.Name = "luxiaoxun"; HelloBean result = test.getData(bean); Console.WriteLine(result.Name); Console.WriteLine(result.Age); Console.WriteLine(result); //Test Object Array HelloBean[] beans = test.getBeanList(); if (beans != null) { foreach (HelloBean data in beans) { Console.WriteLine(data.ToString()); } } //Test complex data ComplexData complexData = test.getComplexData(); if (complexData != null) { Console.WriteLine("Array number: " + complexData.GetNumber()); HelloBean[] comArray = complexData.GetBeans(); if (comArray != null) { foreach (HelloBean data in comArray) { Console.WriteLine(data.ToString()); } } //Dictionary<String, HelloBean> helloBeanMap = complexData.GetBeansDic(); //if (helloBeanMap != null) //{ // foreach (String key in helloBeanMap.Keys) // { // Console.WriteLine(helloBeanMap[key].GetHelloBeanInfo()); // } //} } Console.ReadKey(); } } } |
测试结果:
注意事项:
1、服务端和客户端用于数据传递的对象的命名空间要一致
IHello接口所在命名空间服务端和客户端可以不一致,但是IHello中用到的HelloBean和ComplexData在Java服务端和C#客户端中两个HelloBean类所在的命名空间要一致。
2、类的字段要一致
用于数据传输的类的字段名和字段类型要一致(修饰类型可以不一致)。
3、服务端的类要序列化
4、尽量使用基本的数据类型
从上面的测试可以看出,传递基本的类型没有问题,传递普通的类对象没有问题,传递ArrayList的时候也没有问题(C#客户端使用Array数组),但是传递HashMap字典的时候会有问题,C#这边使用Dictionary没法对应一致,可能是由于hash函数内部实现不一致导致的,具体原因不明。
1. 关注一个动作的流程和内容
比如登录,我需要提供的是登录接口,但是登录是否只是一个动作?一个动作一定不完整,还应该包括动作的内容和步骤(流程),这里有两个问题:就是落地和把问题想复杂了;其实登录还包括有角色的用户名和密码,我在给
手机团队提供这个动作的时候还需要提供一下登录的各个用户名以及密码,这样才比较周全;
再比如下载红外库,当时和广科就没有沟通明白,因为下载其实是有一个生命周期,首先是红外码的来源,红外码的转化txt文档以及红外码的打zip包和编码转换,这些都是需要和李阅苗沟通的;所以对于一个动作一定沟通明白他懂得生命周期是怎样的,每个阶段(步骤)的IHO是怎样的,这样才算落地;
2.做为一个项目经理想明白事情
你不需要编码,大部分文档也不需要你写,你需要做的就是想明白事情,并且告诉成员你想明白的事情;然后通过手段确保他们按照你预期的来做事情;
3.构建>>完成任务
一个团队的
工作模式远大于完成任务,完成任务是近期目标;但是一个团队模式机制的形成则是一个团队健壮的必要内涵;始终应该放在首位,这两其实是两件事:1.你的团队内涵是什么,PM一定要想明白;一定要坚持执行,但是不是执着执行,坚持执行的内涵,形式和方法可以根据团队的性质进行设计和应用;及时有各种的外在因素,构建团队永远是首位;
4.团队做事情套路
构建讲求的的内容套路,还有对外的讨论,比如发布,一定要遵循什么流程,没有客户的指令,千万不能发布;不能为了照顾某些成员的情绪就改变团队风格;
5.事情立即处理
对于邮件以及事情能处理马上处理,不要搁置和延后,水桶到你这里终止。比如机票报销,回到大连马上来做这件事情,否则可能就成为了遗失事情了;
6.准备驱动
在项目的各个环节,PM需要做的是更多的准备,架构准备,人才准备,培训准备等等;然后笑看风雨,看着各个事情到了环节,因为你的准备而有足够的燃料启动,看到他们自己可以自动的基于你的准备来驱动前行,这是做管理的有一个境界。
本文简介:
对于中小企业来说,选择一款适合的
测试管理工具或者工具集合石走向规划管理的必经之路,本文从以下几个方面对目前流行的几款工具:
1、QC(QC是TC的升级版,QC的升级版QC 11就是ALM11)
2、禅道(bugfree升级版)
3、mantis
4、JIRA
5、TestLink
6、Bugzilla
从以下几个方面进行一个简单的对比,供大家参考。其中一些数据来之网上,不全和不对的地方欢迎大家回帖补充。
功能
2.测试需求管理
3.测试用例管理
4.测试过程管理(测试任务分配)
5.BUG管理
6.结果统计(进度、缺陷指标等)
7.灵活性(可否流程自定义等)
8.权限管理
成本
(1.购买成本
2.部署成本
3.使用成本易用性
4.维护成本 稳定性)
扩展性
4.与office的接口)
性能
(1.支持的用户数
2.用例数等KPI指标)
技术支持
(1.官方支持
2.使用人气)
工具简单描述
对比结果如下:
通过以上对比,考虑成本、功能、质量等方面因素,推荐一下两种方案:
1、 可以接受引入成本:QC,禅道
2、 希望使用免费方案: Mantis + TestLink
说明:jira自带数据库是HSQL,为内存数据库,当数据量比较大时,其性能会有问题,所有将其改为mysql
1、准备环境
mysql安装程序:mysql-essential-5.0.87-win32.msi
mysql驱动程序:mysql-connector-java-5.1.7-bin.jar
安装mysql,然后创建jira数据库,语句如下:
create database jira character set 'UTF8'
将jira的license备份出来,以备后面使用
2、备份jira
用管理员账户登录jira,将其备份,具体如下:
系统管理--导入导出--备份数据
3、修改配置
停止jira
将mysql-connector-java-5.1.7-bin.jar驱动程序拷贝到 JIRA\lib 目录下
启动JIRA\bin\config.bat程序,配置Database,配置完成后,
测试连接
4、恢复数据
启动jira
由于修改了配置,且mysql数据库里的内容为空,所以刚启动jira的时候会提示输入license,创建管理员账户什么的,随便填,只要能过去就行。
配置完成后,进入系统管理,进行恢复数据(要求将其备份的zip文件拷贝到其要求的目录下即可)
5、验证
用之前的管理员账户登录jira,查看issue内容,或者用户信息等等,验证成功。
一、功能
关注页面单个功能点验证,充分考虑开发改动的每个点。这个是保证开发每个已知的修改点都能改对。
二、关联
重点考虑修改点对其他模块的影响,包括代码的影响和操作数据引起的影响。
比如新增加的功能增加了
数据库表的字段,必须关联的验证每个使用该表的该字段的模块是否正常
工作。难点在于需要分析出已知和未知的影响模块,考虑的越多,往往遗漏的问题就越少。
三、流程
很多系统是有流程的,比如工作流系统。当修改了一个点的时候,我们必须考虑整个流程是否能够正常运转起来。
四、升级
我们大部分系统都是对已有的系统进行升级。对于升级前的数据,我们必须保证能够正常工作。升级之前,需要模拟好各种情况。也需要对升级的数据库脚本进行充分的检查。
五、安全
比如菜单功能权限等。
六、性能
最近
测试组评审
测试用例时发现组内测试人员不是很理解期望结果会对测试用例的影响,只是把在前置条件(环境)下执行操作步骤,在当前页面下出现的结果,不会写执行操作步骤所带来的所有结果(不限于当个页面或者角色),这其实没有看到设计测试用例时没有想到关联,关联和流程的重要性很多人都忽略掉,只关注一个点,没有想到所有功能点由此操作带来的影响。测试用例设计还要注意着重点
?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Javaweb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts</param-name>
<param-value>
classpath*:struts2.xml
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<!-- spring的监听器,以便在启动时就自动加载spring的配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 注:120则设置过期时间为120分钟 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<!-- spring的应用上下文 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*/applicationContext.xml</param-value>
</context-param>
</web-app>
Linux程序员有时偶尔使用
Windows下的cmd工具,会被逼疯的,有些命令ls, cat, ps等已经条件反射一样使用。
但在cmd下,根本不知道该用什么命令,好在盖兹大叔照顾了此部分需求。从Vista开始,推出了PowerShell工具。
PowerShell工具不仅完全包含cmd所有功能,特别对于Linux程序员有两大利好:
增强的tab补全命令
Unix常用命令ls, cat, ps等的支持,但是参数格式完全不同,所以不要期望太高。
请注意:
从C:进入D:的某个目录,不需要分两步,直接 cd D:\xx即可
别使用仿Unix命令的任何参数,这里的ls等只是一个PowerShell内部命令的别名。
Windows PowerShell ISE > 帮助 > Windows PowerShell 帮助:
其余不再罗嗦,有兴趣自己试试吧。