JBOSS 点滴

丰丰的博客

2009年7月16日 #

字符串型转换为JSON并获取值

@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST)
@ResponseBody
public void updateInvestorApplyAccountNo(HttpServletRequest request,
HttpServletResponse response,
@RequestBody String requestBody) {
int num = 0;
String result = "";
//下面是把拿到的json字符串转成 json对象
JSONObject jsStr = JSONObject.parseObject(requestBody); //将字符串{“id”:1}
//int jsID = Integer.parseInt(jsStr.getString("id"));//获取id的值


/** 
* json对象转换成java对象 
*/ 
InvestorApplyModel stud = (InvestorApplyModel) JSONObject.toJavaObject(jsStr,InvestorApplyModel.class);

}

posted @ 2018-08-25 15:38 半导体 阅读(24) | 评论 (0)编辑 收藏

redirect_uri域名与后台配置不一样,错误码10003

微信获取openid时,如遇到以下错误

解决方法如下:
1、获取openid时,链接地址https://open.weixin.qq.com/connect/oauth2/authorize? 中redirect_uri一定要带上http,
   公众号设置->功能设置->网页授权域名中的域名与redirect_uri域名要一模一样,记得一定要加上http://

posted @ 2018-08-22 10:14 半导体 阅读(28) | 评论 (0)编辑 收藏

JAVA+ORACLE+BLOB+Mybatis

实体类:
    private  byte[] richContent;
    
public byte[] getRichContent() {
        
return richContent;
    }


    
public void setRichContent(byte[] richContent) {
        
this.richContent = richContent;
    }

Mapper.xml
    <result column="RICH_CONTENT" property="richContent" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler"/>

      <if test="richContent != null" >
        UPDATE_DATE = #{richContent,jdbcType=BLOB},
      
</if>
JSP
<td class="propname">发布内容:</td>
<td class="propvalue" colspan="6">
<div id="myEditor" type="text/plain" name='content' style="width: 900px;height:400px;"/>
</td>
CONTROL保存
    //利用content转换为二进制,存入richcontent
String strRich = newsBean.getContent();
if(strRich.length()>0) {
byte[] temp = strRich.getBytes();
newsBean.setRichContent(temp);
newsBean.setContent("");
}

CONTROL显示:
if(casNewsModel.getRichContent().length>0) {
content = new String(casNewsModel.getRichContent());
casNewsModel.setContent(content);
}



posted @ 2018-01-22 20:34 半导体 阅读(56) | 评论 (0)编辑 收藏

模拟登录解决方案

最近一直在做单点登录,随着客户需求不同,解决方案也是多种多样,来说说我总结的解决方案:
一、采用标准接口方式实现单点登录,由于夜已深,以后再上传。
二、采用模拟登录,在门户中让用户输入用户名密码,再模拟用户登录的方式实现系统登录。
当客户提出这种方式时,本人是表示不理解,考虑到安全性本想拒绝,但。。。客户永远是god。
说说这种方式实现的思路吧,用户登录无非几种,
第一:输入用户名密码然后uget或post提交,有密码在手,get方式大家都会,post也很容易,登陆页另存为,form action填远程登陆地址,正常就O了。   
        千万注意,如果用户传的中文,一定要保证不乱码,传输的编码要与系统对应,在<post 中增加编码格式就行了,如:
<form action="远程提交地址"   accept-charset="GB2312" onsubmit="document.charset='GB2312';"/>
第二:如果碰到先加密,再私钥配对这种,模拟他的整个过程,因为密码在手,他调什么方法,你也调,他怎么混,你也照着混。只是步骤多,其他都一样,

posted @ 2017-12-24 00:13 半导体 阅读(22) | 评论 (0)编辑 收藏

ajax调用方法

i不跨域调用

$(document).ready(function() {
$.ajax({
type : 'post',
url :' <%=path%>/mplat/InitAllMenu',
data : {},
cache : false,
dataType : 'json',
success : function(data, stats) {alert(data.menus);
// var returnData=JSON.parse(data);
/* var returnData = data;
appname = returnData.appname;
allTreeNodes = JSON.parse(returnData.menus);*/
},
error : function() {debugger;
alert( "加载应用名出现问题..");
}
})
;

跨域请用jsonp访问,由于回调时会报callback错误,请直接用jquery-jsonp插件;

做跨域数据处理的时候经常使用Jquery的getJSONP方法。但是这个方法跟普通的Ajax是完全不一样的,尽管指定了error,当请求发生错误的时候也不会去执行这个函数。

jQuery-JSONP 是一个支持 JSONP 调用的 jQuery 插件,它支持出错时的 Ajax 回调。下载地址:https://github.com/jaubourg/jquery-jsonp

使用方法很简单,直接引用Down到的文件到你的页面。

$.jsonp({
        url: "/Handler/demo",
        data: { yourdata: "data" },
        callback:"callbackAction",
        success: function (json) {
            //your code            
        },
        error: function (xOptions, textStatus) {
            //your code           
        }
    });

  

注意事项:


http://blog.csdn.net/function_jx_/article/details/47124815
  1. callback:假如指定的值是callbackAction,服务端返回的json数据必须包含在callbackAction()里面。(具体原因请了解一下Jsonp实现原理)

posted @ 2017-12-13 16:50 半导体 阅读(41) | 评论 (0)编辑 收藏

java文件上传工具

uploadify:文件可以切片存放,目前常用

http://www.plupload.com/examples/ 

webUploader

swfUpload:界面漂亮,但文件不能切片存放

posted @ 2017-11-20 16:51 半导体 阅读(36) | 评论 (0)编辑 收藏

powerdesigner反向工程时报错odbc驱动问题

找了很久终于找到64位的powerdesigner16.5了,网上基本所有的默认为32位的,但是现在数据库基本都是64位的了,这样在逆向生成pdm时就会报错,请叫我雷锋。

链接:http://pan.baidu.com/s/1slwAjSh

提取密码:d4gw

需要破解文件的可以在我的上传资源里找到,绝对可以用,本人亲测的!

转自:http://blog.csdn.net/danfeixia123/article/details/53381733

posted @ 2017-11-07 15:17 半导体 阅读(108) | 评论 (0)编辑 收藏

IDE环境配置

oracle 下载地址:http://blog.itpub.net/16886618/viewspace-1365348/
MAVEN安装:http://www.cnblogs.com/izecsonLee/p/6155868.html   最后setting文件localRepository改为 本机地址。

posted @ 2017-10-17 23:43 半导体 阅读(58) | 评论 (0)编辑 收藏

微信公众平台申请测试接口URL和TOKEN的配置,怎么在本地让微信能通过80端口访问

  最近开始微信公众平台的捣鼓,但相信和很多新手一样,遇到的第一件事就是如何配置url,主要是微信的80端口的蛋疼限制,我想这其中的流程应该是这样 的。我们在申请测试帐号时,微信需要指定一个URL和TOKEN,这样微信就可以根据分配给你的APPID和SECRET来通过你提供的URL来认证并且 通过这个接口返回你要的数据,所以也就是我们的程序和微信是能过这个URL来完成交互的,根据这个思路,我们需要一个能让微信访问到你项目的URL,至于 TOKEN可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)

在公司,首先应当解决的是怎么让外网访问你的项目,我用的是JAVA语言来做开发,刚 开始想通过3322动态解析平台让外网映射到公司来,然后用路由来做一个映射到我的tomcat 8080端口,但尝试后发现3322这个是不能用80端口做映射(很多都这样),所以没办法,也不能直接上公司的服务器来开发,而且80会被其他端口占 用,如果把项目托管到云服务器上也不方便开发,幸好在一个群里遇到高手,建议用ngrok直接把本地开放给外网(大喜),下载后直接把这个解压(我用的是ubuntu,所以下的linux版),在终端里运行./ngrok 8080,这样ngrok会返回一个动态的URL,果然可以访问了,但问题是我在微信里填写的这个URL不可能每次都变呀,于是运行./ngrok -subdomain=test 8080,但这个需要注册才可以用,于是去官网注册。 再根据提示运行一次验证,然后运行这个就OK了,这样我的URL就固定为http://test.ngrok.com。于是乎,我填写微信的URL为 http://test.ngrok.com/mywork/app/action/service(项目访问路径), 打开这tomcat,这样不要做任何更改就可以让外网访问了,然后点击申请认证,就可以看到微信平台已经访问到这我的项目了,接下来做一些验证(下篇贴出 验证代码-java版),OK。这下可以看到配置成功了。至此结束,开始微信之旅,这里感谢群里的老K,和其他的一些兄弟。


来源:
http://blog.csdn.net/aj1031689/article/details/17436125

posted @ 2015-10-23 13:11 半导体 阅读(252) | 评论 (0)编辑 收藏

android软银盘始终显示,并显示在焦点上

//强制显示软银盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//edittext默认焦点
scanbill.setFocusable(true);
scanbill.requestFocus();
scanbill.setFocusableInTouchMode(true);

posted @ 2015-07-03 20:09 半导体 阅读(119) | 评论 (0)编辑 收藏

安卓安装

http://wenku.baidu.com/link?url=7c2-Fo9694hJtWxlwsab09f8fv81BPQmrWMQD8z1zxUSnvnM2FfECc4gN0yewgxkSUhLkdbrG4euc2CULcjQHY7fUn5xzjDedELXAcY-2sG&qq-pf-to=pcqq.c2c

posted @ 2015-06-03 12:17 半导体 阅读(101) | 评论 (0)编辑 收藏

[Android实例] 查找手机中所有的APK,并点击其中任一应用程序进入其中

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=203302

posted @ 2015-05-26 11:37 半导体 阅读(84) | 评论 (0)编辑 收藏

android跳转到另一个类再返回当前类和值

第一步:在A类中点击按钮时调用B类
A类中:
int OUTBILL_CODE = 10;//全局啊
  case R.id.diyoutbill:
   intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   intent.setClass(ctx, Itemdiydown.class);
   intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
   startActivityForResult(intent,OUTBILL_CODE);
   break;
第二步:
B类中:
      Bundle bundle = new Bundle();   
      bundle.putString("downtype",pubdowntype);
      bundle.putString("startDate",pubstartDate);
      bundle.putString("endDate", pubendDate);
   Itemdiydown.this.setResult(RESULT_OK, this.getIntent().putExtras(bundle));   
   Itemdiydown.this.finish();//关闭当前窗口 
第三类:
返回A类中:
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  // TODO Auto-generated method stub
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == OUTBILL_CODE&& resultCode == RESULT_OK) {//
    Bundle bundle = data.getExtras();
          startDate = bundle.getString("startDate");
          endDate = bundle.getString("endDate");
          downtype = bundle.getString("downtype");
          //执行事件
  }
 }

posted @ 2015-05-23 16:59 半导体 阅读(92) | 评论 (0)编辑 收藏

android连接数据库sqllist基础操作学习:

基础学习:
http://blog.csdn.net/liuhe688/article/details/6715983/

Android 数据存储——SQLite实例、判断数据库中表是否存在
http://www.2cto.com/kf/201502/375368.html

posted @ 2015-05-23 11:19 半导体 阅读(155) | 评论 (0)编辑 收藏

SharedPreferences存储和读取数据

     摘要: 转自:http://blog.sina.com.cn/s/blog_4f1c99de0101hur1.html除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPrefer...  阅读全文

posted @ 2015-05-21 13:14 半导体 阅读(103) | 评论 (0)编辑 收藏

JAVA获取配置信秘

java.util.Properties props = new java.util.Properties();
  in = getClass().getResourceAsStream("/HotelBeContextDAO.properties");
  try {
   props.load(in);
    props.getProperty("officeCode")
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

posted @ 2015-05-20 09:33 半导体 阅读(69) | 评论 (0)编辑 收藏

用webview写界面,加载本地js,js,html文件

转自:http://www.tuicool.com/articles/3mE7BzR
以jquery mobile为例

1.在android界面拖入一个webview,然后添加一个internet权限

<uses-sdk  
    android:minSdkVersion="8"  
    android:targetSdkVersion="18" />  
<uses-permission android:name="android.permission.INTERNET"/>  
  
<application  
            .............................  
View Code

2.  在assets目录里面放入js,css,html资源文件

3.在写本地html的时候引入assert里的对应路径

<!DOCTYPE html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<meta name="viewport" content="width=device-width, initial-scale=1">   
<title> 标题 </title>  
<link rel="stylesheet" type="text/css" href="file:///android_asset/css/jquery.mobile-1.4.2.min.css">  
<script src="file:///android_asset/js/jquery-1.7.1.min.js"></script>  
<script src="file:///android_asset/js/jquery.mobile-1.4.2.min.js"></script>  
</head>  
<body>  
  
  
 <div data-role="page">  
   <div data-role="header">  
    <h1>My Title</h1>  
   </div>  
     
   <div data-role="content">  
    <ul data-role="listview" data-inset="true" >  
      <li><a href="#">Acura</a></li>  
      <li><a href="#">Audi</a></li>  
      <li><a href="#">BMW</a></li>  
      <li><a href="#">Cadillac</a></li>  
      <li><a href="#">Ferrari</a></li>  
    </ul>   
   </div>  
 </div><!-- /page -->  
  
</body>  
</html>
View Code

4.在代码里访问页面

package com.example.asd_webview;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.webkit.WebSettings;
import android.webkit.WebSettings.RenderPriority;
import android.webkit.WebView;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    WebView webview = (WebView)findViewById(R.id.webView1);
    WebSettings wv_setttig = webview.getSettings();
    wv_setttig.setJavaScriptEnabled(true);
    //wv_setttig.setRenderPriority(RenderPriority.HIGH);
    
    String url = "file:///android_asset/index.html";
    webview.loadUrl(url);
    
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

}
View Code

5.最后效果如下:

posted @ 2015-05-15 17:03 半导体 阅读(330) | 评论 (0)编辑 收藏

CSS图片适应DIV或TD

img{
max-width:100%;height:auto;
}

posted @ 2015-05-15 12:19 半导体 阅读(105) | 评论 (0)编辑 收藏

android在布局中图片大小自适应

一、适应某控制:
      XML:

                <WebView
                    android:id="@+id/awaimage"
                    android:layout_width="90dp"
                    android:layout_height="80dp"
                    android:layout_marginLeft="2dp"
            android:layout_marginRight="2dp"
            android:scaleType="fitXY"

     JAVA:
/*            WebSettings webSettings = holder.imageView.getSettings();    
            webSettings.setUseWideViewPort(true); //设置加载进来的页面自适应手机屏幕 
            webSettings.setLoadWithOverviewMode(true); 
*/

            
//允许使用javascript  
       
//     webSettings.setJavaScriptEnabled(true); 

二、自动适应屏幕大小:
         WebSettings webSettings = holder.imageView.getSettings();   
         webSettings.setUseWideViewPort(true); //设置加载进来的页面自适应手机屏幕
         webSettings.setLoadWithOverviewMode(true); 
         //允许使用javascript  
         webSettings.setJavaScriptEnabled(true);

posted @ 2015-05-13 14:39 半导体 阅读(70) | 评论 (0)编辑 收藏

Android图片处理内存溢出学习

    

        Android图片处理内存溢出学习             

原文:

http://blog.csdn.net/huangbiao86/article/details/8072128

最近遇到一个问题,在Android机器上,调用自带的相机拍摄后获得相处,并且对获得的相片进行缩放,旋转,截取等操作,看似很简单,但是却遇到了一个,让人心疼的问题,我这里用五能手机进行测试,当然,功能测试是没有问题,当发给客户去测试的时候,却出现了内存溢出,哎无言啊...

原来他用的是三星的G3手机进行测试的,我们没有这款手机,后来借别人的G3手机测试,果然也出现这个问题:

  1. java.lang.OutOfMemoryError  
  2. at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)  
  3. at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:518)  
  4. at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:535)  
  5. at com.yippeearts.flashcards.CameraPage$1.onPictureTaken(CameraPage.java:73)  
  6. at android.hardware.Camera$EventHandler.handleMessage(Camera.java:734)  
  7. at android.os.Handler.dispatchMessage(Handler.java:99)  
  8. at android.os.Looper.loop(Looper.java:137)  
  9. at android.app.ActivityThread.main(ActivityThread.java:4514)  
  10. at java.lang.reflect.Method.invokeNative(Native Method)  
  11. at java.lang.reflect.Method.invoke(Method.java:511)  
  12. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)  
  13. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)  
  14. at dalvik.system.NativeStart.main(Native Method)  

这个在不同的手机上出现这种错误还是有点尴尬的。一直以为是对图片的逻辑处理出了什么问题,经过总结发现,估计是因为G3手机拍摄相片分辨率过高,使图片过大,造成过程中内存溢出,通过网上搜索若干解决加载大图片时内存溢出的问题:

 

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。
如果在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常
另外,decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应, 使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源, 否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。


内存溢出解决办法:

1、模拟器RAM比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况,放入到Bitmap的时候,大小会变大,导致超出RAM内存,具体解决办法如下:

  1. // 解决加载图片 内存溢出的问题  
  2. // Options 只保存图片尺寸大小,不保存图片到内存  
  3. BitmapFactory.Options opts = new BitmapFactory.Options();  
  4. // 缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰  
  5. opts.inSampleSize = 4;  
  6. Bitmap bmp = null;  
  7. bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],  
  8.                 opts);  
  9. // 回收  
  10. bmp.recycle();  

2、优化Dalvik虚拟机的堆内存分配

 

对于Android平台来说,其托管层使用的Dalvik JavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法:   private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);即可。

Android堆内存也可自己定义大小

对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了 优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的dalvik.system.VMRuntime类来设置最小堆内存为例:

  1. private final static int CWJ_HEAP_SIZE = 610241024 ;  
  2.   
  3. VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理  

bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法
★android 中用bitmap 时很容易内存溢出,报如下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget

 

主要是加上这段:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;

 eg1:(通过Uri取图片)

  1. private ImageView preview;  
  2. BitmapFactory.Options options = new BitmapFactory.Options();  
  3. options.inSampleSize = 2;//图片大小,设置越大,图片越不清晰,占用空间越小  
  4. Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);  
  5. preview.setImageBitmap(bitmap);  

eg2:(通过路径去图片)

 

  1. private ImageView preview;  
  2. private String fileName= "/sdcard/DCIM/Camera/2010-05-14 16.01.44.jpg";  
  3. BitmapFactory.Options options = new BitmapFactory.Options();  
  4. options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一  
  5. Bitmap b = BitmapFactory.decodeFile(fileName, options);  
  6. preview.setImageBitmap(b);  
  7. filePath.setText(fileName);  

在图片处理的时候,确保图片引用及时回收。

posted @ 2015-05-12 18:54 半导体 阅读(125) | 评论 (0)编辑 收藏

安卓 html显示时,图片无法加载

<!--  hardwareAccelerated解决4.0启动了硬件加速 ,HTML网络图片无法正常显示的问题-->
android:hardwareAccelerated="false"

posted @ 2015-05-05 20:57 半导体 阅读(95) | 评论 (1)编辑 收藏

安卓显示HTML

方法1、使用 CDATA(推荐)
<string name="demoStr"><Data><![CDATA[ <b>ABC</b> ]]> </Data></string>
方法2、转义HTML标签
<string name="myHeadStr">&lt;b>&lt;u>bold, underline &lt;/u>&lt;/b></string>
在程序里引用:
Html.fromHtml(getResources().getString(R.string.myHeadStr));
效果图
android string html标签用法
string.xml代码
Code   ViewCopyPrint
  1. <string name="test"><Data><![CDATA[ <b><font color="#ff0000">ABC</font></b> ]]></Data></string>  

java代码:

Code   ViewCopyPrint
  1. import android.app.Activity;   
  2. import android.app.AlertDialog;   
  3. import android.content.DialogInterface;   
  4. import android.os.Bundle;   
  5. import android.text.Html;   
  6.   
  7. public class testActivity extends Activity {   
  8.     public void onCreate(Bundle savedInstanceState) {   
  9.         super.onCreate(savedInstanceState);   
  10.         AlertDialog.Builder dialog = new AlertDialog.Builder(testActivity.this);   
  11.         dialog.setTitle("测试HTML标签").setMessage(Html.fromHtml(getString(R.string.test))).setPositiveButton(getString(R.string.btn_confirm), new DialogInterface.OnClickListener() {   
  12.             public void onClick(DialogInterface dialog, int which) {   
  13.   
  14.             }   
  15.         }).create().show();   
  16.     }   
  17. }   

posted @ 2015-05-05 13:39 半导体 阅读(45) | 评论 (0)编辑 收藏

eclipse luna+tomcat7.0+JDK7.0+maven环境配置

eclipse luna+tomcat7.0+JDK7.0+maven环境配置

一、下载相关包:

eclipse luna下载地址 :  http://www.eclipse.org/downloads/

JDK7.0下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

Tomcat7.0下载地址:

http://tomcat.apache.org/download-70.cgi

MAVEN下载地址:http://maven.apache.org/

二、环境变量配置(根据软件安装位置配置如下)

JAVA_HOME: D:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\Java\jdk1.6.0_11\;

PATH: D:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\Java\jdk1.6.0_11\bin;

M2_HOME:  D:\Program Files (x86)\apache-maven-3.2.5-bin\apache-maven-3.2.5

PATH D:\Program Files (x86)\apache-maven-3.2.5-bin\apache-maven-3.2.5\bin

三、    运行eclipse luna

绿色环保,直接运行eclipse.exe就行了


四、导入maven项目前配置

    
A,tomcat
配置





B,JDK配置


C,MAVEN
安装:


D,
导入maven项目:


E,
导入后如果项目报错,请执行:

在项目上右击,选择菜单maven->update project MAVEN会自动搜索项目中需要的jar包)

   F、运行服务:

选择run on server->tomcat 7

iE上输入:http://localhost:8080/项目名   测试一下吧。

posted @ 2015-02-12 10:04 半导体 阅读(2693) | 评论 (1)编辑 收藏

MAVEN环境变量配置

一、JDK配置:JAVA_HOME  PATH 
二、新建M2_HOME环境:  如:D:\Program Files (x86)\apache-maven-3.2.5-bin\apache-maven-3.2.5
三、PATH:如:D:\Program Files (x86)\apache-maven-3.2.5-bin\apache-maven-3.2.5\bin
     测试Maven环境是否搭建成功,在CMD下输入命令:
      mvn -v
     编译maven项目方法:cmd下指向项目目录下,运行命行:mvn compile
     mvn te

posted @ 2015-02-11 17:41 半导体 阅读(115) | 评论 (0)编辑 收藏

sqlserver创建用户,指定数据库,指定表的权限

http://www.cnblogs.com/gaizai/archive/2011/07/14/2106617.html
记住要选择dbo_owner 别选sysadmin

posted @ 2014-12-03 16:57 半导体 阅读(146) | 评论 (0)编辑 收藏

IREPORT报表实现

     摘要: 一、在JSP中通过传参数实现源代码:(在jasper模板中定义好查询条件及参数) Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><%@ page language="java" import="java.util...  阅读全文

posted @ 2014-11-19 11:47 半导体 阅读(229) | 评论 (0)编辑 收藏

Spring MVC程序中得到静态资源文件css,js,图片文件的路径问题总结

Spring MVC程序中得到静态资源文件css,js,图片

文件的路径


问题总结

用 Spring MVC 开发应用程序,对于初学者有一个很头疼的问题,那就是程序数据都已经查询出来了,但界面样式仍然十分丑陋,加载不了 css,js,图片等资源文件。当你在浏览器上直接输入某个css文件的路径时,直接得到404错误,而路径肯定没有错,其原因就在于在web.xml 中配置了类似如下的 spring servlet:
程序代码 程序代码

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

请注意  <url-pattern>/</url-pattern> 这表示这个servlet 拦截了所有的请求,包括css,js等。所以出现上面描述的情况。如何解决这个css,js等路径问题呢,有如下几种解决方案.

1. 使用spring mvc resource 去读取静态文件
比如在 WEN-INF 下建立static 文件夹,并在 static 文件夹里面建立css 文件夹,然后建立 1.css  文件.
修改 mvc-dispatcher-servlet.xml 文件
程序代码 程序代码

<mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>

这样配置之后,可以通过 http://your-ip:port/your-app/static/css/1.css 直接访问了。

2. 采用 default servlet
在 web.xml  里面配置
程序代码 程序代码

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

这样做了之后,所有前缀为static 的请求都交给default servlet 去处理。如果你请求  http://your-ip:port/your-app/static/css/1.css ,就表示在 webcontent 目录下的css文件夹下的1.css文件。

3. 通过文件扩展名进行处理
在 web.xml 里面配置
程序代码 程序代码

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>


4. 对spring servlet 不用restful 风格。在url 上加上前缀
程序代码 程序代码

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/app</url-pattern>
</servlet-mapping>

这样做的目的是让 dispatchservlet 去拦截以/app 开头的那些 URL,并不拦截css,js等。

5. 对spring servlet 不用restful 风格。在url 上加上后缀
程序代码 程序代码

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

这样做的目的是让 dispatchservlet 只拦截*.do 的url. 并不拦截css,js等。

上面介绍的5种方法,根据情况自己任意选择一种,现在没办法说那种好,那种方法不好,都有可取之处,用在不同的场景而已。

posted @ 2014-08-24 23:12 半导体 阅读(22482) | 评论 (3)编辑 收藏

easy ui API中文文档

http://www.cnblogs.com/Philoo/archive/2011/10/01/jeasyui_api_layout.html

posted @ 2014-08-20 15:01 半导体 阅读(84) | 评论 (0)编辑 收藏

ajax easy ui总结

1、重新刷新替换iframe:
$("#childRightFrame1").attr('src',"http://www.baidu.com");
2、

取到easyui的tab下iframe方法

http://liuna718-163-com.iteye.com/blog/1672182

3、Easy UI 点击TAB 标签 刷新内容

$('#tabs').tabs({
        onSelect: function (title) {
            var currTab = $('#tabs').tabs('getTab', title);
            var iframe = $(currTab.panel('options').content);
            var src = iframe.attr('src');
            $('#tabs').tabs('update', { tab: currTab, options: { content: createFrame(src)} });
        }
    });

4、页面显示固定值

{
      field : 'tools',
      title : '操作',
      width : 100,
      formatter:function(value,rowData,index){
      var values ="<input type='button' value='设备控制方案'/>";
      return values
      }
      
     }
5、获取选中行的值
  1. var row = grid.datagrid('getSelected');   
  2. if (row){   
  3.   alert(row.id);   
  4. }  

 6、

利用原生JSON对象,将对象转为字符串

 

 

  1. var jsObj = {};  
  2. jsObj.testArray = [1,2,3,4,5];  
  3. jsObj.name = 'CSS3';  
  4. jsObj.date = '8 May, 2011';  
  5. var str = JSON.stringify(jsObj);  
  6. alert(str);  

 

从JSON字符串转为对象

 

 

  1. var jsObj = {};  
  2. jsObj.testArray = [1,2,3,4,5];  
  3. jsObj.name = 'CSS3';  
  4. jsObj.date = '8 May, 2011';  
  5. var str = JSON.stringify(jsObj);  
  6. var str1 = JSON.parse(str);  
  7. alert(str1);  

posted @ 2014-08-20 10:38 半导体 阅读(84) | 评论 (0)编辑 收藏

在JS方法中返回多个值的三种方法 转

在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现:

1 使用数组的方式,如下:

<html>
<head>
    <title>JS函数返回多个值--oec2003</title>
</head>
<body>
    <input type="button" onclick="getNames()" value="test" />

    <script type="text/javascript">
function getData()
{
    var names=new Array("oec2003","oec2004");
    return names;
}
function getNames()
{
    var names=getData();
    alert(getData()[0]); //返回oec2003
}
</script>

</body>
</html>

 

2 将数据封装到Json中返回,如下:

<html>
<head>
<title>JS函数返回多个值--oec2003</title>
</head>
<body>
<input type="button" onclick="getInfo()" value="test"/>
<script type="text/javascript">
function getData()
{
    var info={"name":"oec2003","age":"25"};
    return info;
}
function getInfo()
{
    var info=getData();
    var name=info["name"];
    var age=info["age"];
    alert("姓名:"+name+" 年龄:"+age);
}
</script>
</body>
</html>

更详细的Json的介绍请看这里

3 这是最简单的一种方法,看下面代码:

<html>
<head>
<title>JS函数返回多个值--oec2003</title>
</head>
<body>
<input type="button" onclick="getInfo()" value="test"/>
<script type="text/javascript">
    function getData()
    {
        return ["oec2003", 25]
    }
    function getInfo()
    {
        var info = getData();
        alert("姓名:" + info[0] + "年龄:" + info[1]);
    }
</script>
</body>
</html>

posted @ 2014-08-18 08:23 半导体 阅读(87) | 评论 (0)编辑 收藏

Tomcat部署发布多个工程详细配置;

 

  apache-tomcat-7.0.40配置:

     一、配置解决多个项目出现内存溢出的问题:
 
      找到:D:\apache-tomcat-7.0.40\bin\catalina.bat
      添加:
              set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
    
     在:   echo Using CATALINA_BASE:   "%CATALINA_BASE%"  的上一行;
    
    找到:D:\apache-tomcat-7.0.40\bin\catalina.sh
    添加:
            JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
   
   在:  echo "Using CATALINA_BASE:   $CATALINA_BASE"  的上二行;
    
  二、配置项目路径:
       
     1.找到:D:\apache-tomcat-7.0.40\conf\server.xml
     2.注释掉原来的  Host  标签及标签内的所有:
   eg: 
  <!-- <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true"> -->
   <!-- SingleSignOn valve, share authentication between web applications
    Documentation at: /docs/config/valve.html -->
   <!--
   <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
   -->

   <!-- Access log processes all example.
    Documentation at: /docs/config/valve.html
    Note: The pattern used is equivalent to using pattern="common" -->
   <!-- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log." suffix=".txt"
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />

        </Host> -->
      3.添加:(同级位置)
     <Host name="localhost" debug="0" appBase="webapps"
                    unpackWARs="true"  xmlValidation="false" xmlNamespaceAware="false">
         <Context path="/sxzx" docBase="D:\apache-tomcat-7.0.40\webapps\sxzx"  reloadable="true"   caseSensitive="false"   debug="0"></Context>
      <Context path="/ywgl" docBase="D:\apache-tomcat-7.0.40\webapps\ywgl" reloadable="true"   caseSensitive="false"   debug="0"></Context>
     </Host>
  
      附:Host标签内的属性及值不用修改;
       只改变Context标签内的值:path:访问时候的工程名;
                             docBase:工程部署的位置;
           其他属性及值不用修改;
  
                                                         \ywgl\
   三、两个部署的项目:D:\apache-tomcat-7.0.40\webapps\sxzx\WEB-INF\web.xml中分别添加:(区别另一个项目)
    
    <context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>web1.root</param-value>
          </context-param>
   
    <context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>web2.root</param-value>
          </context-param>
   
   
  *四、一定注意环境变量JDK的版本 :JAVA_HOME=jdk1.6.0_11、JRE_HOME=jre6: 下发布会有启动报错,只能发布成功一个的情况;  
              JAVA_HOME=jdk1.6.0_16、JRE_HOME=jre6: 下启动一闪而过或则启动失败;
                                      JAVA_HOME=jdk1.7.0_17、JRE_HOME=jre7: 下发布成功,没有报错信息; 
   
   

posted @ 2014-05-21 14:23 半导体 阅读(1060) | 评论 (0)编辑 收藏

项管万能模板

摘要:
2011 年8 月(记住,一定要写和考试时间接近的),我作为项目经理参与了xx 省公安厅
xxxxx项目,该项目投资共500 万元人民币(一定需要写),建设工期为1年,通过该项目的建
设,实现了该省公安信息化工作的……..(自己补充完善),该项目于2012 年8 月,通过了业主
方的验收,赢得了用户的好评。本文结合作者的实际经验,以该项目为例,讨论了信息系统项
目建设过程中的xx 管理(具体根据考试题目来),主要从如下几个方面进行了阐述:(一定要
根据题目,如果说是写进度管理的过程,那就是活动定义,活动排序,资源等等----一定要和下
面正文里的提纲对应上。)------摘要就是这个格式,可以写350-400 字。
正文:
2011年8月,我作为项目经理参与了xx 省公安厅xxxxx项目,该项目投资共500万元人
民币,建设工期为1 年,通过该项目的建设,实现了该省公安信息化工作的……..(自己补充完
善),该系统采用java 语言开发,数据库采用oracle 10g,用到了什么中间件、采用什么架构,
数据库服务器、应用服务器分别采用什么??这些大家根据自己的项目去写,写个500字左右,
别太多,别太少。
由于本项目的顺利上线涉及到业务的考核,因此,在本项目中,xx 管理尤为重要,在本项
目中,我作为项目经理特别除了对其余管理领域进行克制恪守的管理外,特别对xx 管理从如
下几个方面进行了管理-----这是一个过渡段,非常重要。

结尾:(这2 个字在论文里可以不写,我这里写,是让大家好看)
经过我们团队不懈的努力,历时1 年,本项目终于于2012 年8 月,通过了业主方组织的
验收,为用户解决了什么问题,或者是达到了什么目的(根据自己的项目去写)得到了业主的
好评。本项目的成功得益于我成功的xx 管理。当然,在本项目中,还有一些不足之处,比如:
在项目的实施过程中,由于项目组2 名成员因为自身原因突然离职,导致项目的团队建设出现
一些小问题,还有,曾经由于需要购买的服务器由于连日暴雨的不可抗力导致环境搭建进度出
现些许异常(自己去想一些小问题,切忌,别出现什么大问题),不过,经过我后期的纠偏,
并没有对项目产生什么影响。在后续的学习和工作中,我将不断的充电学习,和同行进行交流,
提升自己的业务和管理水平,力争为我国信息化建设做出自己的努力。

posted @ 2014-03-27 10:47 半导体 阅读(89) | 评论 (0)编辑 收藏

spring事务配置及事务测试

方法一:
事务配置:applicatoncontext.xml
 1<!-- 配置事务管理器 -->
 2    <bean id="transactionManager"
 3        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 4        <property name="sessionFactory">
 5            <ref local="sessionFactory" />
 6        </property>
 7    </bean>
 8    <!---->
 9    <bean id="txProxyTemplate" abstract="true"
10        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
11        <property name="transactionManager">
12            <ref bean="transactionManager" />
13        </property>
14        <property name="transactionAttributes">
15            <props>
16                <prop key="query*">PROPAGATION_REQUIRED,readOnly,-Exception</prop>
17                <prop key="find*">PROPAGATION_REQUIRED,readOnly,-Exception</prop>
18                <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
19                <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
20                <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
21                <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
22            </props>
23        </property>
24    </bean>
事务测试(BO继承事务):applicationcontext.xml
<bean id="SysJobBO" parent="txProxyTemplate">
        
<property name="target">
            
<bean
                
class="com.gzlt.sys.user.bo.impl.SysJobBOImpl">
                
<property name="commonDAO"
                    ref
="CommonDAO">
                
</property>
            
</bean>
        
</property>
    
</bean>

BOIMPL中:

    @Override
    public boolean updates(SysJob sysJob) throws Exception {
        // TODO Auto-generated method stub
        commonDAO.add(sysJob);
        sysJob.setIsLeaf("453322222222222222ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss");
        commonDAO.add(sysJob);
        return true;
    }

如果事务未起作用,请查看:
1、action中的方法是不是不以add,update,。。开头。
2、有可能是抛出的异常将事务舍弃了。 如果try catch   异常为 applicationException  请改为  applicationException 试试。

方法二:
 

posted @ 2014-03-26 16:46 半导体 阅读(163) | 评论 (0)编辑 收藏

映射文件配置org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():

引起问题的原因:

由Hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。

首先我的表(Info)由两个字段组成,即:

int id;//主建

String name;

(自己做测试,所以就简单的建了个表)

由Hibernate生成的Info.hbm.xml中是这样写的:

-----------------------------------------------------

<id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="assigned"/>
</id>

-----------------------------------------------------

<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键)

而我这里由于id本身就是主键,所以column的属性便是id

下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的:

--------------------------------------------------------------------------------

“assigned”
主键由外部程序负责生成,在   save()   之前指定一个。
   
“hilo”
通过hi/lo   算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
   
“seqhilo”
与hilo   类似,通过hi/lo   算法实现的主键生成机制,需要数据库中的   Sequence,适用于支持   Sequence   的数据库,如Oracle。
   
“increment”
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
   
“identity”
采用数据库提供的主键生成机制。如DB2、SQL   Server、MySQL   中的主键生成机制。
   
“sequence”
采用数据库提供的   sequence   机制生成主键。如   Oralce   中的Sequence。
   
“native”
由   Hibernate   根据使用的数据库自行判断采用   identity、hilo、sequence   其中一种作为主键生成方式。
   
“uuid.hex”
由   Hibernate   基于128   位   UUID   算法   生成16   进制数值(编码后以长度32   的字符串表示)作为主键。
   
“uuid.string”
与uuid.hex   类似,只是生成的主键未进行编码(长度16),不能应用在   PostgreSQL   数据库中。
     
“foreign”
使用另外一个相关联的对象的标识符作为主键。

--------------------------------------------------------------------------------

看了上面的介绍,再看看代码,原来是<Generator>属性设置有问题。

然后改为"identity"、"native"问题便解决。



   在Hibernate中的映射文件配置中,如果在数据库中设置一列为自动增长列,但又不是主键,则在配置时需要设置 property 节点的 "insert" 和“update” 属性为false. 即: <property column="ID" name="id" type="int" insert="false" update="false"/>

posted @ 2014-03-16 22:20 半导体 阅读(375) | 评论 (0)编辑 收藏

myeclipse编译慢的问题

删除.project配置中

1、javascript validation和jtds 选项。
  <buildCommand>
   <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
   <arguments>
   </arguments>
  </buildCommand>

2、打开myeclipse时,会提示是否加入javascriptvalidation 选择否。

再编译时,速度会快很多倍。

posted @ 2014-01-08 15:43 半导体 阅读(227) | 评论 (0)编辑 收藏

ORACLE转为sqlservr碰到的问题集

1、更改配置:application.xml

 <!-- PROXOOL连接池的设置数据源sqlserver -->
 
 <bean id="dataSource"
  class="org.logicalcobwebs.proxool.ProxoolDataSource">
  <property name="driver">
   <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
  </property>
  <property name="driverUrl">
   <value>jdbc:sqlserver://127.0.0.1:1433; DatabaseName=ctts</value>
  </property>
  <property name="user">
   <value>sa</value>
  </property>
  <property name="password">
   <value>sadmin</value>
  </property>
  <property name="alias">
   <value>ctts</value>
  </property>

        <property name="maximumActiveTime" value="300000"/> 
        <property name="prototypeCount" value="0"/> 
        <property name="maximumConnectionCount" value="12000"/> 
        <property name="minimumConnectionCount" value="1"/> 
        <property name="simultaneousBuildThrottle" value="2000"/> 
        <property name="houseKeepingTestSql" value="select CURRENT_DATE"/> 
 </bean>
2、hibernate配置更改:
  <property name="dialect">
   org.hibernate.dialect.SQLServerDialect
  </property>
3、oracle字段类型为DATE,牵移到sqlserver下,会出现类型转换错误,如:

           将 nvarchar 值转换为 JDBC 数据类型 TIMESTAMP 时发生错误   
        sqlserver反映射后,date类型为:java.sql.Timestamp

         oracle反映射后,date类型为:java.util.Date    

    解决办法:方法一:oracle转换为sqlserver时,DATE类型全部转换为DATETIME.
                    方法二:oracle日期类型全部用varchr(7)  ,这样就不存在转换问题。


 

posted @ 2014-01-08 11:28 半导体 阅读(200) | 评论 (0)编辑 收藏

ROW_NUMBER() OVER函数的基本用法

ROW_NUMBER() OVER函数的基本用法

ROW_NUMBER() OVER函数的基本用法用法

 转自:http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。
示例:
xlh           row_num
1700              1
1500              2
1085              3
710                4

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

实例:

初始化数据

create table employee (empid int ,deptid int ,salary decimal(10,2))
insert into employee values(1,10,5500.00)
insert into employee values(2,10,4500.00)
insert into employee values(3,20,1900.00)
insert into employee values(4,20,4800.00)
insert into employee values(5,40,6500.00)
insert into employee values(6,40,14500.00)
insert into employee values(7,40,44500.00)
insert into employee values(8,50,6500.00)
insert into employee values(9,50,7500.00)

数据显示为

empid       deptid      salary
----------- ----------- ---------------------------------------
1           10          5500.00
2           10          4500.00
3           20          1900.00
4           20          4800.00
5           40          6500.00
6           40          14500.00
7           40          44500.00
8           50          6500.00
9           50          7500.00

需求:根据部门分组,显示每个部门的工资等级

预期结果:

empid       deptid      salary                                  rank
----------- ----------- --------------------------------------- --------------------
1           10          5500.00                                 1
2           10          4500.00                                 2
4           20          4800.00                                 1
3           20          1900.00                                 2
7           40          44500.00                               1
6           40          14500.00                               2
5           40          6500.00                                 3
9           50          7500.00                                 1
8           50          6500.00                                 2

SQL脚本:

SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee

 

转自:http://www.cnblogs.com/digjim/archive/2006/09/20/509344.html

我们知道,SQL Server 2005和SQL Server 2000 相比较,SQL Server 2005有很多新特性。这篇文章我们要讨论其中的一个新函数Row_Number()。数据库管理员和开发者已经期待这个函数很久了,现在终于等到了!


 通常,开发者和管理员在一个查询里,用临时表和列相关的子查询来计算产生行号。现在SQL Server 2005提供了一个函数,代替所有多余的代码来产生行号。

 我们假设有一个资料库[EMPLOYEETEST],资料库中有一个表[EMPLOYEE],你可以用下面的脚本来产生资料库,表和对应的数据。

 USE [MASTER]
GO

IF  EXISTS (SELECT NAME FROM SYS.DATABASES WHERE NAME = N'EMPLOYEE TEST')
DROP DATABASE [EMPLOYEE TEST]
GO
CREATE DATABASE [EMPLOYEE TEST]
GO
USE [EMPLOYEE TEST]
GO

IF  EXISTS SELECT * FROM SYS.OBJECTS HERE OBJECT_ID = OBJECT_ID(N'[DBO].[EMPLOYEE]') AND TYPE IN (N'U'))
DROP TABLE [DBO].[EMPLOYEE]
GO

CREATE TABLE EMPLOYEE (EMPID INT, FNAME VARCHAR(50),LNAME VARCHAR(50))
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021110, 'MICHAEL', 'POLAND')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021110, 'MICHAEL', 'POLAND')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021115, 'JIM', 'KENNEDY')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2121000, 'JAMES', 'SMITH')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2011111, 'ADAM', 'ACKERMAN')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (3015670, 'MARTHA', 'LEDERER')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (1021710, 'MARIAH', 'MANDEZ')
GO

 我们可以用下面的脚本查询EMPLOYEE表。

 SELECT EMPID, RNAME, LNAME FROM EMPLOYEE

 这个查询的结果应该如图1.0 

2021110

MICHAEL

POLAND

2021110

MICHAEL

POLAND

2021115

JIM

KENNEDY

2121000

JAMES

SMITH

2011111

ADAM

ACKERMAN

3015670

MARTHA

LEDERER

1021710

MARIAH

MANDEZ


图1.0

 在SQL Server 2005,要根据这个表中的数据产生行号,我通常使用下面的查询。 

SELECT ROWID=IDENTITY(int,1,1) , EMPID, FNAME, LNAME INTO EMPLOYEE2 FROM EMPLOYEE ORDER BY EMPID

 这个查询创建了一个新的表,用identify函数来产生行号。我们用下面的查询来看看这个表的数据。 

SELECT ROWID, EMPID, FNAME, LNAME FROM EMPLOYEE2

 上面的查询结果如图1.1 

1

1021710

MARIAH

MANDEZ

2

2011111

ADAM

ACKERMAN

3

2021110

MICHAEL

POLAND

4

2021110

MICHAEL

POLAND

5

2021115

JIM

KENNEDY

6

2121000

JAMES

SMITH

7

3015670

MARTHA

LEDERER


图1.1

 这个查询结果很明显EMP=2021110的行是重复的数据。

 要删除EMPID=2021110的重复数据,我们必须在EMPLOYEE2表中删除,不能直接在EMPLOYEE中删除。

 SQL Server 2005提供了一个新的函数(Row_Number())来产生行号。我们可以使用这个新函数来删除原来表中的重复数据,只用通常的表达方式再加上Row_Number()函数。

 让我们用Row_Number()函数根据EMPID来产生ROWID。

 SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE

 上面的查询结果如图1.2 

1

1021710

MARIAH

MANDEZ

2

2011111

ADAM

ACKERMAN

3

2021110

MICHAEL

POLAND

4

2021110

MICHAEL

POLAND

5

2021115

JIM

KENNEDY

6

2121000

JAMES

SMITH

7

3015670

MARTHA

LEDERER


图1.2

 在这个结果中,我们可以区别EMPID是2021110的重复数据。

 我们可以用通用表查询表达式和Row_Numner()函数来选出重复的那行数据。

 WITH [EMPLOYEE ORDERED BY ROWID] AS
(SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
SELECT * FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4

上面的查询结果如图1.3 

4

2021110

MICHAEL

POLAND


图1.3

 这一行重复的数据可以用下面这个通用表和Row_Number()函数来删除。

 WITH [EMPLOYEE ORDERED BY ROWID] AS
(SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
DELETE FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4

 删除以后,我们可以用下面的查询语句看一下结果。

 SELECT * FROM EMPLOYEE

 这个查询结果如图1.4 

2021110

MICHAEL

POLAND

2021115

JIM

KENNEDY

2121000

JAMES

SMITH

2011111

ADAM

ACKERMAN

3015670

MARTHA

LEDERER

1021710

MARIAH

MANDEZ


图 1.4

 这里我们可以看到,重复的数据已经被删除了。

 总结

在这篇文章中,我们讨论了SQL Server 2005 的新特性Row_Number()函数,还有通常的表表达式,然后如何使用这两个来删除重复的行。

posted @ 2014-01-08 11:21 半导体 阅读(81) | 评论 (0)编辑 收藏

发送邮件时,报错:Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

如果你用myEclipse进行开发的话,运行时可能会出现以下的错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
原因是jar包版本不统一,解决方法如下:

删除Java EE 5 Libraries/javaee.jar/mail里的包有东西.

具体方法如下:
用rar打开X:/Program Files/MyEclipse 6.0/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_6.0.1.zmyeclipse601200710/data/libraryset/EE_5/javaee.jar
,然后删除mail,一切就ok了.

posted @ 2013-12-23 23:12 半导体 阅读(201) | 评论 (0)编辑 收藏

struts的html标签和html中的标签有什么区别 .

struts的html标签<html:form></html:from>和html标签<form></from>有什么区别


1、无论是struts1还是struts2的标签,都提供了他们对于验证框架的支持,给我们实现验证提供了很多方便。
struts的html标签<html:form></html:from>和Struts2的<s:form></s:form>标签是对form标签的封装,是struts框架自己定义的标签,便于和他的mvc中的form结合使用。但经过查看两个框架的源码发现,最好还是用html标签,建议少用struts标签,因为一个标签就一位一个class,那必然占用jvm的内存,造成页面加载速度缓慢。

就效果而言,他们达到的效果是一样的,struts 的html标签不能脱离动态form而独立运用。但是我们在平时的开发过程中,有的情况下并不需要struts form的校验功能,但同时希望能把页面的值保留下来,比如:查询条件的输入。所以他有他的局限性


<html:form>的三个特有作用
1.自动生成html文档的<form>标签,其focus属性还可以生成相应的JavaScript代码
2.自动获取action属性中路径所对应的scope域中的FormBean,存在则获取,不存在则创建新的,再把这个FormBean以一个特殊关键字保存在request中,以便其中的<html:xxx>获取值是使用
3.自动检查Session中是否存在Token,是则生成隐藏表单域,以防止表单的重复提交
还有些标签用起来要比普通的html标签方便的多(代码量变少了),比如html_link 、 html_optionsCollection 、 html_checkbox 、 html_multibox 等,像这些下拉列表、复选框等的回显用Struts的html标签非常容易实现,普通html也简单,但代码一大堆。

posted @ 2013-12-19 19:25 半导体 阅读(106) | 评论 (0)编辑 收藏

EL表达式语法 JSTL语法

IF表达式判断:
     <c:choose><c:when test="${param.type=='1'}">星级</c:when><c:otherwise>酒店名称</c:otherwise></c:choose>

获取LIST值:
获取一个:
${roomList[0].roomTypeName}
循环获取:
<select
              name="myOrderform.roomTypeName" id="roomTypeName"
              onChange="fuzhi(this)" isnull="2" desc="房间种类"
              style="width:110px;">

 

               <c:forEach var="rooms" items="${roomList}">
                <option value="${rooms.roomTypeName}|${rooms.lowPrice}">${rooms.roomTypeName}</option>

               </c:forEach>
</select>


 

posted @ 2013-12-14 12:44 半导体 阅读(120) | 评论 (0)编辑 收藏

取得某个文件夹的真实路径

String rootPath = ServletActionContext.getServletContext().getRealPath("/upload_files");

posted @ 2013-12-14 11:00 半导体 阅读(165) | 评论 (0)编辑 收藏

List和arrayList ,Map和HashMap的区别

 

 一个 List<Map>变量的内部数据结构

[{F_CITY_NAME=徐州, CNT=1141}, {F_CITY_NAME=镇江, CNT=577}]

一个Map变量的内部数据结构

{泰州非边界=7, 宿迁无=26, 无锡省边界=6, 常州非边界=10, 淮安地市边界=70, 南京null=21}

 


jsp页面中不能通过${list.size}取列表长度,而是
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
list
的长度是:${fn:length(list)}


List
是接口,List特性就是有序,会确保以一定的顺序保存元素.
ArrayList
是它的实现类,是一个用数组实现的List.
Map
是接口,Map特性就是根据一个对象查找对象.
HashMap
是它的实现类,HashMaphash表实现的Map,就是利用对象的hashcode(hashcode()Object的方法)进行快速散列查找.(关于散列查找,可以参看<<数据结构>>)


一般情况下,如果没有必要,推荐代码只同List,Map接口打交道.
比如:List list = new ArrayList();
这样做的原因是list就相当于是一个泛型的实现,如果想改变list的类型,只需要:
List list = new LinkedList();//LinkedList
也是List的实现类,也是ArrayList的兄弟类
这样,就不需要修改其它代码,这就是接口编程的优雅之处.
另外的例子就是,在类的方法中,如下声明:
private void doMyAction(List list){}
这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.


如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.

PS:MAP是存在内存中,所以他的读取速度要比List快。

 

posted @ 2013-11-28 15:36 半导体 阅读(104) | 评论 (0)编辑 收藏

ServletContextListener使用详解 .

摘自:http://blog.csdn.net/zhaozheng7758/article/details/6103700
Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。

Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由 ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。

l  contextInitialized(ServletContextEvent sce) :当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。

l  contextDestroyed(ServletContextEvent sce) :当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的ServletFilter 过滤器。

下面通过两个具体的例子来介绍 ServletContextListener 的用法。

例一:在服务启动时,将数据库中的数据加载进内存,并将其赋值给一个属性名,其它的 Servlet 就可以通过 getAttribute 进行属性值的访问。有如下两个步骤:

1 ServletContext 对象是一个为整个 web 应用提供共享的内存,任何请求都可以访问里面的内容  

2 :如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有:  

1 实现 servletContextListerner 接口 并将要共享的通过 setAttribute name,data )方法提交到内存中去  

2 )应用项目通过 getAttribute(name) 将数据取到

package ServletContextTest; 

 

import java.sql.Connection; 

import java.sql.PreparedStatement; 

import java.sql.ResultSet; 

import java.util.HashMap; 

import java.util.Map; 

 

import javax.servlet.ServletContext; 

import javax.servlet.ServletContextEvent; 

import javax.servlet.ServletContextListener; 

 

import util.ConnectTool; 

 

public class ServletContextLTest implements ServletContextListener{ 

    // 实现其中的销毁函数

    public void contextDestroyed(ServletContextEvent sce) { 

        System.out.println("this is last destroyeed");    

    } 

    // 实现其中的初始化函数,当有事件发生时即触发

    public void contextInitialized(ServletContextEvent sce) { 

        ServletContext sct=sce.getServletContext(); 

        Map<Integer,String> depts=new HashMap<Integer,String>(); 

        Connection connection=null; 

        PreparedStatement pstm=null; 

        ResultSet rs=null; 

         

        try{ 

            connection=ConnectTool.getConnection(); 

            String sql="select deptNo,dname from dept"; 

            pstm=connection.prepareStatement(sql); 

            rs=pstm.executeQuery(); 

            while(rs.next()){ 

                depts.put(rs.getInt(1), rs.getString(2)); 

            } 

            // 将所取到的值存放到一个属性键值对中

            sct.setAttribute("dept", depts); 

            System.out.println("======listener test is beginning========="); 

        }catch(Exception e){ 

            e.printStackTrace(); 

        }finally{ 

            ConnectTool.releasersc(rs, pstm, connection); 

        } 

    } 

在完成上述编码后,仍需在 web.xml 中进行如下配置,以使得该监听器可以起作用。

<listener> 

   <listener-class>ServletContextTest.ServletContextLTest</listener-class> 

</listener> 

在完成上述配置后, web 服务器在启动时,会直接加载该监听器,通过以下的应用程序就可以进行数据的访问。

package ServletContextTest; 

import java.io.IOException; 

import java.io.PrintWriter; 

import java.util.*; 

import javax.servlet.ServletContext; 

import javax.servlet.ServletException; 

import javax.servlet.http.HttpServlet; 

import javax.servlet.http.HttpServletRequest; 

import javax.servlet.http.HttpServletResponse; 

public class CreateEmployee extends HttpServlet{ 

 

    @Override 

    protected void service(HttpServletRequest request, HttpServletResponse response) 

            throws ServletException, IOException { 

        ServletContext sct=getServletConfig().getServletContext(); 

// 从上下文环境中通过属性名获取属性值

        Map<Integer,String> dept=(Map<Integer,String>)sct.getAttribute("dept"); 

        Set<Integer> key=dept.keySet(); 

        response.setContentType("text/html;charset=utf-8"); 

        PrintWriter out=response.getWriter(); 

        out.println("<html>"); 

        out.println("<body>"); 

        out.println("<form action='/register' action='post'>"); 

        out.println("<table alignb='center'>"); 

        out.println("<tr>"); 

        out.println("<td>"); 

        out.println("username:"); 

        out.println("</td>"); 

        out.println("<td>"); 

        out.println("<input type='text' name='username'"); 

        out.println("</tr>"); 

        out.println("<tr>"); 

        out.println("<td>"); 

        out.println("city:"); 

        out.println("</td>"); 

        out.println("<td>"); 

        out.println("<select name='dept'"); 

        for(Integer i:key){ 

            out.println("<option value='"+i+"'>"+dept.get(i)+"</option>"); 

        } 

        out.println("</select>"); 

        out.println("</td>"); 

        out.println("<tr>"); 

        out.println("</table>"); 

        out.println("</form>"); 

        out.println("</body>"); 

        out.println("</html>"); 

        out.flush(); 

    } 

例二:书写一个类用于统计当Web 应用启动后,网页被客户端访问的次数。如果重新启动Web 应用,计数器不会重新从1 开始统计访问次数,而是从上次统计的结果上进行累加。在实际应用中,往往需要统计自Web 应用被发布后网页被客户端访问的次数,这就要求当Web 应用被终止时,计数器的数值被永久存储在一个文件中或者数据库中,等到Web 应用重新启动时,先从文件或数据库中读取计数器的初始值,然后在此基础上继续计数。

向文件中写入或读取计数器的数值的功能可以由自定义的 MyServletContextListener 类来完成,它具有以下功能:

1 、在 Web 应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter 对象存放到 Web 应用范围内。存放计数器的文件的路径为helloapp/count/count.txt

2 、在Web 应用终止时把Web 应用范围内的计数器的数值保存到count.txt 文件中。

package ServletContextTest; 

import javax.servlet.ServletContext; 

import javax.servlet.ServletContextEvent; 

import javax.servlet.ServletContextListener; 

public class MyServletContextListener implements ServletContextListener{

  public void contextInitialized(ServletContextEvent sce){

    System.out.println("helloapp application is Initialized.");

    // 获取 ServletContext 对象

    ServletContext context=sce.getServletContext();

    try{

       // 从文件中读取计数器的数值

       BufferedReader reader=new BufferedReader(

           new InputStreamReader(context.

           getResourceAsStream("/count/count.txt")));

       int count=Integer.parseInt(reader.readLine());

       reader.close();

       // 创建计数器对象

       Counter counter=new Counter(count);

       // 把计数器对象保存到 Web 应用范围

       context.setAttribute("counter",counter);

       } catch(IOException e) {

          e.printStackTrace();

       }

   }

   public void contextDestroyed(ServletContextEvent sce){

       System.out.println("helloapp application is Destroyed.");

       // 获取 ServletContext 对象

       ServletContext context=sce.getServletContext();

       // Web 应用范围获得计数器对象

       Counter counter=(Counter)context.getAttribute("counter");

       if(counter!=null){

       try{

          // 把计数器的数值写到 count.txt 文件中

          String filepath=context.getRealPath("/count");

          filepath=filepath+"/count.txt";

          PrintWriter pw=new PrintWriter(filepath);

          pw.println(counter.getCount());

          pw.close();

         } catch(IOException e) {

             e.printStackTrace();

         }

     }

   }

}

将用户自定义的 MyServletContextListener 监听器在 Servlet 容器进行注册, Servlet 容器会在启动或终止 Web 应用时,会调用该监听器的相关方法。在 web.xml 文件中, <listener> 元素用于向容器注册监听器:

<listener>
<listener-class>
ServletContextTest
.MyServletContextListener<listener-class />
</listener>

通过上述两个例子,即可以非常清楚的了解到 ServletContextListener 接口的使用方法及技巧。 Container 加载Web 应用程序时(例如启动 Container 之后),会呼叫contextInitialized() ,而当容器移除Web 应用程序时,会呼叫contextDestroyed () 方法。 通过 Tomcat 控制台的打印结果的先后顺序,会发现当 Web 应用启动时,Servlet 容器先调用contextInitialized() 方法,再调用lifeInitinit() 方法;当Web 应用终止时,Servlet 容器先调用lifeInitdestroy() 方法,再调用contextDestroyed() 方法。由此可见,在Web 应用的生命周期中,ServletContext 对象最早被创建,最晚被销毁。  

posted @ 2013-11-20 10:13 半导体 阅读(132) | 评论 (0)编辑 收藏

航信接口碰到的问题锦集

1、加入包:httpcore-4.2.1.jar hotelbe-pure-sdk-6.1.1.jar  date4j-1.0.0.jar包   httpclient-4.2.1.jar

重点说一下import org.apache.http.Consts;
这个类在httpcore-4.2.1.jar这个包中,以前的版本如httpcore-4.0.1.jar 没有。(找S我了)

posted @ 2013-11-15 19:20 半导体 阅读(117) | 评论 (0)编辑 收藏

配置sqlserver2000数据源

1、sqlserver2000配置加入包:msbase.jar,mssqlserver.jar,msutil.jar
用得tomcat6.0配置数据库连接池
并在tomcat的lib下加入上文件
和WebRoot\WEB-INF\lib下加入上文件
 
dbcp连接池程序包,要在同一目录下即web-inf/lib下
 
 
 
SQL Server2000的JDBC驱动程序的DriverClassName是 "com.microsoft.jdbc.sqlserver.SQLServerDriver"

SQL Server2005的JDBC驱动程序的DriverClassName是 "com.microsoft.sqlserver.jdbc.SQLServerDriver"

Tomcat *\conf\context.xml配置
 <Resource name="jdbc/pubs" auth="Container" type="javax.sql.DataSource" maxActive="100" maxldle="30"
    maxWait="10000" username="sa" password="sa" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
    url="jdbc:microsoft:sqlserver://localhost:1433;tabaseName=webshop"
    factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"/>
    <ResourceLink global="jdbc/pubs" name="jdbc/pubs" type="javax.sql.DataSource"/>
并web.xml里配置
<resource-ref>
      <description>DataSource</description>
      <res-ref-name>jdbc/pubs</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
   </resource-ref>
applicationContext.xml
设置
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
     <property name="jndiName" value="java:/comp/env/jdbc/pubs"/>
 </bean>


2、SQL Error: 208, SQLState: 42S02
HBM中catalog scheme的配置问题.

posted @ 2013-11-03 11:15 半导体 阅读(275) | 评论 (0)编辑 收藏

DIV切换 标签页切换

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
function aa(){
 contain.style.visibility=contain.style.visibility=="hidden"?"visible":"hidden";
}
</SCRIPT>
</HEAD>
<BODY>
<button onclick=aa()>test</button>
<div id="contain">
<iframe id="iframe1" name="iframe1" src="http://www.51js.com" style="width:400px;height:200px"></iframe>
</div>
</BODY>
</HTML>

posted @ 2013-10-31 13:37 半导体 阅读(94) | 评论 (0)编辑 收藏

连接池配置

配置连接池

 本文旨在给程序开发人员提供一个比较具体的Tomcat连接池参考方案,为了提高文章的可读性,文章前端引用了一位前辈的话,如果构成误解,请多多谅解,本文不是从商业考虑的。有问题请联系作者MSN:hpj2001(at)hotmail.com,Email:tocow(at)google.com。

连接池简介
   程序开发,存在很多问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的Web应用,尤其是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。
      数据库连接池(connection pool)的工作原理:
      由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。
对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配、释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发、测试及性能调整提供依据。
一、Tomcat一般性说明
1、本压缩包内的tomcat为apache-tomcat-5.5.20,截止到2006-10-12,是www.apache.org上最新的tomcat版本。
2、Tomcat使用的端口都是默认的。两个比较重要的端口说明,shutdown port:8005;non-SSL HTTP/1.1 Connector port:8080。
3、涉及到修改的文件:
   a../ conf下server.xml、web.xml
   b../common/lib下增加ms-sql jdbc的三个jar包msbase.jar、mssqlserver.jar、msutil.jar
二、Tomcat配置连接池方案
       本文针对的是tomcat 5.5版本的连接池介绍,其它版本可能不适用。
       数据源可以配置成全局的和局部的:可以在任意Context中引用全局的数据源,在某一Context配置的数据源,不能在其它Context引用它。理解了全局和局部数据源的关系,下面就来介绍一下详细配置说明,如下:
1、编辑打开./confCatalina/localhost/gdczsam.xml可以看到:
<!--F hpj 2006-10-12 
    Defualt, we set all different Resources as Global-Resource[which defined in server.xml <GlobalNamingResources></GlobalNamingResources>], 
    and get special Resource we needed in per-web-application contexts from Global-Resource.
    otherwise,we can set Resource we needed in any special Context, all two solutions are offered.

    A.during application development set reloadable="true", when deployed production set reloadable="false"

    B.many other datebase, url and driverClassName like underside list:
      1.ms-sql       driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
                     url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=SAM_GDCZ"
加载包mssqlserver.jar、msbase.jar、msutil.jar.

      2.oracle       driverClassName="oracle.jdbc.driver.OracleDriver"
                     url="jdbc:oracle:thin:@127.0.0.1:1521:SAM_GDCZ"

      3.postgresql   driverClassName="org.postgresql.Driver"
                     url="jdbc:postgresql://127.0.0.1:5432/SAM_GDCZ"

      4.mysql        driverClassName="org.gjt.mm.mysql.Driver"[old mySql jdbc driver]
                     driverClassName="com.mysql.jdbc.Driver"
                     url="jdbc:mysql://127.0.0.1:3306/SAM_GDCZ"
-->

<Context docBase="setup directory" path="/gdczsam" reloadable="true" cookies="true" crossContext="true" privileged="true" antiResourceLocking="false" antiJARLocking="false">

<!--
    <Resource name="jdbc/mssql-SAM_GDCZ"
              auth="Container"
                type="javax.sql.DataSource"
                driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
                url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=SAM_GDCZ"
                username="sa"
                password=""
                maxIdle="30"
                maxWait="10000"
                maxActive="100"/>
-->

<!--F hpj 2006-10-12 
    name: The name of the resource link to be created, which will be used in this web-application context environment.
    global: The name of the linked global resource in the global JNDI context.
    type: The fully qualified Java class name expected by the web application when it performs lookup for this resource link.
-->
   <ResourceLink name="mssql-SAM_GDCZ" global="jdbc/mssql-SAM_GDCZ" type="javax.sql.DataSource"/>

</Context>
         本文提供的tomcat连接池的默认配置如上述,代码的说明性很强,既采用在./ conf/server.xml配置的全局数据源,然后在指定的Context中调用的方式。
         server.xml中的数据源就是上述代码段注释的Resource节点,被包含在server.xml中的GlobalNamingResources节点中。
         其中需要注意的是,该数据源需要在./conf/web.xml中加入一段声明,如下:
    <resource-ref>
        <descrīption>DB Connection</descrīption>
        <res-ref-name>jdbc/mssql-SAM_GDCZ</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
2、第二种tomcat数据源的配置方式是本人推荐的:不在server.xml的GlobalNamingResources节点中加入Resource节点,而是对每个指定的Context配置数据源,这样结构比较清晰。采用这种方式的gdczsam.xml配置如下:
<Context docBase="setup directory" path="/gdczsam" reloadable="true" cookies="true" crossContext="true" privileged="true" antiResourceLocking="false" antiJARLocking="false">

    <Resource name="jdbc/mssql-SAM_GDCZ"
             auth="Container"
                type="javax.sql.DataSource"
                driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
                url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=SAM_GDCZ"
                username="sa"
                password=""
                maxIdle="30"
                maxWait="10000"
                maxActive="100"/>

</Context>
3、以上两种方式,只要是不同的数据源都必须在./conf/web.xml中加入resource-ref声明。
4、产品部署时,不论使用什么方式来部署程序,都需要在./confCatalina/localhost中加入类似gdczsam.xml的文件来配置数据源。

posted @ 2013-10-26 16:39 半导体 阅读(104) | 评论 (0)编辑 收藏

Eclipse 格式化时不自动换行 Ctrl+shift+f .

Java代码

打开Eclipse的Window菜单,然后Preferences->Java->Code Style->Formatter->Edit/Show(根据不同版本可用的按钮会不一样) ->Line Wrapping->Maximum line width:由80改成800就行了。

2.Html代码

Window->Preferences->MyEclipse->Files and Editors->Html->Html Source->Line width->加个0以后保存

posted @ 2013-10-18 21:44 半导体 阅读(342) | 评论 (0)编辑 收藏

用GET方法时出现乱码的问题。URL传中文出现乱码时:。

最近遇到一个问题:用get方法传递中文有问题,用post没有问题。
问题简单的描述是这样的:
<a href="userGroup.jsp?userGroupName=<%=userGroupName%>">aa</a>
这里userGroupName是中文

在userGroup.jsp页面得到的userGroupName却是乱码。
每个页面也都有<%@ page language="java" pageEncoding="GBK" %>说明。

后来上网找了一下才知道:pageEncoding这个只对post起作用。get方法提交时,大家可以从地址栏里看到提交的参数,这是因为get方法传递是作为报文头提交的,而pageEncoding对报文头是没有作用的,所以仍然按照 iso8859-1编码,才出现了刚才的乱码问题。而post提交的是form表单的内容,pageEncoding指定了它的编码,所以他会按照指定编码传递。

问题清楚了,下面就来解决它:

由于tomcat的servlet实现中ServletRequest.setCharacterEncoding方法未对HTP报文头的内容进行解码,因此
使用HTTP的GET方法提交的数据将不能正确的解码.解决方案为修改其服务器的配置server.xml文件中对HTTP协议的
Connector配置,加上URIEncoding="GBK"属性,配置完成以后"可能"的内容为
< Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" 
disableUploadTimeout="true" URIEncoding="GBK" /> 


URL传中文出现乱码时:
问题:
如传类似这样的地址" index.jsp?ddurl="+"我们是";ddurl获得的就是乱码。
解决办法:这种传值方式相当于get传值,在传值时对他加密:
encodeURI(url);

posted @ 2013-10-17 11:47 半导体 阅读(111) | 评论 (0)编辑 收藏

数据库查询时间没有了时分秒的解决办法

数据库查询时间没有了时分秒的解决办法

转自:http://www.cnblogs.com/lidabo/archive/2013/03/08/2950107.html

    
    问题出处,公司一个项目中使用动态sql方式查询Oracle数据库,在展示时Date类型字段只展示日期,无时分秒。
    
    分析:
    
    1、众所周知Oralce的日期类型有很多种,Date ,Timestamp等。其中Date类型对用的是java.sql.Date类型,Timestamp对用的是java.sql.Timestamp类型。这两个类型均继承自java.util.Date,其中java.sql.Date是没有时分秒的大家可以查看一下javaApi
    
    2、ResultSet 的getObject(*)方法对用Date类型默认返回的是java.sql.Date
    
    3、网上很多人提供的解决方案是将数据库Date类型改为Timestamp类型,显示当中数据库类型DBA是不会允许你改动的,且Oracle中对于时分秒要求不严格的地方DBA反而是建议用Date而不用Timestamp以节省资源
    
    4、ibatis的ResultMap中对Date类型指定为Timestamp却能够正常显示
    
    经过一番思考后发现对用Date类型的字段使用rs.getTimestamp(*)即可正常显示
    
    方案二、
    
    增加服务器/Java应用的虚拟机参数:-Doracle.jdbc.V8Compatible=“true” 

posted @ 2013-10-12 15:08 半导体 阅读(198) | 评论 (0)编辑 收藏

启动参数放MAP,转换为对象,用户编码找到用户名

方法一:类转换为map
JAVA中编写类CacheManager,方法如下:
    

 public void contextInitialized(javax.servlet.ServletContextEvent arg0) {
  WebInfoDBO webInfoDBO = (WebInfoDBO) SpringContext.getBean("WebInfoDBO");
  List list = webInfoDBO.queryBySql(" select detail_id as \"detailId\", genre_id as \"genreId\",type_two as \"typeTwo\", " + "title_name as \"titleName\",is_issue  as \"isIssue\",is_hot  as \"isHot\",content  as \"content\"" + "from   (select detail_id,genre_id,type_two, title_name, is_issue,is_hot,(select content from web_content c where web_info_d.detail_id=c.detail_id and is_hot='1') content,"
    + "rank() over(partition by genre_id order by sort_code,upt_date desc) rn      from web_info_d where is_issue='1') where rn<=1", WebInfoD.class);
  for (int i = 0; i < list.size(); i++) {
   WebInfoD webInfoD = (WebInfoD) list.get(i);
   tableComent.put("webInfoD", webInfoD);
  }

 }
在JSP页面获取值方法:CacheManager:
CacheManager cm = new CacheManager();
WebInfoD webInfoD = (WebInfoD) cm.tableComent.get("webInfoD");
out.println(webInfoD.getDetailId());
out.println(cm.tableComent.get("detailId"));

方法二:类转换为map中KEY,VALUE
JAVA中:

 public void contextInitialized(javax.servlet.ServletContextEvent arg0) {
  SysDictBO sysDictBO = (SysDictBO) SpringContext.getBean("SysDictBO");
  List list = sysDictBO.queryBySql(" select TYPE_DESC_ID as \"typeDescId\", TYPE_DESC_NAME as \"typeDescName\"  from  Sys_Dict_d d,sys_dict h where h.type_id=d.type_id", SysDictD.class);
  for (int i = 0; i < list.size(); i++) {
   SysDictD sysDictD = (SysDictD) list.get(i);
   tableComent.put(sysDictD.getTypeDescId(),sysDictD.getTypeDescName());
  }

 }

JSP中:
<%@ page import="com.gzlt.framework.cache.CacheManager" %>

CacheManager cm = new CacheManager();
WebInfoD webInfoD = (WebInfoD) cm.tableComent;

out.println(cm.tableComent.get("402881c9405be55f01405c12f8240003"));


posted @ 2013-09-06 16:00 半导体 阅读(131) | 评论 (0)编辑 收藏

对象取值,无属性名称的取值。

             Object[] o = (Object[]) page.getListSum().get(0);//这里是对象
             System.out.println("==="+o[1]);


01.在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:  
02.  
03.1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。  
04.  
05.2.只查询一个字段,默认情况下,list中封装的是Object对象。  
06.  
07.3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。  
08.  
09.对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象。  

3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。
  
set的时候,list里面保存的是对象[]

posted @ 2013-09-03 15:26 半导体 阅读(114) | 评论 (0)编辑 收藏

判断是什么类型

.getClass().getName()

posted @ 2013-09-03 15:20 半导体 阅读(93) | 评论 (0)编辑 收藏

获取值方法

application.getRealPath("/");    获取项目根目录,如:D:\apache-tomcat-7.0.23\webapps\sxzx\
   String baseURL = request.getContextPath();
   String uri = request.getRequestURI();

posted @ 2013-08-22 17:25 半导体 阅读(81) | 评论 (0)编辑 收藏

ajax实现获取文件内容并写入

       <div id="formcontent"></div>
        <script type="text/javascript">
        //发文呈报模板
       $.get("../formfiles/export/402881c9405ba15a01405bc2f0fe000a.txt",
       function(data){//写入到对应ID
        document.getElementById("formcontent").innerHTML=data;
        });   
       </script>

posted @ 2013-08-22 16:42 半导体 阅读(110) | 评论 (0)编辑 收藏

oracle管理员身份登录

//用sys用户登录

C:\Users\Administrator>sqlplus

SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 8月 19 16:25:18 2013

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

请输入用户名:  sys/sys as sysdba

//用操作系统登录:

C:\Users\Administrator>sqlplus  / as sysdba

 

posted @ 2013-08-19 16:28 半导体 阅读(183) | 评论 (0)编辑 收藏

ORACLE中常用语法

生成UUID:sys_guid()
字符转换为小写:NLS_LOWER()

查看'_"字符:instr(english_name,'_')
字符全部转换为大写:NLS_UPPER(x[,y])
首字母转换为大写:NLS_INITCAP

posted @ 2013-08-16 17:15 半导体 阅读(107) | 评论 (0)编辑 收藏

取实体类的属性名

  Map<String, String> classColumnMap = new HashMap();
  Class classType=null;
  classType = Class.forName(beanName); 
  Field allFields[]=classType.getDeclaredFields();
    for(int i=0;i<allFields.length;i++)
    {

     classColumnMap.put(allFields[i].getName(),allFields[i].getType());

    }

posted @ 2013-08-16 15:17 半导体 阅读(103) | 评论 (0)编辑 收藏

把对象传入session在JSP页面取值方法:

JAVA中:
super.getSession().put("sysobject", list);
JSP中:、
    <select id="def" name="def">
    <c:forEach var="sysobject" items="${session.sysobject }" >
      <option name="" value=" ${sysobject.englishName}" datevalue="ddd"> ${sysobject.chnName}</option>
   </c:forEach>
   </select>
或用struct标签实现:
<s:iterator value="#session.list">

posted @ 2013-08-16 10:40 半导体 阅读(134) | 评论 (0)编辑 收藏

JAVA规范写法

更新某个对象时: 
// 发布
 public String issue() throws Exception {
  String defineId = super.getRequest().getParameter("defineId");
  try {
   boolean isSuccess = false;
   // 修改
   if (defineId != null && !Utility.isEmpty(defineId)) {
    //更新某个字段时,先清空对象。
    fmDefine = new FmDefine();
    fmDefine.setDefineId(defineId);
    fmDefine.setState("已发布");
    isSuccess = fmDefineBO.update(fmDefine);
   }
   if (isSuccess) {
    super.addActionMessage("发布成功!");
   } else {
    super.addActionMessage("保存失败!");
   }
//   super.getRequest().setAttribute("isSuccess", isSuccess);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return query();
 }

posted @ 2013-08-15 15:11 半导体 阅读(116) | 评论 (0)编辑 收藏

文件上传

         FileWriter writer;
         try {
          String path = System.getProperty("user.dir")+"/../webapps/sxzx/formfiles/"+session.get("objectID")+".txt";
             writer = new FileWriter(path);
             writer.write(content);
             writer.flush();
             writer.close();
         } catch (IOException e) {
             e.printStackTrace();
         }

posted @ 2013-08-15 11:30 半导体 阅读(148) | 评论 (0)编辑 收藏

数据库最大连接数原理

1、JAVA做一个循环,每做一次事务(CRUD)加一个连接,一个连接相当于占2M内存。
50秒后自动释放。
如果超过最大连接数报错如下:
ORA-12519: TNS:no appropriate service handler found 解决  

有时候连得上数据库,有时候又连不上.

可能是数据库上当前的连接数目已经超过了它能够处理的最大值.


select count(*) from v$process --当前的连接数
select value from v$parameter where name = 'processes' --数据库允许的最大连接数
修改最大连接数:
alter system set processes = 300 scope = spfile;
重启数据库:
shutdown immediate;
startup;
--查看当前有哪些用户正在使用数据
SELECT osuser, a.username,cpu_time/executions/1000000||'s', sql_fulltext,machine
from v$session a, v$sqlarea b
where a.sql_address =b.address order by cpu_time/executions desc;

连接数配置在:applicationcontext.xml中
另一种解决办法:直接用存储过程,一个存储过程只占一个连接。

查看当前最大连接数:
BasicDataSource dataSource = (BasicDataSource)SpringTools.getBean("dataSource");
System.out.println(dataSource.getNumActive());

posted @ 2013-08-14 17:07 半导体 阅读(156) | 评论 (0)编辑 收藏

myeclipse环境配置

当myeclipse慢时,请查看以下原因:
1、检查:.project文件,去掉<nature>org.eclipse.wst.jsdt.core.jsNature</nature>。
    或:右键项目 -> properties -> Builders 去掉JavaScript Validator 前面的勾

posted @ 2013-08-14 09:32 半导体 阅读(106) | 评论 (0)编辑 收藏

Jquery Eeay UI Validatebox 常用自定义效验

     摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->$.extend($.fn.validatebox.defaults.rules, {         ...  阅读全文

posted @ 2013-07-26 23:01 半导体 阅读(173) | 评论 (0)编辑 收藏

中文排序

import java.text.Collator;
import java.util.Arrays;


public class Test2 {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        String[] names ={"王飞","李明","赵六"};
        Arrays.sort(names, Collator.getInstance(java.util.Locale.CHINA));
        System.out.println(Arrays.toString(names));

    }

}

posted @ 2013-07-26 22:39 半导体 阅读(91) | 评论 (0)编辑 收藏

输出日志。myeclipse中

1、在hibernate.cfg.xml中配置如下:
  <property name="hibernate.jdbc.batch_size">0</property>
  <property name="format_sql">false</property>
  <property name="use_sql_comments">false</property>
  
  <property name="show_sql">true</property>

posted @ 2013-07-03 16:18 半导体 阅读(150) | 评论 (0)编辑 收藏

struct2.0语法

字符串条件判断:
   <s:if   test="%{#listD.genreId == '402881b73e11d5f5013e11dc118f000a'}">
数字型判断:
   <s:iterator value="list" id="listD" status="ind1">
   <s:if test="#ind1.getIndex()<=6"   >
对象的取值方法:
        <s:iterator value="page" id="list" status="ind1">
      <s:iterator value="list" id="listD" status="ind1">
        <s:if test="#ind1.getIndex()<=5"   >
         <li> <a href="#"><span
           class="news">${listD.titleName}</span> </a> <span class="right"><s:date
            name="issueDate" format="yyyy-MM-dd" /> </span>
       </s:if>
      </s:iterator>
     </s:iterator>
在一个页面重复取list对象(不要id,,var,status):
        <s:iterator value="#list">
      <s:if test="%{genreId == '402881b73e11d5f5013e11dd21ea000c'}">
       <li><a href="../opt/PortalInfoDAction_queryContent.do?detailId=${detailId}"><span class="news">${titleName}</span> </a>
        <span class="right"><s:date name="issueDate"
          format="yyyy-MM-dd" /> </span>
      </s:if>
     </s:iterator>
sql条件的取值方法:
<s:iterator value="#a19list" var="a19list" status="ind1">
           <s:if test="#ind1.getIndex()<4">
           <li>
            <a
             href="<c:url value="/web/WebHomeAction_content.do?detailId=${detailId}"/>">${titleName}</a>
           </li>
          </s:if>
         </s:iterator>

判断大小: <s:property value="sysRegisterList.size()"/>

下拉框获取值:            
<select id="radioName" name="radioName"    >
    <c:forEach var="sysobject" items="${session.sysobject }" >
      <option name="" value="${sysobject.englishNames}" typeCode="${sysobject.dictName}" >${sysobject.chnName}</option>
   </c:forEach>
   </select> 
session取值:
JAVA中:ActionContext.getContext().getSession().put("sum2", (String)sumObject[1]);
取值:${session.sum2}

在struts中用#来访问ActionContext中的对象。

posted @ 2013-05-14 17:15 半导体 阅读(104) | 评论 (0)编辑 收藏

样式表学习

1、文字太长,加省略号。
li{
  white-space:nowrap;
  text-overflow:ellipsis;
  -o-text-overflow:ellipsis; /*opera*/
  overflow: hidden;
 }

posted @ 2013-05-14 16:33 半导体 阅读(86) | 评论 (0)编辑 收藏

jerichoTab 加载完默认选中最后一个,如何让他选择第一个

第一步:

改代码吧。 改文件jquery.jerichotab.js 第205行, 原为

.animate({ 'opacity': '1', width: opts.tabWidth }, function() {

$.fn.setTabActive(curIndex);

});

直接删除205行,或注解掉205行

//$.fn.setTabActive(curIndex);
第二步:改JSP页面
     把activeTabIndex:1改为activeTabIndex:0

posted @ 2013-05-03 15:56 半导体 阅读(463) | 评论 (1)编辑 收藏

javascript常用函数 HTML常用关键

双击:ondblClick="edit_on('I104120130400011')"
单击:onclick="lightonRow(this);"


嵌入页面:<iframe  allowtransparency="true" width=420 height=330 frameborder=0 scrolling=auto src=URL></iframe>
 
           allowtransparency:代表透明景色

posted @ 2013-04-12 14:24 半导体 阅读(83) | 评论 (0)编辑 收藏

网站安全性考虑

用户输入内容 输出用 htmlspecialchars
服务端 sql过滤
xss漏洞过滤

使用工具:Acunetix Web Vulnerability Scanner 7

posted @ 2013-02-01 10:09 半导体 阅读(171) | 评论 (0)编辑 收藏

明宇报表安装

卸载客户端已经安装的插件,升级服务器上的插件到最新版本,再访问服务器上的报表下载新的插件
卸载插件方法:
如果是从服务器自动下载安装的插件:首先关闭浏览报表的浏览器窗口,重新打开一个浏览器窗口,选择浏览器的菜单:
工具-->Internet选项-->设置-->查看对象-->Ming-WebReport Viewer-->右键菜单-->删除
如果是在客户端运行安装程序安装的插件:在客户端运行 regsvr32 /u "C:\.....\MRViewer.ocx"卸载安装的插件。


升级插件到最新版本    windows7
正式版下载地址是http://www.soft2web.com/v4/MRLic/opendownload.asp,下载V3版本
解压缩以后(不需要运行安装程序),更新服务器上报表应用程序下的文件
    报表根目录下的MREngine.prop文件;
    报表根目录\Viewer\MRViewer.CAB文件;
更新以后,重启一下。
服务器上文件正确升级以后,客户端会自动下载安装新版本的插件

注意客户端需要管理员帐户登陆以后再安装浏览器插件。

windows7下   按F8  禁用数字签名驱动。

posted @ 2013-01-24 16:29 半导体 阅读(2690) | 评论 (2)编辑 收藏

获取父窗口的值

获取父窗口的名称
parent.frames["otherframe"].name
parent.frames["otherframe"].location.href
parent.frames["otherframe"].document.all.控件ID.value
获取父窗口内容:
$(parent.window.frames["frameMain"].document.body).html()
 
在body中增加内容:
当前页的body增加内容:$("body").append('4444'); 
增加父窗口代码:parent.frameContent.$(parent.frameContent.document).find("body").append('<font size="17" color="red">类别编码: </font>'); 

posted @ 2013-01-16 16:45 半导体 阅读(285) | 评论 (0)编辑 收藏

工作流表单自定义的误区

 

本人觉得写得很有道理,值得学习。
转自【IT168知识库】

表单自定义功能看似非常方便,可以不用写代码即可完成表单的开发设计,表面上看的确是减少不少开发成本,但深入研究,发现是有不少误区的。

1、              对于整体成本来讲,当表单自定义功能能满足实际客户需求的60%时,会为另外的40%需求付出多少成本。现实中所见到的表单自定义工具一般至多能满足实际客户需求的50%。一般容易实现的仅布局、字段的增减、简单的脚本控制等,但有很多诸如复杂脚本控制、自动计算、特殊