??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产亚洲AV电影网,亚洲人成网站在线播放影院在线,久久久久久久久无码精品亚洲日韩http://www.tkk7.com/yaominxi/archive/2006/05/19/47096.htmlymxymxFri, 19 May 2006 10:10:00 GMThttp://www.tkk7.com/yaominxi/archive/2006/05/19/47096.htmlhttp://www.tkk7.com/yaominxi/comments/47096.htmlhttp://www.tkk7.com/yaominxi/archive/2006/05/19/47096.html#Feedback0http://www.tkk7.com/yaominxi/comments/commentRss/47096.htmlhttp://www.tkk7.com/yaominxi/services/trackbacks/47096.html  华ؓ公司 java 面试?/a>

W一部分Q选择?br />QUESTION NO: 1
1、public class Test {
    public static void changeStr(String str){
        str="welcome";
    }
    public static void main(String[] args) {
        String str="1234";
        changeStr(str);
        System.out.println(str);
    }
}
Please write the output result Q?/p>

QUESTION NO:2
1. public class Test {
2. static boolean foo(char c) {
3. System.out.print(c);
4. return true;
5. }
6. public static void main( String[] argv ) {
7. int i =0;
8. for ( foo('A'); foo('B')&&(i<2); foo('C')){
9. i++ ;
10. foo('D');
12. }
13. }
14. }
What is the result?
A. ABDCBDCB
B. ABCDABCD
C. Compilation fails.
D. An exception is thrown at runtime.

QUESTION NO: 3
1. class A {
2. protected int method1(int a, int b) { return 0; }
3. }
Which two are valid in a class that extends class A? (Choose two)
A. public int method1(int a, int b) { return 0; }
B. private int method1(int a, int b) { return 0; }
C. private int method1(int a, long b) { return 0; }
D. public short method1(int a, int b) { return 0; }
E. static protected int method1(int a, int b) { return 0; }

QUESTION NO: 4
1. public class Outer{
2. public void someOuterMethod() {
3. // Line 3
4. }
5. public class Inner{}
6. public static void main( String[]argv ) {
7. Outer o = new Outer();
8. // Line 8
9. }
10. }
Which instantiates an instance of Inner?
A. new Inner(); // At line 3
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8
D. new Outer.Inner(); // At line 8//new Outer().new Inner()

QUESTION NO: 5
Which method is used by a servlet to place its session ID in a URL that is written to the servlet’s response output stream?
A. The encodeURL method of the HttpServletRequest interface.
B. The encodeURL method of the HttpServletResponse interface.
C. The rewriteURL method of the HttpServletRequest interface.
D. The rewriteURL method of the HttpServletResponse interface.

QUESTION NO: 6
Which two are equivalent? (Choose two)
A. <%= YoshiBean.size%>
B. <%= YoshiBean.getSize()%>
C. <%= YoshiBean.getProperty("size")%>
D. <jsp:getProperty id="YoshiBean" param="size"/>
E. <jsp:getProperty name="YoshiBean" param="size"/>
F. <jsp:getProperty id="YoshiBean" property="size"/>
G. <jsp:getProperty name="YoshiBean" property="size"/>

QUESTION NO: 7
Which of the following statements regarding the lifecycle of a session bean are correct?
1.  java.lang.IllegalStateException is thrown if SessionContext.getEJBObject() is invoked when a stateful session bean instance is passivated.
2.  SessionContext.getRollbackOnly() does not throw an exception when a session bean with bean-managed transaction demarcation is activated.
3.  An exception is not thrown when SessionContext.getUserTransaction() is called in the afterBegin method of a bean with container-managed transactions.
4.  JNDI access to java:comp/env is permitted in all the SessionSynchronization methods of a stateful session bean with container-managed transaction demarcation.
5.  Accessing resource managers in the SessionSynchronization.afterBegin method of a stateful session bean with bean-managed transaction does not throw an exception.


W二部分Q概念题
1Q  ?描述Struts体系l构Q对应各个部分的开发工作主要包括哪些?

 

 

 

 

 

 

2Q  ?XML包括哪些解释技术,区别是什么?

 

 


3Q  ?JSP有哪些内|对象和动作Q它们的作用分别是什么?

 

 

 

 

 

 


4、SQL问答?br />SELECT * FROM TABLE
?br />SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的检索结果ؓ何不同?

 

5、SQL问答?br />表结构:
1、  ?表名Qg_cardapply
字段(字段?cd/长度)Q?br />g_applyno        varchar   8Q?/甌单号Q关键字Q?br />g_applydate     bigint     8Q?/甌日期
g_state        varchar     2Q?/甌状?br />2、  ?表名Qg_cardapplydetail
字段(字段?cd/长度)Q?br />g_applyno        varchar     8Q?/甌单号Q关键字Q?br />g_name        varchar     30Q?/甌人姓?br />g_idcard        varchar     18Q?/甌n份证?br />g_state        varchar     2Q?/甌状?br />其中Q两个表的关联字Dؓ甌单号?br />题目Q?br />1、  ?查询w䆾证号码ؓ440401430103082的申h?br />2、  ?查询同一个n份证L有两条以上记录的w䆾证号码及记录个数
3、  ?n份证L?40401430103082的记录在两个表中的申L态均改ؓ07
4、  ?删除g_cardapplydetail表中所有姓李的记录



ymx 2006-05-19 18:10 发表评论
]]>
利用JBuilder 2005 开发Spring实例http://www.tkk7.com/yaominxi/archive/2006/04/05/39354.htmlymxymxWed, 05 Apr 2006 04:42:00 GMThttp://www.tkk7.com/yaominxi/archive/2006/04/05/39354.htmlhttp://www.tkk7.com/yaominxi/comments/39354.htmlhttp://www.tkk7.com/yaominxi/archive/2006/04/05/39354.html#Feedback0http://www.tkk7.com/yaominxi/comments/commentRss/39354.htmlhttp://www.tkk7.com/yaominxi/services/trackbacks/39354.html
http://www.springframework.org/download.html

  解压后的目录中包含了dist、lib{子目录

  2. 在JBuilder2005中增加spring库,选择菜单Tools-Configure-LibrariesQ在弹出的对话框中点击New按钮Q输入spring库的名称QspringQ点击Add按钮Q将dist目录中的所有jar文g增加到spring库中

  3. 新徏工程文gQ选菜单File-New ProjectQ给工程文g取名为myProject

  讄工程文g的属性,选菜单Project-Project PropertiesQ选择Tomcat作ؓ服务器,spring库加入Path/Required Libraries。因Z子中用到了log4jQ将包含了log4j的库加入Path/Required LibrariesQ注意到lib目录下有两个子目录log4j和jakarta-commonsQ它们的用法是不同的,如下面的代码片断所C:

  log4j

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class SpringappController implements Controller {
 /** Logger for this class and subclasses */

 static Logger logger = Logger.getLogger(SpringappController.class);
 jakarta-commons
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 public class SpringappController implements Controller {
  /** Logger for this class and subclasses */
  protected final Log logger = LogFactory.getLog(getClass());

  4. 新徏Web模块Q选菜单File-NewQ给Web模块取名为springapp

  5. 新徏hello.jsp文g如下Q?br />
Q?@ page contentType="text/html; charset=Big5" %Q?br />QhtmlQ?br /> QheadQ<titleQExample :: Spring ApplicationQ?titleQ</headQ?br />QbodyQ?br /> Qh1QHello - Spring ApplicationQ?h1Q?br /> QpQGreetings.Q?pQ?br />Q?bodyQ?br />Q?htmlQ?/td>

  6. 新徏cL件SpringappController.java如下Q?br />
package spring;

import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class SpringappController implements Controller {
 /** Logger for this class and subclasses */
 // protected final Log logger = LogFactory.getLog(getClass());

 static Logger logger = Logger.getLogger(SpringappController.class);
 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
  logger.info("SpringappController - returning hello view");
  return new ModelAndView("hello.jsp");
 }
}

  7. 修改web.xml文g

Q?xml version="1.0" encoding="UTF-8"?Q?br />Q?DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'Q?br />
Qweb-appQ?br />
 QservletQ?br />  Qservlet-nameQspringappQ?servlet-nameQ?br />  Qservlet-classQorg.springframework.web.servlet.DispatcherServletQ?servlet-classQ?br />  Qload-on-startupQ?Q?load-on-startupQ?br /> Q?servletQ?br />
 Qservlet-mappingQ?br />  Qservlet-nameQspringappQ?servlet-nameQ?br />  Qurl-patternQ?.htmQ?url-patternQ?br /> Q?servlet-mappingQ?br />
 Qwelcome-file-listQ?br />  Qwelcome-fileQ?br />   index.jsp
  Q?welcome-fileQ?br /> Q?welcome-file-listQ?br />
Q?web-appQ?/td>

  8. 在web-inf目录中新建springapp-servlet.xml文g如下

Q?xml version="1.0" encoding="UTF-8"?Q?br />
Q?DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"Q?br />

Q?-- - Application context definition for "springapp" DispatcherServlet. --Q?br />
QbeansQ?br /> Qbean id="springappController" class="spring.SpringappController"/Q?br /> Qbean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"Q?br /> Qproperty name="mappings"Q?br />  QpropsQ?br />   Qprop key="/hello.htm"QspringappControllerQ?propQ?br />  Q?propsQ?br /> Q?propertyQ?br />Q?beanQ?br />
Q?beansQ?/td>

  9. 在web-inf目录中新建log4j.properties文g如下Q?br />
log4j.rootCategory=INFO, stdout, logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - Q?mQ?n

log4j.appender.logfile=org.apache.log4j.RollingFileAppender

log4j.appender.logfile.File=springapp.log

log4j.appender.logfile.MaxFileSize=512KB

# Keep three backup files

log4j.appender.logfile.MaxBackupIndex=3

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

#Pattern to output : date priority [category] - QmessageQline_separator

log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - Q?mQ?n



ymx 2006-04-05 12:42 发表评论
]]>
使用Log4jq行日志操作http://www.tkk7.com/yaominxi/archive/2006/04/05/39351.htmlymxymxWed, 05 Apr 2006 04:38:00 GMThttp://www.tkk7.com/yaominxi/archive/2006/04/05/39351.htmlhttp://www.tkk7.com/yaominxi/comments/39351.htmlhttp://www.tkk7.com/yaominxi/archive/2006/04/05/39351.html#Feedback0http://www.tkk7.com/yaominxi/comments/commentRss/39351.htmlhttp://www.tkk7.com/yaominxi/services/trackbacks/39351.html 1. 概述

1.1. 背景

在应用程序中d日志记录ȝ来说Z三个目的Q监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码q行时轨q,作ؓ日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打C码的调试信息?/p>

最普通的做法是在代码中嵌入许多的打印语句,q些打印语句可以输出到控制台或文件中Q比较好的做法就是构造一个日志操作类来封装此cL作,而不是让一pd的打印语句充斥了代码的主体?/p>

1.2. Log4j?/span>

在强调可重用lg开发的今天Q除了自׃头到ּ发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j?/p>

Log4j是Apache的一个开放源代码目Q通过使用Log4jQ我们可以控制日志信息输送的目的地是控制台、文件、GUIlg、甚x套接口服务器、NT的事件记录器、UNIX Syslog守护q程{;我们也可以控制每一条日志的输出格式Q通过定义每一条日志信息的U别Q我们能够更加细致地控制日志的生成过E。最令h感兴的是Q这些可以通过一个配|文件来灉|地进行配|,而不需要修改应用的代码?/p>

此外Q通过Log4j其他语言接口Q您可以在C、C++?Net、PL/SQLE序中用Log4jQ其语法和用法与在JavaE序中一P使得多语a分布式系l得C个统一一致的日志lg模块。而且Q通过使用各种W三Ҏ展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中?/p>

本文介绍的Log4j版本?.2.3。作者试N过一个简单的客户/服务器JavaE序例子Ҏ使用与不使用Log4j 1.2.3的差别,q详l讲解了在实践中最怋用Log4j的方法和步骤。在可重用组件开发的今天Q相信Log4j会l广大的设计开发h员带来方ѝ加入到Log4j的队伍来吧!

2. 一个简单的例子

我们先来看一个简单的例子Q它是一个用Java实现的客?服务器网l程序。刚开始我们不使用Log4jQ而是使用了一pd的打印语句,然后我们用Log4j来实现它的日志功能。这P大家可以清楚地比较出前后两个代码的差别?/p>

2.1. 不用Log4j

2.1.1. 客户E序

package log4j ;

import java.io.* ;
import java.net.* ;

/**
 *
 * <p> Client Without Log4j </p>
 * <p> Description: a sample with log4j</p>
 * @version 1.0
 */
public class ClientWithoutLog4j {

    /**
     *
     * @param args
     */
    public static void main ( String args [] ) {

        String welcome = null;
        String response = null;
        BufferedReader reader = null;
        PrintWriter writer = null;
        InputStream in = null;
        OutputStream out = null;
        Socket client = null;

        try {
            client = new Socket ( "localhost", 8001 ) ;
            System.out.println ( "info: Client socket: " + client ) ;
            in = client.getInputStream () ;
            out = client.getOutputStream () ;
        } catch ( IOException e ) {
            System.out.println ( "error: IOException : " + e ) ;
            System.exit ( 0 ) ;
        }

        try{
            reader = new BufferedReader( new InputStreamReader ( in ) ) ;
            writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

            welcome = reader.readLine () ;
            System.out.println ( "debug: Server says: '" + welcome + "'" ) ;

            System.out.println ( "debug: HELLO" ) ;
            writer.println ( "HELLO" ) ;
            response = reader.readLine () ;
            System.out.println ( "debug: Server responds: '" + response + "'") ;

            System.out.println ( "debug: HELP" ) ;
            writer.println ( "HELP" ) ;
            response = reader.readLine () ;
            System.out.println ( "debug: Server responds: '" + response + "'" ) ;

            System.out.println ( "debug: QUIT" ) ;
            writer.println ( "QUIT" ) ;
        } catch ( IOException e ) {
            System.out.println ( "warn: IOException in client.in.readln()" ) ;
            System.out.println ( e ) ;
        }
        try{
            Thread.sleep ( 2000 ) ;
        } catch ( Exception ignored ) {}
    }
}

2.1.2. 服务器程?/b>

package log4j ;

import java.util.* ;
import java.io.* ;
import java.net.* ;

/**
 *
 * <p> Server Without Log4j </p>
 * <p> Description: a sample with log4j</p>
 * @version 1.0
 */
public class ServerWithoutLog4j {

    final static int SERVER_PORT = 8001 ; // this server's port

    /**
     *
     * @param args
     */
    public static void main ( String args [] ) {
        String clientRequest = null;
        BufferedReader reader = null;
        PrintWriter writer = null;
        ServerSocket server = null;
        Socket socket = null;
        InputStream in = null;
        OutputStream out = null;

        try {
            server = new ServerSocket ( SERVER_PORT ) ;
            System.out.println ( "info: ServerSocket before accept: " + server ) ;
            System.out.println ( "info: Java server without log4j, on-line!" ) ;

            // wait for client's connection
            socket = server.accept () ;
            System.out.println ( "info: ServerSocket after accept: " + server )  ;

            in = socket.getInputStream () ;
            out = socket.getOutputStream () ;

        } catch ( IOException e ) {
            System.out.println( "error: Server constructor IOException: " + e ) ;
            System.exit ( 0 ) ;
        }
        reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
        writer = new PrintWriter ( new OutputStreamWriter ( out ) , true ) ;

        // send welcome string to client
        writer.println ( "Java server without log4j, " + new Date () ) ;

        while ( true ) {
            try {
                // read from client
                clientRequest = reader.readLine () ;
                System.out.println ( "debug: Client says: " + clientRequest ) ;
                if ( clientRequest.startsWith ( "HELP" ) ) {
                    System.out.println ( "debug: OK!" ) ;
                    writer.println ( "Vocabulary: HELP QUIT" ) ;
                }
                else {
                    if ( clientRequest.startsWith ( "QUIT" ) ) {
                        System.out.println ( "debug: OK!" ) ;
                        System.exit ( 0 ) ;
                    }
                    else{
                        System.out.println ( "warn: Command '" + 
      clientRequest + "' not understood." ) ;
                        writer.println ( "Command '" + clientRequest 
      + "' not understood." ) ;
                    }
                }
            } catch ( IOException e ) {
                System.out.println ( "error: IOException in Server " + e ) ;
                System.exit ( 0 ) ;
            }
        }
    }
}

2.2. q移到Log4j

2.2.1. 客户E序

package log4j ;

import java.io.* ;
import java.net.* ;

// add for log4j: import some package
import org.apache.log4j.PropertyConfigurator ;
import org.apache.log4j.Logger ;
import org.apache.log4j.Level ;

/**
 *
 * <p> Client With Log4j </p>
 * <p> Description: a sample with log4j</p>
 * @version 1.0
 */
public class ClientWithLog4j {

    /*
    add for log4j: class Logger is the central class in the log4j package.
    we can do most logging operations by Logger except configuration.
    getLogger(...): retrieve a logger by name, if not then create for it.
    */
    static Logger logger = Logger.getLogger 
 ( ClientWithLog4j.class.getName () ) ;

    /**
     *
     * @param args : configuration file name
     */
    public static void main ( String args [] ) {

        String welcome = null ;
        String response = null ;
        BufferedReader reader = null ;
        PrintWriter writer = null ;
        InputStream in = null ;
        OutputStream out = null ;
        Socket client = null ;

        /*
        add for log4j: class BasicConfigurator can quickly configure the package.
        print the information to console.
        */
        PropertyConfigurator.configure ( "ClientWithLog4j.properties" ) ;

        // add for log4j: set the level
//        logger.setLevel ( ( Level ) Level.DEBUG ) ;

        try{
            client = new Socket( "localhost" , 8001 ) ;

            // add for log4j: log a message with the info level
            logger.info ( "Client socket: " + client ) ;

            in = client.getInputStream () ;
            out = client.getOutputStream () ;
        } catch ( IOException e ) {

            // add for log4j: log a message with the error level
            logger.error ( "IOException : " + e ) ;

            System.exit ( 0 ) ;
        }

        try{
            reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
            writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

            welcome = reader.readLine () ;

            // add for log4j: log a message with the debug level
            logger.debug ( "Server says: '" + welcome + "'" ) ;

            // add for log4j: log a message with the debug level
            logger.debug ( "HELLO" ) ;

            writer.println ( "HELLO" ) ;
            response = reader.readLine () ;

            // add for log4j: log a message with the debug level
            logger.debug ( "Server responds: '" + response + "'" ) ;

            // add for log4j: log a message with the debug level
            logger.debug ( "HELP" ) ;

            writer.println ( "HELP" ) ;
            response = reader.readLine () ;

            // add for log4j: log a message with the debug level
            logger.debug ( "Server responds: '" + response + "'") ;

            // add for log4j: log a message with the debug level
            logger.debug ( "QUIT" ) ;

            writer.println ( "QUIT" ) ;
        } catch ( IOException e ) {

            // add for log4j: log a message with the warn level
            logger.warn ( "IOException in client.in.readln()" ) ;

            System.out.println ( e ) ;
        }
        try {
            Thread.sleep ( 2000 ) ;
        } catch ( Exception ignored ) {}
    }
}

2.2.2. 服务器程?/b>

package log4j;

import java.util.* ;
import java.io.* ;
import java.net.* ;

// add for log4j: import some package
import org.apache.log4j.PropertyConfigurator ;
import org.apache.log4j.Logger ;
import org.apache.log4j.Level ;

/**
 *
 * <p> Server With Log4j </p>
 * <p> Description: a sample with log4j</p>
 * @version 1.0
 */
public class ServerWithLog4j {

    final static int SERVER_PORT = 8001 ; // this server's port

    /*
    add for log4j: class Logger is the central class in the log4j package.
    we can do most logging operations by Logger except configuration.
    getLogger(...): retrieve a logger by name, if not then create for it.
    */
    static Logger logger = Logger.getLogger 
 ( ServerWithLog4j.class.getName () ) ;

    /**
     *
     * @param args
     */
    public static void main ( String args[]) {
        String clientRequest = null ;
        BufferedReader reader = null ;
        PrintWriter writer = null ;
        ServerSocket server = null ;
        Socket socket = null ;

        InputStream in = null ;
        OutputStream out = null ;

        /*
        add for log4j: class BasicConfigurator can quickly configure the package.
        print the information to console.
        */
        PropertyConfigurator.configure ( "ServerWithLog4j.properties" ) ;

        // add for log4j: set the level
//        logger.setLevel ( ( Level ) Level.DEBUG ) ;

        try{
            server = new ServerSocket ( SERVER_PORT ) ;

            // add for log4j: log a message with the info level
            logger.info ( "ServerSocket before accept: " + server ) ;

            // add for log4j: log a message with the info level
            logger.info ( "Java server with log4j, on-line!" ) ;

            // wait for client's connection
            socket = server.accept() ;

            // add for log4j: log a message with the info level
            logger.info ( "ServerSocket after accept: " + server ) ;

            in = socket.getInputStream() ;
            out = socket.getOutputStream() ;

        } catch ( IOException e ) {

            // add for log4j: log a message with the error level
            logger.error ( "Server constructor IOException: " + e ) ;
            System.exit ( 0 ) ;
        }
        reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
        writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

        // send welcome string to client
        writer.println ( "Java server with log4j, " + new Date () ) ;

        while ( true ) {
            try {
                // read from client
                clientRequest = reader.readLine () ;

                // add for log4j: log a message with the debug level
                logger.debug ( "Client says: " + clientRequest ) ;

                if ( clientRequest.startsWith ( "HELP" ) ) {

                    // add for log4j: log a message with the debug level
                    logger.debug ( "OK!" ) ;

                    writer.println ( "Vocabulary: HELP QUIT" ) ;
                }
                else {
                    if ( clientRequest.startsWith ( "QUIT" ) ) {

                        // add for log4j: log a message with the debug level
                        logger.debug ( "OK!" ) ;

                        System.exit ( 0 ) ;
                    }
                    else {

                        // add for log4j: log a message with the warn level
                        logger.warn ( "Command '" 
      + clientRequest + "' not understood." ) ;

                        writer.println ( "Command '"
      + clientRequest + "' not understood." ) ;
                    }
                }
            } catch ( IOException e ) {

                // add for log4j: log a message with the error level
                logger.error( "IOException in Server " + e ) ;

                System.exit ( 0 ) ;
            }
        }
    }
}

2.2.3. 配置文g

2.2.3.1. 客户E序配置文g

log4j.rootLogger=INFO, 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

2.2.3.2. 服务器程序配|文?/p>

log4j.rootLogger=INFO, 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

2.3. 比较

比较q两个应用可以看出,采用Log4jq行日志操作的整个过E相当简单明了,与直接用System.out.println语句q行日志信息输出的方式相比,基本上没有增加代码量Q同时能够清楚地理解每一条日志信息的重要E度。通过控制配置文gQ我们还可以灉|CҎ志信息的格式Q输出目的地{等斚wQ而单U依靠System.out.println语句Q显焉要做更多的工作?/p>

下面我们以前面使用Log4j的应用作Z子,详细讲解使用Log4j的主要步骤?/p>

3. Log4j基本使用Ҏ

Log4j׃个重要的lg构成Q日志信息的优先U,日志信息的输出目的地Q日志信息的输出格式。日志信息的优先U从高到低有ERROR、WARN、INFO、DEBUGQ分别用来指定这条日志信息的重要E度Q日志信息的输出目的地指定了日志打印到控制台还是文件中Q而输出格式则控制了日志信息的昄内容?/p>

3.1.定义配置文g

其实您也可以完全不用配|文Ӟ而是在代码中配置Log4j环境。但是,使用配置文g您的应用E序更加灉|?/p>

Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是JavaҎ文Ӟ?|。下面我们介l用JavaҎ文件做为配|文件的ҎQ?/p>

  1. 配置根LoggerQ其语法为:
    log4j.rootLogger = [ level ] , appenderName, appenderName, ?/pre>其中Qlevel 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的别。Log4j只用四个别,优先U从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里定义了INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来?br />appenderName是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地?br />
  2. 配置日志信息输出目的地AppenderQ其语法?br />
    log4j.appender.appenderName = fully.qualified.name.of.appender.class
    log4j.appender.appenderName.option1 = value1
    ?
    log4j.appender.appenderName.option = valueN
    其中QLog4j提供的appender有以下几U:
    org.apache.log4j.ConsoleAppenderQ控制台Q,
    org.apache.log4j.FileAppenderQ文ӞQ?br />org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQorg.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?br />org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
  3. 配置日志信息的格式(布局Q,其语法ؓQ?br />
    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
    log4j.appender.appenderName.layout.option1 = value1
    ?
    log4j.appender.appenderName.layout.option = valueN
    其中QLog4j提供的layout有以下几U:
    org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
    org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
    org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
    org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)

3.2.在代码中使用Log4j

下面讲q在E序代码中怎样使用Log4j?/p>

3.2.1.得到记录?/b>

使用Log4jQ第一步就是获取日志记录器Q这个记录器负责控制日志信息。其语法为:

public static Logger getLogger( String name)Q?/pre>通过指定的名字获得记录器Q如果必要的话,则ؓq个名字创徏一个新的记录器。Name一般取本类的名字,比如Q?br />
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;

3.2.2.d配置文g

当获得了日志记录器之后,W二步将配置Log4j环境Q其语法为:
BasicConfigurator.configure ()Q?自动快速地使用~省Log4j环境?br />PropertyConfigurator.configure ( String configFilename) Q读取用Java的特性文件编写的配置文g?br />DOMConfigurator.configure ( String filename ) Q读取XML形式的配|文件?/p>

3.2.3.插入记录信息Q格式化日志信息Q?/b>

当上两个必要步骤执行完毕Q您可以轻村֜使用不同优先U别的日志记录语句插入到您想记录日志的Q何地方,其语法如下:

Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;

4. 参考资?/span>

如果您想更深入地了解Log4jQ请l常讉K下面提及的相关链接?br />Log4j目主页------------------------------------------------------http://www.log4j.org/
Log4j FAQ -------------------------------------------------------http://www-900.ibm.com/developerWorks/cn/java/l-log4j/www.log4j.org/log4j/faq.html



ymx 2006-04-05 12:38 发表评论
]]>Webwork ?spring 的整?/title><link>http://www.tkk7.com/yaominxi/archive/2006/04/05/39349.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:35:00 GMT</pubDate><guid>http://www.tkk7.com/yaominxi/archive/2006/04/05/39349.html</guid><wfw:comment>http://www.tkk7.com/yaominxi/comments/39349.html</wfw:comment><comments>http://www.tkk7.com/yaominxi/archive/2006/04/05/39349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yaominxi/comments/commentRss/39349.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yaominxi/services/trackbacks/39349.html</trackback:ping><description><![CDATA[ <div class="f1rz9tt" id="content3"> <h1> </h1> </div> <div class="bfl1zpv" id="newscontent"> <p> </p> <p> <br />1 适合读?br />本文针对有一定的web基础Qwebwork基础Q对spring有一定的了解?/p> <p> <a > <font color="#003399">http://www.springframework.org/</font> </a>  站点可以了解更多关于spring的详l信? Spring是一个很好的AOP框架Q能提供自动的事务管理?/p> <p> <a > <font color="#003399">http://www.opensymphony.com/webwork/</font> </a>站点可以了解更多的webwork . Webwork是一个很好的 MVC 框架Q以下简单介l,webwork ?spring 的融合,以用h册ؓ例?/p> <p>2 整合步骤<br />2 .1使用 SpringObjectFactory<br />dev.java.net上的 xwork-optional 包括了对 xwork-spring 的支持,可以下蝲些包。包中只?个类Q可以根据具体情况用。我在例子中使用了SpringObjectFactorycdSpringObjectFactoryListener c,q安照webwork的文件在web.xml加入了,以下节点</p> <p><!-- This needs to be after Spring ContextLoaderListener --></p> <p><listener></p> <p>  <listener-class>com.opensymphony.xwork.spring.SpringObjectFactoryListener</listener-class></p> <p></listener></p> <p>但在实际工作中不能用,回ؓ在SpringObjectFactoryListenercM写的Q加载些cd要先加载org.springframework.web.context.ContextLoaderListenerc,׃些类在web.xml配置如下Q后于listener的执行?/p> <p><servlet></p> <p>                   <servlet-name>spring</servlet-name></p> <p>                   <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class></p> <p>                   <load-on-startup>0</load-on-startup></p> <p>          </servlet></p> <p>ContextLoaderServlet 的作用是加蝲 spring配置信息Q在intҎ中)QSpringObjectFactoryListener 的作用是讄 XWork ?Webwork 的环境,使这能从spring 中加载数据和信息Q在contextInitialized(ServletContextEvent event)Ҏ中,当启动web应用E序是调用).</p> <p>要ContextLoaderServlet比SpringObjectFactoryListenercL早执行,我用的Ҏ是重载ContextLoaderServletQ在中子cȝintҎ中设|XWork ?Webwork 的环境,LSpringObjectFactoryListener 监听器,q整改web.xml中的spring配置Q如下:</p> <p><servlet></p> <p>                   <servlet-name>spring</servlet-name></p> <p>                   <servlet-class>spring.server.ContextLoaderServletServer</servlet-class></p> <p>                   <load-on-startup>0</load-on-startup></p> <p>          </servlet></p> <p>2 .2 配置webwork<br />在webwork.xml中增加如下节?/p> <p><action name="registerSupport-spring" class="registerSupportBean" ></p> <p>                            <result name="success" type="dispatcher"></p> <p>                                      <param name="location">/register-result.jsp</param></p> <p>                            </result></p> <p>                            <result name="input" type="dispatcher"></p> <p>                                      <param name="location">/registerSupport.jsp</param></p> <p>           </result></p> <p>           <interceptor-ref name="validationWorkflowStack"/></p> <p>       </action></p> <p>其中的registerSupportBean在spring中配|?/p> <p>2 .3 配置spring<br />在spring中加入action 配置如下</p> <p><!-- action --></p> <p>          <bean name="registerSupportBean" class="spring.action.RegisterActionSupport" </p> <p>                   singleton="false" ></p> <p>                   <property name="userBean"></p> <p>                            <ref bean="userBean"/></p> <p>                   </property></p> <p>          </bean></p> <p>些处的registerSupportBean 即ؓ在webwork中要调用的类名?<br /></p>Copyright 2003-2005 www.sohozu.com All Rights Reserved </div> <img src ="http://www.tkk7.com/yaominxi/aggbug/39349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:35 <a href="http://www.tkk7.com/yaominxi/archive/2006/04/05/39349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Myeclipse快速开发struts应用E序 http://www.tkk7.com/yaominxi/archive/2006/04/05/39344.htmlymxymxWed, 05 Apr 2006 04:32:00 GMThttp://www.tkk7.com/yaominxi/archive/2006/04/05/39344.htmlhttp://www.tkk7.com/yaominxi/comments/39344.htmlhttp://www.tkk7.com/yaominxi/archive/2006/04/05/39344.html#Feedback0http://www.tkk7.com/yaominxi/comments/commentRss/39344.htmlhttp://www.tkk7.com/yaominxi/services/trackbacks/39344.html  jdk5.0
  eclipse3.1M7 (观众问:为啥q在用eclipse3.1M7呢?{曰Q没办法Q偶奶奶家还是拨号上|。^*^)
  myeclipse3.84
  tomcat5.0.28
  
  介:
  文本主要介绍用myeclipse的struts designerQ图形化开发环境)开发一个简单的用户dE序片段?br />  主要包括2个jsp文g、一个ActionForm、一个Action{其?br />  userLogin.jsp(用户d及错误提C页? userLoginSuccess.jsp(提示d成功面)
  UserLoginForm.java(ActionForm,存放用户提交信息)
  UserLoginAction.java(Action,单的处理用户d事g)
  
  开始吧
  首先我们先徏立一个j2ee的web project.如图1:
  
 

  点击next,Project name输入LoginDemo,其余保持默认,点击finish.
  在package explorer?可以看到我们的目?然后l这个项目添加Struts框架必要的文?在我们项目名上点d?选择MyEclipes --> Add Struts Capabilities...弹出对话框图2Q?br />  
 

  其中Struts config path是我们的struts配置文gQURL pattern我们选择*.doQDefault application resource为我们默认的资源文g地方Q你可以选择它的存储位置Q我们在q里保持默认。点击Finish后,目l构cM于图3Q?br />  
 

  现在来开始我们的例子吧。首先修?WEB-INF/web.xml文g,为其d标签?在用中发现Q不d也能成功。但Z保持书上一_q是d安全些。hoho~~)下面代码添加至 </webapp> 上面Q?br />  
  <taglib>
  <taglib-uri>/tags/struts-html</taglib-uri>
  <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
  </taglib>
  
  <taglib>
  <taglib-uri>/tags/struts-bean</taglib-uri>
  <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
  </taglib>
  
  <taglib>
  <taglib-uri>/tags/struts-logic</taglib-uri>
  <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
  </taglib>
  完成后,打开struts-config.xml文gQ点击这个界面左下角的Designq入可视化设计界面。有没有注意双的Palette :) 点击它,让我们来开始我们的jsp面设计。我们先建立userLoginSuccess.jsp文gQؓ啥先一个呢Q等下就知道了,在myeclipse中可以一ơ性把我们的Action,ActionForm,Jsp文g一ơ徏好(三个有兌的文件等下创建)?br />  点击Palette面版上的创徏JSP文g图标,弹出创徏JSP文g面板。图4Q?br />  
 

  在File Name里输入userLoginSuccess.jspQTemplate to use选择2] Standard JSP using Struts 1.1,点击Finish完成?br />  完成后,struts-config.xml文g自动被更斎ͼ可视化界在上也出C刚新建的JSP模块。新建的jsp文g也被打开了?br />  覆盖所有的<%@ taglib ...... 为我们开始在/WEB-INF/web.xml中定义的Q?br />  
  <%@ taglib uri="/tags/struts-html" prefix="html"%>
  <%@ taglib uri="/tags/struts-bean" prefix="bean"%>
  <%@ taglib uri="/tags/struts-logic" prefix="logic"%>
  
  然后?lt;body></body>中添?
  Hello <bean:write name="userName" scope="request" /> .
  q里request中的属性userName输出在页面上Q所以等下我们在UserLoginAction中,d成功后要讄一个相兛_性?br />  
  OK,下面来开始我们最后三个文件的设计吧。在Struts-config.xml的Design模式中,在画版的I白区域点右键,选择New --> New Form, Action and JSP 弹出ActionForm的选项面板Q我们按图上输入相关|?Q?br />  
 

  在Optional Details的Form Properties选项卡,点add个ActionFormd相关|在这个登录示例中Q将d两个属性userName和passwordQ图6Q?br />  
 

  在添加passwordӞ注意JSP input type 下拉框选择password.
  完成q步后,我们将ActionForm设计完成?br />  接下来选择 Optional Details的JSP选项?我们选中Create JSP form? q一步myeclipseؓ我们创徏一个简单的与用户交互的d面。保持内容和?一栗图7Q?br />  
 

  因ؓ我们q只是简单的演示一个登录片D,所以不用验证用户信息是否合法,所以将 Option Details的method选项卡的新徏ҎLQ如?Q?br />  
 

  点NextQ进入Action选项面板.Option Details的Form选项卡中Validate Form取消选择Q如?Q?br />  
 

  然后在Forwards选项卡中点addd成功和失败返回的面.如图10Q?br />  
 

  点击Finish完成。在Struts-config.xml的Design中,可以看到?1所C:
  
 

  最后,单的修改一下userLogin.jsp,所?lt;%@ taglib ...%>替换为:
  <%@ taglib uri="/tags/struts-html" prefix="html"%>
  <%@ taglib uri="/tags/struts-bean" prefix="bean"%>
  修改UserLoginAction中的execute片段为如下所C,?2Q?br />  
 

  OKQ完成。。。下面就部暑目Q测试。。?br />  
  像ؓ目dStruts框架一P在项目名上右击,选择MyEclipse --> Add and Remove Project development.
  在弹出对话框上,单击add Q在弹出?New Deployment 对话框上QServer选Tomcat5Q点击Finish完成部vQ如?3:
  
 

  在用览器上打开Qhttp://127.0.0.1:8080/LoginDemo/userLogin.jsp
  输入密码123456,用户名EricHe。显C成功:
  

  如果输错Q或不输入,则无反映又回到当前登录页面(因ؓ我们没有讄错误信息Q?br />


ymx 2006-04-05 12:32 发表评论
]]>
正则表达式大?http://www.tkk7.com/yaominxi/archive/2006/04/05/39340.htmlymxymxWed, 05 Apr 2006 04:24:00 GMThttp://www.tkk7.com/yaominxi/archive/2006/04/05/39340.htmlhttp://www.tkk7.com/yaominxi/comments/39340.htmlhttp://www.tkk7.com/yaominxi/archive/2006/04/05/39340.html#Feedback0http://www.tkk7.com/yaominxi/comments/commentRss/39340.htmlhttp://www.tkk7.com/yaominxi/services/trackbacks/39340.html正则表达式用于字W串处理Q表单验证等场合Q实用高效,但用到时L不太把握Q以致往往要上|查一番。我一些常用的表达式收藏在q里Q作备忘之用。本贴随时会更新?/p>

匚w中文字符的正则表辑ּQ?[\u4e00-\u9fa5]

匚w双字节字W?包括汉字在内)Q[^\x00-\xff]

应用Q计字W串的长度(一个双字节字符长度?QASCII字符?Q?/font>

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

匚wI的正则表辑ּQ\n[\s| ]*\r

匚wHTML标记的正则表辑ּQ?<(.*)>.*<\/\1>|<(.*) \/>/

匚w首尾I格的正则表辑ּQ?^\s*)|(\s*$)

应用Qjavascript中没有像vbscript那样的trim函数Q我们就可以利用q个表达式来实现Q如下:

应用Qjavascript中没有像vbscript那样的trim函数Q我们就可以利用q个表达式来实现Q如下:

String.prototype.trim = function()
{
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

利用正则表达式分解和转换IP地址Q?/font>

下面是利用正则表辑ּ匚wIP地址QƈIP地址转换成对应数值的JavascriptE序Q?/font>

function IP2V(ip)
{
 re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g  //匚wIP地址的正则表辑ּ
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
 throw new Error("Not a valid IP address!")
}
}

不过上面的程序如果不用正则表辑ּQ而直接用split函数来分解可能更单,E序如下Q?/font>

var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是Q?+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

匚wEmail地址的正则表辑ּQ\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匚w|址URL的正则表辑ּQhttp://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

利用正则表达式去除字串中重复的字W的法E序Q[注:此程序不正确Q原因见本脓回复]

var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2)  //l果为:abcefgi

我原来在CSDN上发贴寻求一个表辑ּ来实现去除重复字W的ҎQ最l没有找刎ͼq是我能惛_的最单的实现Ҏ。思\是用后向引用取出包括重复的字符Q再以重复的字符建立W二个表辑ּQ取C重复的字W,两者串q。这个方法对于字W顺序有要求的字W串可能不适用?/font>

得用正则表达式从URL地址中提取文件名的javascriptE序Q如下结果ؓpage1

s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)

利用正则表达式限制网表单里的文本框输入内容Q?/font>

用正则表辑ּ限制只能输入中文Qonkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

用正则表辑ּ限制只能输入全角字符Q?/font>  onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

用正则表辑ּ限制只能输入数字Qonkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

用正则表辑ּ限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

正则表达式,正规表达式,正则表达式匹配,正则表达式语法,模式匚wQ正规表辑ּ匚w javascript正则表达?ASP正则表达?ASP.NET正则表达?C#正则表达?JSP正则表达?PHP正则表达?VB.NET正则表达?VBSCript正则表达式编E?delphi正则表达?jscript

 

正则表达?regular expression
正则表达?RegExp
模式 pattern
匚w Match
.NET命名I间Q?System.Text.RegularExpression

 

补充Q?
^\d+$  //匚w非负整数Q正整数 + 0Q?
^[0-9]*[1-9][0-9]*$  //匚w正整?
^((-\d+)|(0+))$  //匚w非正整数Q负整数 + 0Q?
^-[0-9]*[1-9][0-9]*$  //匚w负整?
^-?\d+$    //匚w整数
^\d+(\.\d+)?$  //匚w非负点敎ͼ正QҎ + 0Q?
^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$  //匚w正QҎ
^((-\d+(\.\d+)?)|(0+(\.0+)?))$  //匚w非正点敎ͼ负QҎ + 0Q?
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$  //匚w负QҎ
^(-?\d+)(\.\d+)?$  //匚w点?
^[A-Za-z]+$  //匚w?6个英文字母组成的字符?
^[A-Z]+$  //匚w?6个英文字母的大写l成的字W串
^[a-z]+$  //匚w?6个英文字母的写l成的字W串
^[A-Za-z0-9]+$  //匚w由数字和26个英文字母组成的字符?
^\w+$  //匚w由数字?6个英文字母或者下划线l成的字W串
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$    //匚wemail地址
^[a-zA-z]+://匚w(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$  //匚wurl

 

利用正则表达式去除字串中重复的字W的法E序Q?

var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //l果为:abcefgi
===============================
如果var s = "abacabefggeeii"
l果׃对了Q结果ؓQabeicfgg
正则表达式的能力有限

RE: totoro
谢谢你的指点Q这个javascript正则表达式程序算法确实有问题Q我会试着找更好的办法!!!

1.认有效电子邮g格式
下面的代码示例用静?Regex.IsMatch Ҏ验证一个字W串是否为有效电子邮件格式。如果字W串包含一个有效的电子邮g地址Q则 IsValidEmail Ҏq回 trueQ否则返?falseQ但不采取其他Q何操作。您可以使用 IsValidEmailQ在应用E序地址存储在数据库中或昄?ASP.NET 中之前Q筛选出包含无效字符的电子邮件地址?

[Visual Basic]
Function IsValidEmail(strIn As String) As Boolean
' Return true if strIn is in valid e-mail format.
Return Regex.IsMatch(strIn, ("^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")
End Function
[C#]
bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}


2.清理输入字符?
下面的代码示例用静?Regex.Replace Ҏ从字W串中抽出无效字W。您可以使用q里定义?CleanInput ҎQ清除掉在接受用戯入的H体的文本字D中输入的可能有害的字符。CleanInput 在清除掉?@?Q连字符Q和 .Q句点)以外的所有非字母数字字符后返回一个字W串?

[Visual Basic]
Function CleanInput(strIn As String) As String
' Replace invalid characters with empty strings.
Return Regex.Replace(strIn, "[^\w\.@-]", "")
End Function
[C#]
String CleanInput(string strIn)
{
// Replace invalid characters with empty strings.
return Regex.Replace(strIn, @"[^\w\.@-]", "");
}


3.更改日期格式
以下代码CZ使用 Regex.Replace Ҏ来用 dd-mm-yy 的日期Ş式代?mm/dd/yy 的日期Ş式?

[Visual Basic]
Function MDYToDMY(input As String) As String
Return Regex.Replace(input, _
"\b(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2,4})\b", _
"${day}-${month}-${year}")
End Function
[C#]
String MDYToDMY(String input)
{
return Regex.Replace(input,
"\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b",
"${day}-${month}-${year}");
}
Regex 替换模式
本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中,替换表达?${day} 插入?(?<day>...) l捕L子字W串?

有几U静态函C您可以在使用正则表达式操作时无需创徏昑ּ正则表达式对象,?Regex.Replace 函数正是其中之一。如果您不想保留~译的正则表辑ּQ这给您带来方?


4.提取 URL 信息
以下代码CZ使用 Match.Result 来从 URL 提取协议和端口号。例如,“http://www.contoso.com:8080/letters/readme.html”将q回“http:8080”?

[Visual Basic]
Function Extension(url As String) As String
Dim r As New Regex("^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/", _
RegexOptions.Compiled)
Return r.Match(url).Result("${proto}${port}")
End Function
[C#]
String Extension(String url)
{
Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
RegexOptions.Compiled);
return r.Match(url).Result("${proto}${port}");
}

普通字W?/font>

普通字W由所有那些未昑ּ指定为元字符的打印和非打印字W组成。这包括所有的大写和小写字母字W,所有数字,所有标点符号以及一些符受?

最单的正则表达式是一个单独的普通字W,可以匚w所搜烦字符串中的该字符本n。例如,单字W模?'A' 可以匚w所搜烦字符串中M位置出现的字?'A'。这里有一些单字符正则表达式模式的CZQ?/p>

/a/ /7/ /M/

{h?VBScript 单字W正则表辑ּ为:

"a" "7" "M"

可以多个单字符l合在一起得C个较大的表达式。例如,下面?JScript 正则表达式不是别的,是通过l合单字W表辑ּ 'a'?7'以及 'M' 所创徏出来的一个表辑ּ?

/a7M/

{h?VBScript 表达式ؓQ?/p>

"a7M"

h意这里没有连接操作符。所需要做的就是将一个字W放在了另一个字W后面?/p>

Ҏ字符

有不元字符在试囑֯其进行匹配时需要进行特D的处理。要匚wq些Ҏ字符Q必首先将q些字符转义Q也是在前面用一个反斜杠 (\)。下表给Zq些Ҏ字符及其含义Q?/p>

Ҏ字符说明
$匚w输入字符串的l尾位置。如果设|了 RegExp 对象?Multiline 属性,?$ 也匹?'\n' ?'\r'。要匚w $ 字符本nQ请使用 \$?/td>
( )标记一个子表达式的开始和l束位置。子表达式可以获取供以后使用。要匚wq些字符Q请使用 \( ?\)?/td>
*匚w前面的子表达式零ơ或多次。要匚w * 字符Q请使用 \*?/td>
+匚w前面的子表达式一ơ或多次。要匚w + 字符Q请使用 \+?/td>
.匚w除换行符 \n之外的Q何单字符。要匚w .Q请使用 \?/td>
[ 标记一个中括号表达式的开始。要匚w [Q请使用 \[?
?匚w前面的子表达式零ơ或一ơ,或指明一个非贪婪限定W。要匚w ? 字符Q请使用 \??/td>
\下一个字W标Cؓ或特D字W、或原义字符、或后向引用、或八进制{义符。例如, 'n' 匚w字符 'n'?\n' 匚w换行W。序?'\\' 匚w "\"Q?'\(' 则匹?"("?/td>
^匚w输入字符串的开始位|,除非在方括号表达式中使用Q此时它表示不接受该字符集合。要匚w ^ 字符本nQ请使用 \^?/td>
{标记限定W表辑ּ的开始。要匚w {Q请使用 \{?/td>
|指明两项之间的一个选择。要匚w |Q请使用 \|?/td>

非打印字W?/font>

有不很有用的非打印字符Q偶必M用。下表显CZ用来表示q些非打印字W的转义序列Q?/p>

字符含义
\cx匚w?em>x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符?x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/td>
\f匚w一个换늬。等价于 \x0c ?\cL?/td>
\n匚w一个换行符。等价于 \x0a ?\cJ?/td>
\r匚w一个回车符。等价于 \x0d ?\cM?/td>
\s匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td>
\S匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td>
\t匚w一个制表符。等价于 \x09 ?\cI?/td>
\v匚w一个垂直制表符。等价于 \x0b ?\cK?/td>

字符匚w

句点 (.) 匚w一个字W串中Q何单个的打印或非打印字符Q除了换行符 (\n) 之外。下面的 JScript 正则表达式可以匹?'aac'?abc'?acc'?adc'如此{等Q同样也可以匚w 'a1c'?a2c'、a-c'以及 a#c'Q?

/a.c/

{h?VBScript 正则表达式ؓQ?/p>

"a.c"

如果试图匚w一个包含文件名的字W串Q其中句?(.) 是输入字W串的一部分Q则可以在正则表辑ּ中的句点前面加上一个反斜杠 (\) 字符来实现这一要求。D例来_下面?JScript 正则表达式就能匹?'filename.ext'Q?/p>

/filename\.ext/

?VBScript 而言Q等L表达式如下所C:

"filename\.ext"

q些表达式仍然是相当有限的。它们只允许匚wM单字W。很多情况下Q对从列表中匚wҎ字符十分有用。例如,如果输入文字中包含用数字表示为Chapter 1, Chapter 2诸如此类的章节标题,你可能需要找到这些章节标题?

括号表达?/h3>

可以在一个方括号 ([ ?]) 中放入一个或多个单字W,来创Z个待匚w的列表。如果字W被攑օ括号中括hQ则该列表称?em>括号表达?/em>。括号内和其他Q何地方一P普通字W代表其本nQ也是_它们匚w输入文字中出现的一处自己。大多数Ҏ字符在位于括可辑ּ中时都将失去其含义。这里有一些例外:

  • ']' 字符如果不是W一,则将l束一个列表。要在列表中匚w ']' 字符Q请其攑֜W一,紧跟在开始的 '[' 后面?
  • '\' 仍然作ؓ转义W。要匚w '\' 字符Q请使用 '\\'?

括号表达式中所包含的字W只匚w该括可辑ּ在正则表辑ּ中所处位|的一个单字符。下面的 JScript 正则表达式可以匹?'Chapter 1'?Chapter 2'?Chapter 3'?Chapter 4' 以及 'Chapter 5'Q?/p>

/Chapter [12345]/

?VBScript 中要匚w同样的章节标题,请用下面的表达式:

"Chapter [12345]"

h意单?'Chapter' 及后面的I格与括号内的字W的位置关系是固定的。因此,括号表达式只用来指定满紧跟在单?'Chapter' 和一个空g后的单字W位|的字符集合。这里是W九个字W位|?/p>

如果希望使用范围而不是字W本w来表示待匹配的字符Q则可以使用q字W将该范围的开始和l束字符分开。每个字W的字符值将军_其在一个范围内的相寚w序。下面的 JScript 正则表达式包含了一个等价于上面所C的括号列表的范围表辑ּ?/p>

/Chapter [1-5]/

VBScipt 中相同功能的表达式如下所C:

"Chapter [1-5]"

如果以这U方式指定范_则开始和l束值都包括在该范围内。有一点特别需要注意的是,?Unicode 排序中v始g定要在结束g前?/p>

如果惛_括号表达式中包括q字W,则必M用下q方法之一Q?

  • 使用反斜杠将其{义:
    [\-]
  • 连字符攑֜括号列表的开始和l束位置。下面的表达式能匚w所有的写字母和连字符Q?
    [-a-z] [a-z-]
  • 创徏一个范_其中开始字W的值小于连字符Q而结束字W的值等于或大于q字W。下面两个正则表辑ּ都满一要求Q?
    [!--] [!-~]

同样Q通过在列表开始处攄一个插入符(^)Q就可以查找所有不在列表或范围中的字符。如果该插入W出现在列表的其他位|,则匹配其本nQ没有Q何特D含义。下面的 JScript 正则表达式匹配章节号大于 5 的章节标题:

/Chapter [^12345]/

?VBScript 则用:

"Chapter [^12345]"

在上面所C的CZ中,表达式将匚wW九个位|处?, 2, 3, 4, or 5 之外的Q何数字字W。因此, 'Chapter 7' Z个匹配,同样 'Chapter 9' 也是如此?

上面的表辑ּ可以使用q字W?(-) 表示。对 JScript 为:

/Chapter [^1-5]/

或者,?VBScript 为:

"Chapter [^1-5]"

括号表达式的典型用法是指定对M大写或小写字母字W或M数字的匹配。下面的 JScript 表达式给Zq一匚wQ?/p>

/[A-Za-z0-9]/

{h?VBScript 表达式ؓQ?/p>

"[A-Za-z0-9]"



ymx 2006-04-05 12:24 发表评论
]]>
MyEclipse+struts+Hibernate配置开?http://www.tkk7.com/yaominxi/archive/2006/04/05/39339.htmlymxymxWed, 05 Apr 2006 04:21:00 GMThttp://www.tkk7.com/yaominxi/archive/2006/04/05/39339.htmlhttp://www.tkk7.com/yaominxi/comments/39339.htmlhttp://www.tkk7.com/yaominxi/archive/2006/04/05/39339.html#Feedback0http://www.tkk7.com/yaominxi/comments/commentRss/39339.htmlhttp://www.tkk7.com/yaominxi/services/trackbacks/39339.html

  Q?br />
  如果你还不清楚struts和hibernate的一些基本原理,希望能先M解一下这斚w的相兛_宏V?/p>

  推荐Q?br />
  Hibernate中文手册》作者认学Hibernate看这个就_了,里面几乎包括了所有的l节Q不q可能不太适合快速入门?br />
  地址Q?a href="http://www.hibernate.org/hib_docs/v3/reference/zh- cn/html_single/">http://www.hibernate.org/hib_docs/v3/reference/zh-%20cn/html_single/

  关于struts的资料就很多了,q里推荐一个可以下载一些入门教E的|站?br />
  地址Q?a >http://www.wnetw.com/jclub/index.jsp

  强烈入门的朋友先了解一下基本的原理Q否则本文可能对你没有Q何帮助?/p>

  相关工具下蝲Q(注意版本Q?br />
  mysql5.0 http://www.mysql.org/
  eclipse 3.1.1 http://www.eclipse.org/
  myeclipse4.0.3 http://www.myeclipseide.com/
  tomcat5.5

  安装Q?br />
  关于tomcat和mysql的安装就不多说了Q需要注意的是最好保证你?jdk?.5的版本,q|好你的环境变量Q不然可能会遇到一些问题?br />
  把eclipse解开Q再d装刚下蝲的myeclipseQ在安装的时候需要把路径指定到刚才解开的eclipse上,׃myeclipse是个收费软gQ所以需要注册。不q一般按照Chinese的习惯,去google一个注册码可以了:}

  开发环境部|Ԍ

  好了Q现在保证你的mysql和tomcat服务能够正常启动Qmyeclipse能够正常打开Q如果不能,可以L一下相关的说明或者给作者留aQ。下面我们就要开始真正的开始部|一个传说中的tomcat+struts+hibernate+mysqll构的工E了Q(faint!前言写的我好篏Q?br />
  首先Q在myeclipse里新Z个工E。在左边的Package Exporler面版里点右键选择new->project?

  在蟩单里选择MyEclipse->J2EE Projects->Web Project?br />
  点击next后进入如下画面:


  工程名ؓQtest

  l束后点击Finish?br />
  好了Q如果成功的话你׃?Package Exporler里看C个新的test工程Q现在我们先配置一下数据库斚w的东ѝ首先在你的mysql 里徏立一个数据库webasesQ再在里面新Z个表adminQ里面三个字D分别ؓid,name,password其中id动取值的主键Qmysql具体的操作可以自己找资料Q不是本文涉及范_?br />
  再回到myeclipse Q选中window->Open Perspective->Other?br />
  可以看到现在跛_一个名为Select Perspective的菜单,在里面选中MyEclipse Databases ExporlerQ可以看到现在到了下面的面?/p>

  按以上图C入相兛_D后点击Finish便徏立了一个数据库q接Q在新出现的JDBC for Mysql上点右键Q选择Open connection…,认用户名和密码正确后点OKQ如果一切顺利的话你会看C面的画面Q?

  q说明你已经和数据库建立了正的q接。现在我们再回到window->Open Perspective- >Other…里的MyEclipseQ也是我们刚进来的时候看到的画面?br />
  右键点击你刚建立的工E?testq择MyEclipse->Add struts Capabilities…在跛_的菜单里按照如下输入q确定:

  好了Q现在你已经Z的工E增加了strutsQ接下来和上面一样在右键工程后选择MyEclipse- >Add Hibernate Capabilities…一路确定下来ؓ你的工程dHibernate。(为方便v见我们在选择路径时把HibernateSessionFactory.java攑֜了src/com下面Q其实最好徏立个单独的目录如 src/com/hibernateQ?br />
  Z更好的演C我们不建立通常的登陆页面而是建立个注册页面。选择 src目录下的hibernate.cfg.xml文g。照如下填写q保存。这样hibernate׃ؓ你徏立了数据库的q接池?/p>

  下面我们再选择WebRoot/WEB-INF/struts-config.xml文gQ在画面中点d键选择new- >Form, Action and JSP。如下填?/p>

  再选择JSP选项Q如?/p>

  最后选择Finish?br />
  再新Z个一个success.jsp的页面,

  在刚才struts- config.xml文g里右?a class="bluekey" target="_blank">选择addAdmin选择PropertiesQ在菜单里选择ForwordsQ再点addQ如下图填写

  最后你的struts-config.xml是下面q个样子Q?/p>


  下面我们转到hibernate。换到刚才我们徏立数据库的页面,选择你的admin的表点右键选择Create Hibernate Mapping。选择好打包\径后选择Finish。如图:

  在你刚才选择的\径下Q我为方便是src/com/yourcompanyname/Q下新徏立的文g AdminDAOFactory.java文gq输入以下内容:

package com.yourcompanyname;

import java.util.Iterator;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hibernate.SessionFactory;

public class AdminDAOFactory {
 Session session;
 Transaction tx;
 public void add(Admin admin) throws HibernateException {
  /**
   * Creation Date: 11-17-2005
   * TODO Add a new admin user.
   * @param An object of Admin
   * @return void
   * @author Coder Guo
   */
  try {
   session = SessionFactory.currentSession();
   tx = session.beginTransaction();
   //Add a new admin
   session.save(admin);
   tx.commit ();
  }catch(HibernateException e){
   throw e;
  }finally{
   if (tx!=null) {
    tx.rollback();
   }
   SessionFactory.closeSession();
  }
 }
}

 再打开com.yourcompany.struts.action下的AddAdminAction.javadQ其中如果有错误选中好按ctrl+shift+o自动d包)

public class AddAdminAction extends Action {

 // --------------------------------------------------------- Instance Variables

 // --------------------------------------------------------- Methods

 /**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  * @author Coder Guo
  */
 public ActionForward execute(
  ActionMapping mapping,
  ActionForm form,
  HttpServletRequest request,
  HttpServletResponse response) {
  AddAdminForm addAdminForm = (AddAdminForm) form;
  
  // TODO Add a new admin
  Admin admin = new Admin();
  admin.setName(addAdminForm.getName ());
  admin.setPassword(addAdminForm.getPassword ());
  AdminDAOFactory adminDAO = new AdminDAOFactory ();
  adminDAO.add(admin);
  
  return mapping.findForward("success");
 }

}

 再打开com.yourcompanyname.struts.form下的AddAdminForm.javaQ修改(如果有错误按照上面说的方法导入包Q?br /> public ActionErrors validate(
  ActionMapping mapping,
  HttpServletRequest request) {

  // TODO Auto-generated method stub
  ActionErrors errors = new ActionErrors();
  
  Session session = SessionFactory.currentSession();
  Transaction tx = session.beginTransaction ();
  Query query = session.createQuery("select admin from Admin as admin where admin.name = '" + this.name + "'");
  Iterator it = query.iterate ();
  if (it.hasNext()){
   errors.add ("addAdmin.err.name",new ActionMessage("form.addAdmin.err.name"));
  }
  tx.commit();
  SessionFactory.closeSession ();
  return errors;
 }

 public void reset(ActionMapping mapping, HttpServletRequest request) {

  // TODO Auto-generated method stub
  this.name=null;
  this.password=null;
 }

  再打开com\yourcompanyname\struts下的ApplicationResource.properties在这里面d错误信息Q?

Form.addAdmin.err.name=err

  最后,Q汗Q好累啊-_-!Q打开addAdmin.jsp修改成如下:

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page language="java"%>
<%@ taglib uri="<%@ taglib uri="

<script language = "javascript">
<!--
function
check(){
 if (loginForm.userName.value == "" || loginForm.password.value == ""){
  alert("误入完整的信息Q?);
  loginForm.userName.focus();
  return false;
 }
}
//-->
</script>
 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html>
  <head>
    <html:base />
   
    <title>login.jsp</title>
    <link href="css/webcss.css" rel="stylesheet" type="text/css">
   
    <meta http-equiv="pragma" content="no- cache">
    <meta http-equiv="cache-control" content="no- cache">
    <meta http-equiv="expires" content="0">   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http- equiv="description" content="This is my page">
  </head>
 

  <body>
  <center>
   <p>&nbsp;</p>
   <p>&nbsp;</p>
   <table width="300" border="0" cellpadding="0" cellspacing="0">
   <html:form action="/addAdmin" focus="name" method="GET">
     <tr align="center" valign="middle">
       <td colspan="2" class="typt_normal">新增理?lt;/td>
     </tr>
     <tr>
       <td width="100" align="center" valign="middle" class="typt_normal">名称Q?</td>
       <td width="200" align="left"><html:text property="name" styleClass="text_s"/><html:errors property="addAdmin.err.name"/></td>
     </tr>
     <tr>
       <td width="100" align="center" valign="middle" class="typt_normal">密码Q?</td>
       <td width="200" align="left"><html:password property="password" styleClass="text_s"/></td>
     </tr>
     <tr> 
       <td colspan="2" align="center" valign="middle"><html:submit value="提交" onclick="return check ();"/><html:reset value="重置"></html:reset></td>
       </tr>
 </html:form>
   </table>
 </center>
 </body>

</html:html>

  其中可以看到如何在struts的标{中使用javascript的方法?br />
  配置好myeclipse于tomcat的连接。在window->Preferences做如下设定:

  在项目文件点右键Q?gt;“myeclipse”->“Add and remove project deployment”,如下图:

  好了Q我们的配置工作基本l束?在myeclipse上开启tomcat服务

  现在打开览器,输入

  http://127.0.0.1:8080/test/addAdmin.jsp可以看C的jsp面了!



ymx 2006-04-05 12:21 发表评论
]]>
ANT学习指南http://www.tkk7.com/yaominxi/archive/2006/04/05/39336.htmlymxymxWed, 05 Apr 2006 04:14:00 GMThttp://www.tkk7.com/yaominxi/archive/2006/04/05/39336.htmlhttp://www.tkk7.com/yaominxi/comments/39336.htmlhttp://www.tkk7.com/yaominxi/archive/2006/04/05/39336.html#Feedback0http://www.tkk7.com/yaominxi/comments/commentRss/39336.htmlhttp://www.tkk7.com/yaominxi/services/trackbacks/39336.html

内容摘要Q?/font>

ANT是一个基于Java的自动化脚本引擎Q脚本格式ؓXML。除了做Java~译相关d外,ANTq可以通过插g实现很多应用的调用?1)ANT的基本概念:
2)ANT的安装:解包Q设|\?br />3)ANT的用:最好的学习只不q是一个简单实用的例子h…?/font>

作者: 车东 http://www.chedong.com/tech/default.html



ANT的基本概念:Java的Makefile

当一个代码项目大了以后,每次重新~译Q打包,试{都会变得非常复杂而且重复Q因此c语言中有make脚本来帮助这些工作的扚w完成。在Java中应用是q_无关性的Q当然不会用q_相关的make脚本来完成这些批处理d了,ANT本n是q样一个流E脚本引擎,用于自动化调用程序完成项目的~译Q打包,试{。除了基于JAVA是^台无关的外,脚本的格式是ZXML的,比make脚本来说q要好维护一些?br />

每个ant脚本Q缺省叫build.xmlQ中讄了一pdd(target)Q比如对于一个一般的目可能需要有以下d?/font>

  • d1Qusage 打印本脚本的帮助信息Q缺省)
  • d2Qclean <-- init 清空初始化环?/font>
  • d3Qjavadoc <-- build <-- init 生成JAVADOC
  • d4Qjar <-- build <-- init 生成JAR
  • d5Qall <-- jar + javadoc <-- build <-- init 完成以上所有Q务:jar javadoc
而多个Q务之间往往又包含了一定了依赖关系Q比如把整个应用打包d(jar)的这个依赖于~译d(build)Q而编译Q务又依赖于整个环境初始化d(init){?br />
注:我看到很多项目的ant脚本中的命名基本上都是一致的Q比如:~译一般叫build或者compileQ打包一般叫jar或warQ生成文档一般命名ؓjavadoc或javadocsQ执行全部Q务all。在每个d的中QANT会根据配|调用一些外部应用ƈ配以相应参数执行。虽然ANT可调用的外部应用U类非常丰富Q但其实最常用的就2Q?个:比如javac javadoc jar{?/font>

ANT的安?/font>

解包后在pȝ可执行\径中加入指向ant的bin的\径就可以了,比如可以在GNU/Linux上把以下配置加入/etc/profile中:
export ANT_HOME=/home/ant
export JAVA_HOME=/usr/java/j2sdk1.4.1
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin

q样执行ant 后,如果不指定配|文件ant会缺省找build.xmlq个配置文gQƈҎ配置文g执行dQ缺省的d讄可以指向最常用的Q务,比如QbuildQ或指向打印帮助信息QusageQ告诉用h那些脚本选项可以使用?br />

ANT的?/font>

最好的学习q程是看懂那些open source目中的build.xml脚本Q然后根据自q需要简化成一个更单的QANT和APACHE上很多非常工E派的项目:单易用,而且适应性非常强Q因些项目的建立往往来源于开发h员日常最直接的需求?br />以下是的一?a >WebLucene应用的例子:修改?a >JDOM的build.xmlQ?br />
<project default="usage" basedir=".">

  <!-- =================================================================== -->
  <!-- Initialization target                                               -->
  <!-- =================================================================== -->
  <target name="init">
    <tstamp/>
    <property file="${basedir}/build.properties" />
    <property name="Name" value="ProjectFullName"/>
    <property name="name" value="project_name"/>
    <property name="version" value="0.2"/>
    <property name="year" value="2003"/>

    <echo message="----------- ${Name} ${version} [${year}] ------------"/>

    <property name="debug" value="off"/>
    <property name="optimize" value="on"/>
    <property name="deprecation" value="on"/>

    <property name="src.dir" value="./src/WEB-INF/src"/>
    <property name="lib.dir" value="./src/WEB-INF/lib"/>
    <property name="packages" value="com.chedong.*,org.apache.lucene.*"/>

    <property name="build.src" value="./src/WEB-INF/build"/>
    <property name="build.dest" value="./src/WEB-INF/classes"/>
    <property name="build.javadocs" value="./src/doc"/>
   
    <path id="classpath">
        <pathelement path="${jsdk_jar}"/>
        <fileset dir="${lib.dir}">
           <include name="**/*.jar"/>
        </fileset>
    </path>
   
    <filter token="year" value="${year}"/>
    <filter token="version" value="${version}"/>
    <filter token="date" value="${TODAY}"/>
    <filter token="log" value="true"/>
    <filter token="verbose" value="true"/>
  </target>

  <!-- =================================================================== -->
  <!-- Help on usage                                                       -->
  <!-- =================================================================== -->
  <target name="usage" depends="init">
    <echo message="${Name} Build file"/>
    <echo message="-------------------------------------------------------------"/>
    <echo message=""/>
    <echo message=" available targets are:"/>
    <echo message=""/>
    <echo message="   jar      --> generates the ${name}.jar file"/>
    <echo message="   build    --> compiles the source code"/>
    <echo message="   javadoc  --> generates the API documentation"/>
    <echo message="   clean    --> cleans up the directory"/>
    <echo message=""/>
    <echo message=" Please rename build.properties.default to build.properties"/>
    <echo message=" and edit build.properties to specify JSDK 2.3 classpath."/>
    <echo message=""/>
    <echo message=" See the comments inside the build.xml file for more details."/>
    <echo message="-------------------------------------------------------------"/>
    <echo message=""/>
    <echo message=""/>
  </target>

  <!-- =================================================================== -->
  <!-- Prepares the source code                                            -->
  <!-- =================================================================== -->
  <target name="prepare-src" depends="init">
    <!-- create directories -->
    <mkdir dir="${build.src}"/>
    <mkdir dir="${build.dest}"/>
   
    <!-- copy src files -->
    <copy todir="${build.src}">
      <fileset dir="${src.dir}"/>
    </copy>
  </target>

  <!-- =================================================================== -->
  <!-- Compiles the source directory                                       -->
  <!-- =================================================================== -->
  <target name="build" depends="prepare-src">
    <javac srcdir="${build.src}"
           destdir="${build.dest}"
           debug="${debug}"
           optimize="${optimize}">
      <classpath refid="classpath"/>
    </javac>
  </target>

  <!-- =================================================================== -->
  <!-- Creates the class package                                           -->
  <!-- =================================================================== -->
  <target name="jar" depends="build">
    <jar jarfile="${lib.dir}/${name}.jar"
         basedir="${build.dest}"
         includes="**"/>
  </target>

  <!-- =================================================================== -->
  <!-- Creates the API documentation                                       -->
  <!-- =================================================================== -->
  <target name="javadoc" depends="build">
    <mkdir dir="${build.javadocs}"/>
    <javadoc packagenames="${packages}"
             sourcepath="${build.src}"
             destdir="${build.javadocs}"
             author="true"
             version="true"
             use="true"
             splitindex="true"
             windowtitle="${Name} API"
             doctitle="${Name}">
      <classpath refid="classpath"/>
    </javadoc>
  </target>

  <!-- =================================================================== -->
  <!-- Clean targets                                                       -->
  <!-- =================================================================== -->
  <target name="clean" depends="init">
    <delete dir="${build.src}"/>
    <delete dir="${build.dest}/org"/>
    <delete dir="${build.dest}/com"/>
    <delete>
      <fileset dir="${build.dest}" includes="**/*.class"/>
    </delete>
  </target>
</project>
<!-- End of file -->



~省dQusage 打印帮助文Q告诉有那些d选项Q可用的有build, jar, javadoc和clean.

初始化环境变量:init
所有Q务都Z一些基本环境变量的讄初始化完成,是后l其他Q务的基础Q在环境初始化过E中Q有2Ҏ较可以方便设|:

1 除了使用却缺省的property讄了JAVA源\径和输出路径外,引用了一个外部的build.properties文g中的讄Q?br /><property file="${basedir}/build.properties" />
q样大部分简单配|用户只要会看懂build.properties可以了Q毕竟XML比vkey value的属性文件还是要可读性差一些。用build.properties也可以方便其他用户从~译的细节中解放出来?br />
2 CLASSPATH讄Q用了其中的:

    <path id="classpath">
        <pathelement path="${jsdk_jar}"/>
        <fileset dir="${lib.dir}">
           <include name="**/*.jar"/>
        </fileset>
    </path>

则相当于讄了:CLASSPATH=/path/to/resin/lib/jsdk23.jar;/path/to/project/lib/*.jar;

文g复制Qprepare-src
创徏临时SRC存放目录和输出目录?/font>

<!-- =================================================================== -->
  <!-- Prepares the source code                                            -->
  <!-- =================================================================== -->
  <target name="prepare-src" depends="init">
    <!-- create directories -->
    <mkdir dir="${build.src}"/>
    <mkdir dir="${build.dest}"/>
   
    <!-- copy src files -->
    <copy todir="${build.src}">
      <fileset dir="${src.dir}"/>
    </copy>
  </target>

~译dQbuild
~译时的CLASSPATH环境通过一下方式找到引用一个path对象

<classpath refid="classpath"/>

打包dQjar
对应用打包生成项目所写名?jar文g


  <!-- =================================================================== -->
  <!-- Creates the class package                                           -->
  <!-- =================================================================== -->
  <target name="jar" depends="build">
    <jar jarfile="${lib.dir}/${name}.jar"
         basedir="${build.dest}"
         includes="**"/>
  </target>

生成JAVADOC文d: javadoc
  <!-- =================================================================== -->
  <!-- Creates the API documentation                                       -->
  <!-- =================================================================== -->
  <target name="javadoc" depends="build">
    <mkdir dir="${build.javadocs}"/>
    <javadoc packagenames="${packages}"
             sourcepath="${build.src}"
             destdir="${build.javadocs}"
             author="true"
             version="true"
             use="true"
             splitindex="true"
             windowtitle="${Name} API"
             doctitle="${Name}">
      <classpath refid="classpath"/>
    </javadoc>
  </target>

清空临时~译文gQclean
  <!-- =================================================================== -->
  <!-- Clean targets                                                       -->
  <!-- =================================================================== -->
  <target name="clean" depends="init">
    <delete dir="${build.src}"/>
    <delete dir="${build.dest}/org"/>
    <delete dir="${build.dest}/com"/>
    <delete>
      <fileset dir="${build.dest}" includes="**/*.class"/>
    </delete>
  </target>

TODOQ?br />更多d/扩展Q(样例Q?br />

  • 试dQJUnit试
  • 代码风格查Q务:CheckStyleQJalopy{?/font>
  • 邮g警报dQ可以把以上q些d的输告发送到制定的用户列表中Q这个Q务可以设|每天自动运行?/font>


ymx 2006-04-05 12:14 发表评论
]]>
我收集的Eclipse插ghttp://www.tkk7.com/yaominxi/archive/2006/04/05/39335.htmlymxymxWed, 05 Apr 2006 04:08:00 GMThttp://www.tkk7.com/yaominxi/archive/2006/04/05/39335.htmlhttp://www.tkk7.com/yaominxi/comments/39335.htmlhttp://www.tkk7.com/yaominxi/archive/2006/04/05/39335.html#Feedback0http://www.tkk7.com/yaominxi/comments/commentRss/39335.htmlhttp://www.tkk7.com/yaominxi/services/trackbacks/39335.htmlsubversion
版本控制Q相当于CVS
安装Q?/font> http://subclipse.tigris.org/install.html
Name: Subclipse
URL:  http://subclipse.tigris.org/update_1.0.x


CSS Editor for Eclipse
http://csseditor.sourceforge.net/

FacesIDE
FacesIDE是一个用于开发JSF的Eclispe插g.它可以可视化~辑faces-config.xml文gq且提供代码~辑与校?预览JSF的JSP文g.FacesIDE包含MyFaces来作为JSF的实?br />
http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=FacesIDE

Eclipse SQLExplorer plugin
一个数据库理插g
http://sourceforge.net/projects/eclipsesql

Poperties Editor
一个在~辑完成后可以将资源文g中的中文~码格式转换为unicode~码的插Ӟ在开发国际化应用E序的时候非常有?br />
http://propedit.sourceforge.jp/eclipse/updates/

eclipseME
 
http://eclipseme.org/updates/

Eclipse加速插件KeepResident
http://suif.stanford.edu/pub/keepresident/

 
MyEclipse  J2EE开发插Ӟ支持SERVLET/JSP/EJB/数据库操U늭
www.myeclipseide.com
 
Properties Editor  ~辑java的属性文Ӟq可以自动存盘ؓUnicode格式
http://propedit.sourceforge.jp/index_en.html
http://propedit.sourceforge.jp/eclipse/updates/
 
Colorer Take  Z癄cd的文件按语法着?br />
http://colorer.sourceforge.net/
 
XMLBuddy ~辑xml文g
www.xmlbuddy.com
 
Code Folding  加入多种代码折叠功能Q比eclipse自带的更多)
http://www.coffee-bytes.com/servlet/PlatformSupport
 
Easy Explorer  从eclipse中访问选定文g、目录所在的文g?br />
http://easystruts.sourceforge.net/
 
Fat Jar 打包插gQ可以方便的完成各种打包dQ可以包含外部的包等
http://fjep.sourceforge.net/
 
RegEx Test 试正则表达?br />
http://brosinski.com/stephan/archives/000028.php
 
JasperAssistant 报表插gQ强Q要qQ?br />
http://www.jasperassistant.com/
 
Jigloo GUI Builder QAQӞ的GQテ~辑插g
http://cloudgarden.com/jigloo/
 
Profiler 性能跟踪、测量工P能跟t、测量Q程?br />
http://sourceforge.net/projects/eclipsecolorer/
 
AdvanQas 提供对if/else{条件语句的提示和快捷帮助(自动更改l构{)
http://eclipsecolorer.sourceforge.net/advanqas/index.html
 
Log4E     Log4j插gQ提供各U和Log4j相关的Q务,如ؓҎ、类d一个logger{?br />
http://log4e.jayefem.de/index.php/Main_Page
 
VSSPlugin VSS插g
http://sourceforge.net/projects/vssplugin
 
Implementors   提供跌{C个方法的实现c,而不是接中的功能Q实?Q?br />
http://eclipse-tools.sourceforge.net/implementors/
 
Call Hierarchy 昄一个方法的调用层次Q被哪些Ҏ调,调了哪些ҎQ?br />
http://eclipse-tools.sourceforge.net/call-hierarchy/index.html
 
EclipseTidy 查和格式化HTML/XML文g
http://eclipsetidy.sourceforge.net/
 
Checkclipse 查代码的风格、写法是否符合规?br />
http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm
 
Hibernate Synchronizer Hibernate插gQ自动映等
http://www.binamics.com/hibernatesync/
 
spring updatesite 插g
http://springide.org/updatesite/

VeloEclipse  Velocity插g
http://propsorter.sourceforge.net/
 
EditorList   方便的列出所有打开的Editor
http://editorlist.sourceforge.net/
 
MemoryManager 内存占用率的监视
http://cloudgarden.com/memorymanager/

Eclipse的游戏插?br /> http://eclipse-games.sourceforge.net/

JBoss-IDE
http://jboss.sourceforge.net/jbosside/updates/

自动反编译classQ安装后要设定class文g~省兌到jode
http://www.technoetic.com/eclipse/update


jigloo swing/sw设计工具Q里面自带的form/anchor布局很好用!
http://cloudgarden.soft-gems.net/update-site/

jinto的资源文件编辑工P同时~辑多种语言Q而且自动转换成iso8859-1~码。很好用Q?br /> http://www.guh-software.de/eclipse/



ymx 2006-04-05 12:08 发表评论
]]>
Struts+Spring+Hibernatel习(完整)http://www.tkk7.com/yaominxi/archive/2006/04/05/39331.htmlymxymxWed, 05 Apr 2006 04:05:00 GMThttp://www.tkk7.com/yaominxi/archive/2006/04/05/39331.htmlhttp://www.tkk7.com/yaominxi/comments/39331.htmlhttp://www.tkk7.com/yaominxi/archive/2006/04/05/39331.html#Feedback0http://www.tkk7.com/yaominxi/comments/commentRss/39331.htmlhttp://www.tkk7.com/yaominxi/services/trackbacks/39331.html工具Q?/div>
    Eclipse3.1、MyEclipse4.03、Tomcat5.5.9、Properties Editor插g、MySql4.1.13
 
新徏工程Q名UCؓ login
 
创徏Struts框架
 
创徏 index.jspQ增加一链接指向 login.jsp
 
按下Ctrl + NQ创?login.jsp、LoginActionQ用MyEclipse的向导就可以了,记得选对正确的版?/strong>
 
在ActionForm配置中选择cd为动态FormQƈl承于DynaValidatorFormQ新增两个属性:username、passwordQ在创徏jsp文g打上钩,\径改?login.jspQ然后下一步,改LoginAction的Input source改ؓ/login.jspQ点d?/div>
 
按下Ctrl + N 创徏一个forwardsQ?strong>记得选对正确的版?/strong>
name 输入 indexGo
路径选择 /index.jsp
 
配置validator
先添加Struts插gQ用向?/div>
Plugin class : org.apache.struts.validator.ValidatorPlugIn
Property : pathnames
Value : /WEB-INF/validator-rules.xml,/WEB-INF/validation.xml
q里需要两个xml文g
现在创徏?/font> validation.xml ?/font> 文g
 
在这里说明一点,我用MyEclipse创徏的Struts框架中缺了validator-rules.xml文gQ需要动拯到WEB-INF目录?/div>
此文件可以到http://struts.apache.org/下蝲
 
文g内容如下Q?/div>
<form-validation>
 <formset>
  <form name="loginForm">
   <field property="username" depends="required">
    <arg0 key="prompt.username" />
   </field>
   <field property="password" depends="required">
    <arg0 key="prompt.password" />
   </field>
  </form>
 </formset>
</form-validation>
 
~辑资源文g“ApplicationResources.properties?/font>
增加以下内容
 
prompt.username=User Name
prompt.password=User Password
errors.required={0} is required.
 
再创Z文g资源文g“ApplicationResources_zh_CN.properties?/font>

增加以下内容

prompt.username=用户名称
prompt.password=d密码
errors.required={0} 必需填写Q?/font>
 
修改struts-config.xml文g
在以下位|增加绿色字体部?/div>
<action-mappings >
    <action
      attribute="loginForm"
      input="/login.jsp"
      name="loginForm"
      path="/login"
      scope="request"
      validate="true"
      type="com.test.struts.action.LoginAction" />
  </action-mappings>
 
q里说明提交的数据必需l过验证Q而验证则是通过validator框架q行的?/div>
 
修改LoginAction.java文g的executeҎQ内容如?/div>
public ActionForward execute(
  ActionMapping mapping,
  ActionForm form,
  HttpServletRequest request,
  HttpServletResponse response) {
  DynaValidatorForm loginForm = (DynaValidatorForm) form;
  String username=loginForm.getString("username");
  String password=loginForm.getString("password");
  if(username.equals("test")||password.equals("test")){
   return mapping.findForward("indexGo");
  }else{
   return mapping.getInputForward();
  }
 }
 
现在再修改一下login.jsp
增加以下l色字体部䆾
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
 
其中charset=UTF-8 是用UTF-8的字W编码,q也是ؓ了支持国际化而用的?/font>
 
好了Q现在可以启动Tomcatq行试?/div>
http://localhost/login/  q里说明一下,我的Tomcat已经装端口号改ؓ80了,所以就不必使用http://localhost:8080/login/q样的方法了?/div>
 
如果不输入Q何数据而直接提交表单的话就可以看到效果了?/div>
 
好了Q如果没有什么问题的话就l箋往下看吧,如果有问题的话就得往上看了^_^
 
现在创徏Spring框架了,在这里我Spring所有的包全部加载进去,因ؓ我还不知道具体用到哪些类Q全部加q去方便?/div>
 
单选框选第二个Q这L话所有的cd和标{都将拯到项目中去,q样方便以后的布|?/div>
下一步后是创建配|文Ӟ文件放到“WebRoot/WEB-INF”目录下Q文件名UCؓ“applicationContext.xml?/div>
 
 
配置struts-config.xml文gQ添加(springQ的插g
 
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
  </plug-in>
 
 
修改LoginAction配置
 
原:
<action
      attribute="loginForm"
      input="/login.jsp"
      name="loginForm"
      path="/login"
      scope="request"
      validate="true"
      type="com.test.struts.action.LoginAction" />
 
  </action-mappings>
 
改ؓQ?/font>
<action
      attribute="loginForm"
      input="/login.jsp"
      name="loginForm"
      path="/login"
      scope="request"
      validate="true"
      type="org.springframework.web.struts.DelegatingActionProxy" />
  </action-mappings>
 
 
l色字体部䆾Z改内?/font>
q里用spring的代理器来对Actionq行控制
 
当提交到/login.do是将控制权交l了springQ然后由spring来决定是否{回到struts的Action
 
现在来配|spring
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
http://www.springframework.org/dtd/spring-beans.dtd">
 
<beans>
 <bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"></bean>
</beans>
 
l色字体是关于{交控制权的配|内?/font>
 
属性singleton="false"Q指明了Action 的实例获取方式ؓ每次重新创徏。解决了Struts中o病的U程安全问题QStruts中,׃个Action实例处理所有的hQ这导致了cd用资源在q发h中的U程同步问题。)Q摘自spring开发指南)
 
q时如果你要q行试也是可以的,不过Z省点旉׃q行试了?/font>
 
建立数据库在 q里我用的是mysql4.1.13
 
CREATE TABLE `user` (
  `ID` int(11) NOT NULL auto_increment,
  `USERNAME` varchar(50) NOT NULL default '',
  `PASSWORD` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
d记录 insert into user (USERNAME,PASSWORD) values ('test','test')
 
创徏Hibernate框架
在配|界面中配置数据库的q接部䆾Q重要的是点击链接将jdbc拯到lib目录?/div>
使用MyEclipse的数据Database Explorer工具创徏User.hmb.xml、AbstractUser.java、User.java映射文g
创徏完成后可以将自动生成的hibernate.cfg.xml删除
 
创徏UserDAO.java、UserDAOImp.java

UserDAO.java

public interface UserDAO {

   public abstract boolean isValidUser(String username, String password);

}

 

UserDAOImp.java

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.test.Hibernate.SessionFactory;

public class UserDAOImp extends HibernateDaoSupport implements UserDAO {

    private SessionFactory sessionFactory;

    private static String hql = "from User u where u.username=? ";

    public boolean isValidUser(String username, String password) {

       List userList = this.getHibernateTemplate().find(hql, username);

       if (userList.size() > 0) {

           return true;

       }

       return false;

    }

}

 
修改LoginAction.java文gQ用userDao的方法来q行用户验证
package com.test.struts.action;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.DynaValidatorForm;
 
import com.test.UserDAO;

public class LoginAction extends Action {

 private UserDAO userDAO;
 
 public UserDAO getUserDAO() {
  return userDAO;
 }
 
 public void setUserDAO(UserDAO userDAO) {
  this.userDAO = userDAO;
 }
 
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  DynaValidatorForm loginForm = (DynaValidatorForm) form;
  // TODO Auto-generated method stub
  String username = (String) loginForm.get("username");
  String password = (String) loginForm.get("password");
  loginForm.set("password", null);
  if (userDAO.isValidUser(username,password)) {
   return mapping.findForward("indexGo");
  } else {
   return mapping.getInputForward();
  }
 }
}
l色字体Z攚w?/div>
 
现在剩下最后的spring配置?/div>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 
<beans>
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName">
   <value>com.mysql.jdbc.Driver</value>
  </property>
  <property name="url">
   <value>jdbc:mysql://localhost/test</value>
  </property>
  <property name="username">
   <value>root</value>
  </property>
  <property name="password">
   <value>root</value>
  </property>
 </bean>
 
 <!-- 配置sessionFactory, 注意q里引入的包的不同?-->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref local="dataSource" />
  </property>
  <property name="mappingResources">
   <list>
    <value>com/test/Hibernate/User.hbm.xml</value>
   </list>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
 </bean>
 
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref local="sessionFactory" />
  </property>
 </bean>
 
 <bean id="userDAO" class="com.test.UserDAOImp">
  <property name="sessionFactory">
   <ref local="sessionFactory" />
  </property>
 </bean>
 
 <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager">
   <ref bean="transactionManager" />
  </property>
  <property name="target">
   <ref local="userDAO" />
  </property>
  <property name="transactionAttributes">
   <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
 </bean>
 
 <bean name="/login" class="com.test.struts.action.LoginAction" singleton="false">
  <property name="userDAO">
   <ref bean="userDAOProxy" />
  </property>
 </bean>
</beans>
 
现在可以q行试了!
 
在编写代码有配置内容时一定要注意 hibernate ?hibernate3 Q这两个包的名字只差一个字Q千万不要有错,否则N误可是很隄?/div>


ymx 2006-04-05 12:05 发表评论
]]> վ֩ģ壺 רһ·߶| ޹˾Ʒ | ձƵ߹ۿ| Ƶ߹ۿ| ĻmvֻѸ| ɫëƬƵ| Ӱַ| ѳ߹ۿ| ʵ׾Ʒ| ޾ƷѶ| ޾ƷƷþ99һ| ˊ]Ƭѹۿ| ĻѸ| kkk4444߹ۿ| һƷ| ĻӰԺѲ| þaѹۿ| ԻƵ| videos| 99ƷƵ| ձһ岻| պ伤Ƶ߲ | ޳߹ۿ| ޾ƷAVĻӰվ | ҹþAAAAAëƬѿ| ߹ۿ| ŷղavϵ| Ƶѹۿ| Ƭ߹ۿѹۿȫһ | ھƷ߹ۿ| ŮƵѿһ| ޲Ļ| ޹Ʒһ| ߾Ʒһ | ѿοһ| 69avѹۿ| ѳƵۿ| vaѾƷ| žžžƷƵ| gayվ| þ޾Ʒ|