少年阿宾

那些青春的岁月

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

#


我现在是这样的
我有三个文本框,我想每个里面浏览者一输入文字,在表的表格里马上就自动显示出来这个文本框输入的内容,有高手指教


这个很简单,先说一下实现的原理:利用 JavaScript实现表单的实时互动。 再简单介绍实现的过程:先给<body>标签的属性onload属性设置一个值,连接到相应的JavaScript函数,JavaScript函数将文本框中的内容通过innerHTML实时传递到对应ID的表格中的<td></td>标签对中,便实现了你所要的效果。 

下面就给你写下具体的代码: (复制粘贴到一个TXT文档中,将后缀名改为htm就可以) 

<script language="javascript"> 
function chk() 
setTimeout("chk()",100); 
text1.innerHTML = form1.t1.value; 
text2.innerHTML = form1.t2.value; 
text3.innerHTML = form1.t3.value; 
</script> 
<body onload="chk()"> 
<form name="form1"> 
<textarea name="t1"></textarea><br /> 
<textarea name="t2"></textarea><br /> 
<textarea name="t3"></textarea><br /> 
</form> 
<table border="1" width="200" style="border-collapse: collapse" bordercolor="#008000"> 
<tr height="100px"> 
<td id="text1"></td> 
</tr> 
<tr height="100px"> 
<td id="text2"></td> 
</tr> 
<tr height="100px"> 
<td id="text3"></td> 
</tr> 
</table> 
</body>
posted @ 2011-12-19 13:46 abin 阅读(632) | 评论 (1)编辑 收藏

     摘要: 1       ICE简介1.1    简介ICE(Internet Communications Engine)是一个中间件平台。作为一个高性能的互联网通信平台,ICE包含了很多分层的服务和插件(Plug-ins),并且简单、高效和强大。ICE当前支持C++、Java、C#、Visual...  阅读全文
posted @ 2011-12-15 20:35 abin 阅读(4799) | 评论 (1)编辑 收藏

     摘要: ModelDriven 为什么需要ModelDriven 所谓ModelDriven ,意思是直接把实体类当成页面数据的收集对象。比如,有实体类User 如下: package cn.com.leadfar.struts2.actions; public class User {  &nb...  阅读全文
posted @ 2011-12-15 12:44 abin 阅读(1215) | 评论 (0)编辑 收藏

现在服务器端的应用程序几乎都采用了“线程池”技术,这主要是为了提高系统效率。因为如果服务器对应每一个请求就创建一个线程的话,在很短的一段时间内就会产生很多创建和销毁线程动作,导致服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。线程池就是为了尽量减少这种情况的发生。
 
  下面我们来看看怎么用Java实现一个线程池。一个比较简单的线程池至少应包含线程池管理器、工作线程、任务队列、任务接口等部分。其中线程池管理器(ThreadPool Manager)的作用是创建、销毁并管理线程池,将工作线程放入线程池中;工作线程是一个可以循环执行任务的线程,在没有任务时进行等待;任务队列的作用是提供一种缓冲机制,将没有处理的任务放在任务队列中;任务接口是每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等,工作线程通过该接口调度任务的执行。



1.为什么要使用线程池
     在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,服务器应用程序需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是“池化资源”技术产生的原因。
     线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在,所以消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使用应用程序响应更快。另外,通过适当的调整线程中的线程数目可以防止出现资源不足的情况。
2.线程池的组成部分
    一个比较简单的线程池至少应包含线程池管理器、工作线程、任务列队、任务接口等部分。其中线程池管理器的作用是创建、销毁并管理线程池,将工作线程放入线程池中;工作线程是一个可以循环执行任务的线程,在没有任务是进行等待;任务列队的作用是提供一种缓冲机制,将没有处理的任务放在任务列队中;任务接口是每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等,工作线程通过该接口调度任务的执行。
      线程池管理器至少有下列功能:创建线程池,销毁线程池,添加新任务。
      工作线程是一个可以循环执行任务的线程,在没有任务时将等待。
      任务接口是为所有任务提供统一的接口,以便工作线程处理。任务接口主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等。
3.线程池适合应用的场合
      当一个服务器接受到大量短小线程的请求时,使用线程池技术是非常合适的,它可以大大减少线程的创建和销毁次数,提高服务器的工作效率。但是线程要求的运动时间比较长,即线程的运行时间比� ......
posted @ 2011-12-12 16:50 abin 阅读(10178) | 评论 (0)编辑 收藏

在多线程大师Doug Lea的贡献下,在JDK1.5中加入了许多对并发特性的支持,例如:线程池。

一、简介
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)

corePoolSize: 线程池维护线程的最少数量
maximumPoolSize
:线程池维护线程的最大数量
keepAliveTime
: 线程池维护线程所允许的空闲时间
unit
: 线程池维护线程所允许的空闲时间的单位
workQueue
: 线程池所使用的缓冲队列
handler
: 线程池对拒绝任务的处理策略

一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。

当一个任务通过execute(Runnable)方法欲添加到线程池时:

如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。

如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。

也就是:处理任务的优先级为:
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

unit
可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS
MICROSECONDSMILLISECONDSSECONDS

workQueue
我常用的是:java.util.concurrent.ArrayBlockingQueue

handler
有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务


二、一般用法举例

//------------------------------------------------------------   

//TestThreadPool.java   

package com.abin.task;

import java.io.Serializable;

import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

public class TestThreadPool {

 private static int produceTaskSleepTime = 2;

 private static int consumeTaskSleepTime = 2000;

 private static int produceTaskMaxNumber = 10;

 public static void main(String[] args) {

  // 构造一个线程池

  ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3,

  TimeUnit.SECONDS, new ArrayBlockingQueue(3),

  new ThreadPoolExecutor.DiscardOldestPolicy());

  for (int i = 1; i <= produceTaskMaxNumber; i++) {

   try {

    // 产生一个任务,并将其加入到线程池

    String task = "task@ " + i;

    System.out.println("put " + task);

    threadPool.execute(new ThreadPoolTask(task));

    // 便于观察,等待一段时间

    Thread.sleep(produceTaskSleepTime);

   } catch (Exception e) {

    e.printStackTrace();

   }

  }

 }
}




  

/**  

线程池执行的任务  

* @author hdpan  

*/  

 

package com.abin.task;

import java.io.Serializable;

/**
 *
 * 线程池执行的任务
 *
 * @author hdpan
 */

public  class ThreadPoolTask implements Runnable, Serializable {

 private static final long serialVersionUID = 0;
 private static int consumeTaskSleepTime = 2000;

 // 保存任务所需要的数据

 private Object threadPoolTaskData;

 ThreadPoolTask(Object tasks) {

  this.threadPoolTaskData = tasks;

 }

 public void run() {

  // 处理一个任务,这里的处理方式太简单了,仅仅是一个打印语句

  System.out.println("start .." + threadPoolTaskData);

  try {

   // //便于观察,等待一段时间

   Thread.sleep(consumeTaskSleepTime);

  } catch (Exception e) {

   e.printStackTrace();

  }

  threadPoolTaskData = null;

 }

 public Object getTask() {

  return this.threadPoolTaskData;

 }

}

 


//------------------------------------------------------------
说明:
1
、在这段程序中,一个任务就是一个Runnable类型的对象,也就是一个ThreadPoolTask类型的对象。

2、一般来说任务除了处理方式外,还需要处理的数据,处理的数据通过构造方法传给任务。

3、在这段程序中,main()方法相当于一个残忍的领导,他派发出许多任务,丢给一个叫 threadPool的任劳任怨的小组来做。

这个小组里面队员至少有两个,如果他们两个忙不过来,任务就被放到任务列表里面。

如果积压的任务过多,多到任务列表都装不下(超过3)的时候,就雇佣新的队员来帮忙。但是基于成本的考虑,不能雇佣太多的队员,至多只能雇佣 4个。

如果四个队员都在忙时,再有新的任务,这个小组就处理不了了,任务就会被通过一种策略来处理,我们的处理方式是不停的派发,直到接受这个任务为止(更残忍!呵呵)

因为队员工作是需要成本的,如果工作很闲,闲到 3SECONDS都没有新的任务了,那么有的队员就会被解雇了,但是,为了小组的正常运转,即使工作再闲,小组的队员也不能少于两个。

4、通过调整 produceTaskSleepTime consumeTaskSleepTime的大小来实现对派发任务和处理任务的速度的控制,改变这两个值就可以观察不同速率下程序的工作情况。

5、通过调整4中所指的数据,再加上调整任务丢弃策略,换上其他三种策略,就可以看出不同策略下的不同处理方式。

6、对于其他的使用方法,参看jdk的帮助,很容易理解和使用。

 

posted @ 2011-12-12 15:57 abin 阅读(227) | 评论 (0)编辑 收藏

java.lang.Object
java.util.concurrent.AbstractExecutorService
java.util.concurrent.ThreadPoolExecutor
所 有已实现的接口:
ExecutorExecutorService

强烈建议程序员使用较为方便的 Executors 工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、Executors.newFixedThreadPool(int)(固定大小线程池)和 Executors.newSingleThreadExecutor()(单个后台线程),它们均为大多数使用场景预定义了设置。下面是对ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory, 

RejectedExecutionHandler handler) 的一些分析:

  1. 核心和最大池大小:ThreadPoolExecutor将根据corePoolSize和maximumPoolSize设置的边界自动调整大小。当新任务在方法execute(java.lang.Runnable) 中提交时,如果运行的线程少于 corePoolSize,则创建新线程来处理请求,即使其他辅助线程是空闲的。如果运行的线程多于 corePoolSize 而少于 maximumPoolSize,则仅当队列满时才创建新线程。如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则允许池适应任意数量的并发任务。
  2.  创建新线程:使用 ThreadFactory 创建新线程。如果没有另外说明,则在同一个 ThreadGroup 中一律使用 Executors.defaultThreadFactory() 创建线程,并且这些线程具有相同的NORM_PRIORITY 优先级和非守护进程状态。通过提供不同的 ThreadFactory,可以改变线程的名称、线程组、优先级、守护进程状态,等等。如果从 newThread 返回 null 时ThreadFactory 未能创建线程,则执行程序将继续运行,但不能执行任何任务。
  3. 保持活动时间 如果池中当前有多于 corePoolSize 的线程,则这些多出的线程在空闲时间超过 keepAliveTime 时将会终止
  4. 排队所有 BlockingQueue 都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:

    • 如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。
    • 如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。
    • 如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。
  5. 排队有三种通用策略:
    1. 直接提交。工作队列的默认选项是 SynchronousQueue(一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有),它将任务直接提交给线程而不保持它们。在此,如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败,因此会构造一个新的线程此策略可以避免在处理可能具有内部依赖性的请求集合时出现锁定直接提交通常要求无界 maximumPoolSizes 以避免拒绝新提交的任务。
    2. 无界队列使用无界队列(例如,不具有预定义容量的 LinkedBlockingQueue一个基于已链接节点的、范围任意的 blocking queue)将导致在所有 corePoolSize 线程都忙的情况下将新任务加入队列。这样,创建的线程就不会超过 corePoolSize,maximumPoolSize 的值也就无效了当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列,例如,在 Web 页服务器中。
    3. 有界队列当使用有限的 maximumPoolSizes 时,有界队列(如 ArrayBlockingQueue一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序)有助于防止资源耗尽,但是可能较难调整和控制队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量使用小型队列通常要求较大的池大小,CPU 使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
  6. 此类提供 protected 可重写的 beforeExecute(java.lang.Thread, java.lang.Runnable)  afterExecute(java.lang.Runnable, java.lang.Throwable) 方法,这两种方法分别在执行每个任务之前和之后调用。如果挂钩或回调方法抛出异常,则内部辅助线程将依次失败并突然终止。
posted @ 2011-12-12 15:23 abin 阅读(401) | 评论 (0)编辑 收藏

 昨天开始研究java.util.concurrent,是出于线程安全的知识懂得不多,对自己写的线程池没有信心,所以就用了包里专家写好的线程池。这个包的功能很强大。有兴趣的朋友可以搜索了解更多的内容。

     今天刚写好了一段200行左右的代码,拿出来跟大家分享我的学习经验。初次实践,不足之处,望能得到高手的指点。

功能说明:一个发送消息模块将消息发送到消息队列中,无需等待返回结果,发送模块继续执行其他任务。消息队列中的指令由线程池中的线程来处理。使用一个Queue来存放线程池溢出时的任务。

TestDriver.java是一个驱动测试,sendMsg方法不间断的向ThreadPoolManager发送数据。


public class TestDriver
{
    ThreadPoolManager tpm = ThreadPoolManager.newInstance();

    public void sendMsg( String msg )
    {
        tpm.addLogMsg( msg + "记录一条日志 " );
    }

    public static void main( String[] args )
    {
        for( int i = 0; i < 100; i++ )
        {
            new TestDriver().sendMsg( Integer.toString( i ) );
        }
    }
}


 


ThreadPoolManager类:是负责管理线程池的类。同时维护一个Queue和调度进程。

public class ThreadPoolManager
{
 private static ThreadPoolManager tpm = new ThreadPoolManager();

 // 线程池维护线程的最少数量
 private final static int CORE_POOL_SIZE = 4;

 // 线程池维护线程的最大数量
 private final static int MAX_POOL_SIZE = 10;

 // 线程池维护线程所允许的空闲时间
 private final static int KEEP_ALIVE_TIME = 0;

 // 线程池所使用的缓冲队列大小
 private final static int WORK_QUEUE_SIZE = 10;

 // 消息缓冲队列
 Queue<String> msgQueue = new LinkedList<String>();

 // 访问消息缓存的调度线程
 final Runnable accessBufferThread = new Runnable()
 {
  public void run()
  {
   // 查看是否有待定请求,如果有,则创建一个新的AccessDBThread,并添加到线程池中
   if( hasMoreAcquire() )
   {
    String msg = ( String ) msgQueue.poll();
    Runnable task = new AccessDBThread( msg );
    threadPool.execute( task );
   }
  }
 };

 final RejectedExecutionHandler handler = new RejectedExecutionHandler()
 {
  public void rejectedExecution( Runnable r, ThreadPoolExecutor executor )
  {
   System.out.println(((AccessDBThread )r).getMsg()+"消息放入队列中重新等待执行");
   msgQueue.offer((( AccessDBThread ) r ).getMsg() );
  }
 };

 // 管理数据库访问的线程池
 final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
   CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
   new ArrayBlockingQueue( WORK_QUEUE_SIZE ), this.handler );

 // 调度线程池
 final ScheduledExecutorService scheduler = Executors
   .newScheduledThreadPool( 1 );

 final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(
   accessBufferThread, 0, 1, TimeUnit.SECONDS );

 public static ThreadPoolManager newInstance()
 {
  return tpm;
 }

 private ThreadPoolManager(){}

 private boolean hasMoreAcquire()
 {
  return !msgQueue.isEmpty();
 }

 public void addLogMsg( String msg )
 {
  Runnable task = new AccessDBThread( msg );
  threadPool.execute( task );
 }
}




AccessDBThread类:线程池中工作的线程。

 public class AccessDBThread implements Runnable
{
 private String msg;
 
 public String getMsg()
 {
  return msg;
 }

 public void setMsg( String msg )
 {
  this.msg = msg;
 }
 
 public AccessDBThread(){
  super();
 }
 
 public AccessDBThread(String msg){
  this.msg = msg;
 }

 public void run()
 {
  // 向数据库中添加Msg变量值
  System.out.println("Added the message: "+msg+" into the Database");
 }

}


 


posted @ 2011-12-12 15:09 abin 阅读(709) | 评论 (0)编辑 收藏

ThreadPoolManager类:负责管理线程池,调用轮询的线程来访问字符串缓冲区的内容,维护缓冲区,当线程池溢出时抛出的Runnable任务被加入到字符缓冲区。



package com.abin.message.line;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolManager {
private static ThreadPoolManager tpm = new ThreadPoolManager();
// 线程池维护线程的最少数量
private final static int CORE_POOL_SIZE = 4;
// 线程池维护线程的最大数量
private final static int MAX_POOL_SIZE = 10;
// 线程池维护线程所允许的空闲时间
private final static int KEEP_ALIVE_TIME = 0;
// 线程池所使用的缓冲队列大小
private final static int WORK_QUEUE_SIZE = 10;
// 消息缓冲队列
Queue msgQueue = new LinkedList();
// 访问消息缓存的调度线程
final Runnable accessBufferThread = new Runnable() {
  public void run() {
   // 查看是否有待定请求,如果有,则创建一个新的AccessDBThread,并添加到线程池中
   if (hasMoreAcquire()) {
    String msg = (String) msgQueue.poll();
    Runnable task = new AccessDBThread(msg);
    threadPool.execute(task);
   }
  }
};
final RejectedExecutionHandler handler = new RejectedExecutionHandler() {
  public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
   System.out.println(((AccessDBThread) r).getMsg() + "消息放入队列中重新等待执行");
   msgQueue.offer(((AccessDBThread) r).getMsg());
  }
};
// 管理数据库访问的线程池
final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
   CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
   new ArrayBlockingQueue(WORK_QUEUE_SIZE), this.handler);
// 调度线程池
final ScheduledExecutorService scheduler = Executors
   .newScheduledThreadPool(1);
final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(
   accessBufferThread, 0, 1, TimeUnit.SECONDS);

public static ThreadPoolManager newInstance() {
  return tpm;
}

private ThreadPoolManager() {
}

private boolean hasMoreAcquire() {
  return !msgQueue.isEmpty();
}

public void addLogMsg(String msg) {
  Runnable task = new AccessDBThread(msg);
  threadPool.execute(task);
}
}














package com.abin.message.line;

public class AccessDBThread implements Runnable {
private String msg;

public String getMsg() {
  return msg;
}

public void setMsg(String msg) {
  this.msg = msg;
}

public AccessDBThread() {
  super();
}

public AccessDBThread(String msg) {
  this.msg = msg;
}

public void run() {
  // 向数据库中添加Msg变量值
  System.out.println("Added the message: " + msg + " into the Database");
}
}













package com.abin.message.line;

public class TestDriver {
ThreadPoolManager tpm = ThreadPoolManager.newInstance();

public void sendMsg(String msg) {
  tpm.addLogMsg(msg + "记录一条日志 ");
}

public static void main(String[] args) {
  for (int i = 0; i < 100; i++) {
   new TestDriver().sendMsg(Integer.toString(i));
  }
}
}




posted @ 2011-12-12 13:21 abin 阅读(478) | 评论 (0)编辑 收藏

package com.ibm.abin.util;

import java.util.Random;

/**
 * Title: Pager
 * Description: 分页工具
 */
public class Pager {
 
 //标准列表分页,用于后台
 public static String getPagerNormal(int total, int pagesize, int pagenum,String pageurl) {
  int count = total / pagesize;
  if (total % pagesize > 0) {
   count++;
  }
  if(pageurl.indexOf("?")>-1){
   pageurl = pageurl + "&";
  }else{
   pageurl = pageurl + "?";
  }
  StringBuffer buf = new StringBuffer();
  buf.append("共有"+total+"条记录&nbsp;&nbsp;");
  buf.append(pagenum+"/"+ count +"&nbsp;&nbsp;");
  if (pagenum == 1) {
   buf.append("<SPAN style='color:#CCCCCC'>【首页】</SPAN><SPAN style='color:#CCCCCC'>【上一页】</SPAN>&nbsp;&nbsp;");
  } else {
   buf.append("【<a href='" + pageurl + "pagenum=1'>首页</a>】【<a href='" + pageurl + "pagenum=" + (pagenum - 1)
     + "' >上一页</a>】");
  }
  int bound1 = ((pagenum - 2) <= 0) ? 1 : (pagenum - 2);
  int bound2 = ((pagenum + 2) >= count) ? count : (pagenum + 2);
  for (int i = bound1; i <= bound2; i++) {
   if (i == pagenum) {
    buf.append("<SPAN style='color:#FF0000'>" + i
      + "</SPAN>&nbsp;&nbsp;");
   } else {
    buf.append("<a href='" + pageurl + "pagenum=" + i + "'>" + i
      + "</a>&nbsp;&nbsp;");
   }
  }
  if (bound2 < count) {
   buf.append("<SPAN>...</SPAN>");
  }
  if (pagenum == count||count==0) {
   buf.append("<SPAN style='color:#CCCCCC'>【下一页】</SPAN><SPAN style='color:#CCCCCC'>【尾页】</SPAN>");
  } else {
   buf.append("【<a href='" + pageurl + "pagenum=" + (pagenum + 1)
     + "'>下一页</a>】【<a href='" + pageurl + "pagenum=" + count
     + "'>尾页</a>】");
  }
  return buf.toString();
 }
 
 
 //标准列表分页2,用于后台
 public static String getPagerNormal2(int total, int pagesize, int pagenum,String pageurl) {
  int count = total / pagesize;
  if (total % pagesize > 0) {
   count++;
  }
  if(pageurl.indexOf("?")>-1){
   pageurl = pageurl + "&";
  }else{
   pageurl = pageurl + "?";
  }
  StringBuffer buf = new StringBuffer();
  buf.append("共有"+total+"条记录&nbsp;&nbsp;");
  buf.append(pagenum+"/"+ count +"&nbsp;&nbsp;");
  if (pagenum == 1) {
   buf.append("<SPAN style='color:#CCCCCC'>【首页】</SPAN><SPAN style='color:#CCCCCC'>【上一页】</SPAN>&nbsp;&nbsp;");
  } else {
   buf.append("【<a href='" + pageurl + "pagenum=1'>首页</a>】【<a href='" + pageurl + "pagenum=" + (pagenum - 1)
     + "' >上一页</a>】");
  }
  int bound1 = ((pagenum - 5) <= 0) ? 1 : (pagenum - 5);
  int bound2 = ((pagenum + 5) >= count) ? count : (pagenum + 5);
  for (int i = bound1; i <= bound2; i++) {
   if (i == pagenum) {
    buf.append("<SPAN style='color:#FF0000'>" + i
      + "</SPAN>&nbsp;&nbsp;");
   } else {
    buf.append("<a href='" + pageurl + "pagenum=" + i + "'>" + i
      + "</a>&nbsp;&nbsp;");
   }
  }
  if (bound2 < count) {
   buf.append("<SPAN>...</SPAN>");
  }
  if (pagenum == count||count==0) {
   buf.append("<SPAN style='color:#CCCCCC'>【下一页】</SPAN><SPAN style='color:#CCCCCC'>【尾页】</SPAN>");
  } else {
   buf.append("【<a href='" + pageurl + "pagenum=" + (pagenum + 1)
     + "'>下一页</a>】【<a href='" + pageurl + "pagenum=" + count
     + "'>尾页</a>】");
   
   buf.append("第"+pagenum+"/"+ count+"页  ");
   buf.append("<form action='"+pageurl+"' method='post'><input name='pagenum' format='*N' size='3' maxlength='5' value='' emptyok='true' /><input type='submit' value='跳转' /></form>");
  }
  return buf.toString();
 }
 
 
 
 //简单列表分页,用于wap1.0前台
 public static String getPagerSimple(int total, int pagesize, int pagenum,String pageurl) {
  int count = total / pagesize;
  if (total % pagesize > 0) {
   count++;
  }
  if(pageurl.indexOf("?")>-1){
   pageurl = pageurl + "&amp;";
  }else{
   pageurl = pageurl + "?";
  }
  StringBuffer buf = new StringBuffer();
  if(count>1){
   if (pagenum == count) {
    buf.append("[下页] ");
   } else {
    buf.append("[<a href='" + pageurl + "pn=" + (pagenum + 1)
      + "'>下页</a>] ");
   }
   if (pagenum == 1) {
    buf.append("[上页] ");
   } else {
    buf.append("[<a href='" + pageurl + "pn=" + (pagenum - 1)
      + "'>上页</a>] ");
   }
   buf.append("第"+pagenum+"/"+ count+"页  ");
   Random r = new Random();
   int inputpage = r.nextInt(100);
   buf.append("<input name='page"+inputpage+"' value='"+pagenum+"' emptyok='true' format='*N' size='3'/>[<a href='"+pageurl+"pn=$(page"+inputpage+")'>跳转</a>]");
  }
  return buf.toString();
 }
 //简单列表分页,用于wap2.0前台
 public static String getPagerSimple2(int total, int pagesize, int pagenum,String pageurl) {
  int count = total / pagesize;
  if (total % pagesize > 0) {
   count++;
  }
  String pageurl2 ="";
  if(pageurl.indexOf("?")>-1){
   pageurl2 = pageurl + "&amp;";
  }else{
   pageurl2 = pageurl + "?";
  }
  StringBuffer buf = new StringBuffer();
  if(count>1){
   if (pagenum == count) {
    buf.append("[下页] ");
   } else {
    buf.append("[<a href='" + pageurl2 + "pn=" + (pagenum + 1)
      + "'>下页</a>] ");
   }
   if (pagenum == 1) {
    buf.append("[上页] ");
   } else {
    buf.append("[<a href='" + pageurl2 + "pn=" + (pagenum - 1)
      + "'>上页</a>] ");
   }
   buf.append("第"+pagenum+"/"+ count+"页  ");
   buf.append("<form action='"+pageurl+"' method='post'><input name='pn' format='*N' size='3' maxlength='5' value='' emptyok='true' /><input type='submit' value='跳转' /></form>");
  }
  return buf.toString();
 }
 public static String getPagerSimple3(int total, int pagesize, int pagenum,String pageurl, String urlLable) {
  int count = total / pagesize;
  if (total % pagesize > 0) {
   count++;
  }
  if(pageurl.indexOf("?")>-1){
   pageurl = pageurl + "&amp;";
  }else{
   pageurl = pageurl + "?";
  }
  StringBuffer buf = new StringBuffer();
  if(count>1){
   if (pagenum != count) {
    buf.append("<a href='");
    buf.append(pageurl);
    buf.append("pn=");
    buf.append(pagenum + 1);    
    buf.append("'>");
    buf.append(urlLable);
    buf.append("</a><br/> ");
   }
   
  }
  return buf.toString();
 }
 //用于长文本分页
 public static String getPagerText(int total, int pagesize, int pagenum,String pageurl) {
  int count = total / pagesize;
  if (total % pagesize > 0) {
   count++;
  }
  if(pageurl.indexOf("?")>-1){
   pageurl = pageurl + "&amp;";
  }else{
   pageurl = pageurl + "?";
  }
  StringBuffer buf = new StringBuffer();
  if(count>1){
   buf.append("["+pagenum+"/"+count+"]");
   if (pagenum < count-1) {
    buf.append(" <a href='" + pageurl + "pn=" + (pagenum + 1)
      + "'>下页</a>|");
    if (pagenum > 1) {
     buf.append("<a href='" + pageurl + "pn=" + (pagenum - 1)
       + "'>上页|</a>");
    }
    buf.append("<a href='" + pageurl + "pn="+ (pagenum + 1)+"&amp;y=0'>余下全文</a>");
   }
   if(pagenum==(count-1)){
    if(pagenum==1){
     buf.append("<a href='" + pageurl + "pn=" + (pagenum + 1)
       + "'>下页</a>");
    }
    else{
     buf.append("<a href='" + pageurl + "pn=" + (pagenum + 1)
       + "'>下页|</a>");
    }
    if (pagenum > 1) {
     buf.append("<a href='" + pageurl + "pn=" + (pagenum - 1)
       + "'>上页</a>");
    }
   }
   if(pagenum==count){
    buf.append("<a href='" + pageurl + "pn=" + (pagenum - 1)
      + "'>上页</a>");
   }
   
   buf.append("<br/>");
   //for(int i=1;i<=count;i++){
   // if(pagenum==i){
   //  buf.append("["+i+"]");
   // }else{
   //  buf.append("[<a href='" + pageurl + "pn=" + i +"'>"+i+"</a>]");
   // }
   //}
  }
  return buf.toString();
 }
}

posted @ 2011-12-12 09:56 abin 阅读(1822) | 评论 (0)编辑 收藏

1.  超级用户相关:
1. use admin
2. #增加或修改用户密码
3. db.addUser(ixigua,’pwd’)
4. #查看用户列表
5. db.system.users.find()
6. #用户认证
7. db.auth(ixigua,’pwd’)
8. #删除用户
9. db.removeUser(‘mongodb’)
10. #查看所有用户
11. show users
12. #查看所有数据库
13. show dbs
14. #查看所有的collection
15. show collections
16. #查看各collection的状态
17. db.printCollectionStats()
18. #查看主从复制状态
19. db.printReplicationInfo()
20. #修复数据库
21. db.repairDatabase()
22. #设置记录profiling,0=off 1=slow 2=all
23. db.setProfilingLevel(1)
24. #查看profiling
25. show profile
26. #拷贝数据库
27. db.copyDatabase(‘mail_addr’,'mail_addr_tmp’)
28. #删除collection
29. db.mail_addr.drop()
30. #删除当前的数据库
31. db.dropDatabase()
2. 客户端连接
1. /usr/local/mongodb/bin/mongo 8.8.88/ixigualib -u ixigua -p ‘pwd’
3. 增删改
1. #存储嵌套的对象
2. db.foo.save({‘name’:'ysz’,'address’:{‘city’:'beijing’,'post’:100096},’phone’:[138,139]})
3. #存储数组对象
4. db.user_addr.save({‘Uid’:'yushunzhi@sohu.com’,'Al’:['test-1@sohu.com','test-2@sohu.com']})
5. #根据query条件修改,如果不存在则插入,允许修改多条记录
6. db.foo.update({‘yy’:5},{‘$set’:{‘xx’:2}},upsert=true,multi=true)
7. #删除yy=5的记录
8. db.foo.remove({‘yy’:5})
9. #删除所有的记录
10. db.foo.remove()
4. 索引
1. #增加索引:1(ascending),-1(descending)
2. db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
3. #索引子对象
4. db.user_addr.ensureIndex({‘Al.Em’: 1})
5. #查看索引信息
6. db.deliver_status.getIndexes()
7. db.deliver_status.getIndexKeys()
8. #根据索引名删除索引
9. db.user_addr.dropIndex(‘Al.Em_1′)
5. 查询
1. #查找所有
2. db.foo.find()
3. #查找一条记录
4. db.foo.findOne()
5. #根据条件检索10条记录
6. db.foo.find({‘msg’:'Hello 1′}).limit(10)
7. #sort排序
8. db.deliver_status.find({‘From’:'ixigua@sina.com’}).sort({‘Dt’,-1})
9. db.deliver_status.find().sort({‘Ct’:-1}).limit(1)
10. #count操作
11. db.user_addr.count()
12. #distinct操作
13. db.foo.distinct(‘msg’)
14. #>操作
15. db.foo.find({“timestamp”: {“$gte” : 2}})
16. #子对象的查找
17. db.foo.find({‘address.city’:'beijing’})
6. 管理
1. #查看collection数据的大小
2. db.deliver_status.dataSize()
3. #查看colleciont状态
4. db.deliver_status.stats()
5. #查询所有索引的大小
6. db.deliver_status.totalIndexSize()

posted @ 2011-12-06 19:53 abin 阅读(371) | 评论 (0)编辑 收藏

仅列出标题
共50页: First 上一页 42 43 44 45 46 47 48 49 50 下一页