hyljava

2013年2月28日 #

解决SoapUI的Request URL不支持大写

在SoapUI的Request URL中,每次输入的URL中含有的大写字母会自动转换为小写字母,导致请求不了
这个问题在SoapUI 5.1.2和5.2.1版本中都存在,具体的解决办法是在HTTP TestRequest Properties的属性中,在Endpoint中输入对应的含有大写字母的URL即可。



posted @ 2017-03-23 10:27 何云隆 阅读(374) | 评论 (0)编辑 收藏

java发送邮件

Java使用网易邮箱服务器发送邮件实例

1 下载发送mail需要的jar

 

activation.jar  与  mail.jar

 

2 创建 SendMail  

3 代码如下

 

 

import java.util.Date;

import java.util.Properties;

import javax.mail.Address;

import javax.mail.Message;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import cn.founder.common.globals.Constants;

 

public class SendMail {

public int send(String tfrom, String tto, String ttitle, String tcontent) {

Properties props = new Properties();

props.put("mail.smtp.host", "smtp.263.net");//自己到网上查找网易发邮件的smtp服务地址 你的发件邮箱如果是163  你就查找163的发件服务器

props.put("mail.smtp.auth", "true");

Session s = Session.getInstance(props, null);

s.setDebug(true);

Message message = new MimeMessage(s);

try {

Address from = new InternetAddress(tfrom);

message.setFrom(from);

Address to = new InternetAddress(tto);

message.setRecipient(Message.RecipientType.TO, to);

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();  

message.setSubject("=?utf-8?B?"+enc.encode(ttitle.getBytes("utf-8"))+"?=");

message.setContent(tcontent, "text/html;charset=utf-8");

message.setSentDate(new Date());

message.saveChanges();

Transport transport = s.getTransport("smtp");

//第一个参数是发件服务器   第二个是你发件的邮箱名  第三个是你发件邮箱的密码

transport.connect("smtp.263.net",发件邮箱,发件邮箱密码);

transport.sendMessage(message, message.getAllRecipients());

transport.close();

return 0;

} catch (Exception e) {

e.printStackTrace();

return 1;

}

}

/**

 * getEmailServiceIp

 * @return EmailServiceIp

 */

public static void main(String[] args) {

//第一个参数 发件邮箱   第二个收件邮箱  第三个 邮件内容

  new SendMail().send("yunlong090614@163.com", "1063342004@qq.com", "更改密码校验", "尊敬的用户你好,您的校验码为:65432</br>xxxx");

}

posted @ 2016-04-03 11:04 何云隆 阅读(150) | 评论 (0)编辑 收藏

jstl用系统时间进行判断数据时间

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<jsp:useBean id="now" class="java.util.Date" />

 <c:set var="currentday">
        <fmt:formatDate value="${now}" type="both" dateStyle="long" pattern="yyyy-MM-dd" var="nowdate"/>
        </c:set>
        ${nowdate} > ${result.openEndTimeOpen }=${nowdate > result.openEndTimeOpen}
     

posted @ 2015-10-09 09:57 何云隆 阅读(385) | 评论 (0)编辑 收藏

plsqldevelop连接到不到数据库


安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0)。Win7 64位系统暂无PLSQLDeveloper,所以下一个32位的。

  下载instantclient-basic-win32-11.2.0.1.0.zip (一定得是32位的,不要下错了版本,Oracle官网有下载),将其解压至Oracle安装目录的Product下(本机命名为:instantclient_11_2):D:\Oracle\app\Dell\product\instantclient_11_2

拷贝数据库安装根目录下的一个文件夹:D:\Oracle\app\Dell\product\11.2.0\dbhome_1

\NETWORK到Oracle客户端目录下D:\Oracle\app\Dell\product\instantclient_11_2(其实只需要 NETWORK\ADMIN\tnsnames.ora)



 修改oracle客户端tnsnames.ora文件(目录在D:\Oracle\app\Dell\product\instantclient_11_2\NETWORK\ADMIN\tnsnames.ora)
 MYACCP= (DESCRIPTION=       
(ADDRESS_LIST=            
(ADDRESS= (PROTOCOL=tcp)(HOST=superich-accp )(PORT=1521)) ) 
(CONNECT_DATA=(SERVICE_NAME = ACCP)         
 ) )

posted @ 2015-09-29 15:47 何云隆 阅读(138) | 评论 (0)编辑 收藏

SQL按照汉字排序

SELECT createDate,shortName,collNum,fullName FROM college
ORDER BY CONVERT( shortName USING gbk)

posted @ 2015-09-01 13:25 何云隆 阅读(393) | 评论 (0)编辑 收藏

无法启动print spooler服务,错误1068

近几日打印东西都是不成功,显示不能发现打印机,处理方法如下:
启动 print spooler服务 但是报1068错误,
在运行中输入“sc config spooler depend= rpcss”,确定后,我再去启用Print Spooler服务,居然成功了。我也不知道这是个什么命令,但是问题解决了,就要谢谢网络上的高手们!

posted @ 2015-08-30 08:10 何云隆 阅读(177) | 评论 (0)编辑 收藏

JSP中EL表达式三元(三目)运算符的使用

Java中的三元运算符为:条件?条件为true值:条件为false的值
EL也有一样的运算符,用EL的三元运算符有时可以代替c:choose标签,为我们的工作省下很大力气。

比如gender为0显示男,其余显示女,我们可以这么写:

<c:choose>
<c:when test="${gender eq 0}"></c:when>
<c:otherwise></c:otherwise>
</c:choose>

但是不是显得太麻烦了?其实我们这里就可以使用EL表达式中的三元运算符了,上面可以简化为:

${gender eq 0?"男":"女"}

这样是不是简练了很多?在JSTL和EL处理非A即B的时候,三元运算符简单了许多。

转载请注明:观测者 » JSP中EL表达式三元运算符的使用

posted @ 2015-08-25 11:03 何云隆 阅读(2715) | 评论 (0)编辑 收藏

打 war包命令

jar -cvf safety.war *
打 war包命令

posted @ 2015-08-19 10:18 何云隆 阅读(127) | 评论 (0)编辑 收藏

jquery校验输入框内容

     摘要:  引用地址http://www.cnblogs.com/xdp-gacl/p/3467245.html 用Jquery控制文本框只能输入数字和字母   在公司开发WinForm项目时,发现公司自主研发的textbox控件非常强大,可以实现"只能输入数字"、"只能输入字母"和"只能输入数字和字母"的三种输入限制,这样就可以精确控制用户输入的内容范围,让"用户永远没有办法输入...  阅读全文

posted @ 2015-05-08 11:22 何云隆 阅读(437) | 评论 (0)编辑 收藏

svn更新失败提示locked

SVN更新失败,提示locked

  • 浏览:3571
  • |
  • 更新:

 

产生这种情况大多是因为上次svn命令执行失败且被锁定了,需要删除文件夹中的lock文件,即可解锁。这里介绍3种方法:

方法一.直接进行cleanup;对较小的文件比较管用,文件稍大些等待时间很长或不起作用;

 

方法二.选择文件,右键执行release lock;等待时间较长;

 

方法三.手动删除锁定文件:

 1.在运行中输入cmd进入命令行; 2.在命令提示符下cd 到svn项目出现问题的文件所在目录下; 3.执行命令del lock /q/s 4.等待删除lock文件成功,重新更新SVN。

posted @ 2015-03-25 15:03 何云隆 阅读(278) | 评论 (0)编辑 收藏

广禾养老文化村

广禾养老文化村
首页地址http://202.199.162.210:8080/IntelligentNursing/index/toIndex
展示效果

 
 


posted @ 2014-08-26 16:18 何云隆| 编辑 收藏

打开eclipse弹出Error:could not open D:\java\lib\i386\jvm.cfg'

打开eclipse弹出Error:could not open D:\java\lib\i386\jvm.cfg'
运行中 输入regedit 
 
没有修改注册表,解决办法是: 
重新安装JDK时注册表中\HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environemt\1.6 项目下的JavaHome和RuntimeLib设置没有更新,将这两个项目更正即可.
 
 

posted @ 2014-05-24 22:05 何云隆 阅读(534) | 评论 (0)编辑 收藏

安装Eclipse Html Editor

安装Eclipse Html Editor 转

分类: Java 1431人阅读 评论(0) 收藏 举报
  最近在eclipse中开发android项目,用到了jquery mobile框架,则会涉及到新建html文件,发现eclipse不自带新建html文件的插件,必须得新建一个其他形式的文件,譬如xml格式的文件,然后重命名,后缀名改成html,觉得这样老麻烦的,所以在网上发现了Eclipse HTML Editor,不过此插件似乎只支持新建html文件,不支持其格式化。网上看了其他一个html格式化的插件Eclipse Tidy,不过用了后,发现格式化后的html一点都不符合代码审读标准。也不知道是不是自己哪边没设置好,还是本来就是那样。

   现在就暂先不管Eclipse Tidy了,看看如何安装Eclipse HTML Editor。

1.下载GEF(依赖包):

http://www.eclipse.org/downloads/download.php?file=/tools/gef/downloads/drops/3.7.2/R201201171043/GEF-ALL-3.7.2.zip

然后解压,把解压得到的features和plugins两文件夹放到eclipse安装目录下plugins文件夹中

2.下载HTMLEditor

http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=EclipseHTMLEditor

只有一个tk.eclipse.plugin.htmleditor_2.1.0.jar文件

直接复制到eclipse\plugins里面

posted @ 2014-04-03 15:15 何云隆 阅读(169) | 评论 (0)编辑 收藏

mysql 解决全连接问题

     摘要: 基本资料:mysql> select version();+-----------+| version() |+-----------+| 5.0.16 |+-----------+ mysql> select * from t1;+----+------+| id | name |+----+------+| 1 | aa || 2 | bb || 3 | cc |+---...  阅读全文

posted @ 2014-03-03 19:30 何云隆 阅读(343) | 评论 (0)编辑 收藏

ListView实现RadioButton的功能有bug改进

前言:之前做的ListView实现RadioButton的功能有bug,当ListView控件的内容超出屏幕可见区域时,滑动ListView控件会报错,下面有为什么出错和解决方法进行的注解,不多说了,看源码,有更好的解决办法请指教

1,MainActivity.java

package com.excetop.listradio;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    private ListView listView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        listView = (ListView) this.findViewById(R.id.list);
        MyAdapter adapter = new MyAdapter();
        listView.setAdapter(adapter);
    }
    private class MyAdapter extends BaseAdapter{
        private String[] s = new String[]{"a","b","c","d","e","a","b","c","d","e","a","b","c","d","e","a","b","c","d","e"};
        private int temp = -1;

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return s.length;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView = MainActivity.this.getLayoutInflater().inflate(R.layout.item, null);  //解决办法: 每次都重新获取View
            Button button = (Button) convertView.findViewById(R.id.button);
            button.setText(s[position]);
            RadioButton radioButton = (RadioButton) convertView.findViewById(R.id.radioButton);
            radioButton.setId(position);  //把position设为radioButton的id
            radioButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    
                    if(isChecked){
                        //这段代码来实现单选功能
                        if(temp != -1){
                            RadioButton tempButton = (RadioButton) MainActivity.this.findViewById(temp);
                            if(tempButton != null){
                               tempButton.setChecked(false);
                            }
                            
                        }
                        
                        temp = buttonView.getId();
                        Log.i(TAG,"you are women- -   " + isChecked + "   " + temp);
                        
                    }
                }
            });
            
            //这里实现单选框选的回显,解决了单选框移出屏幕范围未选中状态
            if(temp == position){
                radioButton.setChecked(true);
            }
            return convertView;
        }
//            Holder holder;
//            if(convertView == null){    //1,当第一次加载ListView控件时  convertView为空 
//                convertView = MainActivity.this.getLayoutInflater().inflate(R.layout.item, null); //所以当ListView控件没有滑动时都会执行这条语句
//                holder = new Holder();
//                convertView.setTag(holder);
//            }else{
//                holder = (Holder) convertView.getTag();
//            }
//            
//            holder.button = (Button) convertView.findViewById(R.id.button);
//            holder.button.setText(s[position]);
//            
//            holder.radioButton = (RadioButton) convertView.findViewById(R.id.radioButton);   //
//            holder.radioButton.setId(position);  //2,因为这里对radioButton的id进行重新设置,滑动ListView时convertView不为空,上面的语句就没法得到radioButton对象,这条语句就会报空指针异常
          
//            holder.radioButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
//                
//                @Override
//                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//                    
//                    if(isChecked){
//                        if(temp != -1){
//                            RadioButton tempButton = (RadioButton) MainActivity.this.findViewById(temp);
//                            tempButton.setChecked(false);
//                            
//                        }
//                        
//                        temp = buttonView.getId();
//                        Log.i(TAG,"you are women- -   " + isChecked + "   " + temp);
//                        
//                    }
//                }
//            });
//            return convertView;
//        }
//        private class Holder{
//            private Button button;
//            private RadioButton radioButton;
//        }
    }
}

2,item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="测试">
  
  </Button>
  
  <RadioButton
    android:id="@+id/radioButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />  
 
</LinearLayout>
3, main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    <ListView
       android:id="@+id/list"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       />
</LinearLayout>

posted @ 2014-02-22 22:58 何云隆 阅读(252) | 评论 (0)编辑 收藏

listview与checkbox组合使用

一,Layout

 

1,main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    <ListView
       android:id="@+id/list"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       />
</LinearLayout>

 

2,item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="测试">
  
  </Button>
  
  <CheckBox
    android:id="@+id/checkBox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />  
 
</LinearLayout>

二,Activity

 

1,MainActivity

package com.excetop.listradio;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class MainActivity extends Activity {
 private static final String TAG = "MainActivity";
    private ListView listView;
    private Map checkMap;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        listView = (ListView) this.findViewById(R.id.list);
        
        checkMap = new HashMap<String, Object>();
        
        MyAdapter adapter = new MyAdapter();
        listView.setAdapter(adapter);
      
    }
 private class MyAdapter extends BaseAdapter{
  private String[] s = new String[]{"a","b","c","d","e","a","b","c","d","e","a","b","c","d","e","a","b","c","d","e"};

  @Override
  public int getCount() {
   // TODO Auto-generated method stub
   return s.length;
  }

  @Override
  public Object getItem(int position) {
   // TODO Auto-generated method stub
   return null;
  }

  @Override
  public long getItemId(int position) {
   // TODO Auto-generated method stub
   return 0;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
   convertView = MainActivity.this.getLayoutInflater().inflate(R.layout.item, null);  //解决办法: 每次都重新获取View
   Button button = (Button) convertView.findViewById(R.id.button);
   button.setText(s[position]);
   final CheckBox checkBox =  (CheckBox) convertView.findViewById(R.id.checkBox);
   checkBox.setId(position);  //把position设为radioButton的id
   checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
     
     if(isChecked){
      
      checkMap.put(String.valueOf(checkBox.getId()), checkBox.getId());
//      Toast.makeText(MainActivity.this, String.valueOf( checkBox.getId()), 0).show();
     
     }else{
      checkMap.remove(String.valueOf(checkBox.getId()));
//      Toast.makeText(MainActivity.this, String.valueOf( checkBox.getId()), 0).show();
     }
    }
   });
   
   if(checkMap.get(String.valueOf(position)) != null){
    checkBox.setChecked(true);
//    Toast.makeText(MainActivity.this, String.valueOf(String.valueOf(position)), 0).show();
   }
   
   //这里实现单选框选的回显,解决了单选框移出屏幕范围未选中状态
   return convertView;
  }
 }
}

posted @ 2014-02-22 22:56 何云隆 阅读(214) | 评论 (0)编辑 收藏

处理多个fragment之间replace刷新问题

 处理多个fragment之间replace刷新问题[转]
 每次创建fragment对象都会重新走onCreateView方法,所以多个fragment互相替换会重新刷新界面,
 在application中创建一个View,保持onCreateVIew中创建的View
 每次走onCreateView的时候判断application中是否保持了View,如果为null,重新inflater走initView和initData方法,不为nul得到父类,移除子View,不然有父id无法再加入布局中,
 以下是代码:
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  
  GalaxyApplication galaxyApplication = (GalaxyApplication) getActivity().getApplication();
  View recommendView = galaxyApplication.getRecommendView();
  if(recommendView != null){
   
   ViewGroup group = (ViewGroup) recommendView.getParent();
   group.removeAllViews();
   
   return recommendView;
  }
  
  View fmRootView = inflater.inflate(R.layout.fragment_recommend, container,false);
  
  
 
  
  initView(fmRootView);
  initData();
  galaxyApplication.setRecommendView(fmRootView);
  Logger.d("fragment: ", "onCreateView");
  return fmRootView;
 } 

 如有好的方法,处理onCreateView刷新问题  欢迎留言。 

posted @ 2014-02-22 22:55 何云隆 阅读(548) | 评论 (0)编辑 收藏

android设置重复背景

创建重复的背景图片


在drawable目录下创建一个repeat_bg.xml:  src是引用图片的名称

1
2
3
4
5
6
7
8
1
<?xml version="1.0" encoding="utf-8"?>
2
3
    android:src="@drawable/bg"
4
    android:tileMode="repeat" />

然后在布局的xml文件中可以这样引用:

1
2
3
4
5
6
7
8
1
<LinearLayout android:layout_width="fill_parent"
2
    android:layout_height="fill_parent"
3
    android:background="@drawable/repeat_bg">
4
</LinearLayout>

posted @ 2014-02-16 09:59 何云隆 阅读(198) | 评论 (0)编辑 收藏

SQL Server 里面的生成SQL脚本

通常情况下,SQL Server里面的生成SQL脚本,只会包含数据库及表的字段结构,而不会包含表的数据,也就是SQL脚本里面只有Create database,Create table 这样的语句,没有insert into。
因为SQL Server并不包含这个功能,只能靠第三方的代码了。
以下存储过程可以实现:
CREATE PROCEDURE dbo.UspOutputData
@tablename sysname
AS
declare @column varchar(1000)
declare @columndata varchar(1000)
declare @sql varchar(4000)
declare @xtype tinyint
declare @name sysname
declare @objectId int
declare @objectname sysname
declare @ident int
set nocount on
set @objectId=object_id(@tablename)
if @objectId is null -- 判断对象是否存在
begin
print 'The object not exists'
return
end
set @objectname=rtrim(object_name(@objectId))
if @objectname is null or charindex(@objectname,@tablename)=0 --此判断不严密
begin
print 'object not in current database'
return
end
if OBJECTPROPERTY(@objectId,'IsTable') < > 1 -- 判断对象是否是table
begin
print 'The object is not table'
return
end
select @ident=status&0x80 from syscolumns where id=@objectid and status&0x80=0x80
if @ident is not null
print 'SET IDENTITY_INSERT '+@TableName+' ON'
declare syscolumns_cursor cursor
for select c.name,c.xtype from syscolumns c where c.id=@objectid order by c.colid
open syscolumns_cursor
set @column=''
set @columndata=''
fetch next from syscolumns_cursor into @name,@xtype
while @@fetch_status < >-1
begin
if @@fetch_status < >-2
begin
if @xtype not in(189,34,35,99,98) --timestamp不需处理,image,text,ntext,sql_variant 暂时不处理
begin
set @column=@column+case when len(@column)=0 then'' else ','end+@name
set @columndata=@columndata+case when len(@columndata)=0 then '' else ','','','
end
+case when @xtype in(167,175) then '''''''''+'+@name+'+''''''''' --varchar,char
when @xtype in(231,239) then '''N''''''+'+@name+'+''''''''' --nvarchar,nchar
when @xtype=61 then '''''''''+convert(char(23),'+@name+',121)+''''''''' --datetime
when @xtype=58 then '''''''''+convert(char(16),'+@name+',120)+''''''''' --smalldatetime
when @xtype=36 then '''''''''+convert(char(36),'+@name+')+''''''''' --uniqueidentifier
else @name end
end
end
fetch next from syscolumns_cursor into @name,@xtype
end
close syscolumns_cursor
deallocate syscolumns_cursor
set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename
print '--'+@sql
exec(@sql)
if @ident is not null
print 'SET IDENTITY_INSERT '+@TableName+' OFF'
GO
 
使用方法:
exec UspOutputData 你的表名
选择【执行模式】为“以文本显示结果”,然后将运行后的结果存成.sql,加上用SQL Server生成的数据库脚本就可以了。
另外可以利用第三方工具,导出数据可以用powerbuilder。在database painter里面,用SQL选出,或者直接打开表,点击生成的list datawindow,然后在菜单file->save rows as->选择SQL,那么生成的SQL语句就包括建表和insert数据的SQL了。

转载:http://blog.sina.com.cn/s/blog_49b531af0100i74v.html

posted @ 2014-01-09 13:34 何云隆 阅读(134) | 评论 (0)编辑 收藏

CompoundButton

Android 中文 API (29) —— CompoundButton


前言

  本章内容是android.widget.CompoundButton,翻译来自德罗德,再次感谢德罗德 !期待你一起参与Android API 的中文翻译,联系我over140@gmail.com。 

 

  转载

 

 正文

  一、结构

    public abstract class CompoundButton extends Button implements Checkable

 

    java.lang.Object
      android.view.View
        android.widget.TextView
          android.widget.Button
            android.widget.CompoundButton

 

  二、概述

    一个带有选中/未选中状态的按钮。当按钮按下或点中时自动改变状态。

 

  三、公共方法

         public boolean dispatchPopulateAccessibilityEvent (AccessibilityEvent event)

         在子视图的构建时分派一个辅助事件。(译者注:通过源码可以看出,视图构建时设置其选中状态。)

                   参数

                            event       事件

                   返回值

                            如果事件全部完成返回True

 

         public boolean isChecked ()

         (译者注:是否选中)

 

         public void onRestoreInstanceState (Parcelable state)

         允许视图重新应用以前通过onSaveInstanceState()生成代表内部的状态。这个函数决不调用一个空的状态。

                   参数

                            state       返回以前调用onSaveInstanceState()保存下来的状态。

 

         public Parcelable onSaveInstanceState ()

         允许视图生成一个代表内部的状态,以后可用于创建一个与之相同的新的实例。这种状态应该只包含非持久或以后不能够重建的信息。例如,你决不存储你当前在屏幕上的位置,因为这会在视图的层面上重新计算放置一个新的实例。

         你可以存储到这里的一些例子:一个文本框中当前光标的位置(但通常不是文字本身,文字通常保存在内容提供者(content provider)或其他持久的储存中),一个列表视图中的当前选中项。

                   返回值

                            返回一个包含视图当前状态的Parcelable对象,或没有什么状态保存时返回null。默认实现返回null

 

         public boolean performClick ()

         如果视图定义了OnClickListener监听器,调用此方法来执行。

                   返回值

                            定义了的OnClickListener被调用返回True,否则返回False

 

         public void setButtonDrawable (Drawable d)

         给按钮背景设置一个可绘制对象(如:图像)

                   参数

                            d      用作背景的可绘制对象(如:图像)

 

         public void setButtonDrawable (int resid)

         通过资源Id给按钮背景设置一个图像

                   参数

                            resid        作为背景图像的资源id

 

         public void setChecked (boolean checked)

         改变按钮的选中状态

                  参数

                            checked true选中,false非选中

 

         public void setOnCheckedChangeListener (CompoundButton.OnCheckedChangeListener listener)

         注册一个在按钮状态发生改变时执行的回调函数

                   参数

                            listener  当选中状态改变时调用的函数

 

         public void toggle ()

         改变选中状态为当前状态的逆状态

 

  四、受保护方法

         protected void drawableStateChanged ()

         在视图状态的变化影响到所显示可绘制的状态时调用这个方法。

确保在重载时中调用父类方法

 

         protected int[] onCreateDrawableState (int extraSpace)

         为当前视图生成新的可绘图区状态。这个方式当缓存的图像绘图区状态确定失效时通过视图系统调用。你可以使用getDrawableState()方法重新取得当前的状态。

                   参数

                            extraSpace      如果为非零,这是你应该返回的数组在你可以存放你的状态的额外条目的数量。

                   返回值

                            返回一个记录着视图中当前绘图区状态的数组

 

         protected void onDraw (Canvas canvas)

         实现你自己的绘制。

                   参数

                            canvas    在画布上绘制背景

 

         protected boolean verifyDrawable (Drawable who)

         如果你的视图子类显示他自己的可视化对象,他将要重写此方法并且为了显示可绘制返回true。此操作允许进行绘制时有动画效果。

  确认当重写从方法时,需调用父类相应方法。

                   参数

                            who         需判断的可绘制对象(Drawable)。如果是你要显示的对象,返回True,否则返回调用父类的结果。

                   返回值

                            boolean 如果可绘制对象(Drawable)已经在视图中显示,返回True否则返回false。并且此处不允许使用动画。 

posted @ 2013-12-20 22:43 何云隆 阅读(176) | 评论 (0)编辑 收藏

eclipse集成maven

1.eclipse集成maven
http://eclipse.org/m2e/download/
maven在线更新地址与下载插件地址
2.下载maven 并且在机器上配置环境变量到bin目录下;
3.

posted @ 2013-12-19 19:55 何云隆 阅读(141) | 评论 (0)编辑 收藏

周鸿祎-----把自己当成打工的,一辈子都是打工的

别人觉得你是不是在打工,这个不重要。重要的是你自己千万别把自己当成打工的,换个角度去看,是公司给你发工资,替你交学费,练着你自己的能力和经验。你遇到产品经理、技术高手,或者公司创始人,从他们身上学到成功的经验,甚至是失败的教训。

 

我觉得有的人对创业的理解有误区。他们把创业理解成几个哥们开一个公司,回去印几盒名片,我叫董事局主-席,你叫首席执行官,自己的同学脖子上都挂上个CXO,名字很洋气,也不知道什么意思。如果把这个理解为创业就大错特错。

我希望大家这样来理解创业,把创业看成是一种心态,为了实现一个目标,孜孜不倦的去追求。只要你不满足于现状,想法设法去突破,那就是创业。如果你是一个在校学生,是搞电脑,如果你不满足于只是把学分学好,不满足于把考试应付好,而是花了很多时间提高你的编程能力,下了很大功夫来研究很多软件,那这也是创业。学习是这样,工作也是这样,只要你勇敢的正视问题,积极的去解决问题,敢于去承担未来的风险,这其实就是创业心态。

如果我们把创业都理解成我今天出去成立一个公司,明天上市,后天市值超越Facebook,对不起,从来没有过这样成功的例子。天底下哪里有这么一帆风顺的事?把你放在一马平川的大平原上,你凭着直觉沿着直线走,其实从高空看下去,你走出来的路是弯的,是曲折的。创业也是一样,虽然心里有个目标,但是要达到那个目标,你得解决一个个实际的问题。人的路都是一步一步走出来的,而且这个路一定不是直线。

在中国更是这样,环境确实太复杂了。特别是在创业早期,你没有经验,没有资源,你头脑里的创新可能仅仅就是一个想法,一个主意,但如果实现不了,那它就什么都不是。但是,要实现这个想法,这个主意,你需要有判断力,需要有经验,需要有知识。所以,我一直提倡大学生刚毕业的时候,不要头脑一热就攒出一个公司来,最好的方法是加入一家创业公司,甚至可以加入风险很大的种子公司,去学习创业,感受创业。

很多人说,我加入别人的公司,那我不就成了一个打工的了吗?给别人打工,谁认真干呀。错了,如果你觉得自己是打工的,那你一辈子都是打工的。别人觉得你是不是在打工,这个不重要。重要的是你自己千万别把自己当成打工的,换个角度去看,是公司给你发工资,替你交学费,练着你自己的能力和经验。你遇到产品经理、技术高手,或者公司创始人,从他们身上学到成功的经验,甚至是失败的教训。

如果你加入这个公司,这个公司两年之后死了,恭喜你,你一分钱没损失,你参与一个活生生的公司从生到死的例子,你以后就可以避免重蹈覆辙。你一分钱没花,你让一个公司死了一回,你学到了如何避免失败的教训,这是一个多么值的事。这比你拿多少工资,比你到一个有名的大公司,有用多了。

别人一见你,都说你在北京某大公司工作,太了不起。那都是虚荣心,一点意义没有。所以我一直强调,如果你怀着创业的心态,那么你在什么状态都可以叫创业。等到有一天,当你有一股强烈的冲动要办公司去创业的时候,有可能你会发现,人各有所长,你不一定是做CEO的料,但你可能是优秀的CTO,你可能是很好的销售主管,这个时候你就知道找什么样的合伙人去创业了。

所以,我鼓励大家创业,其实是鼓励大家培养创业的精神,我不主张各位一定要出去成立一个公司,那只是一个形式。美国硅谷很多人不是先装模作样地成立一个公司,而是在家里的车库,利用业余时间先搞出来一个产品,这也是创业的一部分。

我不希望传授什么成功学,我最希望大家能够想清楚未来几年自己心里想要什么。在你创业的时候,不论遇到诱惑还是遇到挑战,都能够记住我说的那句话:拒绝平庸,与众不同。你不一定要追随当时的主流,也要能耐得住寂寞,甚至要有一种韧性,敢于屡败屡战,在未来长达五年或者八年、十年的时间里一直坚韧不拔地去探索,我相信五年以后、十年以后,可能中国新一代的企业家,中国新一代的创新领袖应该从各位里面诞生。

posted @ 2013-12-18 22:24 何云隆 阅读(155) | 评论 (0)编辑 收藏

android library projects cannot be launched

android library projects cannot be launched

 
properties 在android选项中将 is library中将前面的勾去了

posted @ 2013-12-14 23:04 何云隆 阅读(140) | 评论 (0)编辑 收藏

向ListView中添加数据

BaseAdapter方式
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android1:id="@+id/listView1"
        android1:layout_width="match_parent"
        android1:layout_height="wrap_content"
        android1:layout_weight="1" >
    </ListView>

</LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center_vertical"
    android:id="@+id/waibubuju"
    >
   
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/bianhao"
        android:text="编号"
        android:textColor="#88ff0000"
        android:gravity="center"
         android:textSize="18sp"
        />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/neibubuju"
        >
        <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="姓名"  
       android:id="@+id/username"
           
            />
 MainActivity.java

package com.hyl.listViewpack;

import java.util.ArrayList;

import android.R.string;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity {
 protected static final String TAG = "MainActivity";
 private ListView listView1;
 ArrayList<ArrayList<String>> arr ;
 
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  listView1=(ListView) findViewById(R.id.listView1);
  arr=new ArrayList<ArrayList<String>>();
  for(int i=0;i<=50;i++){
   ArrayList<String> a=new ArrayList<String>();
   a.add("编号:"+i);
   a.add("姓名:"+i);
   a.add("电话:"+i);
   arr.add(a);
   
   
  }
  
  listView1.setAdapter(new  BaseAdapter() {
   
   
   public View getView(int position, View convertView, ViewGroup parent) {
    //父窗体 挂载 
    
    
    View view=View.inflate(MainActivity.this, R.layout.list_item, null);
 
    
    Log.e(TAG, "测试创建对象位置:"+position);
    
    
    ArrayList<String> a=arr.get(position);
    
    TextView tvbianhao=(TextView) view.findViewById(R.id.bianhao);
    tvbianhao.setText( a.get(0));
    
    TextView tvUserName=(TextView) view.findViewById(R.id.username);
    tvUserName.setText( a.get(1));
    
    TextView tvTel=(TextView) view.findViewById(R.id.tel);
    tvTel.setText( a.get(2));
    
    
    
    return view;
   }
   
   @Override
   public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
   }
   
   @Override
   public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
   }
   
   @Override
   public int getCount() {
    
    return arr.size();
   }
  });
  
  
  
  
  
  
 }

 @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;
 }

}


        
        <TextView
            android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="电话"
        android:id="@+id/tel"
           
            />
    </LinearLayout>
   

</LinearLayout>

 

ArrayAdapter方式
                                                                 //上下文对象    布局列表对象      显示的TextView的ID   数组对象
  listView1.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, R.id.bianhao, new String[]{"选项一","选项二","选项三","选项四","选项五"}));


SimpleAdapter方式

 listView1=(ListView) findViewById(R.id.listView1);
  
  ArrayList<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
  
  Map<String, Object> map1=new HashMap<String, Object>();
  map1.put("icon", R.drawable.ic1);
  map1.put("name", "功能一");
  list.add(map1);
  
  Map<String, Object> map2=new HashMap<String, Object>();
  map2.put("icon", R.drawable.ic2);
  map2.put("name", "功能二");
  list.add(map2);
  
  
  Map<String, Object> map3=new HashMap<String, Object>();
  map3.put("icon", R.drawable.ic3);
  map3.put("name", "功能三");
  list.add(map3);
  
  Map<String, Object> map4=new HashMap<String, Object>();
  map4.put("icon", R.drawable.ic1);
  map4.put("name", "功能四");
  list.add(map4);
  
  Map<String, Object> map5=new HashMap<String, Object>();
  map4.put("icon", R.drawable.ic5);
  map4.put("name", "功能五");
  list.add(map5);
  
  
  listView1.setAdapter(new SimpleAdapter(this, list, R.layout.list_item, new String[]{"icon","name"},new int[]{R.id.tubiao,R.id.gongneng} ));
  
  

  

posted @ 2013-12-10 21:00 何云隆 阅读(373) | 评论 (0)编辑 收藏

利用AsyncHttpClient与服务器端传输数据

创建一个显示的界面xml
 <ListView
        android:id="@+id/lv_show_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="16dp" >
    </ListView>

再创建一个item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
   
 <TextView
     android:layout_width="250dip"
     android:layout_height="wrap_content"
     android:id="@+id/title"
    
    
     />
 <TextView
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:id="@+id/timelength"
    
    
     />
</LinearLayout>


导入AsyncHttpClient需要的类

之后


  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_show_list_activy);
  lv_show_view = (ListView) findViewById(R.id.lv_show_view);


   AsyncHttpClient client=new  AsyncHttpClient();
  
   String  url = "http://192.168.1.100:8080/videogetxml/GetParamServlet?userName="
     + "测试方法";
   client.get(url, new AsyncHttpResponseHandler() {
   
  
   public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
     List<Video> list=new ArrayList<Video>();
    try {
     Toast.makeText(ShowListActivy.this,statusCode+"", 1).show();
     
     String json = new String(responseBody);
      JSONArray array = new JSONArray(json);
     for(int i=0 ; i < array.length() ; i++){
      JSONObject item= array.getJSONObject(i);
     
      String id = item.getString("id");
      String title = item.getString("title");
      String timelength = item.getString("time");
      Log.e("jsonget", id+title+timelength);
      list.add(new Video( id, title, Integer.parseInt(timelength)));
     }
     List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
     for (Video v : list) {
      Map<String, Object> it = new HashMap<String, Object>();
      it.put("id", v.getId());
      it.put("title", v.getTitle());
      it.put("timelength", v.getTime());
      data.add(it);
     }
     SimpleAdapter adapter = new SimpleAdapter(ShowListActivy.this, data,R.layout.item, new String[] { "title", "timelength" },new int[] { R.id.title, R.id.timelength });
     lv_show_view.setAdapter(adapter);

     
     
     
    } catch ( Exception e) {
      Log.e("MainActivity", e.toString());
     
    }     
    
    
   }
   
  
   public void onFailure(int statusCode, Header[] headers,
     byte[] responseBody, Throwable error) {
    Toast.makeText(ShowListActivy.this,"shibai", 1).show();
    
   }
  });
  显示出传过来的json结果:
 
  
 

本文章只是自己学习笔记,大家要慎重借鉴





posted @ 2013-12-03 14:30 何云隆 阅读(311) | 评论 (0)编辑 收藏

文件下载到本地

package com.shxt.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownLoadServlet extends HttpServlet {

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  this.doPost(request, response);
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  response.setContentType("application/x-msdownload");
  PrintWriter out = response.getWriter();
  response.reset();// 可以加也可以不加
  response.setContentType("application/x-download");
  String filedownload = request.getRealPath("/images")
    + "\\02_开发第一个无状态会话bean.avi";// "想办法找到要提供下载的文件的物理路径+文件名";
  System.out.print(filedownload);
  String filedisplay = "okokok.avi";// "给用户提供的下载文件名";
  filedisplay = URLEncoder.encode(filedisplay, "UTF-8");
  response.addHeader("Content-Disposition", "attachment;filename="
    + filedisplay);
  

  OutputStream outp = null;
  FileInputStream in = null;
  try {
   outp = response.getOutputStream();
   // 你可以指定你的ftp输入流
   in = new FileInputStream(new File(filedownload));

   byte[] b = new byte[1024];
   int i = 0;

   while ((i = in.read(b)) > 0) {
    outp.write(b, 0, i);
   }
   outp.flush();
  } catch (Exception e) {
   System.out.println("Error!");
   e.printStackTrace();
  } finally {
   if (in != null) {
    in.close();
    in = null;
   }
   if (outp != null) {
    outp.close();
    outp = null;
   }
   //out.clear();
   //out = pageContext.pushBody();
  }
 }

}

posted @ 2013-11-23 20:51 何云隆 阅读(919) | 评论 (1)编辑 收藏

ajax的传值

     摘要: 转自:转载请标明出处:http://blog.csdn.net/anyoneking/archive/2008/05/23/2472145.aspx1.回传一个普通的String字符串.2.回传一个组织好的Javascript字符串.3.回传一个Json对象.(需要引入json.jar)4.回传一个XML对象.基本实现如下:其中测试页面为: <%@page language="j...  阅读全文

posted @ 2013-11-22 16:55 何云隆 阅读(1839) | 评论 (2)编辑 收藏

html锚点&jsp锚点

经过试验后发现HTML锚点在JSP中并不兼容。两者表示锚点的方法有所不同

 

HTML锚点

<a href="#1">goto1</a>

.

.

.

.

<a name="1">111</a>

这样从goto1可以定位到111

 

JSP锚点

<a href="javascript:void(0)" onclick="document.getElementById('1').scrollIntoView();">goto1</a>

<a id="1">1111</a>

posted @ 2013-09-18 16:49 何云隆 阅读(313) | 评论 (0)编辑 收藏

HTML to PDF

HTML to PDF conversion for your website or application

http://www.htm2pdf.co.uk/

posted @ 2013-07-10 10:41 何云隆 阅读(1391) | 评论 (1)编辑 收藏

通过js事件获取元素中的属性值

通过js事件获取元素中的属性值
<div id="c-title1" onclick="openAndClose(this)" value="content1" >报告概览</div>

  function openAndClose(myelement) {
   
    alert(myelement.attributes["value"].value );
    
    

  }

posted @ 2013-05-29 21:42 何云隆 阅读(844) | 评论 (1)编辑 收藏

miniui超级强悍UI

miniui超级强悍UI
http://www.miniui.com/demo/#src=messagebox.html

posted @ 2013-05-27 15:41 何云隆 阅读(290) | 评论 (0)编辑 收藏

js中动态生成表格

js中动态生成表格
function createTable() {
 var t = document.getElementById("myT");
 for ( var i = 0; i < 3; i++) {
  var r = t.insertRow();
  for ( var j = 0; j < 2; j++) {
   var c = r.insertCell();
   if (j == 0) {
    c.innerHTML = "姓名:"+i+","+j;
   } else {
    c.innerHTML = "<input type='text' name='n' />";
   }
  }
 }
 t.setAttribute('border', '1');
}

function deleteTable() {

 var objTable = document.getElementById("myT");
 objTable.setAttribute('border', '0');
 for ( var i = 0; i <= objTable.rows.length+1; i++) {
  objTable.deleteRow(0);

 }
 
}




jsp中的表单引发事件
<input type="button" onclick="createTable()" name="ty" value="试题类型" />
   &nbsp;
   <input type="button" onclick="deleteTable()" name="re" value="清除表格" />
   <table id="myT">
   
   </table>

posted @ 2013-05-21 21:16 何云隆 阅读(504) | 评论 (1)编辑 收藏

JSTL获取list的大小,jstl获取list 的长度,EL表达式获取list的长度,EL表达式获取list大小

JSTL获取list的大小,jstl获取list 的长度,EL表达式获取list的长度,EL表达式获取list大小 
在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" %> 
<c:out value="${fn:length(list)}"></c:out> 

posted @ 2013-04-20 16:58 何云隆 阅读(4694) | 评论 (0)编辑 收藏

Spring MVC使用动态代理实现事务控制

Spring MVC使用动态代理实现事务控制
applicationContext.xml文件中配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
default-lazy-init="true">
<!--
spring在启动的时候,会默认加载会默认加载整个对象实例图,从初始化ACTION配置、到
service配置到dao配置、乃至到数据库连接、事务等等。这样可以减少web服务器在运行时的负担,但是对于开发者来说无疑是效率极低的一个设置了。
还好,spring提供了default-lazy-init属性,其配置形式如下,applicationContext.xml中: <
beans default-lazy-init ="true" > < bean class ="org.xxxx.bean" >
。。。。。。 </beans>
spring配置默认default-lazy-init为false,当配置为true时sping不会再去加载整个对象实例图,大大减少了初始化的时间,减少了spring的启动速度。
这样做只是为了在开发过程中节约启动时间,在部署到实际环境中,倒是没必要设置default-lazy-init为true。毕竟部署到实际环境中不是经常的事,每次启动1分钟倒不是大问题,而且可以提高服务器效率。
当然,也不是所有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用lazy-init
< beans default-lazy-init ="true" > < bean class
="org.springframework.scheduling.quartz.SchedulerFactoryBean" > <
property name ="triggers" > < list > < ref bean ="buildHtmlTrigger" />
< ref bean ="askTrigger" /> < ref bean ="mailSenderTrigger" /> < ref
bean ="topicDetailBuildTrigger" /> < ref bean ="forumBuildTrigger" />
< ref bean ="topicBuildTrigger" /> </ list > </ property > </ bean >
</ beans > 这样的话。所有的scheduler就都不管用了。所以请大家要注意。
-->
 
<!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 -->
<context:component-scan base-package="com.edufe">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<context:property-placeholder
ignore-resource-not-found="true"
location="classpath*:/application.properties,
           classpath*:/application.development.properties" />
<!-- 创建数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 使用嵌入式数据库H2 -->
<!--
<jdbc:embedded-database id="dataSource" type="H2"> <jdbc:script
location="classpath:sql/h2/schema.sql" /> <jdbc:script
location="classpath:sql/h2/import-data.sql" />
</jdbc:embedded-database>
-->
<!-- 创建jdbcTemplate对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 在容器文件中配置bean(service,dao,domain,action,数据源), -->
<!--
bean的作用是, 当我们spring框架加载的时候,spring就会自动创建一个bean,并放入内存 即产生UserService
user=new UserService(); user.setName("张三");
-->
<!--
<bean id="userService" class=""> 这里就体现出了注入的概念 <property name="name">
<value>张三</value> </property> 在UserService中引用ByeService的对象ref是个引用
<property name="byeS" ref="byeService" /> </bean>
-->
 
 
<!-- 处理事务 -->
<!-- 生成一个事务管理对象 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg index="0" ref="dataSource">
</constructor-arg>
</bean>
<!-- 生成默认事务定义对象 -->
<bean id="def" class="org.springframework.transaction.support.DefaultTransactionDefinition"></bean>
 
</beans>

在dao中
@Autowired
private DataSourceTransactionManager transactionManager;
@Autowired
private DefaultTransactionDefinition def;
public int excuteTrac() {
int temp = 0;
// 批插入
String sql1[] = new String[4];
// 向第一个表插入的语句
sql1[0] = "insert into usermbo( ID, USERNAME, age) values('122','22','22')";
sql1[1] = "insert into usermbo( ID, USERNAME, age) values('133','33','33')";
sql1[2] = "insert into usermbo( ID, USERNAME, age) values('144','44','33')";
sql1[3] = "insert into usermbo( ID, USERNAME, age) values('155','55','33')";
String[] sql2 = new String[3];
// 向第二个表插入的语句
sql2[0] = "insert into address (NO, NAME) values('33','33')";
// 此条数据是错误数据 插入会出现异常
sql2[1] = "insert into address (NO, NAME)  values('eee','44')";
sql2[2] = "insert into address (NO, NAME)  values('144','44')";
 
TransactionStatus status = transactionManager.getTransaction(def);
try {
int[] a = jdbcTemplate.batchUpdate(sql1);
int[] b = jdbcTemplate.batchUpdate(sql2);
try {
transactionManager.commit(status);
} catch (Exception e) {
System.out.println("事务提交异常");
}
} catch (Exception ex) {
System.out.println("出现事务异常");
try {
transactionManager.rollback(status);
} catch (IllegalTransactionStateException e) {
System.out.println("回滚数据异常");
}
temp = -1;
}
return temp;
}

posted @ 2013-04-19 10:56 何云隆 阅读(6038) | 评论 (0)编辑 收藏

JdbcTemplate使用事务控制批处理

JdbcTemplate使用事务控制批处理

//在dao中写的一个方法
public int excuteTrac() {
int temp = 0;
//  批插入 
String sql1[] = new String[4];
//向第一个表插入的语句
sql1[0] = "insert into usermbo(USERNAME,age,PASSWORD) values(' 23  ','3','45')";
sql1[1] = "insert into usermbo(USERNAME,age,PASSWORD) values('22  ','22','22')";
sql1[2] = "insert into usermbo(USERNAME,age,PASSWORD) values(' 44  ','44','4')";
sql1[3] = "insert into usermbo(USERNAME,age,PASSWORD) values(' 55  ','55','55')";
String[] sql2 = new String[3];
//向第二个表插入的语句
sql2[0] = "insert into address(NO,NAME) values('21','33')";
// 此条数据是错误数据 插入会出现异常
sql2[1] = "insert into address(NO,NAME) values('ee','44')";
sql2[2] = "insert into address(NO,NAME) values('44','44')";
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(
jdbcTemplate.getDataSource());
TransactionStatus status = transactionManager.getTransaction(def);
try {
int[] a = jdbcTemplate.batchUpdate(sql1);
int[] b = jdbcTemplate.batchUpdate(sql2);
for (int x : a) {
System.out.println(x);
}
for (int x : b) {
System.out.println(x);
}
} catch (Exception ex) {
System.out.println("出现事务异常");
// transactionManager.rollback(status);
temp = -1;
} finally {
transactionManager.commit(status);
}
return temp;
}

posted @ 2013-04-18 15:12 何云隆 阅读(4894) | 评论 (0)编辑 收藏

监听键盘按下键的值(兼容IE与其他浏览器)

监听键盘按下键的值(兼容IE与其他浏览器)
function getKeyPressCode(event) {
/*
  //此种方法不可取
if(event.keyCode!=0) // IE
{
keynum = event.keyCode;
}
else if(event.which!=0) // Netscape/Firefox/Opera
{
keynum = event.which;
}
alert(keynum);
*/
//此种方法可行 
var keycode;
if (navigator.appName == "Microsoft Internet Explorer") {  // IE
keycode = event.keyCode;
} else {             // Netscape/Firefox/Opera
keycode = event.which;
}
alert("按键码: " + keycode  );
}

posted @ 2013-04-13 11:08 何云隆 阅读(2041) | 评论 (2)编辑 收藏

文本框中只能是数字输入或者是字母输入

<script type="text/javascript">
function noNumbers(e)
{
var keynum;
var keychar;
var numcheck;
if(window.event) // IE
{
keynum = e.keyCode;
}
else if(e.which) // Netscape/Firefox/Opera
{
keynum = e.which;
}
keychar = String.fromCharCode(keynum);
numcheck = /\d/;
return  numcheck.test(keychar);
}
</script>
<form>
Type some text (numbers not allowed):
<input type="text" onkeypress="return noNumbers(event)" />
</form>

posted @ 2013-04-13 10:47 何云隆 阅读(1086) | 评论 (0)编辑 收藏

博鳌亚洲论坛 央视记者何岩柯与比尔盖茨对话

博鳌亚洲论坛

央视记者何岩柯与比尔盖茨对话

何岩柯:

你好!比尔盖茨先生,能够和您对话是我们的荣幸。

盖茨:

我也很荣幸

何岩柯:

首先我想跟您确定一件事,你更喜欢被看作是一个企业家,还是一个慈善家

盖茨:

我现在大部分时间都用于盖茨基金的工作,但是我仍然是微软的主席,我要向他们提出意见,所以我两方面都有所涉及,我的员工和团队都很优秀,我觉得很幸运。

何岩柯:

我们发现你们做慈善的方式,和别人不同,很多慈善组织只是给钱,而你们是给别人一种方法,去谋生,为什么?

盖茨:

我觉得最好的慈善,(扶了扶眼镜)是你为人们提供种子教育,如果你觉得问题有可能解决,你缺少的就是让科学家了解这些问题,获取所需的资源,我们了解了很多关于健康方面的知识,为什么贫困国家的儿童有这么高的死亡率?为什么非洲国家的生产率比美国低这么多?

如果你了解这些状况,你就知道把好的做法普及到世界上最贫困的地方,。

何岩柯:

习近平主席在开幕式上,做了主旨演讲,你也在现场,我在想有关这个演讲,哪点让你最深刻?

盖茨:

我觉得习主席一直都强调,中国的角色是要帮助世界上其他国家,关于中国梦的主题,在其他演讲中也都有提到,我觉得这是很重要的信息,中国是消除贫困、疾病和在教育领域投资的很好典范,中国有越来越多的科学家,他们的研究不仅对中国有价值,对全世界都很有价值,包括他第一次出访,就去了非洲最需要帮助的国家,他夫人也去了,我觉得非常的兴奋,这是很好的开始。

何岩柯:

智能手机,触屏技术以及云技术,这些新的技术,极大改变我们的生活,但这些技术都不是

微软所发展的,作为微软的创立者,会感到有些失望吗?

盖茨:

微软无疑也做的很好,It领域有件很棒的事情,就是同时有很多优秀的公司,我们在做Xbox识别人脸,你看 比如微软的Office,微软在这方面无疑是领先者,尽管谷歌在搜索引擎方面做的很好,但我们也有我们的搜索引擎必应,我们的研究团队对此很有贡献,他在行业中也是领先者,微软会全力以赴做到行业领先,但是这个行业最优秀成功的,不可能来自一个

公司,微软公司正是,这些优秀公司的其中之一。

何岩柯:

您认为微软还是很有竞争力?

盖茨:

当然,我们有很棒的人才,很棒的北京实验室,我们在北京的实验室对此很有贡献。

何岩柯:

我突然想起一个很有意思的说法,当苹果失去乔布斯,就失去了味道,当微软失去了比尔盖茨,也不再是以前的微软,你怎么看这个说法?你同意吗?

盖茨:

技术公司是一直在持续变化,无论你的创意,在十年前五年前有多棒,现在都不适用了,所以你必须有革新意识,你比别人多想一步,即便是微软办公室的白板,我们想办法改变它变化他,有很多领域,微软都想去进行革新,一个公司不是靠一个人可以支撑的,也适用于苹果公司,所以微软会继续做的很棒,我现在全职在盖茨基金会工作,我相信这样同样很重要,我会全力以赴。

何岩柯:

你在人民日报发表了篇文章,有关中国的农业革新,你提到了中国的杂交水稻之父袁隆平,他为世界做出了很多贡献,这一次袁隆平也在参加博鳌论坛,有机会和他交流一下吗?

盖茨:

很遗憾,没机会见到他,杂交水稻是帮助最贫困人群的一个很好的例子,但是现在杂交水稻主要只有中国有,现在的问题是如何普及到世界上的其他国家,比如说非洲,谁来提供种子,

如何让价格合理。

何岩柯:

您如何看待中国的创新能力?

盖茨:

中国的创新能力每年都在增长,中国的大学都很致力于自身提高,比如清华大学已经做的很优秀了,在IT方面有很多的投入,有很多的工程师毕业,生物领域也做的很好,这很令人兴奋。

何岩柯:

我们听说盖茨基金会和中国政府,建立了不少合作项目,这些合作进展如何?

盖茨:

我们最早是和卫生部合作,防治艾滋病,如何减少吸烟,因为吸烟会引起癌症,这些合作很顺利,现在我们正在和科技部合作,因为他们能找到创新者,很多人领域是普通人没有想到的,比如说给动物的疫苗,在这些论坛上,我能够见到很多中国的领导者,我们可以交流下彼此的梦想,我们就可以发现,我们有很多的共同点。

2013年4月8日


posted @ 2013-04-12 22:09 何云隆 阅读(284) | 评论 (0)编辑 收藏

NavicateForOracle安装过程

NavicateForOracle安装过程

http://www.navicat.com/下载Navicate for oracle 或者

http://www.navicat.com/en/products/navicat_oracle/oracle_overview.html

注册信息
name:www.pc6.com
organization:www.pc6.com
key:NAVB-2WQC-4UWV-5XXW

下载客户端


点击安装:



完成后,可能还不能用,但是根据给的连接到网站上指定位置修改即可

posted @ 2013-04-12 22:06 何云隆 阅读(233) | 评论 (0)编辑 收藏

ORA-12541:TNS:无监听程序的错误

ORA-12541:TNS:无监听程序的错误


如何启动oracle的监听

  1.打开Net Configuration Assistant

  2.选择监听程序配置,下一步

  3.选择重新配置,下一步


  4.选择监听程序,默认,下一步


  注:如果你的监听已启动,则出现提示框,选择是


  5.选择协议,使用默认的TCP协议,下一步


  6.选择端口号,使用标准端口号1521,下一步


  7.不配置另一个监听程序,选择否,下一步


  8.监听程序配置完成,下一步


到此基本就可以运行了,你重新开启oracle的服务,测试看能否连上plsql

  重配服务名,测试连接

  1.选择Net服务器配置,下一步

  2.选择重新配置,下一步

  3.选择数据库名,下一步

  4.填写服务名,也就是你创建数据库时的全数据库名,下一步

  5.选择TCP协议,下一步

  6.填写主机名(可填写你的IP地址,也可填写你的主机名),使用标准端口号1521,下一步

  7.进行测试,下一步

  8.选择更改登录

  9.填写用户名和口令,确定

  10.测试连接成功,下一步

  11.网络服务名,默认(和之前的数据库名一样),下一步

  12.不配置另一个Net服务名,选择否,下一步

  13.Net服务名配置完毕,下一步,完成

  启动PL/SQLDeveloper,输入用户名和口令,登录成功

  小结:很多错误都有很明显的提示,要根据提示去找相关的解决办法。

 

posted @ 2013-04-12 21:47 何云隆 阅读(585) | 评论 (0)编辑 收藏

刷新窗口的方法

<script type="text/javascript"> 

    window.parent.dialogArguments.document.execCommand('Refresh');   

</script> 

浮层内嵌iframe及frame集合窗口,刷新父页面的多种方法

<script type="text/javascript">   

   window.parent.location.reload();   

</script> 

弹出子页面
<script type="text/javascript">
   window.opener.location.reload();   
</script> 
子窗口刷新父窗口
<script type="text/javascript">
   window.self.opener.location.reload();   
</script> 
刷新以open()方法打开的窗口[上面的弹出子页面也可以完成]
<script type="text/javascript">
     window.opener.location.href=window.opener.location.href;   
</script> 

posted @ 2013-04-12 15:53 何云隆 阅读(304) | 评论 (0)编辑 收藏

js中对象冒充示例

javascript对象冒充示例
 <script type="text/javascript">
        function Animal(name,age){
            this.name=name;
            this.age=age;
            this.eat=function(){
                alert("动物可以吃东西");
            }
        }
        function Dog(name,age){
            //把Animal构造函数赋给this.an
            this.an=Animal;
            //运行调用@!!!!非常重要
            this.an(name,age);
        }
        var dog=new Dog("小白",2);
        alert(dog.name);
        dog.eat();
 </script>

posted @ 2013-04-12 15:44 何云隆 阅读(1761) | 评论 (0)编辑 收藏

提示输入内容

<input name="keyword"  type="text"  value="请输入关键字" onFocus="this.value=''" onBlur="if(!value){value=defaultValue;}"/>

posted @ 2013-04-12 15:37 何云隆 阅读(3053) | 评论 (2)编辑 收藏

阻止超级连接的跳转

<a href="javascript:void(0)" onclick="changeMa()">看不清</a>
onclick事件会被引发,但是不会发生任何跳转,相当于一个死链接

posted @ 2013-04-12 15:34 何云隆 阅读(1238) | 评论 (0)编辑 收藏

SpringMVC做二级联动

<select id="myCol" onchange="getChange()">
<option value="1">
大连交大
</option>
<option value="2">
东北财经
</option>
<option value="3">
大连海事
</option>
</select>
<select id="myGet">
</select>


<script type="text/javascript"  >
function getChange() {
//获取到第一个select表单value值
var myCol = document.getElementById("myCol").value;
  //拼接成要获取值的url
var url = "getCateGory?myCol=" + myCol; //url  
//利用jquery的ajax方法,使用此方法要引jquery包
htmlobj = $.ajax( {
url : url,
async : false
});
//此处利用json处理值,还需要引json包,在服务器端可以使用GSON转化数据,响应当前页面
/*服务器端:
//需要引GSON包
  //创建一个Gson对象
Gson gson = new Gson();
//返回一个json格式的字符串 
String pStr = gson.toJson(user);
      System.out.println(pStr);
out.print(pStr);
*/
//接取响应值,并且转化成JSON对象
var obj = JSON.parse(htmlobj.responseText);
//此变量是为拼接而做
var options = "";
var myGet = document.getElementById("myGet");
//myGet.removeChild("option");
//删除现有option节点
for ( var i = 1; i <= myGet.length; i++) {
myGet.remove(i);
}
myGet.remove(myGet.selectedIndex);
   //利用循环,在此将新的option添加上
   for(var i=0;i<obj.length;i++){
  alert(obj[i].uUserName);
     var myOption=document.createElement("option");
  myOption.setAttribute("value",obj[i].uId);
  var testN=document.createTextNode(obj[i].uUserName);
myOption.appendChild(testN);
  myGet.appendChild(myOption);
  
 //此种方法最简单,但是没有技术含量
 //options+="<option value='"+obj[i].uId+"'>"+obj[i].uUserName+"</option>";
 }
// myGet.innerHTML=options;
  
}
</script>

posted @ 2013-04-12 15:30 何云隆 阅读(3915) | 评论 (0)编辑 收藏

Spring MVC级联查询(用户与地址之间关系)

 这里的级联查询仿照Hibernate中的一对多关系映射,写个例子留个笔记
(地址表主表,用户表从表)
用户表(类)User
成员变量如下,并且对应有get和set方法
        private String uId;
private String uUserName;
private String uPassWord;
private String uTelephone;
private int uAge;
private Date uBirthday;
对应的表如下:
 
地址表(类)Address成员变量如下:
        private int no;
private String name;
private List<User> userList;


对应的UserDao中先写:
public List<User> findByAddressId(int a){
String sql="select * from usermbo where address=?";
List<User> users = new  ArrayList<User>();
Object[] params=new Object[]{a};
users = jdbcTemplate.query(sql,params, new UserRowMapper() );
return users;
}

private class UserRowMapper implements ParameterizedRowMapper<User>{
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setuUserName(rs.getString("username"));
user.setuAge(rs.getInt("age"));
user.setuId(rs.getInt("id")+"");
user.setuTelephone(rs.getString("telephone"));
return user;
}
}

此部完成以后,再写AddressDao

@Autowired
private UserDao userDao ;


public List<Address> getAddress(){
String sql="select * from address";
List<Address> addresss = new  ArrayList<Address>();
addresss = jdbcTemplate.query(sql, new AddressRowMapper() );
return addresss;
}
private class AddressRowMapper implements ParameterizedRowMapper<Address>{
public Address mapRow(ResultSet rs, int rowNum) throws SQLException {
Address address=new Address( );
address.setNo(rs.getInt("no"));
address.setName(rs.getString("name"));
         address.setUserList( userDao.findByAddressId(rs.getInt("no")));
return address;
}
}
Service层再配一下(此层不配也行直接将
@Autowired
private AddressDao addressDao ;引入Controllar中即可)
在Controllar中再写
addressService.getAddress()就可以查出结果
 [Address [name=计算力, no=1, userList=[User [uAddress=null, uAge=12, uBirthday=null, uId=11, uPassWord=null, uTelephone=1234567, uUserName=张三]]], Address [name=大连, no=2, userList=[]], Address [name=海南, no=3, userList=[User [uAddress=null, uAge=34, uBirthday=null, uId=12, uPassWord=null, uTelephone=2323232323, uUserName=李四], User [uAddress=null, uAge=33, uBirthday=null, uId=13, uPassWord=null, uTelephone=2323, uUserName=王武]]]] 

posted @ 2013-04-12 13:10 何云隆 阅读(3918) | 评论 (3)编辑 收藏

SPRING-MVC访问静态文件,如jpg,js,css

SPRING-MVC访问静态文件,如jpg,js,css

 

如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。

 

目的:可以正常访问静态文件,不要找不到静态文件报404。
 
方案一:激活Tomcat的defaultServlet来处理静态文件

Xml代码  <servlet-mapping>       <servlet-name>default</servlet-name>      <url-pattern>*.jpg</url-pattern>     </servlet-mapping>    <servlet-mapping>           <servlet-name>default</servlet-name>        <url-pattern>*.js</url-pattern>    </servlet-mapping>    <servlet-mapping>            <servlet-name>default</servlet-name>           <url-pattern>*.css</url-pattern>      </servlet-mapping>    要配置多个,每种文件配置一个   

要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了,我想性能是最好的吧。


Tomcat, Jetty, JBoss, and GlassFish  默认 Servlet的名字 -- "default"
Google App Engine 默认 Servlet的名字 -- "_ah_default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字  -- "FileServlet"
WebSphere  默认 Servlet的名字 -- "SimpleFileServlet" 

 

 


方案二: 在spring3.0.4以后版本提供了mvc:resources 
mvc:resources 的使用方法:

Xml代码  <!-- 对静态资源文件的访问 -->    <mvc:resources mapping="/images/**" location="/images/" />  

  
/images/**映射到 ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period 可以使得静态资源进行web cache 
 
如果出现下面的错误,可能是没有配置<mvc:annotation-driven />的原因。 
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'

 

使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.
另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,
否则无法处理static resources request.

 

 

方案三 ,使用<mvc:default-servlet-handler/>

Xml代码  <mvc:default-servlet-handler/>  

 

会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.

 

 

补充说明:多个HandlerMapping的执行顺序问题:

DefaultAnnotationHandlerMapping的order属性值是:0

<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping的order属性值是: 2147483646

 

<mvc:default-servlet-handler/>自动注册的SimpleUrlHandlerMapping的order属性值是:2147483647

 

spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫a.jpg的Action。再按order值升序找,由于最后一个SimpleUrlHandlerMapping 是匹配"/**"的,所以一定会匹配上,再响应图片。

 

访问一个图片,还要走层层匹配。真不知性能如何?改天做一下压力测试,与Apache比一比。

 

最后再说明一下,如何你的DispatcherServlet拦截 *.do这样的URL,就不存上述问题了。


转载至:http://hi.baidu.com/blueskyfaith/item/a47483a91d5cfce015329b98

posted @ 2013-04-09 14:48 何云隆 阅读(4735) | 评论 (1)编辑 收藏

JSP编程的过程中会遇到各种各样的问题

 

在JSP编程的过程中会遇到各种各样的问题

JSP常见问题1:

表单request汉字处理:

  1. request.setCharacterEncoding("GB2312") 

JSP常见问题2:

在JSP网页中获取页面的名称:

  1. request.getRequestURI() ;//文件名  
  2. request.getRequestURL() ;//全部url 

JSP常见问题3:

页面不保留缓存:

  1. response.setHeader("Pragma","No-cache");  
  2. response.setHeader("Cache-Control","no-cache");  
  3. response.setDateHeader("Expires", 0);  
  4.  

JSP常见问题4:

日期时间(服务器端)

  1. String datestr ;  
  2. java.text.DateFormat df = new java.text.SimpleDateFormat("MM月dd日 HH:mm E"); //这里格式化  
  3. datestr = df.format(new java.util.Date()) ;  
  4. out.println(datestr);  
  5.  

或者

  1. % java.util.Date shijian= new java.util.Date();%>  
  2. %=shijian.getYear()+1900%>%=shijian.getMonth()+1%>%=shijian.getDate()%>  
  3. %=shijian.getHour()%>%=shijian.getMinute()%>  
  4.  

JSP常见问题5:

java中运用正则。

jdk需是1.4以上 import="java.util.regex.*

JSP常见问题6:

点后退显示网页过期

在里面加以下代码

  1. META http-equiv=Pragma content=no-cache  
  2. META http-equiv=Cache-Control content=no-cache  
  3. META http-equiv=Expires content=0  
  4.  

和 3 原理一样。

JSP常见问7:

swtich不能作用在long上和String上:

switch(expr1)中,expr1是一个整数表达式。传递给 switch 和 case 语句的参数应该是
int、 short、 char 或者 byte。long,string 都不能作用于swtich。

JSP常见问题8:

计算执行所花费的时间

代码开始取时间,结束后取时间,相减

  1. long t1 = System.currentTimeMillis();  
  2. .... ...... ....  ...your code  
  3. long t2 = System.currentTimeMillis() ;  
  4. long time = t2-t1;  
  5.  

JSP常见问题9:

四舍五入,保留小数点后两位小数?

  1. import java.text.*;  
  2. NumberFormat nf=NumberFormat.getNumberInstance();  
  3. nf.setMaximumFractionDigits(2);  
  4. nf.setMinimumFractionDigits(2);  
  5. nf.format(numb);  

或者(+0.005 - 0.01)再取.后两位

JSP常见问题10:

form的默认方法是get.

post方式是向服务器传送大容量数据时使用的方法。(再打开一个socket.?)

JSP常见问题11:

防止用户直接输入url进去页面:

◆是在要访问的页面中加入控制.这个一般用session。

◆是从web服务器控制,对某一目录的所有访问要通过验证.(有人说把jsp放到web-inf下)

JSP常见问题12:

数据库是datetime 型 ,插入当前时间到数据库:

  1. java.sql.Date sqlDate = new java.sql.Date();  
  2. PreparedStatement pstmt = conn.prepareStatement("insert into foo(time) values(?)");  
  3. pstmt.setDate(1,sqlDate);  
  4. pstmt.executeUpdate();  
  5.  

其实一般数据库都有自己的系统时间函数。

insert into foo(time) values(sysdate)

JSP常见问题13:

session存取int类型的变量:

  1. session.setAttribute("int", i+""); //注意这里i+""  
  2. int i = Integer.parseInt(session.getAttribute("int"));  
  3.  

session的一些概念。

用户在浏览网页时,由于Http 协议是一种无状态的协议,往往在不同的页面之间存在数据交换的问题,这就需要在这些不同的页面之间共享数据。常见的实现方法是把要共享的数据保存到 Session 中。比如在用户登录的页面中把一些用户的信息保存到Session 之中,然后在其他的页面中读取用户的信息。这些共享的数据可以是字符串或者与Java 的原始数据类型相关的对象,也可以是一个Java 对象。

Session 只能保存对象,不能保存原始的数据类型,比如:

session.setAttribute(“count”,10)

是非法的语句,如果要把值为10 的整数保存到Session 中,需要使用以下的方法:

session.setAttribute(“count”,new Integer(10));

然后在另一个页面中使用:

(Integer)session.getAttribute(“count”)

来把这个整数读取出来。

was中设置可以把session放在系统的数据库中,但这样影响效率。session大小最好不要太大

JSP常见问题14:

把字符转化成ASCII码

int a='A'; out.println(a);

JSP常见问题15:

String s = new String("xyz");创建了两个String Object对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

还有典型的equals() 与 == 这个参考在堆栈原理。

JSP常见问题16:

Hashtable和HashMap 

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现HashMap允许将null作为一个entry的key或者value,而Hashtable不允许

Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。

posted @ 2013-03-25 17:17 何云隆 阅读(317) | 评论 (0)编辑 收藏

师者,所以传道授业解惑也

师者,所以传道授业解惑也。”一千多年前韩愈在《师说》里讲的这句话,几乎成了教师职业的定义,直到今天,我们很多中小学老师仍然常常以“传道授业解惑”者自居,却不知韩老先生说的“传道授业解惑”,本不是指的中小学老师。

     韩愈在《师说》中说得很清楚:“彼童子之师,授之书而习其句读者也,非吾所谓传其道、解其惑者也。”(那些小孩子的老师,是教孩子读书,掌握句读的,并不是我所谓的传授道理、解答疑难的人)古代所谓的“童子”,大致相当于今天的未成年人,也就是中小学生。这些孩子的老师的工作,在韩愈眼里,是谈不到“传道授业解惑”的。可见,今天中小学教师以传道授业解惑者自居,并不符合韩老先生的本意。
     韩愈的这种态度说明了什么呢?我想,这一方面说明了韩愈对基础教育的轻视,另一方面也说明了他的清醒。我国古代的教育,基本上是成人教育,孔子的学生好像没有未成年人,都是大老爷们。所以我国古代的教育思想,都是成人教育思想,那时的教育家们,对于儿童心理和儿童的成长规律,比较生疏,也不屑于研究,这应该说是一个缺点。这也提醒我们,在继承古代教育思想的时候,要注意有所分析、改造和取舍,不能盲目传承。

     今天的中小学教师,张口就说什么“传道授业解惑”,这是比较盲目的。同时我们应该看到,韩愈的这种态度自有一定的合理性。他对未成年人的教育,期望值不算高,相较于今日每天高喊“人文主义”的教育者们,我觉得韩愈的头脑没有发热,他并不指望孩子小小年纪就能入“道”。韩愈的要求或许低了点,基础教育确有影响学生世界观价值观的作用,但是,把“立人”的千钧重担都放在或主要放在中小学教师的身上,显然缺乏合理性。

    不过,传道授业解惑这种提法,用于今日,毛病还是很大的。传,授,解,分明是一副教师中心,居高临下的姿态,抹杀了受教育者的主体性,有明显的灌输色彩。这种教育姿态,无论在成人教育、高等教育还是基础教育中,都是落后的。

    要“解惑”当然必须学习,但学习不等于必须“从师”,“从师”而学只是学习的一部分,或者一小部分。离开学习就没有老师,离开老师却有学习。“惑而不从师,其为惑也,终不解矣”,等于宣布学生不可能超过老师,也就等于否定了革新和创造,剩下的只有继承。这是一种将人际关系凌驾于智慧之上的思维方式,是学习领域中的“人治”。它当然会抑制智慧的发展。这是一种封闭的思维方式,它只有单向的传递,没有双向的交流。它当然会抑制科学的进步。西方的哲人却另有一种思维方式:“我爱老师,但更爱真理!”这是一种真理高于人际关系的思维方式。这是一种开放的、双向的思维方式。它推动了西方智慧的发展,科学的进步。
    往事越千年。在我们的学校里,绝大部分老师至今还姓“韩”,学生还是在等着老师来“解惑”,甚至连他们的“惑”都是老师提出的,只是一种“解惑表演。”(考试不就是这样吗)我见到有的博士生,一接触到和导师不同的见解,立刻噤若寒蝉,一副“若为尊师故,真理亦可抛”的架式。你看这人际关系有多么厉害!要想鼓励创新,只好对“惑而不从师 ,其为惑也,终不解矣”的思维方式进行改革,没有办法。
转载至:http://hnpx.cersp.com/article/browse/102634.jspx

posted @ 2013-03-25 13:10 何云隆 阅读(216) | 评论 (0)编辑 收藏

(转载)Session

     摘要: 摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。目录:一、术语session二、HTTP协议与状态保持三、理解cookie机制四、理解session机制...  阅读全文

posted @ 2013-03-23 09:53 何云隆 阅读(230) | 评论 (0)编辑 收藏

WebSocket

 

WebSocket是一种比HTTP协议更加高效的网络传输协议,它有效地减少了HTTP头中的冗余信息和网络延时,能够提供客户端-服务器和服务器-客户端的双通道实时通信,同时具有很好的安全机制。基于WebSocket的URL通常以WS://...开头,类似于HTTPS,安全的WebSocket连接URL通常以WSS://...开头。要实现WebSocket通信,需要客户端浏览器支持WebSocket,服务器端也必须支持WebSocket。

WebSocket还具有广播功能,当有多个监听者连接时,广播服务器发送的消息都可被接收到。

2.浏览器支持检测

function loadDemo() 

if (window.WebSocket) 

document.getElementById("support").innerHTML = "HTML5 WebSocket is supported in your browser."; 

} else 

document.getElementById("support").innerHTML = "HTML5 WebSocket is not supported in your browser."; 

}

3.WebSocket对象

WebSocket在DOM中是window对象的子对象,它具有:

•WebSocket(url)构造函数。

•readyState。只读属性,其值可以是CONNECTING(0),OPEN(1),CLOSED(3)。

•boolean send(in DOMString data)和void close()两个方法,分别用于发送消息和关闭WebSocket连接

•onopen, onmessage, 和onclosee三个事件属性,分别对open, message和close三个WebSocket事件。

3.使用WebSocket的步骤

//建立连接

url = "ws://localhost:8080/echo"; 

w = new WebSocket(url); 

//事件监听

w.onopen = function() { 

log("open"); w.send("thank you for accepting this websocket request"); 

w.onmessage = function(e) { 

log(e.data); 

w.onclose = function(e) { 

log("closed"); 

}

//发送消息

document.getElementById("sendButton").onclick = function() { 

w.send(document.getElementById("inputMessage").value); 

}

//关闭连接。一般情况下不关闭,以保持实时通信

w.close();

posted @ 2013-03-19 12:54 何云隆 阅读(1013) | 评论 (0)编辑 收藏

在HTML5的Canvas上绘制椭圆的几种方法

在HTML5的Canvas上绘制椭圆的几种方法

概述

    HTML5中的Canvas并没有直接提供绘制椭圆的方法,下面是对几种绘制方法的总结。各种方法各有优缺,视情况选用。各方法的参数相同:

context为Canvas的2D绘图环境对象,

x为椭圆中心横坐标,

y为椭圆中心纵坐标,

a为椭圆横半轴长,

b为椭圆纵半轴长。

参数方程法

    该方法利用椭圆的参数方程来绘制椭圆

 

//-----------用参数方程绘制椭圆---------------------

//函数的参数x,y为椭圆中心;a,b分别为椭圆横半轴、

//纵半轴长度,不可同时为0

//该方法的缺点是,当lineWidth较宽,椭圆较扁时

//椭圆内部长轴端较为尖锐,不平滑,效率较低

function ParamEllipse(context, x, y, a, b)

{

   //max是等于1除以长轴值a和b中的较大者

   //i每次循环增加1/max,表示度数的增加

   //这样可以使得每次循环所绘制的路径(弧线)接近1像素

   var step = (a > b) ? 1 / a : 1 / b;

   context.beginPath();

   context.moveTo(x + a, y); //从椭圆的左端点开始绘制

   for (var i = 0; i < 2 * Math.PI; i += step)

   {

      //参数方程为x = a * cos(i), y = b * sin(i),

      //参数为i,表示度数(弧度)

      context.lineTo(x + a * Math.cos(i), y + b * Math.sin(i));

   }

   context.closePath();

   context.stroke();

};

均匀压缩法

    这种方法利用了数学中的均匀压缩原理将圆进行均匀压缩为椭圆,理论上为能够得到标准的椭圆.下面的代码会出现线宽不一致的问题,解决办法看5楼simonleung的评论。

 

//------------均匀压缩法绘制椭圆--------------------

//其方法是用arc方法绘制圆,结合scale进行

//横轴或纵轴方向缩放(均匀压缩)

//这种方法绘制的椭圆的边离长轴端越近越粗,长轴端点的线宽是正常值

//边离短轴越近、椭圆越扁越细,甚至产生间断,这是scale导致的结果

//这种缺点某些时候是优点,比如在表现环的立体效果(行星光环)时

//对于参数a或b为0的情况,这种方法不适用

function EvenCompEllipse(context, x, y, a, b)

{

   context.save();

   //选择a、b中的较大者作为arc方法的半径参数

   var r = (a > b) ? a : b; 

   var ratioX = a / r; //横轴缩放比率

   var ratioY = b / r; //纵轴缩放比率

   context.scale(ratioX, ratioY); //进行缩放(均匀压缩)

   context.beginPath();

   //从椭圆的左端点开始逆时针绘制

   context.moveTo((x + a) / ratioX, y / ratioY);

   context.arc(x / ratioX, y / ratioY, r, 0, 2 * Math.PI);

   context.closePath();

   context.stroke();

   context.restore();

};

三次贝塞尔曲线法一

    三次贝塞尔曲线绘制椭圆在实际绘制时是一种近似,在理论上也是一种近似。 但因为其效率较高,在计算机矢量图形学中,常用于绘制椭圆,但是具体的理论我不是很清楚。 近似程度在于两个控制点位置的选取。这种方法的控制点位置是我自己试验得出,精度还可以.

 

//---------使用三次贝塞尔曲线模拟椭圆1---------------------

//此方法也会产生当lineWidth较宽,椭圆较扁时,

//长轴端较尖锐,不平滑的现象

function BezierEllipse1(context, x, y, a, b)

{

   //关键是bezierCurveTo中两个控制点的设置

   //0.5和0.6是两个关键系数(在本函数中为试验而得)

   var ox = 0.5 * a,

       oy = 0.6 * b;

   context.save();

   context.translate(x, y);

   context.beginPath();

   //从椭圆纵轴下端开始逆时针方向绘制

   context.moveTo(0, b); 

   context.bezierCurveTo(ox, b, a, oy, a, 0);

   context.bezierCurveTo(a, -oy, ox, -b, 0, -b);

   context.bezierCurveTo(-ox, -b, -a, -oy, -a, 0);

   context.bezierCurveTo(-a, oy, -ox, b, 0, b);

   context.closePath();

   context.stroke();

   context.restore();

};

三次贝塞尔曲线法二

    这种方法是从StackOverFlow中一个帖子的回复中改变而来,精度较高,也是通常用来绘制椭圆的方法.

 

//---------使用三次贝塞尔曲线模拟椭圆2---------------------

//此方法也会产生当lineWidth较宽,椭圆较扁时

//,长轴端较尖锐,不平滑的现象

//这种方法比前一个贝塞尔方法精确度高,但效率稍差

function BezierEllipse2(ctx, x, y, a, b)

{

   var k = .5522848,

   ox = a * k, // 水平控制点偏移量

   oy = b * k; // 垂直控制点偏移量

   ctx.beginPath();

   //从椭圆的左端点开始顺时针绘制四条三次贝塞尔曲线

   ctx.moveTo(x - a, y);

   ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b);

   ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y);

   ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b);

   ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y);

   ctx.closePath();

   ctx.stroke();

};

光栅法

    这种方法可以根据Canvas能够操作像素的特点,利用图形学中的基本算法来绘制椭圆。 例如中点画椭圆算法等。

    其中一个例子是园友“豆豆狗”的一篇博文“HTML5 Canvas 提高班(一) —— 光栅图形学(1)中点画圆算法”。这种方法由于比较“原始”,灵活性大,效率高,精度高,但要想实现一个有使用价值的绘制椭圆的函数,比较复杂。比如,要当线宽改变时,算法就复杂一些。虽然是画圆的算法,但画椭圆的算法与之类似,可以参考下。

 

总结

 

   基本上所有的方法都不可能达到100%精确,因为受显示器分辨率的限制。

   其实最好的方法应该是arc()+scale()。canvas绘图库KineticJS就是用的这种方法。

   在其他绘图软件中,不像HTML5的canvas那样提供固有的arc()+scale()方法,通常用贝塞尔曲线模拟近似椭圆,无论是几条贝塞尔曲线都是近似而已。关于用贝塞尔曲线模拟椭圆,可以参考这份资料:Drawing an elliptical arc using polylines, quadratic or cubic Bezier curves。

   由于arc()+scale()是浏览器已经实现的方法,理论上精度最高,所以从效率、精确度和简单易用程度上来讲,都是最佳的。

   在用arc()+scale()绘制完椭圆后,context.stroke()和 context.restore()两个方法调用的先后顺序不同,产生的结果会很有意思的。通常应该先restore()再stroke()。 

Demo

下面是除光栅法之外,几个绘制椭圆函数的演示,演示代码如下:

<div id="CanvasWrap" style=" background:#fff; width: 600px; height: 600px; border: 1px solid black;"></div>

<script type="text/javascript">// <![CDATA[

   var canvas,

       context;

   var div = document.getElementById("CanvasWrap");

   div.innerHTML = "";

   canvas = document.createElement("canvas");

   canvas.style.width = "600px"

   canvas.style.height = "600px"

   canvas.width = 600;

   canvas.height = 600;

   context = canvas.getContext("2d");

   div.appendChild(canvas);

   function execDraw()

   {

      //解决Chrome下的线宽小于等于1的问题

      context.lineWidth = 1.1;

      context.strokeStyle="black"

      ParamEllipse(context, 130, 80, 50, 50);         //圆

      ParamEllipse(context, 130, 80, 100, 20);        //椭圆

      EvenCompEllipse(context, 130, 200, 50, 50);     //圆

      EvenCompEllipse(context, 130, 200, 100, 20);    //椭圆

      BezierEllipse1(context, 470, 80, 50, 50);       //圆

      BezierEllipse1(context, 470, 80, 100, 20);      //椭圆

      BezierEllipse2(context, 470, 200, 50, 50);      //圆

      BezierEllipse2(context, 470, 200, 100, 20);     //椭圆

      //检测相似性(重合的程度)

      ParamEllipse(context, 300, 450, 250, 50);

      context.strokeStyle = "yellow";

      BezierEllipse1(context, 300, 450, 250, 50);

      context.strokeStyle = "blue";

      BezierEllipse2(context, 300, 450, 250, 50);

   };

   function clearCavnas()

   {

      context.clearRect(0, 0, 600, 600);

   };

// ]]></script>

<p>

   <br />

   <button onclick="execDraw();" type="button">执行</button>

   <button onclick="clearCanvas();" type="button">清理</button>

</p>

注意,要成功运行代码,需要支持HTML5的Canvas的浏览器。

本文转载至:
http://www.cnblogs.com/shn11160/archive/2012/08/27/2658057.html

posted @ 2013-03-19 12:50 何云隆 阅读(2034) | 评论 (0)编辑 收藏

客户端跳转与服务器端跳转的区别

客户端跳转与服务器端跳转的区别

客户端跳转与服务器端跳转的区别

客户端跳转时用HttPservletResopse对象的sendRedirect函数实现,服务器端跳转是使用RequestDispather对象的forward方法实现的。这两者之间的区别主要体现在三个方面:

 

1. 使用服务器端跳转时,客户浏览器的地址栏并不会显示目标地址的URL,而是用客户端跳转时,地址栏当中会显示目标资源的URL;

 

2. 服务器端跳转是由客户端发送一个请求,请求一个服务器资源——如JSP和Servlet——,这个资源又将请求转到另一个服务器资源,然后再给客户端发送一个响应,也就是说服务器端跳转是客户端发送一次请求,服务器端给出一次响应;

客户端跳转的流程则不同。客户端同样是发送一个请求给服务器端资源,这个服务器资源会首先给客户端一个响应,客户端再根据这个响应当中所包含的地址,再次向服务器端发送一个请求,也就是说客户端跳转是两次请求,两次响应;

 

3. 在进行客户端跳转和服务器端跳转时,都需要指定目标资源的URL,如果这个路径以“/”开始。在客户端跳转当中“/”代表的是应用服务器根目录,而在服务器端跳转当中代表的是应用程序根目录。

 

 

 

 

 

page = 页面级别

 

request = 请求级别(与服务器端跳转配合使用)

 

session = 会话级别(客户端跳转(服务器端跳转也可,但是客户端跳转更加突出了session的作用范围))

 

application = 应用级别

 

客户端跳转:服务器端将请求结果返回给客户端,客户端向服务器发出另一次请求。在客户端跳转过程中是两次不同的请求。在地址栏中显示的是最后一次请求地址。

 

客户端跳转可以进行站外跳转。

 

1、链接跳转:<a href=””></a>

 

2、表单提交

 

3、Response.sendRedirect(“3.jsp”);

 

4、<mata http-equiv=”refresh”, content=”3;2.jsp”/>

 

5、response.setHeader(“refresh”,” 3;2.jsp”);

 

6、客户端跳转“/”代表服务器跟路径localhost:8080

7、客户端跳转“.”代表当前工程项目根路径(http://localhost:8080/addressbook

 

 

服务器端跳转(容器内跳转):能够自动的在服务器内部进行跳转,这种跳转对用户来说是透明的。两次跳转时同一个request,在地址栏中显示的事第一次页面地址。

 

只能进行站点内跳转。

 

1、<jsp:forward page=””/>    --写在jsp页面内的跳转

2、pageContext.forward();       --写在jsp页面内的跳转

3、 request.getRequestDispatcher("1.jsp").forward(request,response);

4、 服务器端跳转“/”代表当前请求根路径(http://localhost:8080/addressbooktest/GoServlet

5、 服务器端跳转“.”代表当前请求根路径(http://localhost:8080/addressbooktest/GoServlet

posted @ 2013-03-18 10:05 何云隆 阅读(2139) | 评论 (0)编辑 收藏

JAVA_OPTS

JAVA_OPTS="-Xms1024m -Xmx1024m -Xmn512m -Xss256K -XX:PermSize=120M -XX:NewSize=512m -XX:MaxNewSize=512m -XX:MaxPermSize=120m -XX:ParallelGCThreads=15 -XX:MaxTenuringThreshold=5 -XX:ParallelCMSThreads=15 -XX:+UseConcMarkSweepGC -XX:+UseCMSCom

posted @ 2013-03-13 09:32 何云隆 阅读(264) | 评论 (0)编辑 收藏

包含分页的JDBC工具类

包含分页的JDBC工具类
package com.shxt.tool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
 * @Author:何云龙
 * @Version:JDBC封装1.1 2012-11-29 下午06:38:55
 * @Description:jdbc的封装
 */
public class DBUtil {
private String url = "jdbc:mysql://localhost:3306/sduentdb";
private String userName = "root";
private String passWord = "root";
private Connection conn = null;
private Statement st = null;
private PreparedStatement ps = null;
private ResultSet rs=null;
// 加载驱动,只加载一次即可
static {
try {
// System.out.println("加载驱动正在进行");
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("加载驱动遇到异常");
e.printStackTrace();
}
}
public Connection getConnection() {
// 创建连接
try {
conn = DriverManager.getConnection(url, userName, passWord);
return conn;
} catch (SQLException e) {
System.out.println("创建连接出现异常!!");
e.printStackTrace();
}
return null;
}
public int update(String sql) {
// row是指受影响的行数
int row = -1;
try {
// 当前连接如果是空或者被关闭,需要重新创建一个连接
if (conn == null || conn.isClosed()) {
conn = getConnection();
}
st = conn.createStatement();
row = st.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}finally{
//关闭资源
release();
}
return row;
}
public int update(String sql, Object[] obj) {
int row = -1;
// 当前连接如果是空或者被关闭,需要重新创建一个连接
try {
if (conn == null || conn.isClosed()) {
conn = getConnection();
}
ps = conn.prepareStatement(sql);
// 参数结构数据对象
ParameterMetaData pmd = ps.getParameterMetaData();
int varCount = pmd.getParameterCount();
// 给sql语句中的问号?附上值
for (int i = 0; i < varCount; i++) {
ps.setObject(i + 1, obj[i]);
}
row = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
//关闭资源
release();
}
return row;
}
public ArrayList<Map<String, Object>> queryToList(String sql) {
ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 当前连接如果是空或者被关闭,需要重新创建一个连接
try {
if (conn == null || conn.isClosed()) {
conn = getConnection();
}
st = conn.createStatement();
rs = st.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int col = rsmd.getColumnCount();
 
while (rs.next()) {
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 1; i <= col; i++) {
map.put(rsmd.getColumnName(i),
rs.getObject(rsmd.getColumnName(i)));
}
list.add(map);
}
// System.out.println(list);
return list;
} catch (Exception e) {
e.printStackTrace();
}finally{
//关闭资源
release();
 
}
return null;
}
public ArrayList<Map<String, Object>> queryToList(String sql,String[] str) {
ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 当前连接如果是空或者被关闭,需要重新创建一个连接
try {
if (conn == null || conn.isClosed()) {
conn = getConnection();
}
ps = conn.prepareStatement(sql);
// 参数结构数据对象
ParameterMetaData pmd = ps.getParameterMetaData();
int varCount = pmd.getParameterCount();
// 给sql语句中的问号?附上值
for (int i = 0; i < varCount; i++) {
ps.setString(i + 1, str[i]);
}
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int col = rsmd.getColumnCount();
while (rs.next()) {
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 1; i <= col; i++) {
map.put(rsmd.getColumnName(i),
rs.getObject(rsmd.getColumnName(i)));
}
list.add(map);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}finally{
//关闭资源
release();
}
return null;
}
private int pageSize;//页容量
private int rowsCount;//总记录数
private int start;//开始位置
private int end;//结束位置
private int pageNow;//当前页
public static int pageCount;//总页数
public  ArrayList<Map<String, Object>>  getPage(int pageSize,int pageNow,String sql){
rowsCount=queryToList(sql).size();//获取到总记录数
pageCount=rowsCount%pageSize==0?rowsCount/pageSize:(rowsCount/pageSize+1);//获取到总页数
start=pageNow*pageSize-pageSize;//开始位置
String sqlPage="select * from  ("+sql+") as t limit "+start+" , "+pageSize;
  ArrayList<Map<String, Object>> list=queryToList(sqlPage);
return list;
}
 
//关闭资源  释放资源
public void release(){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(st!=null){
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
 
}
 
}

posted @ 2013-02-28 22:20 何云隆 阅读(271) | 评论 (0)编辑 收藏