??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲午夜福利在线观看,亚洲国产天堂久久综合,亚洲国产亚洲片在线观看播放http://m.tkk7.com/176142998/zh-cnMon, 12 May 2025 04:06:28 GMTMon, 12 May 2025 04:06:28 GMT60suse下的weblogic下蝲地址http://m.tkk7.com/176142998/archive/2012/04/12/373909.html飞飞飞飞Thu, 12 Apr 2012 01:54:00 GMThttp://m.tkk7.com/176142998/archive/2012/04/12/373909.htmlhttp://m.tkk7.com/176142998/comments/373909.htmlhttp://m.tkk7.com/176142998/archive/2012/04/12/373909.html#Feedback0http://m.tkk7.com/176142998/comments/commentRss/373909.htmlhttp://m.tkk7.com/176142998/services/trackbacks/373909.htmlhttp://www.oracle.com/technetwork/cn/middleware/ias/downloads/wls-main-091116-zhs.html


各个版本的都有,以下列D出来9.2?/p>

Oracle WebLogic Server 9.2 MP3版本

http://download.oracle.com/otn/bea/weblogic/server923_win32.exe.zip

http://download.oracle.com/otn/bea/weblogic/server923_linux32.bin.zip

http://download.oracle.com/otn/bea/weblogic/server923_solaris32.bin.zip

 

Oracle WebLogic Server 9.2 MP4版本

 

http://download.oracle.com/otn/bea/weblogic/server924_win32.zip

 

http://download.oracle.com/otn/bea/weblogic/server924_linux32.zip

http://download.oracle.com/otn/bea/weblogic/server924_solaris32.zip

 

Oracle WebLogic Server 10.0 MP2 版本

http://download.oracle.com/otn/bea/weblogic/V16484-01.zip



飞飞 2012-04-12 09:54 发表评论
]]>
opensuse讄oracle开机启动脚?/title><link>http://m.tkk7.com/176142998/archive/2012/04/06/373486.html</link><dc:creator>飞飞</dc:creator><author>飞飞</author><pubDate>Fri, 06 Apr 2012 09:35:00 GMT</pubDate><guid>http://m.tkk7.com/176142998/archive/2012/04/06/373486.html</guid><wfw:comment>http://m.tkk7.com/176142998/comments/373486.html</wfw:comment><comments>http://m.tkk7.com/176142998/archive/2012/04/06/373486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/176142998/comments/commentRss/373486.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/176142998/services/trackbacks/373486.html</trackback:ping><description><![CDATA[<br /><br /> <p>linux-geum:/etc/init.d # more start_oracle.sh <br />#this script is used to start the oracle</p> <p>su - oracle -c "/opt/oracle/product/10g/bin/dbstart"</p> <p>su - oracle -c "/opt/oracle/product/10g/bin/lsnrctl start"</p><br />ln -s /etc/init.d/start_oracle.sh  /etc/rc.d/rc2.d/S16start_oracle<br />ln -s /etc/init.d/start_oracle.sh  /etc/rc.d/rc3.d/S16start_oracle<br />ln -s /etc/init.d/start_oracle.sh  /etc/rc.d/rc5.d/S16start_oracle<br /><br /> <p>linux-geum:/etc/init.d # more stop_oracle.sh <br />#this script is used to stop the oracle</p> <p>su - oracle -c "/opt/oracle/product/10g/bin/lsnrctl stop"</p> <p>su - oracle -c "/opt/oracle/product/10g/bin/bin/dbshut"</p><br />ln -s /etc/init.d/stop_oracle.sh  /etc/rc.d/rc2.d/S16stop_oracle<br />ln -s /etc/init.d/stop_oracle.sh  /etc/rc.d/rc3.d/S16stop_oracle<br />ln -s /etc/init.d/stop_oracle.sh  /etc/rc.d/rc5.d/S16stop_oracle<br /><br /><img src ="http://m.tkk7.com/176142998/aggbug/373486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/176142998/" target="_blank">飞飞</a> 2012-04-06 17:35 <a href="http://m.tkk7.com/176142998/archive/2012/04/06/373486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>opensusepȝ下设|memcache开机启?/title><link>http://m.tkk7.com/176142998/archive/2012/04/06/373485.html</link><dc:creator>飞飞</dc:creator><author>飞飞</author><pubDate>Fri, 06 Apr 2012 09:33:00 GMT</pubDate><guid>http://m.tkk7.com/176142998/archive/2012/04/06/373485.html</guid><wfw:comment>http://m.tkk7.com/176142998/comments/373485.html</wfw:comment><comments>http://m.tkk7.com/176142998/archive/2012/04/06/373485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/176142998/comments/commentRss/373485.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/176142998/services/trackbacks/373485.html</trackback:ping><description><![CDATA[?etc/init.d 下新建after.local或者编辑after.local文gQ?br /><br />文g内容<br />/usr/local/bin/memcached -d -m 512 -u root -l 192.168.1.106 -p 11211 -c 1024 -P /tmp/memcached.pid<br /> <img src ="http://m.tkk7.com/176142998/aggbug/373485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/176142998/" target="_blank">飞飞</a> 2012-04-06 17:33 <a href="http://m.tkk7.com/176142998/archive/2012/04/06/373485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring的AOP拦截用户操作DAO日志信息记录http://m.tkk7.com/176142998/archive/2011/11/07/363115.html飞飞飞飞Mon, 07 Nov 2011 11:48:00 GMThttp://m.tkk7.com/176142998/archive/2011/11/07/363115.htmlhttp://m.tkk7.com/176142998/comments/363115.htmlhttp://m.tkk7.com/176142998/archive/2011/11/07/363115.html#Feedback0http://m.tkk7.com/176142998/comments/commentRss/363115.htmlhttp://m.tkk7.com/176142998/services/trackbacks/363115.html1、主要实现用户在q行某项操作Ӟ多数据库的更新、插入和删除详细信息。记录操作时的请求信息?br />2、在q入ControllerӞ生成一个事物IDQ在q个Controller中进行的所有DAO操作都绑定该事物ID。ƈq行记录日志信息?br />

package com.centralsoft.filter;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.regex.Pattern;

import net.sf.json.JSONObject;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import com.centralsoft.cache.CacheService;
import com.centralsoft.cache.annotations.Cache;
import com.centralsoft.cache.entity.MemCacheKey;
import com.centralsoft.entity.SysLogDetail;
import com.centralsoft.manager.pub.ThreadBean;
import com.centralsoft.manager.pub.ThreadId;
import com.centralsoft.pub.dao.SysLogDAO;
import com.centralsoft.webservice.pub.DateSHA;

/**
 * DAO层AOP拦截器,实现记录用户操作q的所有方法和参数Qƈ实现DAO层缓?br /> *
 * @author Administrator
 *
 */
@Aspect
@Component
public class AspectAutoDAOBean {

 @Autowired
 @Qualifier("CacheService")
 private CacheService memcache;

 @Autowired
 @Qualifier("SysLogDAO")
 private SysLogDAO SysLogDAO;

 @Around("execution(* com.centralsoft.*.dao.Zr*DAO.*(..))")
 public Object before(ProceedingJoinPoint joinPoint) throws Throwable {
  // 获取h事务ID信息
  ThreadId threadId = new ThreadBean().getThreadId();
  // 调用Ҏ(gu)名称
  String methodName = joinPoint.getSignature().getName();
  // 调用参数
  Object[] args = joinPoint.getArgs();
  Object object = null;

  // 数据库更新操作日?br />  if (Pattern.matches("(save|insert|add|delete|remove|del|update)[\\S]*",
    methodName)) {
   if (threadId != null && threadId.getTransactionalId() != null) {
    // 获取执行h事务ID
    String transactionalId = threadId.getTransactionalId();
    // 获取执行h用户ID
    String userId = threadId.getUserId();
    SysLogDetail sysLogDetail = new SysLogDetail();
    sysLogDetail.setXh(transactionalId);
    sysLogDetail.setUserId(userId);
    sysLogDetail.setMethod(methodName);
    JSONObject msg = new JSONObject();
    // 处理参数
    for (Object temp : args) {
     // 获取参数cd,不同参数cd数据处理不一?br />     Class<? extends Object> paramClazz = temp.getClass();
     String classType = paramClazz.getName();
     if (classType.equals("java.lang.String")) {
      msg.put("key", temp);
     } else if (classType.equals("java.util.HashMap")) {
      msg.putAll((HashMap<?, ?>) temp);
     } else if (classType.startsWith("com.")) {
      try {
       Field[] f = paramClazz.getDeclaredFields();
       for (Field field : f) {
        String fieldName = field.getName();
        field.setAccessible(true);
        msg.put(fieldName, field.get(temp));
       }
      } catch (SecurityException e) {
       e.printStackTrace();
      } catch (IllegalArgumentException e) {
       e.printStackTrace();
      }
     }
    }
    sysLogDetail.setMsg(msg.toString());
    // 记录DAO数据库操作日?br />    SysLogDAO.insertSysLogDetail(sysLogDetail);
   }
   // 执行数据库操?br />   object = joinPoint.proceed();

   // 数据库查询缓?br />  } else if (Pattern.matches("(query|load|get|select|read)[\\S]*",
    methodName)) {
   // DAO层缓存注?br />   MemCacheKey cacheKey = new MemCacheKey();
   // 获取cache注解属?br />   Cache cache = null;
   // 获取hҎ(gu)
   Class<?> cls = joinPoint.getTarget().getClass();
   // 获取class中的所有方?br />   Method[] methods = cls.getMethods();
   for (Method m : methods) {
    // 获取执行Ҏ(gu)前的注解信息?br />    if (m.getName().equals(methodName)) {
     cache = m.getAnnotation(Cache.class);
     break;
    }
   }

   if (cache != null) {
    // 获取memcacheKey,q进行MD5加密
    cacheKey = memcacheKey(cache, args);
    // 判断~存服务器是否存在该可以?br />    if (memcache.exist(cacheKey.getMemcacheKey())) {
     object = memcache.get(cacheKey.getMemcacheKey());
    } else {
     // 执行数据库操?br />     object = joinPoint.proceed();
     // 数据存放进~存
     if (cacheKey.getMemcacheKey() != null) {
      memcache.put(cacheKey.getMemcacheKey(),
        object == null ? "" : object, new Date(cacheKey
          .getTime()));
     }
    }
   } else {
    // 执行数据库操?br />    object = joinPoint.proceed();
   }
  } else {
   // 执行数据库操?br />   object = joinPoint.proceed();
  }

  return object;

 }

 /**
  * 获取Ҏ(gu)注解中的key获取memcache的含参数key?br />  *
  * @param cache
  * @param parameterObject
  * @return
  * @author fei.zhao 2011-10-10
  */
 @SuppressWarnings("unchecked")
 private static MemCacheKey memcacheKey(Cache cache, Object[] args) {
  MemCacheKey tempKey = new MemCacheKey();
  String key = "";
  boolean flag = true;
  StringBuilder keyBuilder = new StringBuilder(32);
  // 获取注解中的key?br />  String cacheKey = cache.key();
  Object[] cacheArgs = cacheKey.split("\\.");

  // 讄h参数在args[]中的序号
  // key参数q行循环遍历
  for (Object s : cacheArgs) {
   // 判断是否是格?,$...
   if (s.toString().startsWith("$")) {
    // 获取参数名称
    String type = s.toString().substring(1);
    // 获取参数?br />    Object temp = args[0];
    // 获取参数cd,不同参数cd数据处理不一?br />    Class<? extends Object> paramClazz = temp.getClass();
    String classType = paramClazz.getName();
    if (classType.equals("java.lang.String")) {
     keyBuilder.append(temp);
    } else if (classType.equals("java.util.HashMap")) {
     keyBuilder.append(((HashMap) temp).get(type));
    } else if (classType.startsWith("com.")) {
     try {
      Field f = paramClazz.getDeclaredField(type);// 实体中字D?br />      f.setAccessible(true);// 允许讉KU有字段
      keyBuilder.append(f.get(temp));
     } catch (SecurityException e) {
      flag = false;
      e.printStackTrace();
     } catch (NoSuchFieldException e) {
      flag = false;
      e.printStackTrace();
     } catch (IllegalArgumentException e) {
      flag = false;
      e.printStackTrace();
     } catch (IllegalAccessException e) {
      flag = false;
      e.printStackTrace();
     }
    }
   } else {
    keyBuilder.append(s);
   }
   // 每个参数后面d “.”号分?br />   keyBuilder.append(".");
  }
  if (args.length == 3) {
   keyBuilder.append(args[1] + ".").append(args[2]);
  }
  if (flag == true) {
   key = keyBuilder.toString();
   tempKey.setMemcacheKey(DateSHA.shaEncrypt(key));
   tempKey.setTime(cache.time());
  }
  return tempKey;
 }
}



飞飞 2011-11-07 19:48 发表评论
]]>
用HttpClient来模拟浏览器GET POST(?http://m.tkk7.com/176142998/archive/2011/04/22/348787.html飞飞飞飞Fri, 22 Apr 2011 04:38:00 GMThttp://m.tkk7.com/176142998/archive/2011/04/22/348787.htmlhttp://m.tkk7.com/176142998/comments/348787.htmlhttp://m.tkk7.com/176142998/archive/2011/04/22/348787.html#Feedback0http://m.tkk7.com/176142998/comments/commentRss/348787.htmlhttp://m.tkk7.com/176142998/services/trackbacks/348787.html一般的情况下我们都是用IE或者Navigator览器来讉K一个WEB服务器,用来览面查看信息或者提交一些数据等{。所讉K的这些页面有的仅仅是一些普通的面Q有的需要用L(fng)录后方可使用Q或者需要认证以?qing)是一些通过加密方式传输Q例如HTTPS。目前我们用的览器处理这些情况都不会(x)构成问题。不q你可能在某些时候需要通过E序来访问这L(fng)一些页面,比如从别人的|页?#8220;?#8221;一些数据;利用某些站点提供的页面来完成某种功能Q例如说我们想知道某个手机号码的归属地而我们自己又没有q样的数据,因此只好借助其他公司已有的网站来完成q个功能Q这个时候我们需要向|页提交手机L(fng)q从q回的页面中解析出我们想要的数据来。如果对方仅仅是一个很单的面Q那我们的程序会(x)很简单,本文也就没有必要大张旗鼓的在q里费口舌。但是考虑C些服务授权的问题Q很多公司提供的面往往q不是可以通过一个简单的URL可以访问的Q而必ȝq注册然后登录后方可使用提供服务的页面,q个时候就涉及(qing)到COOKIE问题的处理。我们知道目前流行的***|术例如ASP、JSP无不是通过COOKIE来处理会(x)话信息的。ؓ(f)了我们的程序能使用别h所提供的服务页面,p求程序首先登录后再访问服务页面,q过E就需要自行处理cookieQ想惛_你用java.net.HttpURLConnection来完成这些功能时是多么恐怖的事情啊!况且q仅仅是我们所说的固的WEB服务器中的一个很常见?#8220;固”Q再有如通过HTTP来上传文件呢Q不需要头|q些问题有了“?#8221;很Ҏ(gu)解决了!

我们不可能列举所有可能的固Q我们会(x)针对几种最常见的问题进行处理。当然了Q正如前面说到的Q如果我们自׃用java.net.HttpURLConnection来搞定这些问题是很恐怖的事情Q因此在开始之前我们先要介l一下一个开放源码的目Q这个项目就是Apache开源组l中的httpclientQ它隶属于Jakarta的commons目Q目前的版本?.0RC2。commons下本来已l有一个net的子目Q但是又把httpclient单独提出来,可见http服务器的讉Kl非易事?/font>

Commons-httpclient目是专门设计来简化HTTP客户端与服务器进行各U通讯~程。通过它可以让原来很头疼的事情现在L的解冻I例如你不再管是HTTP或者HTTPS的通讯方式Q告诉它你想使用HTTPS方式Q剩下的事情交给httpclient替你完成。本文会(x)针对我们在编写HTTP客户端程序时l常到的几个问题进行分别介l如何用httpclient来解军_们,Z让读者更快的熟?zhn)q个目我们最开始先l出一个简单的例子来读取一个网늚内容Q然后@序渐q解x前进中的所形侍?/font>

1Q?d|页(HTTP/HTTPS)内容

下面是我们给出的一个简单的例子用来讉K某个面

/*

 * Created on 2003-12-14 by Liudong

 */

package http.demo;

 

import java.io.IOException;

 

import org.apache.commons.httpclient.*;

import org.apache.commons.httpclient.methods.*;

/**

 * 最单的HTTP客户?用来演示通过GET或者POST方式讉K某个面

 * @author Liudong

 */

public class SimpleClient {

 

    public static void main(String[] args) throws IOException

    {

        HttpClient client = new HttpClient();   

        //讄代理服务器地址和端?nbsp;   

        //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);

        //使用GETҎ(gu)Q如果服务器需要通过HTTPSq接Q那只需要将下面URL中的http换成https

        HttpMethod method = new GetMethod("http://java.sun.com");

        //使用POSTҎ(gu)

        //HttpMethod method = new PostMethod("http://java.sun.com");

        client.executeMethod(method);

        //打印服务器返回的状?/font>

        System.out.println(method.getStatusLine());

        //打印q回的信?/font>

        System.out.println(method.getResponseBodyAsString());

        //释放q接

        method.releaseConnection();

    }
}

 

在这个例子中首先创徏一个HTTP客户?HttpClient)的实例,然后选择提交的方法是GET或者POSTQ最后在HttpClient实例上执行提交的Ҏ(gu)Q最后从所选择的提交方法中d服务器反馈回来的l果。这是使用HttpClient的基本流E。其实用一行代码也可以搞定整个请求的q程Q非常的单!


2Q?以GET或者POST方式向网|交参?/font>

其实前面一个最单的CZ中我们已l介l了如何使用GET或者POST方式来请求一个页面,本小节与之不同的是多了提交时讑֮面所需的参敎ͼ我们知道如果是GET的请求方式,那么所有参数都直接攑ֈ面的URL后面用问号与面地址隔开Q每个参数用&隔开Q例如:(x)http://java.sun.com?name=liudong&mobile=123456Q但是当使用POSTҎ(gu)时就?x)稍微有一点点ȝ(ch)。本节的例子演C向如何查询手机L(fng)所在的城市Q代码如下:(x)

 

/*

 * Created on 2003-12-7 by Liudong

 */

package http.demo;

 

import java.io.IOException;

 

import org.apache.commons.httpclient.*;

import org.apache.commons.httpclient.methods.*;

/**

 * 提交参数演示

 * 该程序连接到一个用于查询手机号码所属地的页?/font>

 * 以便查询L(fng)D?330227所在的省䆾以及(qing)城市

 * @author Liudong

 */

public class SimpleHttpClient {

 

    public static void main(String[] args) throws IOException

    {

        HttpClient client = new HttpClient();

        client.getHostConfiguration().setHost("www.imobile.com.cn", 80, "http");

 

        HttpMethod method = getPostMethod();//使用POST方式提交数据

        client.executeMethod(method);

       //打印服务器返回的状?/font>

        System.out.println(method.getStatusLine());

        //打印l果面

        String response =

           new String(method.getResponseBodyAsString().getBytes("8859_1"));

       //打印q回的信?/font>

        System.out.println(response);

        method.releaseConnection();

    }

    /**

     * 使用GET方式提交数据

     * @return

     */

    private static HttpMethod getGetMethod(){

        return new GetMethod("/simcard.php?simcard=1330227");

    }

    /**

     * 使用POST方式提交数据

     * @return

     */

    private static HttpMethod getPostMethod(){

        PostMethod post = new PostMethod("/simcard.php");

        NameValuePair simcard = new NameValuePair("simcard","1330227");

        post.setRequestBody(new NameValuePair[] { simcard});

        return post;

    }

}

在上面的例子中页?/font>http://www.imobile.com.cn/simcard.php需要一个参数是simcardQ这个参数gؓ(f)手机L(fng)D,x机号码的前七位,服务器会(x)q回提交的手机号码对应的省䆾、城市以?qing)其他详l信息。GET的提交方法只需要在URL后加入参C息,而POST则需要通过NameValuePaircL讄参数名称和它所对应的?/font>

3Q?处理面重定?/font>

在JSP/Servlet~程中response.sendRedirectҎ(gu)是使用HTTP协议中的重定向机制。它与JSP中的<jsp:forward …>的区别在于后者是在服务器中实现页面的跌{Q也是说应用容器加载了所要蟩转的面的内容ƈq回l客L(fng)Q而前者是q回一个状态码Q这些状态码的可能D下表Q然后客L(fng)d需要蟩转到的页面的URLq新加载新的页面。就是这样一个过E,所以我们编E的时候就要通过HttpMethod.getStatusCode()Ҏ(gu)判断q回值是否ؓ(f)下表中的某个值来判断是否需要蟩转。如果已l确认需要进行页面蟩转了Q那么可以通过dHTTP头中的location属性来获取新的地址?/font>

状态码
 对应HttpServletResponse的常?br />  详细描述
 
301
 SC_MOVED_PERMANENTLY
 面已经怹Ud另外一个新地址
 
302
 SC_MOVED_TEMPORARILY
 面暂时Ud到另外一个新的地址
 
303
 SC_SEE_OTHER
 客户端请求的地址必须通过另外的URL来访?br />  
307
 SC_TEMPORARY_REDIRECT
 同SC_MOVED_TEMPORARILY
 


下面的代码片D|C如何处理页面的重定?/font>

client.executeMethod(post);

        System.out.println(post.getStatusLine().toString());

        post.releaseConnection();

       

        //(g)查是否重定向

        int statuscode = post.getStatusCode();

        if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) ||

            (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) ||

            (statuscode == HttpStatus.SC_SEE_OTHER) ||

(statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {

//d新的URL地址

            Header header = post.getResponseHeader("location");

            if (header != null) {

                String newuri = header.getValue();

                if ((newuri == null) || (newuri.equals("")))

                    newuri = "/";

                GetMethod redirect = new GetMethod(newuri);

                client.executeMethod(redirect);

                System.out.println("Redirect:"+ redirect.getStatusLine().toString());

                redirect.releaseConnection();

            } else

                System.out.println("Invalid redirect");

        }

我们可以自行~写两个JSP面Q其中一个页面用response.sendRedirectҎ(gu)重定向到另外一个页面用来测试上面的例子?/font>

4Q?模拟输入用户名和口o(h)q行d

本小节应该说是HTTP客户端编E中最常碰见的问题Q很多网站的内容都只是对注册用户可见的,q种情况下就必须要求使用正确的用户名和口令登录成功后Q方可浏览到惌的页面。因为HTTP协议是无状态的Q也是q接的有效期只限于当前请求,h内容l束后连接就关闭了。在q种情况下ؓ(f)了保存用L(fng)d信息必须使用到Cookie机制。以JSP/ServletZQ当览器请求一个JSP或者是Servlet的页面时Q应用服务器?x)返回一个参敎ͼ名ؓ(f)jsessionidQ因不同应用服务器而异Q,值是一个较长的唯一字符串的CookieQ这个字W串g是当前讉K该站点的?x)话标识。浏览器在每讉K该站点的其他面时候都要带上jsessionidq样的Cookie信息Q应用服务器Ҏ(gu)dq个?x)话标识来获取对应的会(x)话信息?/font>

对于需要用L(fng)录的|站Q一般在用户d成功后会(x)用戯料保存在服务器的?x)话中,q样当访问到其他的页面时候,应用服务器根据浏览器送上的Cookie中读取当前请求对应的?x)话标识以获得对应的会(x)话信息Q然后就可以判断用户资料是否存在于会(x)话信息中Q如果存在则允许讉K面Q否则蟩转到d面中要求用戯入帐号和口o(h)q行d。这是一般用JSP开发网站在处理用户d的比较通用的方法?/font>

q样一来,对于HTTP的客L(fng)来讲Q如果要讉K一个受保护的页面时必L拟浏览器所做的工作Q首先就是请求登录页面,然后dCookie|再次hd面q加入登录页所需的每个参敎ͼ最后就是请求最l所需的页面。当然在除第一ơ请求外其他的请求都需要附带上Cookie信息以便服务器能判断当前h是否已经通过验证。说了这么多Q可是如果你使用httpclient的话Q你甚至q一行代码都无需增加Q你只需要先传递登录信息执行登录过E,然后直接讉K惌的页面,跟访问一个普通的面没有M区别Q因为类HttpClient已经帮你做了所有该做的事情了,太棒了!下面的例子实Cq样一个访问的q程?/font>


/*

 * Created on 2003-12-7 by Liudong

 */

package http.demo;

 

import org.apache.commons.httpclient.*;

import org.apache.commons.httpclient.cookie.*;

import org.apache.commons.httpclient.methods.*;

 

/**

 * 用来演示d表单的示?/font>

 * @author Liudong

 */

public class FormLoginDemo {

 

    static final String LOGON_SITE = "localhost";

    static final int    LOGON_PORT = 8080;

   

    public static void main(String[] args) throws Exception{

        HttpClient client = new HttpClient();

        client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);

      

       //模拟d面login.jsp->main.jsp

        PostMethod post = new PostMethod("/main.jsp");

        NameValuePair name = new NameValuePair("name", "ld");    

        NameValuePair pass = new NameValuePair("password", "ld");    

        post.setRequestBody(new NameValuePair[]{name,pass});

       int status = client.executeMethod(post);

        System.out.println(post.getResponseBodyAsString());

        post.releaseConnection(); 

      

       //查看cookie信息

        CookieSpec cookiespec = CookiePolicy.getDefaultSpec();

        Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies());

       if (cookies.length == 0) {

           System.out.println("None");   

       } else {

           for (int i = 0; i < cookies.length; i++) {

               System.out.println(cookies[i].toString());   

           }

       }

       //讉K所需的页面main2.jsp

        GetMethod get = new GetMethod("/main2.jsp");

        client.executeMethod(get);

        System.out.println(get.getResponseBodyAsString());

        get.releaseConnection();

    }

}

5Q?提交XML格式参数

提交XML格式的参数很单,仅仅是一个提交时候的ContentType问题Q下面的例子演示从文件文件中dXML信息q提交给服务器的q程Q该q程可以用来试Web服务?/font>

import java.io.File;

import java.io.FileInputStream;

 

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.methods.EntityEnclosingMethod;

import org.apache.commons.httpclient.methods.PostMethod;

 

/**

 * 用来演示提交XML格式数据的例?/font>

 */

public class PostXMLClient {

 

    public static void main(String[] args) throws Exception {

        File input = new File(“test.xml”);

        PostMethod post = new PostMethod(“http://localhost:8080/httpclient/xml.jsp”);

        // 讄h的内容直接从文g中读?/font>

        post.setRequestBody(new FileInputStream(input));

       

        if (input.length() < Integer.MAX_VALUE)

            post.setRequestContentLength(input.length());

        else            post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);

       

        // 指定h内容的类?/font>

        post.setRequestHeader("Content-type", "text/xml; charset=GBK");

       

        HttpClient httpclient = new HttpClient();

        int result = httpclient.executeMethod(post);

        System.out.println("Response status code: " + result);

        System.out.println("Response body: ");

        System.out.println(post.getResponseBodyAsString());

        post.releaseConnection();

    }

}

6Q?通过HTTP上传文g

httpclient使用了单独的一个HttpMethod子类来处理文件的上传Q这个类是MultipartPostMethodQ该cdl封装了文g上传的细节,我们要做的仅仅是告诉它我们要上传文g的全路径卛_Q下面的代码片段演示如何使用q个cR?/font>

MultipartPostMethod filePost = new MultipartPostMethod(targetURL);

filePost.addParameter("fileName", targetFilePath);

HttpClient client = new HttpClient();

//׃要上传的文g可能比较?因此在此讄最大的q接时旉

client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);

int status = client.executeMethod(filePost);


上面代码中,targetFilePath即ؓ(f)要上传的文g所在的路径?/font>

7Q?讉K启用认证的页?/font>

我们l常?x)碰到这L(fng)面Q当讉K它的时候会(x)弹出一个浏览器的对话框要求输入用户名和密码后方可,q种用户认证的方式不同于我们在前面介l的Z表单的用戯n份验证。这是HTTP的认证策略,httpclient支持三种认证方式包括Q基本、摘要以?qing)NTLM认证。其中基本认证最单、通用但也最不安全;摘要认证是在HTTP 1.1中加入的认证方式Q而NTLM则是微Y公司定义的而不是通用的规范,最新版本的NTLM是比摘要认证q要安全的一U方式?/font>

下面例子是从httpclient的CVS服务器中下蝲的,它简单演C如何访问一个认证保护的面Q?/font>


import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.UsernamePasswordCredentials;

import org.apache.commons.httpclient.methods.GetMethod;

 

public class BasicAuthenticationExample {

    public BasicAuthenticationExample() {

    }

    public static void main(String[] args) throws Exception {

        HttpClient client = new HttpClient();

        client.getState().setCredentials(

            "www.verisign.com",

            "realm",

            new UsernamePasswordCredentials("username", "password")

        );

        GetMethod get = new GetMethod("https://www.verisign.com/products/index.html");

        get.setDoAuthentication( true );

        int status = client.executeMethod( get );

        System.out.println(status+""+ get.getResponseBodyAsString());

        get.releaseConnection();

    }

}

8Q?多线E模式下使用httpclient

多线E同时访问httpclientQ例如同时从一个站点上下蝲多个文g。对于同一个HttpConnection同一个时间只能有一个线E访问,Z保证多线E工作环境下不生冲H,httpclient使用了一个多U程q接理器的c:(x)MultiThreadedHttpConnectionManagerQ要使用q个cd单,只需要在构造HttpClient实例的时候传入即可,代码如下Q?/font>

MultiThreadedHttpConnectionManager connectionManager =

   new MultiThreadedHttpConnectionManager();

HttpClient client = new HttpClient(connectionManager);

以后管讉Kclient实例卛_?/font>



飞飞 2011-04-22 12:38 发表评论
]]>
httphW三方获取信息ؕ码处理!http://m.tkk7.com/176142998/archive/2011/04/22/348780.html飞飞飞飞Fri, 22 Apr 2011 03:00:00 GMThttp://m.tkk7.com/176142998/archive/2011/04/22/348780.htmlhttp://m.tkk7.com/176142998/comments/348780.htmlhttp://m.tkk7.com/176142998/archive/2011/04/22/348780.html#Feedback0http://m.tkk7.com/176142998/comments/commentRss/348780.htmlhttp://m.tkk7.com/176142998/services/trackbacks/348780.html import org.apache.commons.httpclient.methods.PostMethod;


public class UTF8PostMethod extends PostMethod
{
   
    public static final String ENCODE_UTF8 = "UTF-8";
   
    /**
     * 默认构造函?br />      * @param url    地址
     */
    public UTF8PostMethod(String url)
    {
        super(url);
    }

    /* (non-Javadoc)
     * @see org.apache.commons.httpclient.methods.EntityEnclosingMethod#getRequestCharSet()
     */
    @Override
    public String getRequestCharSet()
    {
        return ENCODE_UTF8;
    }

    /* (non-Javadoc)
     * @see org.apache.commons.httpclient.HttpMethodBase#getResponseCharSet()
     */
    @Override
    public String getResponseCharSet()
    {
        return ENCODE_UTF8;
    }
}


package com.org.softwore;

import org.apache.commons.httpclient.methods.GetMethod;

public class UTF8GetMethod extends GetMethod {
 public static final String ENCODE_UTF8 = "UTF-8";

 /**
  * 默认构造函?br />   *
  * @param url
  *            地址
  */
 public UTF8GetMethod(String url) {
  super(url);
 }

 /*
  * (non-Javadoc)
  *
  * @see
  * org.apache.commons.httpclient.methods.EntityEnclosingMethod#getRequestCharSet
  * ()
  */
 @Override
 public String getRequestCharSet() {
  return ENCODE_UTF8;
 }

 /*
  * (non-Javadoc)
  *
  * @see org.apache.commons.httpclient.HttpMethodBase#getResponseCharSet()
  */
 @Override
 public String getResponseCharSet() {
  return ENCODE_UTF8;
 }
}




试使用!

HttpMethod method = null;
        try {
            HttpClient client = new HttpClient();
            method = new UTF8PostMethod(
                    "http://.........");
            client.executeMethod(method);
            if (method.getStatusCode() == HttpStatus.SC_OK) {
                String response = method.getResponseBodyAsString();
                System.out.println(response);
            }

        } catch (HttpException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            if (method != null) {
                method.releaseConnection();
            }
        }



飞飞 2011-04-22 11:00 发表评论
]]>
领略Spring 3.x 时代的Spring MVC (?http://m.tkk7.com/176142998/archive/2011/04/21/348688.html飞飞飞飞Thu, 21 Apr 2011 03:02:00 GMThttp://m.tkk7.com/176142998/archive/2011/04/21/348688.htmlhttp://m.tkk7.com/176142998/comments/348688.htmlhttp://m.tkk7.com/176142998/archive/2011/04/21/348688.html#Feedback0http://m.tkk7.com/176142998/comments/commentRss/348688.htmlhttp://m.tkk7.com/176142998/services/trackbacks/348688.html 

鼎鼎大名的Spring框架3.0版在12?日由其作者之一——Juergen Hoeller先生在博客里宣告问世Qƈ命ؓ(f)里程版Q给Spring_丝们带来了震撼的快感。笔者即开“快R”拉了两个包回来,遗憾的是参考文档至今还没有出来(仅有API文档)Q这为学?fn)Spring 3.0带来了非常大的困难,但没有阻挡笔者对C品的兴趣?/font>

    Spring之父Rod Johnson先生早在2003q就预言EJB死(观点颇具争议)Q攻击EJB之臃肿是在虐待程序员。然而EJB 3.0出来后几乎宣判SpringdQ但?.0版以后Spring火爆E度已经过EJBQ两者的争斗至今仍不停息Q这也是Spring 3.0q文档还没有整理出来匆匆推出的原因。当?dng)Spring与EJB有很多各自独特优势之处,例如EJB的分布式q算、标准规范,Spring的IoC、AOP切面~程、偶合集成、MVC{等Q取各自之长在企业中应用如虎ȝ。Spring目前已经加入了J2EE规范QJ2EE世界更加精?.....

    或许是用MStruts1那死板的WEB框架Q才对Spring MVC׃释手Q尤其是2.5版本以后Q支持全注解配置方式Q已l很久没有再写qxml文g了?/font>

    3.0版是完全兼容2.5Q因此了?.5版的@MVC则更Ҏ(gu)接受。正如Arjen Poutsma伙子在他的博客里说的那P3.0时代集中致力于表述性状态{U?RESTQ希望我没有译错,金山词霸译?#8220;休息”)的网l服务和更容易的|络~程。的增加了更多的控制器cdQƈ增强了SOAP/WSDL/WSq些Z分布式体pȝ构?/font>

先回忆下2.5注解方式的@MVCQ来一个示例:(x)

@Controller
public class ArticleController{

  @RequestMapping("/articleView")
   public String getArticle(@RequestParam("id") String id, HttpServletRequest request){
    request.setAttribute("article", service.find(Article.class, id));
    return "articleView";
   }

}

    ArticleController没有实现M接口Q是一个最普通不q的pojoQ如果浏览器来了articleView.do?id=xxxq个hQSpring?x)找到getArticle()q个Ҏ(gu)Q该Ҏ(gu)W一个参数绑定到了URL上的h参数Q第二个是J2EE标准的request对象(可见Spring MVC是非侵入式的Q不像变态的Struts2)Q事实上q可以给定HttpServletResponse,ModelMap,甚至自己的类型,Spring都会(x)Zg入进来。通过一个逻辑层servicelgҎ(gu)id参数值去底层查找Article对象Qƈ攑օrequest作用域中Q最后返回的是面视囑֐Q这个例子中是返回到articleView.jsp中?/font>

    上例再变通下Q?/font>

@Controller
public class ArticleController{

  @RequestMapping("/articleView_*")
   public String getArticle(HttpServletRequest request){

    String id = StringUtil.getParam(request.getRequestURI(),"articleView_*");
    request.setAttribute("article", service.find(Article.class, id));
    return "articleView";
   }

}

    对于articleView_aaa.doQarticleView_bbbb.doQarticleView_c5h8j2.doQarticleView_xxx.doQ这L(fng)h都会(x)由getArticle()q个Ҏ(gu)来应付,是不是很有意思?

    Spring 3.0增加了一?strong style="font-weight: bold; line-height: 32px">@ PathVariable注解来支持可变的h路径Q将上面的代码在3.0版中再变通下Q?font style="line-height: 32px" size="4">

@Controller
public class ArticleController{

  @RequestMapping("/articleView/${id}")   //可以接受articleView/aaa.do,articleView/xxx.do...
   public String getArticle(@PathVariable String id, HttpServletRequest request){
    request.setAttribute("article", service.find(Article.class, id));
    return "articleView";
   }

}

再变得复杂些Q?/p>

@Controller
public class ArticleController{

  @RequestMapping("/articleList/${pageSize}/channel/*/category/${id}")   

   public String getArticles((@PathVariable Integer pageSize, @PathVariable int id, HttpServletRequest request){
    Integer channelId = StringUtil.getParam(request.getRequestURI(),"channel/*/");
    request.setAttribute("articles", service.findScroll(Article.class, pageSize,50,"channel=? and category=?",new Object[]{channelId,id}));
    
    return "articleList";
   }

}

    它已l灵zdURL地址完全可以自己随意~制?/p>

    Ҏ(gu)内容协商制的视图解析机制Q?/strong>

    2.5版是由@MVC控制器来军_视图解析器,3.0版将变得更加灉|Q似乎可以通过扩展名来转到不同的解析器中,例如h一?pdf文g是如何效果呢?3.0版都?x)带来不可思议的模式?/p>

    HTTPҎ(gu)的{换:(x)

    先看前台面一DHtml代码

<form:form method="delete">  
<p class="submit"><input type="submit" value="Delete Pet"/></p> 
</form:form>

    HTTP规范中form表单只有两种Ҏ(gu)——POST和GETQ?.0做了一个过滤器Q可以{换这些方法至四种——GET, PUT, POST, ?DELETE。控制器接受hQ?/p>

@Controller("/deleteArticle")
public class ArticleController{

  de style="line-height: 28px; ">@RequestMappingde>de style="line-height: 28px; ">(method = RequestMethod.DELETE)
de>   public String deleteArticle(@PathVariable String id, HttpServletRequest request){
    service.delete(Article.class, id);
    return "message";
   }

}
    3.0版仅在MVC子集中就增加了很多新Ҏ(gu),如果在IoC、AOP{等其它子集所有的变革Q绝对可以称得上Srping创始人所q的里程版本?.0版用的注解列表如下Q?/p>

? @Autowired
? @Component
? @Controller
? @InitBinder
? @ManagedAttribute
? @ManagedOperation
? @ManagedOperationParameters
? @ManagedOperationParameter
? @ManagedResource
? @PathVariable
? @PostConstruct
? @PreDestroy
? @Repository
? @RequestMapping
? @Required
? @Resource
? @Service
? @Transactional
    目前Spring 3版本已经CM2Q应该是M3完成后将推出最l正式版本,我想很快?x)来_(d)按照Spring的创始h|d.U翰逊的预言Q未来J2EE应用中Spring+Tomcat占dCQ是否引起争议,W者不敢点评,不过Oracle收购Sun后,JavaC֌是如何Q还无从知晓Q似乎罗?U翰逊对q宗收购案也有些紧张Q因为Oracle不像Sun的第一个谈判者IBM那样有过开放技术的先例(可以回忆下IBM早期的主板ȝ开放掀L(fng)兼容机潮至今波涛不熄)。目前国内对C西消化尚慢,我到图书城看了下QSpring 2.5的资料都很难扑ֈ。且很多企业都是qStruts1.x在做开发,管W者这栯?x)引来很多争议,但Struts1时代的灭亡只是时间问题。Struts2虽然改进了很多,依笔者看Q与Spring MVC相比仍有诸多的不I其看不惯那U变态的侵入模式Q看看它把HttpServletRequest、HttpSession、HttpServletResponse{servlet标准lgq成什么样Q开源时代,臛_我不愿意接受那种变态的潜规则?/p>

    W者早先常用Struts1.x框架Q它搭配了一套自qActionFormQ得编E工作量增加Q虽然可以变通用自qPojoQ但对于没有掌握J2EE底层工具c?BeanUtil)的开发h员来_(d)其类型匹配是非常复杂的事。事实上Spring MVC早在1.x版本完全用自qpojo来对应表单的填充Q配上属性编辑器Q可以解决类型{换问题,完全实现领域模型驱动的设计模式。由于MVC层的控制器也是Spring容器的Bean而已Q因此对整个目的控制、扩展变得非常容易。同时上文也Z点评了Struts2Q可见Spring MVC在各cMVC框架的优势所在。本w罗?U翰逊先生是设计模式高手Q一个优U的框架给我们带来的远q不只是开发效率,q有更先q的开发模式和理念...

    W者对Spring框架研究肤浅Q待日后了解掌握更多时会(x)常在博客中述之?br style="line-height: 32px" />



飞飞 2011-04-21 11:02 发表评论
]]>
iBatis整理——iBatis批处理实玎ͼSpring环境Q?Q{Q?/title><link>http://m.tkk7.com/176142998/archive/2011/04/21/348682.html</link><dc:creator>飞飞</dc:creator><author>飞飞</author><pubDate>Thu, 21 Apr 2011 02:15:00 GMT</pubDate><guid>http://m.tkk7.com/176142998/archive/2011/04/21/348682.html</guid><wfw:comment>http://m.tkk7.com/176142998/comments/348682.html</wfw:comment><comments>http://m.tkk7.com/176142998/archive/2011/04/21/348682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/176142998/comments/commentRss/348682.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/176142998/services/trackbacks/348682.html</trackback:ping><description><![CDATA[<strong><span style="font-size: large">?个层面分析这部分实现Q?nbsp;<br /> <ol style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 1.5em; line-height: 1.4em; padding-top: 0px"> <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">iBatis的基本实? <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">Z事务的iBatis的基本实? <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">Z事务的Spring+iBatis实现 <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">Z回调方式的Spring+iBatis实现</li> </ol> <br /> 1.iBatis的基本实?/span></strong> <br /> iBatis通过SqlMapClient提供了一l方法用于批处理实现Q?<br /> <ol> <li>startBatch() 开始批处理 <li>executeBatch() 执行批处?</li> </ol> <br /> 代码如下Q?<br /> <div id="rllmkmi" class="dp-highlighter"> <div id="lclhkgr" class="bar"> <div id="kgfogge" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://snowolf.iteye.com/images/icon_copy.gif" /></a> <a title="收藏q段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://snowolf.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" alt="" src="http://snowolf.iteye.com/images/spinner.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="rgvhdtb" class="keyword">public</span><span> </span><span id="szdpqch" class="keyword">void</span><span> create(List<Reply> replyList) {   </span></span> <li><span>  </span> <li><span>    </span><span id="rcgdpmr" class="keyword">try</span><span> {   </span></span> <li><span>        </span><span id="bykzwmr" class="comment">// 开始批处理 </span><span>  </span></span> <li><span>        sqlMapClient.startBatch();   </span> <li><span>  </span> <li><span>        </span><span id="mqjghmc" class="keyword">for</span><span> (Reply reply: replyList) {   </span></span> <li><span>            </span><span id="bxfcvlf" class="comment">// 插入操作 </span><span>  </span></span> <li><span>            sqlMapClient.insert(</span><span id="auckwxc" class="string">"Reply.create"</span><span>, reply);   </span></span> <li><span>        }   </span> <li><span>        </span><span id="qzsatjo" class="comment">// 执行批处?</span><span>  </span></span> <li><span>        sqlMapClient.executeBatch();   </span> <li><span>  </span> <li><span>    } </span><span id="aeimjcs" class="keyword">catch</span><span> (Exception e) {   </span></span> <li><span>        e.printStackTrace();   </span> <li><span>    }   </span> <li><span>}  </span> </li> </ol> </div> <pre class="java" title="iBatis整理——iBatis批处理实玎ͼSpring环境Q? style="display: none" name="code" pre_index="0" source_url="http://snowolf.iteye.com/blog/752764" codeable_type="Post" codeable_id="1652431"> public void create(List<Reply> replyList) { try { // 开始批处理 sqlMapClient.startBatch(); for (Reply reply: replyList) { // 插入操作 sqlMapClient.insert("Reply.create", reply); } // 执行批处? sqlMapClient.executeBatch(); } catch (Exception e) { e.printStackTrace(); } } </pre> <br /> q是ZiBatis的最基本实现Q如果你一步一步debugQ你?x)发玎ͼ?x)其实Q数据库已经执行了插入操作! <br /> <span style="color: red"><strong>因此Q除了这两个核心Ҏ(gu)外,你还需要开启事务支持。否则,上述代码只不q是个空架子Q?/strong></span> <br /> <br /> <strong><span style="font-size: large">2.Z事务的iBatis的基本实?/span></strong> <br /> 事务处理Q?<br /> <ol> <li>startTransaction() 开始事? <li>commitTransaction() 提交事务 <li>endTransaction() l束事务 </li> </ol> <br /> <br /> 我们以insert操作ZQ把它们l合CP(x) <br /> <div id="ogkweug" class="dp-highlighter"> <div id="pamugsm" class="bar"> <div id="miucvau" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://snowolf.iteye.com/images/icon_copy.gif" /></a> <a title="收藏q段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://snowolf.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" alt="" src="http://snowolf.iteye.com/images/spinner.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="bnzwajz" class="keyword">public</span><span> </span><span id="imjcoiy" class="keyword">void</span><span> create(List<Reply> replyList) {   </span></span> <li><span>  </span> <li><span>    </span><span id="cyvwmns" class="keyword">try</span><span> {   </span></span> <li><span>        </span><span id="hwiugot" class="comment">// 开始事?</span><span>  </span></span> <li><span>        sqlMapClient.startTransaction();   </span> <li><span>        </span><span id="bzdpmva" class="comment">// 开始批处理 </span><span>  </span></span> <li><span>        sqlMapClient.startBatch();   </span> <li><span>  </span> <li><span>        </span><span id="ffgwirs" class="keyword">for</span><span> (Reply reply: replyList) {   </span></span> <li><span>            </span><span id="ixnoafv" class="comment">// 插入操作 </span><span>  </span></span> <li><span>            sqlMapClient.insert(</span><span id="laapicw" class="string">"Reply.create"</span><span>, reply);   </span></span> <li><span>        }   </span> <li><span>        </span><span id="ywwemyd" class="comment">// 执行批处?</span><span>  </span></span> <li><span>        sqlMapClient.executeBatch();   </span> <li><span>  </span> <li><span>        </span><span id="rgdatch" class="comment">// 提交事务 </span><span>  </span></span> <li><span>        sqlMapClient.commitTransaction();   </span> <li><span>  </span> <li><span>    } </span><span id="ddspmve" class="keyword">catch</span><span> (Exception e) {   </span></span> <li><span>        e.printStackTrace();   </span> <li><span>    } </span><span id="wtmnkej" class="keyword">finally</span><span> {     </span></span> <li><span>             </span><span id="ltibqve" class="keyword">try</span><span> {   </span></span> <li><span>            </span><span id="rkwlxyd" class="comment">// l束事务 </span><span>  </span></span> <li><span>            sqlMapClient.endTransaction();   </span> <li><span>                } </span><span id="zwpbnom" class="keyword">catch</span><span> (SQLException e) {   </span></span> <li><span>                         e.printStackTrace();   </span> <li><span>                     }   </span> <li><span>    }     </span> <li><span>}  </span> </li> </ol> </div> <pre class="java" title="iBatis整理——iBatis批处理实玎ͼSpring环境Q? style="display: none" name="code" pre_index="1" source_url="http://snowolf.iteye.com/blog/752764" codeable_type="Post" codeable_id="1652431"> public void create(List<Reply> replyList) { try { // 开始事? sqlMapClient.startTransaction(); // 开始批处理 sqlMapClient.startBatch(); for (Reply reply: replyList) { // 插入操作 sqlMapClient.insert("Reply.create", reply); } // 执行批处? sqlMapClient.executeBatch(); // 提交事务 sqlMapClient.commitTransaction(); } catch (Exception e) { e.printStackTrace(); } finally { try { // l束事务 sqlMapClient.endTransaction(); } catch (SQLException e) { e.printStackTrace(); } } } </pre> <br /> <strong>replyList</strong>是一个ListQ要把这个List插入到数据库Q就需要经q这三个步骤Q?<br /> <ol> <li>开始批处理 startBatch() <li>插入      insert() <li>执行批处?executeBatch() </li> </ol> <br /> <span style="color: red"><strong>如果要在Spring+iBatis中进行批处理实现Q需要注意用同一个sqlMapClientQ同Ӟ提交事务的工作交给Springl一处理Q?/strong></span> <br /> <br /> <strong><span style="font-size: large">3.Z事务的Spring+iBatis实现</span></strong> <br /> <div id="wqnklqk" class="dp-highlighter"> <div id="tcgohqr" class="bar"> <div id="uowpinh" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://snowolf.iteye.com/images/icon_copy.gif" /></a> <a title="收藏q段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://snowolf.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" alt="" src="http://snowolf.iteye.com/images/spinner.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="uhpairw" class="keyword">public</span><span> </span><span id="czsaics" class="keyword">void</span><span> create(List<Reply> replyList) {   </span></span> <li><span>    </span><span id="dbuczlu" class="keyword">if</span><span> (!CollectionUtils.isEmpty(replyList)) {   </span></span> <li><span>        </span><span id="nlemywm" class="comment">// 注意使用同一个SqlMapClient?x)?</span><span>  </span></span> <li><span>        SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient();   </span> <li><span>  </span> <li><span>        </span><span id="joltqvw" class="keyword">try</span><span> {   </span></span> <li><span>            </span><span id="tnkdlbg" class="comment">// 开始事?</span><span>  </span></span> <li><span>            sqlMapClient.startTransaction();   </span> <li><span>            </span><span id="zmjrveb" class="comment">// 开始批处理 </span><span>  </span></span> <li><span>            sqlMapClient.startBatch();   </span> <li><span>            </span><span id="yhhpejs" class="keyword">for</span><span> (Reply reply : replyList) {   </span></span> <li><span>                </span><span id="qostxgl" class="comment">// 插入操作 </span><span>  </span></span> <li><span>                sqlMapClient.insert(</span><span id="mvwtfgl" class="string">"Reply.create"</span><span>, reply);   </span></span> <li><span>            }   </span> <li><span>  </span> <li><span>            </span><span id="hijrzhx" class="comment">// 执行批处?</span><span>  </span></span> <li><span>            sqlMapClient.executeBatch();   </span> <li><span>            </span><span id="tjnkzxr" class="comment">// 提交事务 交给Springl一控制 </span><span>  </span></span> <li><span>            </span><span id="bkdhpuv" class="comment">// sqlMapClient.commitTransaction(); </span><span>  </span></span> <li><span>  </span> <li><span>        } </span><span id="ktbuyob" class="keyword">catch</span><span> (Exception e) {   </span></span> <li><span>            e.printStackTrace();   </span> <li><span>        } </span><span id="klxuvpf" class="keyword">finally</span><span> {     </span></span> <li><span>                 </span><span id="xkwtfvw" class="keyword">try</span><span> {   </span></span> <li><span>                </span><span id="qslxfga" class="comment">// l束事务 </span><span>  </span></span> <li><span>                sqlMapClient.endTransaction();   </span> <li><span>                    } </span><span id="mzolefg" class="keyword">catch</span><span> (SQLException e) {   </span></span> <li><span>                             e.printStackTrace();   </span> <li><span>                         }   </span> <li><span>        }     </span> <li><span>    }   </span> <li><span>}  </span> </li> </ol> </div> <pre class="java" title="iBatis整理——iBatis批处理实玎ͼSpring环境Q? style="display: none" name="code" pre_index="2" source_url="http://snowolf.iteye.com/blog/752764" codeable_type="Post" codeable_id="1652431"> public void create(List<Reply> replyList) { if (!CollectionUtils.isEmpty(replyList)) { // 注意使用同一个SqlMapClient?x)? SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient(); try { // 开始事? sqlMapClient.startTransaction(); // 开始批处理 sqlMapClient.startBatch(); for (Reply reply : replyList) { // 插入操作 sqlMapClient.insert("Reply.create", reply); } // 执行批处? sqlMapClient.executeBatch(); // 提交事务 交给Springl一控制 // sqlMapClient.commitTransaction(); } catch (Exception e) { e.printStackTrace(); } finally { try { // l束事务 sqlMapClient.endTransaction(); } catch (SQLException e) { e.printStackTrace(); } } } } </pre> <br /> 注意使用同一个sqlMapClientQ?<br /> <strong>SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient();</strong> <br /> <strong>如果直接sqlMapClientTemplate执行insert()Ҏ(gu)Q将?x)造成异常Q?/strong> <br /> <br /> <span style="color: red"><strong>xQ还有什么问题?其实问题很明显,虽然解决了批处理实现的问题,却造成了事务代码入늚新问题?img alt="" src="http://snowolf.iteye.com/images/smiles/icon_sad.gif" /> q么做,有点恶心Q?<br /> 除此之外Q异常的处理也很恶心Q不能够单的包装?DataAccessException 无法被Spring当作l一的数据库操作异常做处理?<br /> </strong></span><br /> <br /> <strong><span style="font-size: large">4.Z回调方式的Spring+iBatis实现</span></strong> <br /> 如果观察qSpring的源代码Q你一定知道,SpringZ保持事务l一控制Q在实现ORM框架旉常都采用了回调模式Q从而避免了事务代码入R的可能!<img alt="" src="http://snowolf.iteye.com/images/smiles/icon_biggrin.gif" /> <br /> 修改后的代码如下Q?<br /> <div id="gebygwe" class="dp-highlighter"> <div id="dxfnkiq" class="bar"> <div id="sexxfgw" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://snowolf.iteye.com/images/icon_copy.gif" /></a> <a title="收藏q段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://snowolf.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" alt="" src="http://snowolf.iteye.com/images/spinner.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="vivyrwm" class="annotation">@SuppressWarnings</span><span>(</span><span id="vijnzej" class="string">"unchecked"</span><span>)   </span></span> <li><span id="xrkwajd" class="keyword">public</span><span> </span><span id="qzdhefv" class="keyword">void</span><span> create(</span><span id="udwaiyd" class="keyword">final</span><span> List<Reply> replyList) {   </span></span> <li><span>    </span><span id="rwaiuvt" class="comment">// 执行回调 </span><span>  </span></span> <li><span>    sqlMapClientTemplate.execute(</span><span id="zpxfyze" class="keyword">new</span><span> SqlMapClientCallback() {   </span></span> <li><span>        </span><span id="dtmqcza" class="comment">// 实现回调接口 </span><span>  </span></span> <li><span>        </span><span id="tvosauo" class="keyword">public</span><span> Object doInSqlMapClient(SqlMapExecutor executor)   </span></span> <li><span>                </span><span id="vamurhb" class="keyword">throws</span><span> SQLException {   </span></span> <li><span>            </span><span id="cpvyvpu" class="comment">// 开始批处理 </span><span>  </span></span> <li><span>            executor.startBatch();   </span> <li><span>            </span><span id="iccksmc" class="keyword">for</span><span> (Reply reply : replyList) {   </span></span> <li><span>                </span><span id="objvwtn" class="comment">// 插入操作 </span><span>  </span></span> <li><span>                executor.insert(</span><span id="pykweyo" class="string">"Reply.create"</span><span>, reply);   </span></span> <li><span>  </span> <li><span>            }   </span> <li><span>            </span><span id="hjnkstn" class="comment">// 执行批处?</span><span>  </span></span> <li><span>            executor.executeBatch();   </span> <li><span>  </span> <li><span>            </span><span id="tgkswfg" class="keyword">return</span><span> </span><span id="ydhpbgl" class="keyword">null</span><span>;   </span></span> <li><span>  </span> <li><span>        }   </span> <li><span>    });   </span> <li><span>  </span> <li><span>}  </span> </li> </ol> </div> <pre class="java" title="iBatis整理——iBatis批处理实玎ͼSpring环境Q? style="display: none" name="code" pre_index="3" source_url="http://snowolf.iteye.com/blog/752764" codeable_type="Post" codeable_id="1652431"> @SuppressWarnings("unchecked") public void create(final List<Reply> replyList) { // 执行回调 sqlMapClientTemplate.execute(new SqlMapClientCallback() { // 实现回调接口 public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException { // 开始批处理 executor.startBatch(); for (Reply reply : replyList) { // 插入操作 executor.insert("Reply.create", reply); } // 执行批处? executor.executeBatch(); return null; } }); } </pre> <br /> <strong>注意Q待遍历的参数replyList需要加入final标识Q即Q待遍历对象不能修改Q?/strong> <br /> <div id="erdpbgw" class="quote_title">引用</div> <div id="aczqstn" class="quote_div">public void create(final List<Reply> replyList) </div> <br /> <strong>q样做,将事务处理的控制权完全交给了SpringQ?/strong><img alt="" src="http://snowolf.iteye.com/images/smiles/icon_biggrin.gif" /> <br /> qͼ(x) <br /> <ol> <li>SqlMapClientCallback 回调接口 <li>doInSqlMapClient(SqlMapExecutor executor) 回调实现Ҏ(gu) <li>DataAccessException 最l可能抛出的异常 </li> </ol> <img src ="http://m.tkk7.com/176142998/aggbug/348682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/176142998/" target="_blank">飞飞</a> 2011-04-21 10:15 <a href="http://m.tkk7.com/176142998/archive/2011/04/21/348682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置Log4j(?http://m.tkk7.com/176142998/archive/2011/04/18/348482.html飞飞飞飞Mon, 18 Apr 2011 06:14:00 GMThttp://m.tkk7.com/176142998/archive/2011/04/18/348482.htmlhttp://m.tkk7.com/176142998/comments/348482.htmlhttp://m.tkk7.com/176142998/archive/2011/04/18/348482.html#Feedback0http://m.tkk7.com/176142998/comments/commentRss/348482.htmlhttp://m.tkk7.com/176142998/services/trackbacks/348482.htmlLog4J的配|文?Configuration File)是用来讄记录器的U别、存攑֙和布局的,它可接key=value格式的设|或xml格式的设|信息。通过配置Q可以创建出Log4J的运行环境?/p>

1. 配置文g
Log4J配置文g的基本格式如下:(x)

#配置根Logger
log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2 ,  …

#配置日志信息输出目的地Appender
log4j.appender.appenderName  =  fully.qualified.name.of.appender.class
  log4j.appender.appenderName.option1  =  value1
  …
  log4j.appender.appenderName.optionN  =  valueN

#配置日志信息的格式(布局Q?br /> log4j.appender.appenderName.layout  =  fully.qualified.name.of.layout.class
  log4j.appender.appenderName.layout.option1  =  value1
  …
  log4j.appender.appenderName.layout.optionN  =  valueN 

其中 [level] 是日志输出别,共有5U:(x)


FATAL       0 
ERROR      3 
WARN       4 
INFO         6 
DEBUG      7
 
Appender 为日志输出目的地QLog4j提供的appender有以下几U:(x)
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文Ӟ(j)Q?br /> org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ(j)Q?br /> org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文Ӟ(j)Q?br /> org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)(j)
LayoutQ日志输出格式,Log4j提供的layout有以下几U:(x)


org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)(j)

打印参数: Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q如?


    %m   输出代码中指定的消息
  %p   输出优先U,即DEBUGQINFOQW(xu)ARNQERRORQFATAL
  %r   输出自应用启动到输出该log信息耗费的毫U数
  %c   输出所属的cȝQ通常是所在类的全?
  %t   输出产生该日志事件的U程?
  %n   输出一个回车换行符QW(xu)indowsq_?#8220;\r\n”QUnixq_?#8220;\n”
  %d   输出日志旉点的日期或时_(d)默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss , SSS}Q输出类|(x)2002q?0?8?nbsp; 22 Q?10 Q?28 Q?921 
  %l   输出日志事g的发生位|,包括cȝ名、发生的U程Q以?qing)在代码中的行数。D例:(x)Testlog4.main(TestLog4.java: 10 ) 

2. 在代码中初始化Logger:
1Q在E序中调用BasicConfigurator.configure()Ҏ(gu)Q给根记录器增加一个ConsoleAppenderQ输出格式通过PatternLayout设ؓ(f)"%-4r [%t] %-5p %c %x - %m%n"Q还有根记录器的默认U别是Level.DEBUG.
2Q配|放在文仉Q通过命o(h)行参C递文件名字,通过PropertyConfigurator.configure(args[x])解析q|;
3Q配|放在文仉Q通过环境变量传递文件名{信息,利用log4j默认的初始化q程解析q|;
4Q配|放在文仉Q通过应用服务器配|传递文件名{信息,利用一个特D的servlet来完成配|?/p>

3. Z同的 Appender 讄日志输出U别Q?br /> 当调试系l时Q我们往往注意的只是异常别的日志输出Q但是通常所有别的输出都是攑֜一个文仉的,如果日志输出的别是BUGQ?那就慢慢L吧?br /> q时我们也许?x)想要是能把异常信息单独输出C个文仉该多好啊。当然可以,Log4j已经提供了这L(fng)功能Q我们只需要在配置中修改Appender的Threshold p实现,比如下面的例子:(x)

[配置文g]


 ### set log levels ###
log4j.rootLogger = debug ,  stdout ,  D ,  E

### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n

### 输出到日志文?###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 输出DEBUGU别以上的日?br /> log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 保存异常信息到单独文?###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log ## 异常日志文g?br /> log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR ## 只输出ERRORU别以上的日?!!
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
[代码中用]


  public   class  TestLog4j   {
     public   static   void  main(String[] args)   {
        PropertyConfigurator.configure( " D:/Code/conf/log4j.properties " );
        Logger logger  =  Logger.getLogger(TestLog4j. class );
        logger.debug( " debug " );
        logger.error( " error " );
    }
}

q行一下,看看异常信息是不是保存在了一个单独的文gerror.log?/p>

log4j.properties 使用
一.参数意义说明
输出U别的种c?br /> ERROR、WARN、INFO、DEBUG
ERROR Z重错?主要是程序的错误
WARN Z般警告,比如session丢失
INFO Z般要昄的信息,比如dd
DEBUG 为程序的调试信息
配置日志信息输出目的?br /> log4j.appender.appenderName = fully.qualified.name.of.appender.class
1.org.apache.log4j.ConsoleAppenderQ控制台Q?br /> 2.org.apache.log4j.FileAppenderQ文Ӟ(j)
3.org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ(j)
4.org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文Ӟ(j)
5.org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)(j)
配置日志信息的格?br /> log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
2.org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
3.org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
4.org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)(j)
控制台选项
Threshold=DEBUG:指定日志消息的输出最低层ơ?br /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会(x)被立卌出?br /> Target=System.errQ默认情况下是:(x)System.out,指定输出控制?br /> FileAppender 选项
Threshold=DEBUF:指定日志消息的输出最低层ơ?br /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会(x)被立卌出?br /> File=mylog.txt:指定消息输出到mylog.txt文g?br /> Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br /> RollingFileAppender 选项
Threshold=DEBUG:指定日志消息的输出最低层ơ?br /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会(x)被立卌出?br /> File=mylog.txt:指定消息输出到mylog.txt文g?br /> Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br /> MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小Ӟ会(x)自动滚动Q即原来的内容Udmylog.log.1文g?br /> MaxBackupIndex=2:指定可以产生的滚动文件的最大数?br /> log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
日志信息格式中几个符h代表的含义:(x)
 -X? X信息输出时左寚wQ?br />  %p: 输出日志信息优先U,即DEBUGQINFOQW(xu)ARNQERRORQFATAL,
 %d: 输出日志旉点的日期或时_(d)默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|(x)2002q?0?8?22Q?0Q?8Q?21
 %r: 输出自应用启动到输出该log信息耗费的毫U数
 %c: 输出日志信息所属的cȝQ通常是所在类的全?br />  %t: 输出产生该日志事件的U程?br />  %l: 输出日志事g的发生位|,相当?C.%M(%F:%L)的组?包括cȝ名、发生的U程Q以?qing)在代码中的行数。D例:(x)Testlog4.main (TestLog4.java:10)
 %x: 输出和当前线E相兌的NDC(嵌套诊断环境),其用到像java servletsq样的多客户多线E的应用中?br />  %%: 输出一?%"字符
 %F: 输出日志消息产生时所在的文g名称
 %L: 输出代码中的行号
 %m: 输出代码中指定的消息,产生的日志具体信?br />  %n: 输出一个回车换行符QW(xu)indowsq_?\r\n"QUnixq_?\n"输出日志信息换行
 可以?与模式字W之间加上修饰符来控制其最宽度、最大宽度、和文本的对齐方式。如Q?br />  1)%20cQ指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q默认的情况下右寚w?br />  2)%-20c:指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q?-"h定左寚w?br />  3)%.30c:指定输出category的名Uͼ最大的宽度?0Q如果category的名U大?0的话Q就?x)将左边多出的字W截掉,但小?0的话也不?x)有I格?br />  4)%20.30c:如果category的名U小?0pI格Qƈ且右寚wQ如果其名称长于30字符Q就从左边较q输出的字符截掉?br /> ?文g配置Sample1
log4j.rootLogger=DEBUG,A1,R
#log4j.rootLogger=INFO,A1,R
# ConsoleAppender 输出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
# File 输出 一天一个文?输出路径可以定制,一般在根\径下
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=blog_log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
文g配置Sample2
下面l出的Log4J配置文g实现了输出到控制収ͼ文gQ回滚文Ӟ发送日志邮Ӟ输出到数据库日志表,自定义标{全套功能?br /> log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
###################
#自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@yeqiangwei.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
?高使用
实验目的Q?br />  1.把FATALU错误写?000NT日志
 2. WARNQERRORQFATALU错误发送email通知理?br />  3.其他U别的错误直接在后台输出
实验步骤Q?br />  输出?000NT日志
 1.把Log4j压羃包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目录?br />  2.写配|文件log4j.properties
# ?000pȝ日志输出
 log4j.logger.NTlog=FATAL, A8
 # APPENDER A8
 log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
 log4j.appender.A8.Source=JavaTest
 log4j.appender.A8.layout=org.apache.log4j.PatternLayout
 log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
3.调用代码Q?br />  Logger logger2 = Logger.getLogger("NTlog"); //要和配置文g中设|的名字相同
 logger2.debug("debug!!!");
 logger2.info("info!!!");
 logger2.warn("warn!!!");
 logger2.error("error!!!");
 //只有q个错误才会(x)写入2000日志
 logger2.fatal("fatal!!!");
发送email通知理员:(x)
 1. 首先下蝲JavaMail和JAF,
  http://java.sun.com/j2ee/ja/javamail/index.html
  http://java.sun.com/beans/glasgow/jaf.html
 在项目中引用mail.jar和activation.jar?br />  2. 写配|文?br />  # 日志发送到email
 log4j.logger.MailLog=WARN,A5
 #  APPENDER A5
 log4j.appender.A5=org.apache.log4j.net.SMTPAppender
 log4j.appender.A5.BufferSize=5
 log4j.appender.A5.To=chunjie@yeqiangwei.com
 log4j.appender.A5.From=error@yeqiangwei.com
 log4j.appender.A5.Subject=ErrorLog
 log4j.appender.A5.SMTPHost=smtp.263.net
 log4j.appender.A5.layout=org.apache.log4j.PatternLayout
 log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
 3.调用代码Q?br />  //把日志发送到mail
 Logger logger3 = Logger.getLogger("MailLog");
 logger3.warn("warn!!!");
 logger3.error("error!!!");
 logger3.fatal("fatal!!!");
在后台输出所有类别的错误Q?br />  1. 写配|文?br />  # 在后台输?br />  log4j.logger.console=DEBUG, A1
 # APPENDER A1
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
 2Q调用代?br />  Logger logger1 = Logger.getLogger("console");
 logger1.debug("debug!!!");
 logger1.info("info!!!");
 logger1.warn("warn!!!");
 logger1.error("error!!!");
 logger1.fatal("fatal!!!");
--------------------------------------------------------------------
 全部配置文gQlog4j.properties
 # 在后台输?br />  log4j.logger.console=DEBUG, A1
 # APPENDER A1
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# ?000pȝ日志输出
 log4j.logger.NTlog=FATAL, A8
 # APPENDER A8
 log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
 log4j.appender.A8.Source=JavaTest
 log4j.appender.A8.layout=org.apache.log4j.PatternLayout
 log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# 日志发送到email
 log4j.logger.MailLog=WARN,A5
 #  APPENDER A5
 log4j.appender.A5=org.apache.log4j.net.SMTPAppender
 log4j.appender.A5.BufferSize=5
 log4j.appender.A5.To=chunjie@yeqiangwei.com
 log4j.appender.A5.From=error@yeqiangwei.com
 log4j.appender.A5.Subject=ErrorLog
 log4j.appender.A5.SMTPHost=smtp.263.net
 log4j.appender.A5.layout=org.apache.log4j.PatternLayout
 log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
全部代码QLog4jTest.java
 
/*
  * 创徏日期 2003-11-13
  */
 package edu.bcu.Bean;
 import org.apache.log4j.*;
 //import org.apache.log4j.nt.*;
 //import org.apache.log4j.net.*;
 /**
  * @author yanxu
  */
 public class Log4jTest
 {
  public static void main(String args[])
  {
   PropertyConfigurator.configure("log4j.properties");
   //在后台输?
   Logger logger1 = Logger.getLogger("console");
   logger1.debug("debug!!!");
   logger1.info("info!!!");
   logger1.warn("warn!!!");
   logger1.error("error!!!");
   logger1.fatal("fatal!!!");
//在NTpȝ日志输出
   Logger logger2 = Logger.getLogger("NTlog");
   //NTEventLogAppender nla = new NTEventLogAppender();
   logger2.debug("debug!!!");
   logger2.info("info!!!");
   logger2.warn("warn!!!");
   logger2.error("error!!!");
   //只有q个错误才会(x)写入2000日志
   logger2.fatal("fatal!!!");
//把日志发送到mail
   Logger logger3 = Logger.getLogger("MailLog");
   //SMTPAppender sa = new SMTPAppender();
   logger3.warn("warn!!!");
   logger3.error("error!!!");
   logger3.fatal("fatal!!!");
  }
 }

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/azheng270/archive/2008/03/12/2173430.aspx



飞飞 2011-04-18 14:14 发表评论
]]>
unixpȝ常用命o(h)Q?/title><link>http://m.tkk7.com/176142998/archive/2011/04/15/348358.html</link><dc:creator>飞飞</dc:creator><author>飞飞</author><pubDate>Fri, 15 Apr 2011 08:11:00 GMT</pubDate><guid>http://m.tkk7.com/176142998/archive/2011/04/15/348358.html</guid><wfw:comment>http://m.tkk7.com/176142998/comments/348358.html</wfw:comment><comments>http://m.tkk7.com/176142998/archive/2011/04/15/348358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/176142998/comments/commentRss/348358.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/176142998/services/trackbacks/348358.html</trackback:ping><description><![CDATA[<table style="width: 665pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="887" border="0"> <colgroup> <col style="width: 145pt" width="193"> <col style="width: 149pt" width="199"> <col style="width: 112pt" width="149"> <col style="width: 104pt" width="139"> <col style="width: 155pt" width="207"> <tbody> <tr style="height: 15pt" height="20"> <td style="width: 145pt; height: 15pt" width="193" height="20">查看q行命o(h)Q?/td> <td style="width: 149pt" width="199">ps -ef | grep tomcat</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">查看日志</td> <td>tail -f logs/catalina.out</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">74文g传送蟩转文件夹</td> <td>/opt/transport/</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">复制文g命o(h)</td> <td colspan="3">scp UserOperateServiceImpl.class 118.123.253.71:/opt/transport/</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">q程q接</td> <td>ssh 118.123.253.71</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">l束q程命o(h)</td> <td>kill -9 31454</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">启动tomcat</td> <td>sh bin/startup.sh</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">搜烦(ch)日志中的内容</td> <td colspan="2">grep '18923858130' interfaceLog.log*</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">本地复制文g</td> <td colspan="3">cp -r appMarketWebApi   appMarketWebApi2000000</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">删除文g命o(h)</td> <td>rm appMarketWebApi.zip</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">压羃文g命o(h)</td> <td colspan="2"> zip -r AppStoreBak1108.zip AppStore</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">复制文g清除.svn文g?/td> <td colspan="2">xcopy appMarketWebApi1.3 11111111111 /s /i</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">从现|复制文件命?/td> <td colspan="4">scp 10.128.100.115:/opt/transport/appMarketWebApi_1111_115.zip /opt/transport/</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">查看文g占用量大命o(h)</td> <td>du -k|sort -t " " +0 -n -r|more</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">查看当前目录文g大小</td> <td>du -sh .</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">tar包解压命?/td> <td>tar -xvf</td> </tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">抓内存包命o(h)</td> <td colspan="2">jmap -dump:format=b,file=heap20101216.bin</td> </tr> <tr style="height: 15pt" height="20"> <td colspan="2">useradd -d /home -s /bin/sh   liyanhong</td> </tr> <tr style="height: 15pt" height="20"> <td>passwd liyanhong </td> </tr> </tbody> </table> <img src ="http://m.tkk7.com/176142998/aggbug/348358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/176142998/" target="_blank">飞飞</a> 2011-04-15 16:11 <a href="http://m.tkk7.com/176142998/archive/2011/04/15/348358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://shadaiym.com" target="_blank">Ʒަv</a>| <a href="http://sese3366.com" target="_blank">ҹþþӰԺ</a>| <a href="http://webgame86.com" target="_blank">sɫƬ߹ۿ</a>| <a href="http://53reniao.com" target="_blank">޳˸</a>| <a href="http://831055.com" target="_blank">ɫַѹۿ</a>| <a href="http://www003924.com" target="_blank">þþþþùƷ</a>| <a href="http://szq18888.com" target="_blank">ڵƵ߹ۿ </a>| <a href="http://yy9977.com" target="_blank">AVרAV</a>| <a href="http://fense1.com " target="_blank">aɫëƬѲƵ</a>| <a href="http://aabbcc567.com" target="_blank">žѹۿ嶯4</a>| <a href="http://znboxcdn304.com" target="_blank">޾ƷƷԲۿ </a>| <a href="http://aa2176.com" target="_blank">ֱƵ</a>| <a href="http://6000cpkj.com" target="_blank">98Ʒѹۿ</a>| <a href="http://rdccc.com" target="_blank">ۺ</a>| <a href="http://zhiwajic.com" target="_blank">ŷպ</a>| <a href="http://singbomb.com" target="_blank">һƵվ</a>| <a href="http://tedegold.com" target="_blank">ƷþþþþþþӰԺ</a>| <a href="http://326h.com" target="_blank">Ʒһ߹ۿ</a>| <a href="http://79909d.com" target="_blank">++ۺ+ר</a>| <a href="http://941sese.com" target="_blank">Ʒþþþþù</a>| <a href="http://wjjccw.com" target="_blank">Ůվ߿</a>| <a href="http://1897tao.com" target="_blank">޳</a>| <a href="http://701807.com" target="_blank">ǴýƵѹۿ</a>| <a href="http://taoduoduo666.com" target="_blank">67194츾ѹۿ</a>| <a href="http://www-840012.com" target="_blank">ҹAVר߲</a>| <a href="http://beidemei.com" target="_blank">պ޹ۺϸ</a>| <a href="http://miliwo.com" target="_blank">ҹˬˬˬŮѹۿӰԺ </a>| <a href="http://wenbye.com" target="_blank">˳վ߸</a>| <a href="http://gisdn.com" target="_blank">ɫվ߹ۿ</a>| <a href="http://727744.com" target="_blank">Ƶ</a>| <a href="http://xxzyyj.com" target="_blank">ѿŮճˮƵ</a>| <a href="http://tbw77.com" target="_blank">2018av</a>| <a href="http://56p6.com" target="_blank">9420ѸƵ</a>| <a href="http://28896543.com" target="_blank">޾ƷAAƬѽ</a>| <a href="http://www-kj5799.com" target="_blank">AVŮ18ëƬˮ</a>| <a href="http://927ff.com" target="_blank">ѿJIZZƵ</a>| <a href="http://hh5151.com" target="_blank">þþŷղa</a>| <a href="http://fenglengqi.com" target="_blank">4huĻӰԺwww</a>| <a href="http://www-15706.com" target="_blank">ŮڵƵ </a>| <a href="http://51huanxin.com" target="_blank">þþƷѵӰ</a>| <a href="http://yeshenghuowang.com" target="_blank">ԾþþӰԺ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>