??xml version="1.0" encoding="utf-8" standalone="yes"?> 什么是工作: 工作的应用场景Q?br />
soa中的时序~排Qoapȝ中的审批{。大部分理程中都可以用到工作?/font> 工作与业务的关p?br />
一、业务集成到工作中Q一U常见的做法是把所有的业务集成到工作流中,如果有个业务定义个functionQ然后放q去。例如要生成spcode?br />
1、带来的好处Q?br />
业务与工作流完全集成Q只需要找到工作流配置文gQ以他ؓȝp扑ֈ所有的业务。让代码的阅ȝ护更方便?br />
2、坏处: 二、业务单独写Q工作流后加入进?br />
用非工作的代码实现所有的业务Q再用工作流~排 使用工作引擎带来的便利Q?br />
1、开发简?br />
2、稳定?br />
3、易l护 理解工作: 有限状态机Q?br />
你熟悉他吗,一定的Q一定熟悉他Q想x多少E序是基于他实现的。比如rpg游戏中迷宫的L路口Q比如rpg游戏中的情节讑֮。如果你写一个游戏引擎,你会发现fsmM有多q。即使你不写游戏引擎Q你玩游戏吗Q在rpg中是否用W通过一个个的点再现q迷宫地图,是否通过一ơ次的通关扑ֈ各种隐藏情节Q这是状态机?/p>
osworkflow的设计工P
http://www.aygfsteel.com/Files/dreamstone/eclipse1.part2.rar
http://www.aygfsteel.com/Files/dreamstone/eclipse1.part3.rar
http://www.aygfsteel.com/Files/dreamstone/eclipse1.part4.rar
http://www.aygfsteel.com/Files/dreamstone/eclipse1.part5.rar
http://www.aygfsteel.com/Files/dreamstone/eclipse1.part6.rar
是工作程的计模型,卛_工作程中的工作如何前后l织在一L逻辑和规则在计算Z以恰当的模型q行表示q对其实施计。工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之_利用计算机,按某U预定规则自动传递文档、信息或者Q务?strong>
q不是最好的理念Q仍焉要一ơ次的读原来的代码,复用性差Q可剥离性差Q比如我不想用工作流了)Q替换性差Q比如我想从osworkflow到jbpmQ,侵入性高。跟现在大家说的最多的soa冲突?br />
3、适用环境
项目开发,灉|Q重写难度不?/font>
1、带来的好处Q?br />
W合soa的原则,可以分组Ӟ分服务,分应用,复用性好Q一旦复用消耗小Qƈ不需要了解内部代码?br />
2、坏处:
初期消耗大Q业务划分难度大Q需要频J调整?br />
3、适用环境
大型的目好Q甚臛_以在应用之间l织。在电子pȝ集成中最有用?br />
工作引擎:
字面意思理解,工作引擎就是工作流核心元素解决Ҏ?br />
那工作流的核心是什么呢Q?br />
有权限的操作者触发流E在各种条g下的跌{?br />
关键的是权限Q条Ӟ跌{?br />
所以工作流引擎实现的就是:
Ҏ角色、分工和条g的不同决定信息传递\?br />
一句话Q其实Y件设计上更多的是借鉴非Y件知识,比如设计模式来源于徏{。哲学上也有大同理论?/p>
说了好久的工作流Q知道它的好处,知道它的坏处Q知道应用场景,但工作流q是有点朦胧Q想到设计工作流Q理解工作流q是有点头疼。特别是在大的场景,比如说我要实CQ意方式定义的程。听到这个就头大。那如何解决q个问题呢?
是q类问题Q约Ҏ从理论的高度来解冟뀂那么我们来看osworkflow是基于什么实现的Q有限状态机。当我们攑ֈ宏观Q我们要解决所有问题的时候会感觉很棘手,L程。但攑ֈ微观呢。虽然我们最l是要解x个的路由。但是我只要解决L两个step之间的\由。所有的路由p决了。这也是数学上的归纳法?br />
好了现在的问题已l变成如何解决两个step之间的\׃Q从两个step之间的\由,再次~减刎ͼ我只需要知道一个step可以C么地方,那我q道是否两个step之间存在路由?br />
那放C个step上是否就是有限状态机了呢Q没错?br />
step是状态,action是状态{换,但是osworkflow赋予了action太多的功能,变成了action中的result才是转换Q而action变成了{换过E中一些列操作及{换的集合?/p>
Z么osworkflow不提供设计工具呢Qosworkflow开发者说Q要灉|Q这是程序员q的事情。但是uml本n也是E序员干的事情。再x因ؓosworkflowZ有限状态机Q而对于有限状态机q种如果用uml表现出来是困隄。MZ些难以控制的地方Q再来看看jbpmQ因为jbpm是基于状态图的,来源于umlQ所以更Ҏ计工兗?/p>
个h理解Q大家交?/p>
public Authentication attemptAuthentication(HttpServletRequest request)
2 throws AuthenticationException {
3 String username = obtainUsername(request);
4 String password = obtainPassword(request);
5
6 if (username == null) {
7 username = "";
8 }
9
10 if (password == null) {
11 password = "";
12 }
13
14 UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
15
16 // Place the last username attempted into HttpSession for views
17 request.getSession().setAttribute(ACEGI_SECURITY_LAST_USERNAME_KEY, username);
18
19 // Allow subclasses to set the "details" property
20 setDetails(request, authRequest);
21
22 return this.getAuthenticationManager().authenticate(authRequest);
23 }
24
取出username后发现是qQ如果解册个问题呢Q第一个想到的是{?br />
username=new String(username.getBytes("ISO8859-1"),"UTF-8");
解决问题Q但是这D代码要嵌入到acegi中必重新编译acegi
spring的filter是解决编码问题的Q但是因为acegi的filter在spring之前Q所以编码没有{码。又不能把acegi的filter挪到spring filter之后Q这样就有安全问题了?br />
那就增加一个filterQ只qod链接Q然后设|一下代替spring的encodingfilter讄一下编码,解决问题
public class EncodeChnUsernameFilter implements Filter{
private static final String ACEGI_SECURITY_FORM_USERNAME_KEY ="j_username";
private static final String ACEGI_SECURITY_FORM_PASSWORD_KEY = "j_password";
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
但是另一个问题来了,密码是非明文的md5加密的,需要加密,同样不想更改acegi?br />
那好吧l用filterQ看看能否getParameter后再set回去
String password= request.getParameter("j_password");
//q里是个md5加密函数
password = md5(password);
//怎么setq去呢?
request.getParameterMap().put("j_password",password);
//启动试一下,异常报错Qmap不能putQ看一下异常,发现q个不是普通的mapQ是org.apache.catalina.util.ParameterMapQ这个map中有个标志位lockQtomcat不让更改http接收到的倹{?br />
//Z不服输的_Q一定要搞定它,呵呵
ParameterMap map = (ParameterMap)request.getParameterMap();
map.setLock(false);
map.put("j_password",password);
map.setLock(true);
//搞定Q不对,~译不通过Q发现org.apache.catalina.util.ParameterMap的jar包是catalina.jar?br />
把这个包攑ֈlib下编译,通过Q运行出向下转型错误Q仔l看一下发现request.getParameterMap()出来的ParameterMap.getClass()的id?00多,而接受{?/span>
的ParameterMap.class.getClass()?000多,不是一个类啊。想想也对,lib下和tomcat的server/lib下各有一个catalina.jarq个是两个cM?br />
eclipse add 外部jar包,直接add上tomcat中的catalina.jarQ编译运行,q是有问题,q次是报的classNotFound异常Qؓ什么会q样呢,命名Server/lib下有q个jar包,后来想了下明白了。tomcat一定是限定了catalina.jar不能被普通的用户cL直接引用。处于安全性考虑吧。这条\C通了Q回到acegi才发现acegi的配|文件中是可以随意配|autheticationfilter的,自己写一个autheticationfilterQ配|进去,不用pȝ的,解决问题Qfilter里边怎么写都没问题,爱怎么处理怎么处理Q呵?/span>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<script language="javascript">
var i = 0,j = 0; //行号与列?/span>
var oNewRow ; //定义插入行对?/span>
var oNewCell1,oNewCell2; //定义插入列对?/span>
//d条g?/span>
function AddRow()
{
i = document.all.MyTable.rows.length;
oNewRow = document.all.MyTable.insertRow(i);
oNewRow.id = j;
//dW一?/span>
oNewCell1 = document.all.MyTable.rows[i].insertCell(0)
oNewCell1.innerHTML = "<input type='text' id='Value" + j + "'"+" size='14' value=\"\">";
//dW二?/span>
oNewCell2 = document.all.MyTable.rows[i].insertCell(1)
oNewCell2.innerHTML ="<input type=button name=Del" + j + " value='删除当前?"+"onClick='DelCurrentRow(" + j + ");'>";
j++;
}
//删除?/span>
function DelCurrentRow(j)
{
with(document.all.MyTable)
{
for (var i=0;i<rows.length;i++)
{
if (rows[i].id == j)
{
deleteRow(i);
}
}
}
}
</script>
<form method="post" action="">
<div style="margin-left:80px;color:red;font-weight:bold;"></div>
<div align="center" class="title-font">
动态添加HTML元素
</div>
<br>
<table style="border:0px;" cellpadding=0 cellspacing=0
align="center">
<tr>
<td style="border:0px;" width="340"><hr></td>
<td style="border:0px;"><input type=button value="d" name"addFieldBT" onclick="AddRow();"/></td>
</tr>
</table>
<br><br>
<table style="border:0px;" cellpadding=0 cellspacing=0
align="center" class="TableBody" id="MyTable" border="0">
</table>
<br><br>
<table style="border:0px;" cellpadding=0 cellspacing=0
align="center">
<tr>
<td align="center" style="border:0px;">
<input type=button value="提交" name="searchBT" onclick=""/>
</td>
</tr>
</table>
<script language="javascript">AddRow()</script>
</form>
</BODY>
</HTML>
<script type="text/javascript" language="javascript">
var http_request = false;
function makeRequest(url) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertContents;
http_request.open('GET', url, true);
http_request.send(null);
}
function alertContents() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
alert(http_request.responseText);
} else {
alert('There was a problem with the request.');
}
}
}
</script>
<span
style="cursor: pointer; text-decoration: underline"
onclick="makeRequest('test.html')">
Make a request
</span>
' ProcessKillLocal.vbs
' Sample VBScript to kill a program
' Author Guy Thomas http://computerperformance.co.uk/
' Version 2.7 - December 2005
' ------------------------ -------------------------------'
Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill
strComputer = "."
strProcessKill = "'otrun.exe'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
objProcess.Terminate()
Next
WSCript.Echo "Just killed process " & strProcessKill _
& " on " & strComputer
WScript.Quit
' End of WMI Example of a Kill Process
reg=/^[a-z]*$/;
return reg.test(str)
}
</script>
<input type="text"
onkeypress = "return regInput(String.fromCharCode(event.keyCode))"
onpaste = "return regInput(window.clipboardData.getData('Text'))"
ondrop = "return regInput(event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled"><br>
<input type="text"><br><br>
另外如果要兼容ie ,firefox netscapt三个览器,׃能用onkeypress事g?br />
而应该把onkeypress事g变成 onkeydown事g+onkeyup事g?br />
再keydown事g中检查,q设|标志位Q在onkeyup事g中返回,cMq样
script language="javascript">
var tag;
function kd(evt) {
alert(evt.keyCode);
if (evt.keyCode >= 48 && evt.keyCode <= 57) {
tag=true;
return;
}else{
if (evt.keyCode==8){
tag=true;
return;
}
}
tag=false;
}
function kp(){
return tag;
}
</script>
至于Z么这P自己试一下不q样的结果吧
<script>
function formatNumber(number,pattern){
var str = number.toString();
var strInt;
var strFloat;
var formatInt;
var formatFloat;
if(/\./g.test(pattern)){
formatInt = pattern.split('.')[0];
formatFloat = pattern.split('.')[1];
}else{
formatInt = pattern;
formatFloat = null;
}
if(/\./g.test(str)){
if(formatFloat!=null){
var tempFloat = Math.round(parseFloat('0.'+str.split('.')[1])*Math.pow(10,formatFloat.length))/Math.pow(10,formatFloat.length);
strInt = (Math.floor(number)+Math.floor(tempFloat)).toString();
strFloat = /\./g.test(tempFloat.toString())?tempFloat.toString().split('.')[1]:'0';
}else{
strInt = Math.round(number).toString();
strFloat = '0';
}
}else{
strInt = str;
strFloat = '0';
}
if(formatInt!=null){
var outputInt = '';
var zero = formatInt.match(/0*$/)[0].length;
var comma = null;
if(/,/g.test(formatInt)){
comma = formatInt.match(/,[^,]*/)[0].length-1;
}
var newReg = new RegExp('(\\d{'+comma+'})','g');
if(strInt.length<zero){
outputInt = new Array(zero+1).join('0')+strInt;
outputInt = outputInt.substr(outputInt.length-zero,zero)
}else{
outputInt = strInt;
}
var
outputInt = outputInt.substr(0,outputInt.length%comma)+outputInt.substring(outputInt.length%comma).replace(newReg,(comma!=null?',':'')+'$1')
outputInt = outputInt.replace(/^,/,'');
strInt = outputInt;
}
if(formatFloat!=null){
var outputFloat = '';
var zero = formatFloat.match(/^0*/)[0].length;
if(strFloat.length<zero){
outputFloat = strFloat+new Array(zero+1).join('0');
//outputFloat = outputFloat.substring(0,formatFloat.length);
var outputFloat1 = outputFloat.substring(0,zero);
var outputFloat2 = outputFloat.substring(zero,formatFloat.length);
outputFloat = outputFloat1+outputFloat2.replace(/0*$/,'');
}else{
outputFloat = strFloat.substring(0,formatFloat.length);
}
strFloat = outputFloat;
}else{
if(pattern!='' || (pattern=='' && strFloat=='0')){
strFloat = '';
}
}
return strInt+(strFloat==''?'':'.'+strFloat);
}
alert(formatNumber(0,''));
alert(formatNumber(12432.21,'#,###'));
alert(formatNumber(12432.21,'#,###.000#'));
alert(formatNumber(12432,'#,###.00'));
alert(formatNumber('12432.415','#,###.0#'));
</script>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<script language=javascript>
function msg(){
execScript("n=msgbox('是否保存',4,'自定的的confirm')","vbscript");
alert(n);
return(n == 1);
}
</script>
<BODY>
<input type="button" onclick="msg()" value="click" />
</BODY>
</HTML>
var x = 33;
alert(x.toString(16));
</script>
֮现限制输入大、小写英文,数字QQ点小敎ͼ日期Q中文,部分英文Q部分中文等众多功能。直接加入到html代码中即可用?/p>
<script>
function regInput(obj, reg, inputStr)
{
var docSel = documentQselection.createRange()
if (docSel.parentElement().tagName != "INPUT") return false
oSel = docSel.duplicate()
oSel.text = ""
var srcRange = obj.createTextRange()
oSel.setEndPoint("StartToStart", srcRange)
var str = oSel.text + inputStr + srcRange.text.substr(oSel.text.length)
return reg.test(str)
}
</script>
写英文Q?lt;xmp style= "display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^[a-z]*$/, String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[a-z]*$/, window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[a-z]*$/, event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled"><br>
大写英文Q?lt;xmp style= "display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^[A-Z]*$/, String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[A-Z]*$/, window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[A-Z]*$/, event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled">
<br>
L数字Q?lt;xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^[0-9]*$/, String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[0-9]*$/, window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[0-9]*$/, event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled"><br>
?位小敎ͼ<xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^\d*\.?\d{0,2}$/,
String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^\d*\.?\d{0,2}$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^\d*\.?\d{0,2}$/,
event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled">
? 123.12<br>
日 期:<xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^\d{1,4}
([-\/](\d{1,2}([-\/](\d{1,2})?)?)?)?$/,
String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^\d{1,4}([-\/](\d{1,2}
([-\/](\d{1,2})?)?)?)?$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^\d{1,4}([-\/](\d{1,2}
([-\/](\d{1,2})?)?)?)?$/,
event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled">
? 2002-9-29<br>
L中文Q?lt;xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^$/,
String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[\u4E00-\u9FA5]*$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[\u4E00-\u9FA5]*$/,
event.dataTransfer.getData('Text'))"><br>
部分英文Q?lt;xmp style="display:inline"> </xmp>
<input onkeypress = "return regInput(this, /^[a-e]*$/,
String.fromCharCode(event.keyCode))"
onpaste = "return regInput(this, /^[a-e]*$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[a-e]*$/,
event.dataTransfer.getData('Text'))"
style="ime-mode:Disabled">
范围: a,b,c,d,e<br>
部分中文Q?lt;xmp style="display:inline"> </xmp>
<script language=javascript>
function checkChinese(oldLength, obj)
{
var oTR = window.documentQselection.createRange()
var reg = /[^一二三四五六七八九十]/g
oTR.moveStart("character", -1*(obj.value.length-oldLength))
oTR.text = oTR.text.replace(reg, "")
}
</script>
<input onkeypress="return false" onkeydown=
"setTimeout('checkChinese('+this.value.length+','+this.uniqueID+')',
1)"
onpaste = "return regInput(this, /^[一二三四五六七八九十]*$/,
window.clipboardData.getData('Text'))"
ondrop = "return regInput(this, /^[一二三四五六七八九十]*$/,
event.dataTransfer.getData('Text'))">
范围: 一二三四五六七八九?lt;br>
2.不能展开右键Q不能全选,不能复制的实?
<body oncontextmenu="window.event.returnvalue=false"
onkeypress="window.event.returnvalue=false"
onkeydown="window.event.returnvalue=false"
onkeyup="window.event.returnvalue=false"
ondragstart="window.event.returnvalue=false"
onselectstart="event.returnvalue=false">
...
</body>
3.止面正文内容被选取
<body oncontextmenu="return false" ondragstart="return false"
onselectstart ="return false" onselect="documentQselection.empty()"
oncopy="documentQselection.empty()" onbeforecopy="return false"onmouseup="documentQselection.empty()">
4.避免别h把网|在框架中
<script language=“javascript”><!--if (self!=top){top.location=self.location;}-->< /script>
5.示查看源代?
<frameset>
<frame src="你要保密的文件的URL">
</frameset>
6.关闭输入?
<input style="ime-mode:disabled">
7.止囄下蝲
在这里的最后加入:
oncontextmenu="return false" ondragstart="return false" onselectstart="return
false" scroll="auto"
8.止~存
在HEAD里加入:
<meta http-equiv="Expires" CONTENT="0">
<meta http-equiv="Cache-Control" CONTENT="no-cache">
<meta http-equiv="Pragma" CONTENT="no-cache">