精通CSS web高级解决方案
精通CSS web高级解决方案
Ext Js.rar
Ext是一个强大的js类库,以前是基于YAHOO-UI,现在已经完全独立了。
主要包括data、widget、form、grid、dd、menu,其中最强大的应该算grid了,编程思想是基于面向对象编程(oop),扩展性相当的好。可以自己写扩展,自己定义命名空间。web应用可能感觉太大。不过您可以根据需要按需加载您想要的类库就可以了。
主要包括三个大的文件:ext-all.css,ext-base.js,ext-all.js(包括所有的类库,您可以根据需要进行删减.官方网站提供这一接口),在引用ext类库的时候,这三个文件必不可少。
它提供了丰富的,非常漂亮的外观体验,成为众多界面层开发人员的追捧!其核心的组件基本覆盖了我们构建富客户端的常用的组件。
从 Ext 2开始,商业版(针对那些以盈利为目的的开发方)要收费了。这可能会影响一些他的应用前景。
目前的最新版本为4.0。
struts 2
struts是开源软件。使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的选择。
基于Ext JS的仓库管理系统
基于EXT 的仓库管理系统
.集成性极强。包括对企业内部业务的完整整合能力以及对供应链外部资源的整合能力。具有开放的与流行电子商务平台集成的能力。
2 .业界最先进的技术。
3 .先进的管理理念和前瞻性考虑。
4 .极强的扩展能力。
5 .优秀的可维护性和极低的维护成本。
性能指标
可支持的最大用户数:无限制;
可支持的最大并发用户数:无限制;
吞吐量:只受到网络带宽的限制,系统本身无限制;
研磨设计模式
11.1 场景问题
11.1.1 访问多条数据
考虑这样一个实际应用:要一次性访问多条数据。
这个功能的背景是这样的;在一个HR(人力资源)应用项目中客户提出,当选择一个部门或是分公司的时候,要把这个部门或者分公司下的所有员工都显示出来,而且不要翻页,好方便他们进行业务处理。在显示全部员工的时候,只需要显示名称即可,但是也需要提供如下的功能:在必要的时候可以选择并查看某位员工的详细信息。
客户方是一个集团公司,有些部门或者分公司可能有好几百人,不让翻页,也就是要求一次性的获取这多条数据并展示出来。
该怎么样实现呢?
11.1.2 不用模式的解决方案
不就是要获取某个部门或者某个分公司下的所有员工的信息吗?直接使用sql语句从数据库中查询就可以得到,示意性的SQL大致如下:
String sql = "select * from 用户表,部门表 "
+"where 用户表.depId=部门表.depId "
+"and 部门表.depId like '"+用户选择查看的depId+"%'";
为了方便获取某个部门或者某个分公司下的所有员工的信息,设计部门编号的时候,是按照层级来进行编码的,比如:上一级部门的编码为“01”,那么本级的编码就是“0101”、“0102”……以此类推,下一级的编码就是“010101”、“010102”……。
这种设计方式,从设计上看虽然不够优雅,但是实用,像这种获取某个部门或者某个分公司下的所有员工的信息的功能,就不用递归去查找了,直接使用like,只要找到以该编号开头的所有部门就可以了。
示例涉及到的表有两个,一个是用户表,一个是部门表。两个表需要描述的字段都较多,尤其是用户表,多达好几十个,为了示例简洁,简化后简单的定义如下:
DROP TABLE TBL_USER CASCADE CONSTRAINTS ;
DROP TABLE TBL_DEP CASCADE CONSTRAINTS ;
CREATE TABLE TBL_DEP (
DEPID VARCHAR2(20) PRIMARY KEY,
NAME VARCHAR2(20)
);
CREATE TABLE TBL_USER (
USERID VARCHAR2(20) PRIMARY KEY,
NAME VARCHAR2(20) ,
DEPID VARCHAR2(20) ,
SEX VARCHAR2(10) ,
CONSTRAINT TBL_USER_FK FOREIGN KEY(DEPID)
REFERENCES TBL_DEP(DEPID)
);
全部采用大写,是基于Oracle开发的习惯。再来增加点测试数据,SQL如下:
INSERT INTO TBL_DEP VALUES('01','总公司');
INSERT INTO TBL_DEP VALUES('0101','一分公司');
INSERT INTO TBL_DEP VALUES('0102','二分公司');
INSERT INTO TBL_DEP VALUES('010101','开发部');
INSERT INTO TBL_DEP VALUES('010102','测试部');
INSERT INTO TBL_DEP VALUES('010201','开发部');
INSERT INTO TBL_DEP VALUES('010202','客服部');
INSERT INTO TBL_USER VALUES('user0001','张三1','010101','男');
INSERT INTO TBL_USER VALUES('user0002','张三2','010101','男');
INSERT INTO TBL_USER VALUES('user0003','张三3','010102','男');
INSERT INTO TBL_USER VALUES('user0004','张三4','010201','男');
INSERT INTO TBL_USER VALUES('user0005','张三5','010201','男');
INSERT INTO TBL_USER VALUES('user0006','张三6','010202','男');
COMMIT;
正则表达式必知必会
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
正则表达式的特点是:1. 灵活性、逻辑性和功能性非常的强;2. 可以迅速地用极简单的方式达到字符串的复杂控制。3. 对于刚接触的人来说,比较晦涩难懂。
由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容
享元、解释器、职责链、装饰模式
22.1 场景问题
22.1.1 复杂的奖金计算
考虑这样一个实际应用:就是如何实现灵活的奖金计算。
奖金计算是相对复杂的功能,尤其是对于业务部门的奖金计算方式,是非常复杂的,除了业务功能复杂外,另外一个麻烦之处是计算方式还经常需要变动,因为业务部门经常通过调整奖金的计算方式来激励士气。
先从业务上看看现有的奖金计算方式的复杂性:
首先是奖金分类:对于个人,大致有个人当月业务奖金、个人累计奖金、个人业务增长奖金、及时回款奖金、限时成交加码奖金等等;
对于业务主管或者是业务经理,除了个人奖金外,还有:团队累计奖金、团队业务增长奖金、团队盈利奖金等等。
其次是计算奖金的金额,又有这么几个基数:销售额、销售毛利、实际回款、业务成本、奖金基数等等;
另外一个就是计算的公式,针对不同的人、不同的奖金类别、不同的计算奖金的金额,计算的公式是不同的,就算是同一个公式,里面计算的比例参数也有可能是不同的。
22.1.2 简化后的奖金计算体系
看了上面奖金计算的问题,所幸我们只是来学习设计模式,并不是真的要去实现整个奖金计算体系的业务,因此也没有必要把所有的计算业务都罗列在这里,为了后面演示的需要,简化一下,演示用的奖金计算体系如下:
每个人当月业务奖金 = 当月销售额 X 3%
每个人累计奖金 = 总的回款额 X 0.1%
团队奖金 = 团队总销售额 X 1%
22.1.3 不用模式的解决方案
一个人的奖金分成很多个部分,要实现奖金计算,主要就是要按照各个奖金计算的规则,把这个人可以获取的每部分奖金计算出来,然后计算一个总和,这就是这个人可以得到的奖金。
(1)为了演示,先准备点测试数据,在内存中模拟数据库,示例代码如下:
/**
* 在内存中模拟数据库,准备点测试数据,好计算奖金
*/
public class TempDB {
private TempDB(){
}
/**
* 记录每个人的月度销售额,只用了人员,月份没有用
*/
public static Map<String,Double> mapMonthSaleMoney =
new HashMap<String,Double>();
static{
//填充测试数据
mapMonthSaleMoney.put("张三",10000.0);
mapMonthSaleMoney.put("李四",20000.0);
mapMonthSaleMoney.put("王五",30000.0);
}
}
(2)按照奖金计算的规则,实现奖金计算,示例代码如下:
/**
* 计算奖金的对象
*/
public class Prize {
/**
* 计算某人在某段时间内的奖金,有些参数在演示中并不会使用,
* 但是在实际业务实现上是会用的,为了表示这是个具体的业务方法,
* 因此这些参数被保留了
* @param user 被计算奖金的人员
* @param begin 计算奖金的开始时间
* @param end 计算奖金的结束时间
* @return 某人在某段时间内的奖金
*/
public double calcPrize(String user,Date begin,Date end){
double prize = 0.0;
//计算当月业务奖金,所有人都会计算
prize = this.monthPrize(user, begin, end);
//计算累计奖金
prize += this.sumPrize(user, begin, end);
//需要判断该人员是普通人员还是业务经理,团队奖金只有业务经理才有
if(this.isManager(user)){
prize += this.groupPrize(user, begin, end);
}
return prize;
}
/**
* 计算某人的当月业务奖金,参数重复,就不再注释了
*/
private double monthPrize(String user, Date begin, Date end) {
//计算当月业务奖金,按照人员去获取当月的业务额,然后再乘以3%
double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03;
System.out.println(user+"当月业务奖金"+prize);
return prize;
}
/**
* 计算某人的累计奖金,参数重复,就不再注释了
*/
public double sumPrize(String user, Date begin, Date end) {
//计算累计奖金,其实应该按照人员去获取累计的业务额,然后再乘以0.1%
//简单演示一下,假定大家的累计业务额都是1000000元
double prize = 1000000 * 0.001;
System.out.println(user+"累计奖金"+prize);
return prize;
}
/**
* 判断人员是普通人员还是业务经理
* @param user 被判断的人员
* @return true表示是业务经理,false表示是普通人员
*/
private boolean isManager(String user){
//应该从数据库中获取人员对应的职务
//为了演示,简单点判断,只有王五是经理
if("王五".equals(user)){
return true;
}
return false;
}
/**
* 计算当月团队业务奖,参数重复,就不再注释了
*/
public double groupPrize(String user, Date begin, Date end) {
//计算当月团队业务奖金,先计算出团队总的业务额,然后再乘以1%,
//假设都是一个团队的
double group = 0.0;
for(double d : TempDB.mapMonthSaleMoney.values()){
group += d;
}
double prize = group * 0.01;
System.out.println(user+"当月团队业务奖金"+prize);
return prize;
}
}
(3)写个客户端来测试一下,看看是否能正确地计算奖金,示例代码如下:
public class Client {
public static void main(String[] args) {
//先创建计算奖金的对象
Prize p = new Prize();
//日期对象都没有用上,所以传null就可以了
double zs = p.calcPrize("张三",null,null);
System.out.println("==========张三应得奖金:"+zs);
double ls = p.calcPrize("李四",null,null);
System.out.println("==========李四应得奖金:"+ls);
double ww = p.calcPrize("王五",null,null);
System.out.println("==========王经理应得奖金:"+ww);
}
}
测试运行的结果如下:
张三当月业务奖金300.0
张三累计奖金1000.0
==========张三应得奖金:1300.0
李四当月业务奖金600.0
李四累计奖金1000.0
==========李四应得奖金:1600.0
王五当月业务奖金900.0
王五累计奖金1000.0
王五当月团队业务奖金600.0
==========王经理应得奖金:2500.0
java 原型、桥接、访问者模式
25.1 场景问题
25.1.1 扩展客户管理的功能
考虑这样一个应用:扩展客户管理的功能。
既然是扩展功能,那么肯定是已经存在一定的功能了,先看看已有的功能:公司的客户分成两大类,一类是企业客户,一类是个人客户,现有的功能非常简单,就是能让客户提出服务申请。目前的程序结构如图25.1所示:
图25.1 已有的客户管理程序结构示意图
现有的实现很简单,先看看Customer的实现,示例代码如下:
/**
* 各种客户的父类
*/
public abstract class Customer {
/**
* 客户编号
*/
private String customerId;
/**
* 客户名称
*/
private String name;
/**
* 客户提出服务请求的方法,示意一下
*/
public abstract void serviceRequest();
}
接下来看看企业客户的实现示例代码如下:
/**
* 企业客户
*/
public class EnterpriseCustomer extends Customer{
/**
* 联系人
*/
private String linkman;
/**
* 联系电话
*/
private String linkTelephone;
/**
* 企业注册地址
*/
private String registerAddress;
/**
* 企业客户提出服务请求的方法,示意一下
*/
public void serviceRequest(){
//企业客户提出的具体服务请求
System.out.println(this.getName()+"企业提出服务请求");
}
}
再看看个人客户的实现示例代码如下:
/**
* 个人客户
*/
public class PersonalCustomer extends Customer{
/**
* 联系电话
*/
private String telephone;
/**
* 年龄
*/
private int age;
/**
* 企业注册地址
*/
private String registerAddress;
/**
* 个人客户提出服务请求的方法,示意一下
*/
public void serviceRequest(){
//个人客户提出的具体服务请求
System.out.println("客户"+this.getName()+"提出服务请求");
}
}
从上面的实现可以看出来,以前对客户的管理功能是很少的,现在随着业务的发展,需要加强对客户管理的功能,假设现在需要增加如下的功能:
客户对公司产品的偏好分析,针对企业客户和个人客户有不同的分析策略,主要是根据以往购买的历史、潜在购买意向等进行分析,对于企业客户还要添加上客户所在行业的发展趋势、客户的发展预期等的分析。
客户价值分析,针对企业客户和个人客户,有不同的分析方式和策略。主要是根据购买的金额大小、购买的产品和服务的多少、购买的频率等进行分析。
其实除了这些功能,还有很多潜在的功能,只是现在还没有要求实现,比如:针对不同的客户进行需求调查;针对不同的客户进行满意度分析;客户消费预期分析等等。虽然现在没有要求实现,但不排除今后有可能会要求实现。
25.1.2 不用模式的解决方案
要实现上面要求的功能,也不是很困难,一个很基本的想法就是:既然不同类型的客户操作是不同的,那么在不同类型的客户里面分别实现这些功能,不就可以了。
由于这些功能的实现依附于很多其它功能的实现,或者是需要很多其它的业务数据,在示例里面不太好完整的体现其功能实现,都是示意一下,因此提前说明一下。
备忘录模式 和状态模式.
设计模式之备忘录 和 状态模式精讲
19.1 场景问题
19.1.1 开发仿真系统
考虑这样一个仿真应用,功能是:模拟运行针对某个具体问题的多个解决方案,记录运行过程的各种数据,在模拟运行完成过后,好对这多个解决方案进行比较和评价,从而选定最优的解决方案。
这种仿真系统,在很多领域都有应用,比如:工作流系统,对同一问题制定多个流程,然后通过仿真运行,最后来确定最优的流程做为解决方案;在工业设计和制造领域,仿真系统的应用就更广泛了。
由于都是解决同一个具体的问题,这多个解决方案并不是完全不一样的,假定它们的前半部分运行是完全一样的,只是在后半部分采用了不同的解决方案,后半部分需要使用前半部分运行所产生的数据。
由于要模拟运行多个解决方案,而且最后要根据运行结果来进行评价,这就意味着每个方案的后半部分的初始数据应该是一样,也就是说在运行每个方案后半部分之前,要保证数据都是由前半部分运行所产生的数据,当然,咱们这里并不具体的去深入到底有哪些解决方案,也不去深入到底有哪些状态数据,这里只是示意一下。
那么,这样的系统该如何实现呢?尤其是每个方案运行需要的初始数据应该一样,要如何来保证呢?
19.1.2 不用模式的解决方案
要保证初始数据的一致,实现思路也很简单:
首先模拟运行流程第一个阶段,得到后阶段各个方案运行需要的数据,并把数据保存下来,以备后用
每次在模拟运行某一个方案之前,用保存的数据去重新设置模拟运行流程的对象,这样运行后面不同的方案时,对于这些方案,初始数据就是一样的了
根据上面的思路,来写出仿真运行的示意代码,示例代码如下:
/**
* 模拟运行流程A,只是一个示意,代指某个具体流程
*/
public class FlowAMock {
/**
* 流程名称,不需要外部存储的状态数据
*/
private String flowName;
/**
* 示意,代指某个中间结果,需要外部存储的状态数据
*/
private int tempResult;
/**
* 示意,代指某个中间结果,需要外部存储的状态数据
*/
private String tempState;
/**
* 构造方法,传入流程名称
* @param flowName 流程名称
*/
public FlowAMock(String flowName){
this.flowName = flowName;
}
public String getTempState() {
return tempState;
}
public void setTempState(String tempState) {
this.tempState = tempState;
}
public int getTempResult() {
return tempResult;
}
public void setTempResult(int tempResult) {
this.tempResult = tempResult;
}
/**
* 示意,运行流程的第一个阶段
*/
public void runPhaseOne(){
//在这个阶段,可能产生了中间结果,示意一下
tempResult = 3;
tempState = "PhaseOne";
}
/**
* 示意,按照方案一来运行流程后半部分
*/
public void schema1(){
//示意,需要使用第一个阶段产生的数据
this.tempState += ",Schema1";
System.out.println(this.tempState
+ " : now run "+tempResult);
this.tempResult += 11;
}
/**
* 示意,按照方案二来运行流程后半部分
*/
public void schema2(){
//示意,需要使用第一个阶段产生的数据
this.tempState += ",Schema2";
System.out.println(this.tempState
+ " : now run "+tempResult);
this.tempResult += 22;
}
}
(2)看看如何使用这个模拟流程的对象,写个客户端来测试一下。示例代码如下:
public class Client {
public static void main(String[] args) {
// 创建模拟运行流程的对象
FlowAMock mock = new FlowAMock("TestFlow");
//运行流程的第一个阶段
mock.runPhaseOne();
//得到第一个阶段运行所产生的数据,后面要用
int tempResult = mock.getTempResult();
String tempState = mock.getTempState();
//按照方案一来运行流程后半部分
mock.schema1();
//把第一个阶段运行所产生的数据重新设置回去
mock.setTempResult(tempResult);
mock.setTempState(tempState);
//按照方案二来运行流程后半部分
mock.schema2();
}
}
运行结果如下:
PhaseOne,Schema1 : now run 3
PhaseOne,Schema2 : now run 3
java正则表达式经典实例
正则表达式到底是什么东西?
字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件。
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
java面试宝典
常用java面试题,编程题 如数列出
基于JSP+Servlet+MySql的物流管理系统
基于jsp Servlet的物流管理系统,功能包括用户注册、登录、货物信息查询、货车信息查询、用户密码和货物信息的修改、后台审核等。 设计到的知识点有JDBC、JSTL Tag 等
JAVA 实现ATM模拟系统
ATM系统:
动作:存款 取款 查询 修改密码 验证密码
属性:name ID PWD money allNum selfNum bankName
设计出继承关系:
父类普通用户:存款 取款 查询 修改密码 验证密码
子类VIP用户:转账
有四位普通用户 2位VIP用户
java 实现医院病人看病系统 (面向对象)
java 实现医院病人看病系统 (面向对象)
功能包括 挂号,取药 ,体检,充值,看病,买药等……
用JAVA实现彩票管理系统
用JAVA实现彩票管理系统
机体功能体现为 : 购买彩票、发奖,兑奖
用Java实现图书馆管理系统
用Java实现图书馆管理系统,包括查询全部图书,已借图书信息,缴纳罚款等功能!!
用Java实现图书馆管理系统,包括查询全部图书,已借图书信息,缴纳罚款等功能!!
用Java实现图书馆管理系统,包括查询全部图书,已借图书信息,缴纳罚款等功能!!
C语言双链表实现通讯簿
1.1 课程设计内容
利用双向循环链表作为储存结构设计并实现一个通讯录程序。可以实现信息的添加、插入、删除、查询和统计等功能
1.2 课程设计要求
(1) 每条信息至少包含:姓名(name)、街道(street)、城市(city)、邮编、(eip)、国家(state)几项;
(2) 作为一个完整的系统。应该具有有好的界面和较强的容错能力。
2 课程设计原理
2.1 课设题目粗略分析
根据课设题目要求,拟将整体程序分为五大模块。此五个模块相互独立,没有嵌套调用的情况,以下是五个模块的大体分析:
(1)添加新联系人
系统将提示用户输入新添加人员信息,输入到文件中,人员信息数据包括姓名(name),街道(street),城市(city),邮编(eip),国家(state)。
(2)查询
该功能将显示已经保存的所有人员的姓名,街道,城市,邮编及国家。并且可由用户输入要查找的人员姓名,然后系统用查找函数查找,接着系统使用相关文件命令输出所查找的人员的全部信息。
(3)删除联系人
首先由用户输入要删除的人员的姓名,然后调用删除函数,删除该人员的所有相关资料。
单链表实现用户登录管理
C语言单链表实现用户登录管理
1.1 课程设计内容
能够建立单链表记录已登录的用户信息,每隔三分钟要修改一次费用余额,可随时浏览登录信息。用户推出后,需要将登录信息学如文件中,并可浏览登录信息的历史记录。
1.2 课程设计要求
1.需要包括如下的用户基本信息:用户名,密码,登录的时间,用户级别,费用余额。
2.参考相应的资料,独立完成课程设计任务。
3.交规范课程设计报告和软件代码。
jdk的配置及其参数的设置
讲解jdk的配置及其参数的设置
本章将要介绍Java的特点以及所应用的平台,然后带领读者从第一步做起,来完成一个Java的小程序,通过这个小程序的完成,可以让读者了解Java平台的搭建以及简单的开发步骤。通过本章的学习,读者应该能够达到如下几个目标。
熟练掌握如何搭建Java开发环境,包括下载、安装和配置JDK。
能够编写和编译Java程序,并能够运行生成文件。
这些是学习本章的目标,同时也是对读者的基本要求。学好本章是学习以后知识的基础,读者一定要熟练地掌握本章的知识。