cd /home/app/sxpservice/logs/apps && ll && tail -200f server.log 查看日志
|
11.24
策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
介绍
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
实现
我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
步骤 1
创建一个接口。
Strategy.java
public interface Strategy {
public int doOperation(int num1, int num2);
}
步骤 2
创建实现接口的实体类。
OperationAdd.java
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
OperationSubstract.java
public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
OperationMultiply.java
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
步骤 3
创建 Context 类。
Context.java
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
步骤 4
使用 Context 来查看当它改变策略 Strategy 时的行为变化。
StrategyPatternDemo.java
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
步骤 5
验证输出。
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。 java实现代码: package com.cn.单向加密;
import java.math.BigInteger; import java.security.MessageDigest; /* MD5(Message Digest algorithm 5,信息摘要算法) 通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串 Digest:汇编 */ public class MD5 { public static final String KEY_MD5 = "MD5";
public static String getResult(String inputStr) { System.out.println("=======加密前的数据:"+inputStr); BigInteger bigInteger=null;
try { MessageDigest md = MessageDigest.getInstance(KEY_MD5); byte[] inputData = inputStr.getBytes(); md.update(inputData); bigInteger = new BigInteger(md.digest()); } catch (Exception e) {e.printStackTrace();} System.out.println("MD5加密后:" + bigInteger.toString(16)); return bigInteger.toString(16); }
public static void main(String args[]) { try { String inputStr = "简单加密8888888888888888888"; getResult(inputStr); } catch (Exception e) { e.printStackTrace(); }
}
} MD5算法具有以下特点: 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
|
StringUtils常用的方法
1. 检查字符串是否为空:
static boolean isBlank(CharSequence str) 判断字符串是否为空或null;
StringUtils.isBlank("a");
2. 缩进字符串:
static String abbreviate(String str, int maxWidth) 缩进字符串,第二个参数至少为4(包括...)
StringUtils.abbreviate("abcdefg", 20); StringUtils.abbreviate("abcdefg", 4);
3. 首字母大写:
static String capitalize(String str) 首字母大写
StringUtils.capitalize("abcdefg");
4. 字符串显示在一个大字符串的位置:
static String center(String str, int size); 默认以空格填充 StringUtils.center("abcdefg", 20); StringUtils.center("abcdefg", 20,"*_"); StringUtils.leftPad("abc", 10, "*");
5. 重复字符串次数
static String repeat(String str, int repeat);
StringUtils.repeat("abc", 5);
6. 是否全是大写,是否全是小写(3.0版本)
public static boolean isAllLowerCase(String str);
StringUtils.isAllLowerCase("abC");
7. 是否都是由字母组成:
public static boolean isAlpha(String str); 只由字母组成
StringUtils.isAlpha("a2bdefg");
8. 小字符串在大字符串中的匹配次数
public static int countMatches(String str,String sub);
StringUtils.countMatches("ababsssababa", "ab");
9. 字符串倒转
public static String reverse(String str);
StringUtils.reverse("abcdef");
10. 大小写转换,空格不动 public static String swapCase(String str);
StringUtils.swapCase("I am a-A*a")
|
ArrayUtils是专门用来处理数组的工具类,提供很多有用的方法,下面是其一个方法蓝图: ArrayUtils.png 添加方法add(boolean[] array,boolean element)等等 add(T[] array,int index,T element)等等 addAll(boolean[] array1,boolean... array2)等等 克隆方法clone(boolean[] array)等等 包含方法contains(boolean[] array,boolean valueToFind) 获取长度方法getLength(Object array) 获取索引方法indexOf(boolean[] array,boolean valueToFind) indexOf(boolean[] array,boolean valueToFind,int startIndex) 判空方法isEmpty(boolean[] array)等等 isNotEmpty(T[] array) 长度相等判断方法isSameLength(boolean[] array1,boolean[] array2) 空数组转换nullToEmpty(Object[] array)等等 删除元素方法remove(boolean[] array,int index)等等 removeElement(boolean[] array,boolean element) removeAll(T[] array,int... indices) removeElements(T[] array,T... values) 反转方法reverse(boolean[] array)等等 reverse(boolean[] array,int startIndexInclusive,int endIndexExclusive) 截取数组subarray(boolean[] array,int startIndexInclusive,int endIndexExclusive) 打印数组方法toString(Object array) toString(Object array,String stringIfNull) 数组类型转换toPrimitive(Boolean[] array,boolean valueForNull) Boolean[] toObject(boolean[] array) Map<Object,Object> toMap(Object[] array) <T> T[] toArray(T... items)
|
@responsebody表示该方法的返回结果直接写入HTTP response body中。
@responsebody表示该方法的返回结果直接写入HTTP response body中 一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
|
Java 同步和异步交换数据 同步:A跟B说给我一杯水,B去倒水,A等着,B倒完水,给A拿来,A喝水,A继续做其他事情
交互模型就是Ajax在Browser端引入一个执行引擎,它一边应付user的请求,一边把某些必须交给服务器处理的东西背地里传送给服务器,同时背地里把结果准备好(接受服务器端的数据),展现给客户的技术模式。Ajax增强了用户的操作性。
|
Spring-jdbc:JdbcTemplate使用简介 原创 2016年08月16日 11:18:14
为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架. 作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低. JdbcTemplate主要提供以下五类方法: 使用示例: 在数据库中先准备两张表:
和
在java工程中创建两个对应类: [java] view plain copy
[java] view plain copy
37. }
jdbc.properties文件内容如下: [plain] view plain copy
[html] view plain copy
14. </bean>
[html] view plain copy
接下来创建一个测试类对JdbcTemplate的方法进行测试: [java] view plain copy
11. public class JDBCTest {
15. // private EmployeeDao employee;
90. }
比如,创建一个EmployeeDao类如下: [java] view plain copy
19. }
由于这里使用了注解来配置bean以及bean的自动装配,所以还需要在xml文件中添加(要先导入context命名空间): [html] view plain copy
测试一下EmployeeDao: [java] view plain copy
总结:JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错。但是功能还是不够强大(比如不支持级联属性),在实际应用中还需要和hibernate、mybaties等框架混合使用。
|