﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-WEB2.0开发-随笔分类-开发</title><link>http://www.blogjava.net/yaominxi/category/7779.html</link><description>心态决定行为，行为决定习惯，习惯决定命运  </description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 15:36:16 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 15:36:16 GMT</pubDate><ttl>60</ttl><item><title> 华为公司 java 面试题 </title><link>http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Fri, 19 May 2006 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/47096.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/47096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/47096.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a href="http://blog.csdn.net/shuidisha/archive/2006/05/18/744313.aspx">
						<img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" /> 华为公司 java 面试题</a>
				<script language="javascript"><![CDATA[ocument.title="华为公司 java 面试题 - "+document.title]]&gt;</script>
		</div>
		<div class="postText">
				<p>第一部分：选择题<br />QUESTION NO: 1<br />1、public class Test {<br />    public static void changeStr(String str){<br />        str="welcome";<br />    }<br />    public static void main(String[] args) {<br />        String str="1234";<br />        changeStr(str);<br />        System.out.println(str);<br />    }<br />}<br />Please write the output result ：</p>
				<p>QUESTION NO:2<br />1. public class Test {<br />2. static boolean foo(char c) {<br />3. System.out.print(c);<br />4. return true;<br />5. }<br />6. public static void main( String[] argv ) {<br />7. int i =0;<br />8. for ( foo('A'); foo('B')&amp;&amp;(i&lt;2); foo('C')){<br />9. i++ ;<br />10. foo('D');<br />12. }<br />13. }<br />14. }<br />What is the result?<br />A. ABDCBDCB<br />B. ABCDABCD<br />C. Compilation fails.<br />D. An exception is thrown at runtime.</p>
				<p>QUESTION NO: 3<br />1. class A {<br />2. protected int method1(int a, int b) { return 0; }<br />3. }<br />Which two are valid in a class that extends class A? (Choose two)<br />A. public int method1(int a, int b) { return 0; }<br />B. private int method1(int a, int b) { return 0; }<br />C. private int method1(int a, long b) { return 0; }<br />D. public short method1(int a, int b) { return 0; }<br />E. static protected int method1(int a, int b) { return 0; }</p>
				<p>QUESTION NO: 4<br />1. public class Outer{<br />2. public void someOuterMethod() {<br />3. // Line 3<br />4. }<br />5. public class Inner{}<br />6. public static void main( String[]argv ) {<br />7. Outer o = new Outer();<br />8. // Line 8<br />9. }<br />10. }<br />Which instantiates an instance of Inner?<br />A. new Inner(); // At line 3<br />B. new Inner(); // At line 8<br />C. new o.Inner(); // At line 8<br />D. new Outer.Inner(); // At line 8//new Outer().new Inner()</p>
				<p>QUESTION NO: 5<br />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?<br />A. The encodeURL method of the HttpServletRequest interface.<br />B. The encodeURL method of the HttpServletResponse interface.<br />C. The rewriteURL method of the HttpServletRequest interface.<br />D. The rewriteURL method of the HttpServletResponse interface.</p>
				<p>QUESTION NO: 6<br />Which two are equivalent? (Choose two)<br />A. &lt;%= YoshiBean.size%&gt;<br />B. &lt;%= YoshiBean.getSize()%&gt;<br />C. &lt;%= YoshiBean.getProperty("size")%&gt;<br />D. &lt;jsp:getProperty id="YoshiBean" param="size"/&gt;<br />E. &lt;jsp:getProperty name="YoshiBean" param="size"/&gt;<br />F. &lt;jsp:getProperty id="YoshiBean" property="size"/&gt;<br />G. &lt;jsp:getProperty name="YoshiBean" property="size"/&gt;</p>
				<p>QUESTION NO: 7<br />Which of the following statements regarding the lifecycle of a session bean are correct? <br />1.  java.lang.IllegalStateException is thrown if SessionContext.getEJBObject() is invoked when a stateful session bean instance is passivated. <br />2.  SessionContext.getRollbackOnly() does not throw an exception when a session bean with bean-managed transaction demarcation is activated. <br />3.  An exception is not thrown when SessionContext.getUserTransaction() is called in the afterBegin method of a bean with container-managed transactions. <br />4.  JNDI access to java:comp/env is permitted in all the SessionSynchronization methods of a stateful session bean with container-managed transaction demarcation. <br />5.  Accessing resource managers in the SessionSynchronization.afterBegin method of a stateful session bean with bean-managed transaction does not throw an exception.</p>
				<p>
						<br />第二部分：概念题<br />1．    描述Struts体系结构？对应各个部分的开发工作主要包括哪些？</p>
				<p> </p>
				<p> </p>
				<p> </p>
				<p> </p>
				<p> </p>
				<p> </p>
				<p>2．    XML包括哪些解释技术，区别是什么？</p>
				<p> </p>
				<p> </p>
				<p>
						<br />3．    JSP有哪些内置对象和动作？它们的作用分别是什么？</p>
				<p> </p>
				<p> </p>
				<p> </p>
				<p> </p>
				<p> </p>
				<p> </p>
				<p>
						<br />4、SQL问答题<br />SELECT * FROM TABLE<br />和<br />SELECT * FROM TABLE <br />WHERE NAME LIKE '%%' AND ADDR LIKE '%%' <br />AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%' <br />OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' ) <br />的检索结果为何不同？</p>
				<p> </p>
				<p>5、SQL问答题<br />表结构：<br />1、    表名：g_cardapply<br />字段(字段名/类型/长度)：<br />g_applyno        varchar   8；//申请单号（关键字）<br />g_applydate     bigint     8；//申请日期<br />g_state        varchar     2；//申请状态<br />2、    表名：g_cardapplydetail<br />字段(字段名/类型/长度)：<br />g_applyno        varchar     8；//申请单号（关键字）<br />g_name        varchar     30；//申请人姓名<br />g_idcard        varchar     18；//申请人身份证号<br />g_state        varchar     2；//申请状态<br />其中，两个表的关联字段为申请单号。<br />题目：<br />1、    查询身份证号码为440401430103082的申请日期<br />2、    查询同一个身份证号码有两条以上记录的身份证号码及记录个数<br />3、    将身份证号码为440401430103082的记录在两个表中的申请状态均改为07<br />4、    删除g_cardapplydetail表中所有姓李的记录</p>
		</div>
<img src ="http://www.blogjava.net/yaominxi/aggbug/47096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-05-19 18:10 <a href="http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JBuilder 2005 开发Spring实例</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39354.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39354.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39354.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39354.html</trackback:ping><description><![CDATA[1. 下载spring包，网址如下：<br /><br />http://www.springframework.org/download.html<br /><br />　　解压后的目录中包含了dist、lib等子目录<br /><br />　　2. 在JBuilder2005中增加spring库，选择菜单<a class="bluekey" href="http://www.yesky.com/key/67/160067.html" target="_blank">Tools</a>-Configure-Libraries，在弹出的对话框中点击New按钮，输入spring库的名称：spring，点击Add按钮，将dist目录中的所有jar文件增加到spring库中<br /><br />　　3. 新建工程文件，选菜单File-New Project，给工程文件取名为myProject<br /><br />　　设置工程文件的属性，选菜单Project-Project Properties，选择Tomcat作为服务器，将spring库加入Path/Required Libraries。因为例子中用到了log4j，将包含了log4j的库加入Path/Required Libraries，注意到lib目录下有两个子目录log4j和jakarta-commons，它们的用法是不同的,如下面的代码片断所示：<br /><br />　　log4j<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>import org.apache.log4j.Level;<br />import org.apache.log4j.Logger;<br /><br />public class SpringappController implements Controller {<br />　/** Logger for this class and subclasses */<br /><br />　static Logger logger = Logger.getLogger(SpringappController.class);<br />　jakarta-commons<br />　import org.apache.commons.logging.Log;<br />　import org.apache.commons.logging.LogFactory;<br />　public class SpringappController implements Controller {<br />　　/** Logger for this class and subclasses */<br />　　protected final Log logger = LogFactory.getLog(getClass());</td></tr></tbody></table><br />　　4. 新建Web模块，选菜单File-New，给Web模块取名为springapp<br /><br />　　5. 新建hello.jsp文件如下：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>＜%@ page contentType="text/html; charset=Big5" %＞<br />＜html＞<br />　＜head＞＜title＞Example :: Spring Application＜/title＞＜/head＞<br />＜body＞<br />　＜h1＞Hello - Spring Application＜/h1＞<br />　＜p＞Greetings.＜/p＞<br />＜/body＞<br />＜/html＞</td></tr></tbody></table><br />　　6. 新建类文件SpringappController.java如下：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>package spring;<br /><br />import org.springframework.web.servlet.mvc.Controller;<br />import org.springframework.web.servlet.ModelAndView;<br />import javax.servlet.ServletException;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import java.<a class="bluekey" href="http://www.yesky.com/key/938/160938.html" target="_blank">io</a>.IOException;<br /><br />//import org.apache.commons.logging.Log;<br />//import org.apache.commons.logging.LogFactory;<br /><br />import org.apache.log4j.Level;<br />import org.apache.log4j.Logger;<br /><br />public class SpringappController implements Controller {<br />　/** Logger for this class and subclasses */<br />　// protected final Log logger = LogFactory.getLog(getClass());<br /><br />　static Logger logger = Logger.getLogger(SpringappController.class);<br />　public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)<br />　throws ServletException, IOException {<br />　　logger.info("SpringappController - returning hello view");<br />　　return new ModelAndView("hello.jsp");<br />　}<br />}</td></tr></tbody></table><br />　　7. 修改web.xml文件<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>＜?xml version="1.0" encoding="UTF-8"?＞<br />＜!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'＞<br /><br />＜web-app＞<br /><br />　＜servlet＞<br />　　＜servlet-name＞springapp＜/servlet-name＞<br />　　＜servlet-class＞org.springframework.web.servlet.DispatcherServlet＜/servlet-class＞<br />　　＜load-on-startup＞1＜/load-on-startup＞<br />　＜/servlet＞<br /><br />　＜servlet-mapping＞<br />　　＜servlet-name＞springapp＜/servlet-name＞<br />　　＜url-pattern＞*.htm＜/url-pattern＞<br />　＜/servlet-mapping＞<br /><br />　＜welcome-file-list＞<br />　　＜welcome-file＞<br />　　　index.jsp<br />　　＜/welcome-file＞<br />　＜/welcome-file-list＞<br /><br />＜/web-app＞</td></tr></tbody></table><br />　　8. 在web-inf目录中新建springapp-servlet.xml文件如下<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>＜?xml version="1.0" encoding="UTF-8"?＞<br /><br />＜!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"＞<br /><br /><br />＜!-- - Application context <a class="bluekey" href="http://www.yesky.com/key/434/160434.html" target="_blank">definition</a> for "springapp" DispatcherServlet. --＞<br /><br />＜beans＞<br />　＜bean id="springappController" class="spring.SpringappController"/＞<br />　＜bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"＞<br />　＜property name="mappings"＞<br />　　＜props＞<br />　　　＜prop <a class="bluekey" href="http://www.yesky.com/key/697/160697.html" target="_blank">key</a>="/hello.htm"＞springappController＜/prop＞<br />　　＜/props＞<br />　＜/property＞<br />＜/bean＞<br /><br />＜/beans＞</td></tr></tbody></table><br />　　9. 在web-inf目录中新建log4j.properties文件如下：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>log4j.rootCategory=INFO, stdout, logfile<br /><br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br /><br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br /><br />log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - ＜%m＞%n<br /><br />log4j.appender.logfile=org.apache.log4j.RollingFileAppender<br /><br />log4j.appender.logfile.File=springapp.log<br /><br />log4j.appender.logfile.MaxFileSize=512KB<br /><br /># Keep three backup files<br /><br />log4j.appender.logfile.MaxBackupIndex=3<br /><br />log4j.appender.logfile.layout=org.apache.log4j.PatternLayout<br /><br />#Pattern to output : date priority [<a class="bluekey" href="http://www.yesky.com/key/4894/159894.html" target="_blank">category</a>] - ＜message＞line_separator<br /><br />log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - ＜%m＞%n</td></tr></tbody></table><br /><img src ="http://www.blogjava.net/yaominxi/aggbug/39354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:42 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Log4j进行日志操作</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39351.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39351.html</trackback:ping><description><![CDATA[
		<p>
				<a name="1">
						<span class="atitle2">1. 概述</span>
				</a>
		</p>
		<p>
				<a name="1_1">
						<span class="atitle3">1.1. 背景</span>
				</a>
		</p>
		<p>在应用程序中添加日志记录总的来说基于三个目的：监视代码中变量的变化情况，周期性的记录到文件中供其他应用进行统计分析工作；跟踪代码运行时轨迹，作为日后审计的依据；担当集成开发环境中的调试器的作用，向文件或控制台打印代码的调试信息。</p>
		<p>最普通的做法就是在代码中嵌入许多的打印语句，这些打印语句可以输出到控制台或文件中，比较好的做法就是构造一个日志操作类来封装此类操作，而不是让一系列的打印语句充斥了代码的主体。</p>
		<p>
				<a name="1_2">
						<span class="atitle3">1.2. Log4j简介</span>
				</a>
		</p>
		<p>在强调可重用组件开发的今天，除了自己从头到尾开发一个可重用的日志操作类外，Apache为我们提供了一个强有力的日志操作包-Log4j。</p>
		<p>Log4j是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。</p>
		<p>此外，通过Log4j其他语言接口，您可以在C、C++、.Net、PL/SQL程序中使用Log4j，其语法和用法与在Java程序中一样，使得多语言分布式系统得到一个统一一致的日志组件模块。而且，通过使用各种第三方扩展，您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。</p>
		<p>本文介绍的Log4j版本是1.2.3。作者试图通过一个简单的客户/服务器Java程序例子对比使用与不使用Log4j 1.2.3的差别，并详细讲解了在实践中最常使用Log4j的方法和步骤。在强调可重用组件开发的今天，相信Log4j将会给广大的设计开发人员带来方便。加入到Log4j的队伍来吧！</p>
		<p>
				<a name="2">
						<span class="atitle2">2. 一个简单的例子</span>
				</a>
		</p>
		<p>我们先来看一个简单的例子，它是一个用Java实现的客户/服务器网络程序。刚开始我们不使用Log4j，而是使用了一系列的打印语句，然后我们将使用Log4j来实现它的日志功能。这样，大家就可以清楚地比较出前后两个代码的差别。</p>
		<p>
				<a name="2_1">
						<span class="atitle3">2.1. 不使用Log4j</span>
				</a>
		</p>
		<p>
				<b>2.1.1. 客户程序</b>
		</p>
		<code>
				<pre>package log4j ;

import java.io.* ;
import java.net.* ;

/**
 *
 * &lt;p&gt; Client Without Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @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 ) {}
    }
}
</pre>
		</code>
		<p>
				<b>2.1.2. 服务器程序</b>
		</p>
		<code>
				<pre>package log4j ;

import java.util.* ;
import java.io.* ;
import java.net.* ;

/**
 *
 * &lt;p&gt; Server Without Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @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 ) ;
            }
        }
    }
}
</pre>
		</code>
		<p>
				<a name="2_2">
						<span class="atitle3">2.2. 迁移到Log4j</span>
				</a>
		</p>
		<p>
				<b>2.2.1. 客户程序</b>
		</p>
		<code>
				<pre>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 ;

/**
 *
 * &lt;p&gt; Client With Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @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 ) {}
    }
}
</pre>
		</code>
		<p>
				<b>2.2.2. 服务器程序</b>
		</p>
		<code>
				<pre>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 ;

/**
 *
 * &lt;p&gt; Server With Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @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 ) ;
            }
        }
    }
}
</pre>
		</code>
		<p>
				<b>2.2.3. 配置文件</b>
		</p>
		<p>2.2.3.1. 客户程序配置文件</p>
		<code>
				<pre>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
</pre>
		</code>
		<p>2.2.3.2. 服务器程序配置文件</p>
		<code>
				<pre>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
</pre>
		</code>
		<p>
				<a name="2_3">
						<span class="atitle3">2.3. 比较</span>
				</a>
		</p>
		<p>比较这两个应用可以看出，采用Log4j进行日志操作的整个过程相当简单明了，与直接使用System.out.println语句进行日志信息输出的方式相比，基本上没有增加代码量，同时能够清楚地理解每一条日志信息的重要程度。通过控制配置文件，我们还可以灵活地修改日志信息的格式，输出目的地等等方面，而单纯依靠System.out.println语句，显然需要做更多的工作。</p>
		<p>下面我们将以前面使用Log4j的应用作为例子，详细讲解使用Log4j的主要步骤。</p>
		<p>
				<a name="3">
						<span class="atitle2">3. Log4j基本使用方法</span>
				</a>
		</p>
		<p>Log4j由三个重要的组件构成：日志信息的优先级，日志信息的输出目的地，日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG，分别用来指定这条日志信息的重要程度；日志信息的输出目的地指定了日志将打印到控制台还是文件中；而输出格式则控制了日志信息的显示内容。</p>
		<p>
				<a name="3_1">
						<span class="atitle3">3.1.定义配置文件</span>
				</a>
		</p>
		<p>其实您也可以完全不使用配置文件，而是在代码中配置Log4j环境。但是，使用配置文件将使您的应用程序更加灵活。</p>
		<p>Log4j支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件（键=值）。下面我们介绍使用Java特性文件做为配置文件的方法：</p>
		<ol class="n01">
				<li>配置根Logger，其语法为：<br /><pre>log4j.rootLogger = [ level ] , appenderName, appenderName, …</pre>其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。<br />appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。<br /></li>
				<li>配置日志信息输出目的地Appender，其语法为<br /><pre>log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN</pre>其中，Log4j提供的appender有以下几种：<br />org.apache.log4j.ConsoleAppender（控制台），<br />org.apache.log4j.FileAppender（文件），<br />org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br />org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br /></li>
				<li>配置日志信息的格式（布局），其语法为：<br /><pre>log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN</pre>其中，Log4j提供的layout有以下几种：<br />org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br /></li>
		</ol>
		<p>
				<a name="3_2">
						<span class="atitle3">3.2.在代码中使用Log4j</span>
				</a>
		</p>
		<p>下面将讲述在程序代码中怎样使用Log4j。</p>
		<p>
				<b>3.2.1.得到记录器</b>
		</p>
		<p>使用Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为：<br /></p>
		<pre>public static Logger getLogger( String name)，</pre>通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如：<br /><pre>static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;</pre><p><b>3.2.2.读取配置文件</b></p><p>当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：<br />BasicConfigurator.configure ()： 自动快速地使用缺省Log4j环境。<br />PropertyConfigurator.configure ( String configFilename) ：读取使用Java的特性文件编写的配置文件。<br />DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。</p><p><b>3.2.3.插入记录信息（格式化日志信息）</b></p><p>当上两个必要步骤执行完毕，您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：</p><pre>Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
</pre><p><a name="resources"><span class="atitle2">4. 参考资料</span></a></p><p>如果您想更深入地了解Log4j，请经常访问下面提及的相关链接。<br />Log4j项目主页------------------------------------------------------<a href="http://www.log4j.org/"><font color="#003399">http://www.log4j.org/</font></a><br />Log4j FAQ -------------------------------------------------------<a href="http://www-900.ibm.com/developerWorks/cn/java/l-log4j/www.log4j.org/log4j/faq.html"><font color="#003399">http://www-900.ibm.com/developerWorks/cn/java/l-log4j/www.log4j.org/log4j/faq.html</font></a></p><!-- AUTHOR BIOS--><!-- Make author heading singular or plural as needed--><img src ="http://www.blogjava.net/yaominxi/aggbug/39351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:38 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Webwork 和 spring 的整合</title><link>http://www.blogjava.net/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.blogjava.net/yaominxi/archive/2006/04/05/39349.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39349.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39349.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39349.html</trackback:ping><description><![CDATA[
		<div id="content3">
				<h1> </h1>
		</div>
		<div id="newscontent">
				<p>
				</p>
				<p>
						<br />1 适合读者<br />本文针对有一定的web基础，webwork基础，对spring有一定的了解。</p>
				<p>
						<a href="http://www.springframework.org/">
								<font color="#003399">http://www.springframework.org/</font>
						</a>  站点可以了解更多关于spring的详细信息. Spring是一个很好的AOP框架，能提供自动的事务管理。</p>
				<p>
						<a href="http://www.opensymphony.com/webwork/">
								<font color="#003399">http://www.opensymphony.com/webwork/</font>
						</a>站点可以了解更多的webwork . Webwork是一个很好的 MVC 框架，以下简单介绍，webwork 和 spring 的融合，以用户注册为例。</p>
				<p>2 整合步骤<br />2 .1使用 SpringObjectFactory<br />dev.java.net上的 xwork-optional 包括了对 xwork-spring 的支持，可以下载些包。包中只有4个类，可以根据具体情况使用。我在例子中使用了SpringObjectFactory类和SpringObjectFactoryListener 类，并安照webwork的文件在web.xml加入了，以下节点</p>
				<p>&lt;!-- This needs to be after Spring ContextLoaderListener --&gt;</p>
				<p>&lt;listener&gt;</p>
				<p>  &lt;listener-class&gt;com.opensymphony.xwork.spring.SpringObjectFactoryListener&lt;/listener-class&gt;</p>
				<p>&lt;/listener&gt;</p>
				<p>但在实际工作中不能使用，回为在SpringObjectFactoryListener类中写的，加载些类必须要先加载org.springframework.web.context.ContextLoaderListener类，由于些类在web.xml配置如下，后于listener的执行。</p>
				<p>&lt;servlet&gt;</p>
				<p>                   &lt;servlet-name&gt;spring&lt;/servlet-name&gt;</p>
				<p>                   &lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;</p>
				<p>                   &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;</p>
				<p>          &lt;/servlet&gt;</p>
				<p>ContextLoaderServlet 的作用是加载 spring配置信息（在int方法中），SpringObjectFactoryListener 的作用是设置 XWork 和 Webwork 的环境，使这能从spring 中加载数据和信息（在contextInitialized(ServletContextEvent event)方法中，当启动web应用程序是调用）.</p>
				<p>要使ContextLoaderServlet比SpringObjectFactoryListener类更早执行，我使用的方法是重载ContextLoaderServlet，在中子类的int方法中设置XWork 和 Webwork 的环境，去掉SpringObjectFactoryListener 监听器，并整改web.xml中的spring配置，如下：</p>
				<p>&lt;servlet&gt;</p>
				<p>                   &lt;servlet-name&gt;spring&lt;/servlet-name&gt;</p>
				<p>                   &lt;servlet-class&gt;spring.server.ContextLoaderServletServer&lt;/servlet-class&gt;</p>
				<p>                   &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;</p>
				<p>          &lt;/servlet&gt;</p>
				<p>2 .2 配置webwork<br />在webwork.xml中增加如下节点</p>
				<p>&lt;action name="registerSupport-spring" class="registerSupportBean" &gt;</p>
				<p>                            &lt;result name="success" type="dispatcher"&gt;</p>
				<p>                                      &lt;param name="location"&gt;/register-result.jsp&lt;/param&gt;</p>
				<p>                            &lt;/result&gt;</p>
				<p>                            &lt;result name="input" type="dispatcher"&gt;</p>
				<p>                                      &lt;param name="location"&gt;/registerSupport.jsp&lt;/param&gt;</p>
				<p>           &lt;/result&gt;</p>
				<p>           &lt;interceptor-ref name="validationWorkflowStack"/&gt;</p>
				<p>       &lt;/action&gt;</p>
				<p>其中的registerSupportBean在spring中配置</p>
				<p>2 .3 配置spring<br />在spring中加入action 配置如下</p>
				<p>&lt;!-- action --&gt;</p>
				<p>          &lt;bean name="registerSupportBean" class="spring.action.RegisterActionSupport" </p>
				<p>                   singleton="false" &gt;</p>
				<p>                   &lt;property name="userBean"&gt;</p>
				<p>                            &lt;ref bean="userBean"/&gt;</p>
				<p>                   &lt;/property&gt;</p>
				<p>          &lt;/bean&gt;</p>
				<p>些处的registerSupportBean 即为在webwork中要调用的类名。 <br /></p>Copyright 2003-2005 www.sohozu.com All Rights Reserved </div>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:35 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Myeclipse快速开发struts应用程序 </title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39344.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39344.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39344.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39344.html</trackback:ping><description><![CDATA[开发环境：<br />　　jdk5.0<br />　　eclipse3.1M7 (观众问：为啥还在用eclipse3.1M7呢？答曰：没办法，偶奶奶家还是拨号上网。^*^)<br />　　myeclipse3.84<br />　　tomcat5.0.28<br />　　<br />　　简介：<br />　　文本主要介绍用myeclipse的struts designer（图形化开发环境）开发一个简单的用户登录程序片段。<br />　　主要包括2个jsp文件、一个ActionForm、一个Action等其它<br />　　userLogin.jsp(用户登录及错误提示页面) userLoginSuccess.jsp(提示登录成功页面)<br />　　UserLoginForm.java(ActionForm,存放用户提交信息)<br />　　UserLoginAction.java(Action,简单的处理用户登录事件)<br />　　<br />　　开始吧<br />　　首先我们先建立一个j2ee的web project.如图1:<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.35.42.1.gif" /></center><br />　　点击next,Project name输入LoginDemo,其余保持默认,点击finish.<br />　　在package explorer下,就可以看到我们的项目了,然后给这个项目添加Struts框架必要的文件.在我们项目名上点击右键,选择MyEclipes --&gt; Add Struts Capabilities...弹出对话框图2：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.35.58.2.gif" /></center><br />　　其中Struts config path就是我们的struts配置文件，URL pattern我们选择*.do，Default application resource为我们默认的资源文件地方，你可以选择它的存储位置，我们在这里保持默认。点击Finish后，项目结构类似于图3：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.36.15.3.jpg" /></center><br />　　现在就来开始我们的例子吧。首先修改/WEB-INF/web.xml文件,为其添加标签库(在使用中发现，不添加也能成功。但为了保持书上一致，还是添加安全些。hoho~~)将下面代码添加至 &lt;/webapp&gt; 上面：<br />　　<br />　　&lt;taglib&gt;<br />　　&lt;taglib-uri&gt;/tags/struts-html&lt;/taglib-uri&gt;<br />　　&lt;taglib-location&gt;/WEB-INF/struts-html.tld&lt;/taglib-location&gt;<br />　　&lt;/taglib&gt;<br />　　<br />　　&lt;taglib&gt;<br />　　&lt;taglib-uri&gt;/tags/struts-bean&lt;/taglib-uri&gt;<br />　　&lt;taglib-location&gt;/WEB-INF/struts-bean.tld&lt;/taglib-location&gt;<br />　　&lt;/taglib&gt;<br />　　<br />　　&lt;taglib&gt;<br />　　&lt;taglib-uri&gt;/tags/struts-logic&lt;/taglib-uri&gt;<br />　　&lt;taglib-location&gt;/WEB-INF/struts-logic.tld&lt;/taglib-location&gt;<br />　　&lt;/taglib&gt;<br />　　完成后，打开struts-config.xml文件，点击这个界面左下角的Design进入可视化设计界面。有没有注意右边的Palette :) 点击它，让我们来开始我们的jsp页面设计。我们先建立userLoginSuccess.jsp文件，为啥先建这一个呢？等下就知道了，在myeclipse中可以一次性把我们的Action,ActionForm,Jsp文件一次建好（将三个有关联的文件等下创建）。<br />　　点击Palette面版上的创建JSP文件图标,弹出创建JSP文件面板。图4：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.36.29.4.gif" /></center><br />　　在File Name里输入userLoginSuccess.jsp，Template to use选择2] Standard JSP using Struts 1.1,点击Finish完成。<br />　　完成后，struts-config.xml文件自动被更新，可视化界在上也出现了刚新建的JSP模块。新建的jsp文件也被打开了。<br />　　覆盖所有的&lt;%@ taglib ...... 为我们开始在/WEB-INF/web.xml中定义的：<br />　　<br />　　&lt;%@ taglib uri="/tags/struts-html" prefix="html"%&gt;<br />　　&lt;%@ taglib uri="/tags/struts-bean" prefix="bean"%&gt;<br />　　&lt;%@ taglib uri="/tags/struts-logic" prefix="logic"%&gt;<br />　　<br />　　然后在&lt;body&gt;&lt;/body&gt;中添加:<br />　　Hello &lt;bean:write name="userName" scope="request" /&gt; .<br />　　这里将request中的属性userName输出在页面上，所以等下我们在UserLoginAction中，登录成功后要设置一个相关属性。<br />　　<br />　　OK,下面来开始我们最后三个文件的设计吧。在Struts-config.xml的Design模式中，在画版的空白区域点右键，选择New --&gt; New Form, Action and JSP 弹出ActionForm的选项面板，我们按图上输入相关值，图5：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.36.45.5.gif" /></center><br />　　在Optional Details的Form Properties选项卡，点add为这个ActionForm添加相关值，在这个登录示例中，将添加两个属性userName和password，图6：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.37.1.6.jpg" /></center><br />　　在添加password时，注意将JSP input type 下拉框选择password.<br />　　完成这步后，我们就将ActionForm设计完成。<br />　　接下来选择 Optional Details的JSP选项卡,我们选中Create JSP form? 这一步myeclipse将为我们创建一个简单的与用户交互的登录页面。保持内容和图7一样。图7：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.37.14.7.gif" /></center><br />　　因为我们这只是简单的演示一个登录片段，所以不用验证用户信息是否合法，所以将 Option Details的method选项卡的新建方法去掉，如图8：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.37.31.8.gif" /></center><br />　　点Next，进入Action选项面板.将Option Details的Form选项卡中Validate Form取消选择，如图9：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.37.50.9.gif" /></center><br />　　然后在Forwards选项卡中点add添加成功和失败返回的页面.如图10：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.38.4.10.jpg" /></center><br />　　点击Finish完成。在Struts-config.xml的Design中，可以看到图11所示：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.38.18.11.gif" /></center><br />　　最后，简单的修改一下userLogin.jsp,将所有&lt;%@ taglib ...%&gt;替换为：<br />　　&lt;%@ taglib uri="/tags/struts-html" prefix="html"%&gt;<br />　　&lt;%@ taglib uri="/tags/struts-bean" prefix="bean"%&gt;<br />　　修改UserLoginAction中的execute片段为如下所示，图12：<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.38.32.12.gif" /></center><br />　　OK，完成。。。下面就部暑项目，测试。。。<br />　　<br />　　像为项目添加Struts框架一样，在项目名上右击，选择MyEclipse --&gt; Add and Remove Project development.<br />　　在弹出对话框上，单击add ，在弹出的 New Deployment 对话框上，Server选Tomcat5，点击Finish完成部署，如图13:<br />　　 
<center>　<img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.38.48.13.gif" /></center><br />　　在用浏览器上打开：http://127.0.0.1:8080/LoginDemo/userLogin.jsp<br />　　输入密码123456,用户名EricHe。显示成功：<br />　　 
<center><img alt="" src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.39.1.14.jpg" /></center><br />　　如果输错，或不输入，则无反映又回到当前登录页面（因为我们没有设置错误信息）。<br /><br /><img src ="http://www.blogjava.net/yaominxi/aggbug/39344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:32 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式大全 </title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39340.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:24:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39340.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39340.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39340.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39340.html</trackback:ping><description><![CDATA[
		<p>正则表达式用于字符串处理，表单验证等场合，实用高效，但用到时总是不太把握，以致往往要上网查一番。我将一些常用的表达式收藏在这里，作备忘之用。本贴随时会更新。</p>
		<p>
				<font color="#800080">匹配中文字符的正则表达式： [\u4e00-\u9fa5]</font>
		</p>
		<p>
				<font color="#000080">匹配双字节字符(包括汉字在内)：[^\x00-\xff]</font>
		</p>
		<p>
				<font color="#000080">应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）</font>
		</p>
		<p>
				<font color="#000080">String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}</font>
		</p>
		<p>
				<font color="#800080">匹配空行的正则表达式：\n[\s| ]*\r</font>
		</p>
		<p>
				<font color="#000080">匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/</font>
				<font color="#000000">
				</font>
		</p>
		<font color="#000080">
				<p>
						<font color="#800080">匹配首尾空格的正则表达式：(^\s*)|(\s*$)</font>
				</p>
				<p>
						<font color="#800080">应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：</font>
				</p>
		</font>
		<font color="#800080">应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：</font>
		<p>
				<font color="#800080">String.prototype.trim = function()<br />{<br />    return this.replace(/(^\s*)|(\s*$)/g, "");<br />}</font>
		</p>
		<p>
				<font color="#000080">利用正则表达式分解和转换IP地址：</font>
		</p>
		<p>
				<font color="#000080">下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：</font>
		</p>
		<p>
				<font color="#000080">function IP2V(ip)<br />{<br /> re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g  //匹配IP地址的正则表达式<br />if(re.test(ip))<br />{<br />return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br />}<br />else<br />{<br /> throw new Error("Not a valid IP address!")<br />}<br />}</font>
		</p>
		<p>
				<font color="#000080">不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：</font>
		</p>
		<p>
				<font color="#000080">var ip="10.100.20.168"<br />ip=ip.split(".")<br />alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))</font>
		</p>
		<p>
				<font color="#800080">匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*</font>
		</p>
		<p>
				<font color="#000080">匹配网址URL的正则表达式：http://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?</font>
		</p>
		<p>
				<font color="#800080">利用正则表达式去除字串中重复的字符的算法程序：[注：此程序不正确，原因见本贴回复]</font>
		</p>
		<p>
				<font color="#800080">var s="abacabefgeeii"<br />var s1=s.replace(/(.).*\1/g,"$1")<br />var re=new RegExp("["+s1+"]","g")<br />var s2=s.replace(re,"") <br />alert(s1+s2)  //结果为：abcefgi<br /></font>
				<font color="#800080">
						<br />我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法，最终没有找到，这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。</font>
		</p>
		<p>
				<font color="#000080">得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1</font>
		</p>
		<p>
				<font color="#800080">
						<font color="#000080">s="http://www.9499.net/page1.htm"<br />s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")<br />alert(s)</font>
				</font>
		</p>
		<p>
				<font color="#800080">利用正则表达式限制网页表单里的文本框输入内容：</font>
		</p>
		<p>
				<font color="#800080">用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"</font>
		</p>
		<p>
				<font color="#800080">用正则表达式限制只能输入全角字符：</font>
				<font color="#800080"> onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"</font>
		</p>
		<p>
				<font color="#800080">用正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"</font>
		</p>
		<p>
				<font color="#800080">用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"</font>
		</p>
		<p>正则表达式，正规表达式，正则表达式匹配，正则表达式语法，模式匹配，正规表达式匹配 javascript正则表达式 ASP正则表达式 ASP.NET正则表达式 C#正则表达式 JSP正则表达式 PHP正则表达式 VB.NET正则表达式 VBSCript正则表达式编程 delphi正则表达式 jscript <a id="Comments.ascx_CommentList__ctl0_EditLink"></a></p>
		<div id="comments">  
<p>正则表达式 regular expression <br />正则表达式 RegExp <br />模式 pattern <br />匹配 Match <br />.NET命名空间： System.Text.RegularExpression <br /><br /><a id="Comments.ascx_CommentList__ctl1_EditLink"></a></p>  
<p>补充： <br />^\d+$　　//匹配非负整数（正整数 + 0） <br />^[0-9]*[1-9][0-9]*$　　//匹配正整数 <br />^((-\d+)|(0+))$　　//匹配非正整数（负整数 + 0） <br />^-[0-9]*[1-9][0-9]*$　　//匹配负整数 <br />^-?\d+$　　　　//匹配整数 <br />^\d+(\.\d+)?$　　//匹配非负浮点数（正浮点数 + 0） <br />^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$　　//匹配正浮点数 <br />^((-\d+(\.\d+)?)|(0+(\.0+)?))$　　//匹配非正浮点数（负浮点数 + 0） <br />^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$　　//匹配负浮点数 <br />^(-?\d+)(\.\d+)?$　　//匹配浮点数 <br />^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串 <br />^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串 <br />^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串 <br />^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串 <br />^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串 <br />^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$　　　　//匹配email地址 <br />^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$　　//匹配url <a id="Comments.ascx_CommentList__ctl2_EditLink"></a></p>  
<p>利用正则表达式去除字串中重复的字符的算法程序： <br /><br />var s="abacabefgeeii" <br />var s1=s.replace(/(.).*\1/g,"$1") <br />var re=new RegExp("["+s1+"]","g") <br />var s2=s.replace(re,"") <br />alert(s1+s2) //结果为：abcefgi <br />=============================== <br />如果var s = "abacabefggeeii" <br />结果就不对了，结果为：abeicfgg <br />正则表达式的能力有限 <a id="Comments.ascx_CommentList__ctl3_EditLink"></a></p><p>RE: totoro <br />谢谢你的指点，这个javascript正则表达式程序算法确实有问题，我会试着找更好的办法!!! <a id="Comments.ascx_CommentList__ctl4_EditLink"></a></p><p>1.确认有效电子邮件格式 <br />下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址，则 IsValidEmail 方法返回 true，否则返回 false，但不采取其他任何操作。您可以使用 IsValidEmail，在应用程序将地址存储在数据库中或显示在 ASP.NET 页中之前，筛选出包含无效字符的电子邮件地址。 <br /><br />[Visual Basic] <br />Function IsValidEmail(strIn As String) As Boolean <br />' Return true if strIn is in valid e-mail format. <br />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})(\]?)$") <br />End Function <br />[C#] <br />bool IsValidEmail(string strIn) <br />{ <br />// Return true if strIn is in valid e-mail format. <br />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})(\]?)$"); <br />} <br /><br /><br />2.清理输入字符串 <br />下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法，清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-（连字符）和 .（句点）以外的所有非字母数字字符后返回一个字符串。 <br /><br />[Visual Basic] <br />Function CleanInput(strIn As String) As String <br />' Replace invalid characters with empty strings. <br />Return Regex.Replace(strIn, "[^\w\.@-]", "") <br />End Function <br />[C#] <br />String CleanInput(string strIn) <br />{ <br />// Replace invalid characters with empty strings. <br />return Regex.Replace(strIn, @"[^\w\.@-]", ""); <br />} <br /><br /><br />3.更改日期格式 <br />以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。 <br /><br />[Visual Basic] <br />Function MDYToDMY(input As String) As String <br />Return Regex.Replace(input, _ <br />"\b(?&lt;month&gt;\d{1,2})/(?&lt;day&gt;\d{1,2})/(?&lt;year&gt;\d{2,4})\b", _ <br />"${day}-${month}-${year}") <br />End Function <br />[C#] <br />String MDYToDMY(String input) <br />{ <br />return Regex.Replace(input, <br />"\\b(?&lt;month&gt;\\d{1,2})/(?&lt;day&gt;\\d{1,2})/(?&lt;year&gt;\\d{2,4})\\b", <br />"${day}-${month}-${year}"); <br />} <br />Regex 替换模式 <br />本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中，替换表达式 ${day} 插入由 (?&lt;day&gt;...) 组捕获的子字符串。 <br /><br />有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象，而 Regex.Replace 函数正是其中之一。如果您不想保留编译的正则表达式，这将给您带来方便 <br /><br /><br />4.提取 URL 信息 <br />以下代码示例使用 Match.Result 来从 URL 提取协议和端口号。例如，“http://www.contoso.com:8080/letters/readme.html”将返回“http:8080”。 <br /><br />[Visual Basic] <br />Function Extension(url As String) As String <br />Dim r As New Regex("^(?&lt;proto&gt;\w+)://[^/]+?(?&lt;port&gt;:\d+)?/", _ <br />RegexOptions.Compiled) <br />Return r.Match(url).Result("${proto}${port}") <br />End Function <br />[C#] <br />String Extension(String url) <br />{ <br />Regex r = new Regex(@"^(?&lt;proto&gt;\w+)://[^/]+?(?&lt;port&gt;:\d+)?/", <br />RegexOptions.Compiled); <br />return r.Match(url).Result("${proto}${port}"); <br />} </p><div class="postText"><h2><a name="reconordinarycharacters"></a><font size="3">普通字符</font></h2><p>普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。 </p><p>最简单的正则表达式是一个单独的普通字符，可以匹配所搜索字符串中的该字符本身。例如，单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有一些单字符正则表达式模式的示例：</p><pre><code>/a/ /7/ /M/</code></pre><p>等价的 VBScript 单字符正则表达式为：</p><pre><code>"a" "7" "M"</code></pre><p>可以将多个单字符组合在一起得到一个较大的表达式。例如，下面的 JScript 正则表达式不是别的，就是通过组合单字符表达式 'a'、'7'以及 'M' 所创建出来的一个表达式。 </p><pre><code>/a7M/</code></pre><p>等价的 VBScript 表达式为：</p><pre><code>"a7M"</code></pre><p>请注意这里没有连接操作符。所需要做的就是将一个字符放在了另一个字符后面。</p><h2><a name="reconspecialcharacters"></a><font size="3">特殊字符</font></h2><p>有不少元字符在试图对其进行匹配时需要进行特殊的处理。要匹配这些特殊字符，必须首先将这些字符转义，也就是在前面使用一个反斜杠 (\)。下表给出了这些特殊字符及其含义：</p><p></p><table cellspacing="0" cols="2" rules="all" border="1" frame="box"><tbody><tr valign="top"><th width="16%">特殊字符</th><th width="84%">说明</th></tr><tr valign="top"><td width="16%">$</td><td width="84%">匹配输入字符串的结尾位置。如果设置了 <strong>RegExp</strong> 对象的 <strong>Multiline</strong> 属性，则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身，请使用 \$。</td></tr><tr valign="top"><td width="16%">( )</td><td width="84%">标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 \( 和 \)。</td></tr><tr valign="top"><td width="16%"><strong>*</strong></td><td width="84%">匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 \*。</td></tr><tr valign="top"><td width="16%"><strong>+</strong></td><td width="84%">匹配前面的子表达式一次或多次。要匹配 + 字符，请使用 \+。</td></tr><tr valign="top"><td width="16%"><strong>.</strong></td><td width="84%">匹配除换行符 \n之外的任何单字符。要匹配 .，请使用 \。</td></tr><tr valign="top"><td width="16%">[ </td><td width="84%">标记一个中括号表达式的开始。要匹配 [，请使用 \[。 </td></tr><tr valign="top"><td width="16%">?</td><td width="84%">匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 \?。</td></tr><tr valign="top"><td width="16%">\</td><td width="84%">将下一个字符标记为或特殊字符、或原义字符、或后向引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\"，而 '\(' 则匹配 "("。</td></tr><tr valign="top"><td width="16%">^</td><td width="84%">匹配输入字符串的开始位置，除非在方括号表达式中使用，此时它表示不接受该字符集合。要匹配 ^ 字符本身，请使用 \^。</td></tr><tr valign="top"><td width="16%">{</td><td width="84%">标记限定符表达式的开始。要匹配 {，请使用 \{。</td></tr><tr valign="top"><td width="16%">|</td><td width="84%">指明两项之间的一个选择。要匹配 |，请使用 \|。</td></tr></tbody></table><br /><!--Copyright_START--><h2><a name="reconnon"></a><font size="3">非打印字符</font></h2><p>有不少很有用的非打印字符，偶尔必须使用。下表显示了用来表示这些非打印字符的转义序列：</p><p></p><table cellspacing="0" cols="2" rules="all" border="1" frame="box"><tbody><tr valign="top"><th width="16%">字符</th><th width="84%">含义</th></tr><tr valign="top"><td width="16%">\c<em>x</em></td><td width="84%">匹配由<em>x</em>指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 <em>x</em> 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</td></tr><tr valign="top"><td width="16%">\f</td><td width="84%">匹配一个换页符。等价于 \x0c 和 \cL。</td></tr><tr valign="top"><td width="16%">\n</td><td width="84%">匹配一个换行符。等价于 \x0a 和 \cJ。</td></tr><tr valign="top"><td width="16%">\r</td><td width="84%">匹配一个回车符。等价于 \x0d 和 \cM。</td></tr><tr valign="top"><td width="16%">\s</td><td width="84%">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</td></tr><tr valign="top"><td width="16%">\S</td><td width="84%">匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</td></tr><tr valign="top"><td width="16%">\t</td><td width="84%">匹配一个制表符。等价于 \x09 和 \cI。</td></tr><tr valign="top"><td width="16%">\v</td><td width="84%">匹配一个垂直制表符。等价于 \x0b 和 \cK。</td></tr></tbody></table><br /><!--Copyright_START--><h2>字符匹配</h2><p>句点 (.) 匹配一个字符串中任何单个的打印或非打印字符，除了换行符 (\n) 之外。下面的 JScript 正则表达式可以匹配 'aac'、'abc'、'acc'、'adc'如此等等，同样也可以匹配 'a1c'、'a2c'、a-c'以及 a#c'： </p><pre><code>/a.c/</code></pre><p>等价的 VBScript 正则表达式为：</p><pre><code>"a.c"</code></pre><p>如果试图匹配一个包含文件名的字符串，其中句点 (.) 是输入字符串的一部分，则可以在正则表达式中的句点前面加上一个反斜杠 (\) 字符来实现这一要求。举例来说，下面的 JScript 正则表达式就能匹配 'filename.ext'：</p><pre><code>/filename\.ext/</code></pre><p>对 VBScript 而言，等价的表达式如下所示：</p><pre><code>"filename\.ext"</code></pre><p>这些表达式仍然是相当有限的。它们只允许匹配<em>任何</em>单字符。很多情况下，对从列表中匹配特殊字符十分有用。例如，如果输入文字中包含用数字表示为Chapter 1, Chapter 2诸如此类的章节标题，你可能需要找到这些章节标题。 </p><h3>括号表达式</h3><p>可以在一个方括号 ([ 和 ]) 中放入一个或多个单字符，来创建一个待匹配的列表。如果字符被放入括号中括起来，则该列表称为<em>括号表达式</em>。括号内和其他任何地方一样，普通字符代表其本身，也就是说，它们匹配输入文字中出现的一处自己。大多数特殊字符在位于括号表达式中时都将失去其含义。这里有一些例外： </p><ul type="disc"><li>']' 字符如果不是第一项，则将结束一个列表。要在列表中匹配 ']' 字符，请将其放在第一项，紧跟在开始的 '[' 后面。 
</li><li>'\' 仍然作为转义符。要匹配 '\' 字符，请使用 '\\'。 </li></ul><p>括号表达式中所包含的字符只匹配该括号表达式在正则表达式中所处位置的一个单字符。下面的 JScript 正则表达式可以匹配 'Chapter 1'、'Chapter 2'、'Chapter 3'、'Chapter 4' 以及 'Chapter 5'：</p><pre><code>/Chapter [12345]/</code></pre><p>在 VBScript 中要匹配同样的章节标题，请使用下面的表达式：</p><pre><code>"Chapter [12345]"</code></pre><p>请注意单词 'Chapter' 及后面的空格与括号内的字符的位置关系是固定的。因此，括号表达式只用来指定满足紧跟在单词 'Chapter' 和一个空格之后的单字符位置的字符集合。这里是第九个字符位置。</p><p>如果希望使用范围而不是字符本身来表示待匹配的字符，则可以使用连字符将该范围的开始和结束字符分开。每个字符的字符值将决定其在一个范围内的相对顺序。下面的 JScript 正则表达式包含了一个等价于上面所示的括号列表的范围表达式。</p><pre><code>/Chapter [1-5]/</code></pre><p>VBScipt 中相同功能的表达式如下所示：</p><pre><code>"Chapter [1-5]"</code></pre><p>如果以这种方式指定范围，则开始和结束值都包括在该范围内。有一点特别需要注意的是，在 Unicode 排序中起始值一定要在结束值之前。</p><p>如果想在括号表达式中包括连字符，则必须使用下述方法之一： </p><ul type="disc"><li>使用反斜杠将其转义： <pre><code>[\-]</code></pre></li><li>将连字符放在括号列表的开始和结束位置。下面的表达式能匹配所有的小写字母和连字符： <pre><code>[-a-z] [a-z-]</code></pre></li><li>创建一个范围，其中开始字符的值小于连字符，而结束字符的值等于或大于连字符。下面两个正则表达式都满足这一要求： <pre><code>[!--] [!-~]</code></pre></li></ul><p>同样，通过在列表开始处放置一个插入符(^)，就可以查找所有不在列表或范围中的字符。如果该插入符出现在列表的其他位置，则匹配其本身，没有任何特殊含义。下面的 JScript 正则表达式匹配章节号大于 5 的章节标题：</p><pre><code>/Chapter [^12345]/</code></pre><p>对 VBScript 则使用：</p><pre><code>"Chapter [^12345]"</code></pre><p>在上面所示的示例中，表达式将匹配第九个位置处除1, 2, 3, 4, or 5 之外的任何数字字符。因此， 'Chapter 7' 为一个匹配，同样 'Chapter 9' 也是如此。 </p><p>上面的表达式可以使用连字符 (-) 表示。对 JScript 为：</p><pre><code>/Chapter [^1-5]/</code></pre><p>或者，对 VBScript 为：</p><pre><code>"Chapter [^1-5]"</code></pre><p>括号表达式的典型用法是指定对任何大写或小写字母字符或任何数字的匹配。下面的 JScript 表达式给出了这一匹配：</p><pre><code>/[A-Za-z0-9]/</code></pre><p>等价的 VBScript 表达式为：</p><pre><code>"[A-Za-z0-9]"</code></pre><!--Copyright_START--></div></div>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:24 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse+struts+Hibernate配置开发 </title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39339.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39339.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39339.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39339.html</trackback:ping><description><![CDATA[　这个手册只是为初学者制作的环境配置和快速开发的一些基本方法，为的是广大爱好者能快速上手，少走我走过的弯路，里面没有任何关于java模式和其他相关的说明。本人水平有限，也没有能力去讨论关于模式设计和开发细节的一些内容。 
<p></p><p></p><p>　　建议：<br /><br />　　如果你还不清楚struts和hibernate的一些基本原理，希望能先去了解一下这方面的相关内容。</p><p>　　推荐：<br /><br />　　Hibernate中文手册》作者认为要学Hibernate看这个就足够了，里面几乎包括了所有的细节，不过可能不太适合快速入门。<br /><br />　　地址：<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/</a><br /><br />　　关于struts的资料就很多了，这里推荐一个可以下载一些入门教程的网站。<br /><br />　　地址：<a href="http://www.wnetw.com/jclub/index.jsp">http://www.wnetw.com/jclub/index.jsp</a><br /><br />　　强烈建议入门的朋友先了解一下基本的原理！否则本文可能对你没有任何帮助。</p><p>　　相关工具下载：（注意版本）<br /><br />　　mysql5.0 <a href="http://www.mysql.org/">http://www.mysql.org/</a><br />　　eclipse 3.1.1 <a href="http://www.eclipse.org/" target="_blank">http://www.eclipse.org/</a><br />　　myeclipse4.0.3 <a href="http://www.myeclipseide.com/">http://www.myeclipseide.com/</a><br />　　tomcat5.5</p><p>　　安装：<br /><br />　　关于tomcat和mysql的安装就不多说了，需要注意的是最好保证你的 jdk是1.5的版本，并配置好你的环境变量，不然可能会遇到一些问题。<br /><br />　　把eclipse解开，再去安装刚下载的myeclipse，在安装的时候需要把路径指定到刚才解开的eclipse上，由于myeclipse是个收费软件，所以需要注册。不过一般按照Chinese的习惯，去google一个注册码就可以了:}</p><p>　　开发环境部署：<br /><br />　　好了，现在保证你的mysql和tomcat服务能够正常启动，myeclipse能够正常打开（如果不能，可以去找一下相关的说明或者给作者留言）。下面我们就要开始真正的开始部署一个传说中的tomcat+struts+hibernate+mysql结构的工程了！（faint!前言就写的我好累）<br /><br />　　首先，在myeclipse里新建一个工程。在左边的Package Exporler面版里点右键选择new-&gt;project… <br /><br />　　在跳出菜单里选择MyEclipse-&gt;J2EE Projects-&gt;Web Project。<br /><br />　　点击next后进入如下画面：</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/3dv4s4cjwa2l.cn/pic/3fa10d830200006m" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/1.JPG" target="_blank"></a></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/1.JPG" target="_blank"></a></p><p><br />　　工程名为：test<br /><br />　　结束后点击Finish。<br /><br />　　好了，如果成功的话你就会在 Package Exporler里看到一个新的test工程！现在我们先配置一下数据库方面的东西。首先在你的mysql 里建立一个数据库webases，再在里面新建一个表admin，里面三个字段分别为id,<a class="bluekey" href="http://www.yesky.com/key/99/160099.html" target="_blank">name</a>,password其中id为自动取值的主键（mysql具体的操作可以自己找资料，不是本文涉及范围）。<br /><br />　　再回到myeclipse ，选中window-&gt;Open Perspective-&gt;Other…<br /><br />　　可以看到现在跳出一个名为Select Perspective的菜单，在里面选中MyEclipse Databases Exporler，可以看到现在到了下面的页面。</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/2s5d31zdm346.cn/pic/3fa10d830200006n" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/2.JPG" target="_blank"></a></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/2.JPG" target="_blank"></a></p><p>　　按以上图示输入相关字段后点击Finish便建立了一个数据库连接，在新出现的JDBC for Mysql上点右键，选择Open connection…，确认用户名和密码正确后点OK，如果一切顺利的话你会看到下面的画面： </p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/0g601v5hykhy.cn/pic/3fa10d830200006o" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/3.JPG" target="_blank"></a></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/3.JPG" target="_blank"></a></p><p>　　这说明你已经和数据库建立了正确的连接。现在我们再回到window-&gt;Open Perspective- &gt;Other…里的MyEclipse，也就是我们刚进来的时候看到的画面。<br /><br />　　右键点击你刚建立的工程 test并选择MyEclipse-&gt;Add struts Capabilities…在跳出的菜单里按照如下输入并确定：</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/r8rfzry4u70v.cn/pic/3fa10d830200006p" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/4.JPG" target="_blank"></a></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/4.JPG" target="_blank"></a></p><p>　　好了，现在你已经为你的工程增加了struts，接下来和上面一样在右键工程后选择MyEclipse- &gt;Add Hibernate Capabilities…一路确定下来为你的工程添加Hibernate。（为方便起见我们在选择路径时把HibernateSessionFactory.java放在了src/com下面，其实最好建立个单独的目录如 src/com/hibernate）<br /><br />　　为了更好的演示我们不建立通常的登陆页面而是建立个注册页面。选择 src目录下的hibernate.cfg.xml文件。照如下填写并保存。这样hibernate就为你建立了数据库的连接池。</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/w9r22908kj35.cn/pic/3fa10d830200006q" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/5.JPG" target="_blank"></a></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/5.JPG" target="_blank"></a></p><p>　　下面我们再选择WebRoot/WEB-INF/struts-config.xml文件，在画面中点击右键选择new- &gt;Form, Action and JSP。如下填写</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/w0cu77s737rz.cn/pic/3fa10d830200006r" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/6.JPG" target="_blank"></a></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/6.JPG" target="_blank"></a><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/5.JPG" target="_blank"></a></p><p>　　再选择JSP选项，如下</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/1x6mi889p265.cn/pic/3fa10d830200006s" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/7.JPG" target="_blank"></a></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/7.JPG" target="_blank"></a><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/6.JPG" target="_blank"></a></p><p>　　最后选择Finish。<br /><br />　　再新建一个一个success.jsp的页面，<br /><br />　　在刚才struts- config.xml文件里右键<a class="bluekey" href="http://www.yesky.com/key/1712/156712.html" target="_blank">选择a</a>ddAdmin选择Properties，在菜单里选择Forwords，再点add，如下图填写 </p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/55rct6wh32c3.cn/pic/3fa10d830200006t" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/8.JPG" target="_blank"></a></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/8.JPG" target="_blank"></a><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/7.JPG" target="_blank"></a></p><p>　　最后你的struts-config.xml就是下面这个样子：</p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/9.JPG" target="_blank"></a><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/8.JPG" target="_blank"></a></p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/17nf5q9p44y5.cn/pic/3fa10d830200006u" /></p><p><br />　　下面我们转到hibernate。换到刚才我们建立数据库的页面，选择你的admin的表点右键选择Create Hibernate Mapping。选择好打包路径后选择Finish。如图：</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/k8h07y72ok59.cn/pic/3fa10d830200006v" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/10.JPG" target="_blank"></a></p><p>　　在你刚才选择的路径下（我为方便是src/com/yourcompanyname/）下新建立的文件 AdminDAOFactory.java文件并输入以下内容：</p><p>package com.yourcompanyname;</p><p>import java.util.Iterator;</p><p>import org.hibernate.HibernateException;<br />import org.hibernate.Query;<br />import org.hibernate.Session;<br />import org.hibernate.Transaction;</p><p>import com.hibernate.SessionFactory;</p><p>public class AdminDAOFactory {<br /> Session session;<br /> Transaction tx;<br /> public void add(Admin admin) throws HibernateException {<br />  /**<br />   * Creation Date: 11-17-2005<br />   * TODO Add a new admin user.<br />   * @param An object of Admin<br />   * @return void<br />   * @author Coder Guo<br />   */<br />  try {<br />   session = SessionFactory.currentSession();<br />   tx = session.beginTransaction();<br />   //Add a new admin<br />   session.save(admin);<br />   tx.commit ();<br />  }catch(HibernateException e){<br />   throw e;<br />  }finally{<br />   if (tx!=null) {<br />    tx.rollback();<br />   } <br />   SessionFactory.closeSession();<br />  }<br /> }<br />}</p><p> 再打开com.yourcompany.struts.action下的AddAdminAction.java添加（其中如果有错误选中好按ctrl+shift+o自动添加包）</p><p>public class AddAdminAction extends Action {</p><p> // --------------------------------------------------------- Instance Variables</p><p> // --------------------------------------------------------- Methods</p><p> /** <br />  * Method execute<br />  * @param mapping<br />  * @param form<br />  * @param request<br />  * @param response<br />  * @return ActionForward<br />  * @author Coder Guo<br />  */<br /> public ActionForward execute(<br />  ActionMapping mapping,<br />  ActionForm form,<br />  HttpServletRequest request,<br />  HttpServletResponse response) {<br />  AddAdminForm addAdminForm = (AddAdminForm) form;<br />  <br />  // TODO Add a new admin<br />  Admin admin = new Admin();<br />  admin.setName(addAdminForm.getName ());<br />  admin.setPassword(addAdminForm.getPassword ());<br />  AdminDAOFactory adminDAO = new AdminDAOFactory ();<br />  adminDAO.add(admin);<br />  <br />  return mapping.findForward("success");<br /> }</p><p>}</p><p> 再打开com.yourcompanyname.struts.form下的AddAdminForm.java，修改（如果有错误按照上面说的方法导入包）<br /> public ActionErrors validate(<br />  ActionMapping mapping,<br />  HttpServletRequest request) {</p><p>  // TODO Auto-generated method stub<br />  ActionErrors errors = new ActionErrors();<br />  <br />  Session session = SessionFactory.currentSession();<br />  Transaction tx = session.beginTransaction ();<br />  Query query = session.createQuery("select admin from Admin as admin where admin.name = '" + this.name + "'");<br />  Iterator it = query.iterate ();<br />  if (it.hasNext()){<br />   errors.add ("addAdmin.err.name",new ActionMessage("form.addAdmin.err.name"));<br />  } <br />  tx.commit();<br />  SessionFactory.closeSession ();<br />  return errors;<br /> }</p><p> public void reset(ActionMapping mapping, HttpServletRequest request) {</p><p>  // TODO Auto-generated method stub<br />  this.name=null;<br />  this.password=null;<br /> }</p><p>　　再打开com\yourcompanyname\struts下的ApplicationResource.properties在这里面添加错误信息： <br /><br />Form.addAdmin.err.name=err</p><p>　　最后，（汗，好累啊-_-!）打开addAdmin.jsp修改成如下：<br /><br />&lt;%@ page contentType="text/html; charset=utf-8"%&gt; <br />&lt;%@ page language="java"%&gt;<br />&lt;%@ taglib uri="<a href="http://jakarta.apache.org/struts/tags-bean">http://jakarta.apache.org/struts/tags-bean</a>" prefix="bean"%&gt; <br />&lt;%@ taglib uri="<a href="http://jakarta.apache.org/struts/tags-html">http://jakarta.apache.org/struts/tags-html</a>" prefix="html"%&gt;</p><p>&lt;script language = "javascript"&gt;<br />&lt;!--<br />function <a class="bluekey" href="http://www.yesky.com/key/4908/159908.html" target="_blank">check</a>(){<br /> if (loginForm.userName.value == "" || loginForm.password.value == ""){<br />  alert("请输入完整的信息！");<br />  loginForm.userName.focus();<br />  return false;<br /> }<br />}<br />//--&gt;<br />&lt;/script&gt;<br /> <br /> &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html:html&gt;<br />  &lt;head&gt;<br />    &lt;html:base /&gt;<br />    <br />    &lt;title&gt;login.jsp&lt;/title&gt;<br />    &lt;link href="css/webcss.css" rel="stylesheet" type="text/css"&gt;<br />    <br />    &lt;<a class="bluekey" href="http://www.yesky.com/key/4816/159816.html" target="_blank">meta</a> http-equiv="pragma" content="no- cache"&gt;<br />    &lt;meta http-equiv="cache-control" content="no- cache"&gt;<br />    &lt;meta http-equiv="expires" content="0"&gt;    <br />    &lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br />    &lt;meta http- equiv="description" content="This is my page"&gt;<br />  &lt;/head&gt;<br />  </p><p>  &lt;body&gt;<br />  &lt;center&gt;<br />   &lt;p&gt;&amp;nbsp;&lt;/p&gt;<br />   &lt;p&gt;&amp;nbsp;&lt;/p&gt;<br />   &lt;table width="<a class="bluekey" href="http://www.yesky.com/key/636/160636.html" target="_blank">30</a>0" border="0" cellpadding="0" cellspacing="0"&gt;<br />   &lt;html:form action="/addAdmin" focus="name" method="GET"&gt;<br />     &lt;tr align="center" valign="middle"&gt;<br />       &lt;td colspan="2" class="typt_normal"&gt;新增管理员&lt;/td&gt;<br />     &lt;/tr&gt;<br />     &lt;tr&gt;<br />       &lt;td width="100" align="center" valign="middle" class="typt_normal"&gt;名称： &lt;/td&gt;<br />       &lt;td width="200" align="left"&gt;&lt;html:text property="name" styleClass="text_s"/&gt;&lt;html:errors property="addAdmin.err.name"/&gt;&lt;/td&gt;<br />     &lt;/tr&gt;<br />     &lt;tr&gt;<br />       &lt;td width="100" align="center" valign="middle" class="typt_normal"&gt;密码： &lt;/td&gt;<br />       &lt;td width="200" align="left"&gt;&lt;html:password property="password" styleClass="text_s"/&gt;&lt;/td&gt;<br />     &lt;/tr&gt;<br />     &lt;tr&gt; <br />       &lt;td colspan="2" align="center" valign="middle"&gt;&lt;html:submit value="提交" onclick="return check ();"/&gt;&lt;html:reset value="重置"&gt;&lt;/html:reset&gt;&lt;/td&gt;<br />       &lt;/tr&gt;<br /> &lt;/html:form&gt;<br />   &lt;/table&gt;<br /> &lt;/center&gt;<br /> &lt;/body&gt;</p><p>&lt;/html:html&gt;<br /><br />　　其中可以看到如何在struts的标签中使用javascript的方法。<br /><br />　　配置好myeclipse于tomcat的连接。在window-&gt;Preferences做如下设定：</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/rfe9mz6n6877.cn/pic/3fa10d830200006w" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/11.JPG" target="_blank"></a></p><p>　　在项目文件点右键－&gt;“myeclipse”－&gt;“Add and remove project deployment”，如下图：</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/4el6k0a08339.cn/pic/3fa10d830200006x" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/12.JPG" target="_blank"></a></p><p>　　好了，我们的配置工作基本结束了,在myeclipse上开启tomcat服务</p><p align="center"><img src="http://dev.yesky.com/imagelist/05/12/a597a7j21uhi.cn/pic/3fa10d830200006y" /></p><p><a href="file:///E:/我的文章/MyEclipse+TomCat+struts+Hibernate+Mysql环境配置手册和快速开发实例/pic/13.JPG" target="_blank"></a></p><p>　　现在打开浏览器，输入<br /><br />　　<a href="http://127.0.0.1:8080/test/addAdmin.jsp">http://127.0.0.1:8080/test/addAdmin.jsp</a><b r="">就可以看到你的jsp页面了！</b></p><img src ="http://www.blogjava.net/yaominxi/aggbug/39339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:21 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT学习指南</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39336.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39336.html</trackback:ping><description><![CDATA[
		<table class="chs" cellspacing="3" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<strong>
												<h4>
														<font size="2">内容摘要：</font>
												</h4>
										</strong>
										<font size="2">ANT是一个基于Java的自动化脚本引擎，脚本格式为XML。除了做Java编译相关任务外，ANT还可以通过插件实现很多应用的调用。 1)ANT的基本概念：<br />2)ANT的安装：解包，设置路径<br />3)ANT的使用：最好的学习只不过是一个简单实用的例子起步……</font>
										<p>
												<strong>
														<font size="2">作者：</font>
												</strong>
												<font size="2">
														<a href="mailto:chedong@chedong.com">
																<font color="#002c99">车东</font>
														</a>
														<a href="http://www.chedong.com/tech/default.html">
																<font color="#002c99">http://www.chedong.com/tech/default.html</font>
														</a>
												</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<font size="2">
				<br />
		</font>
		<font color="#002c99">
				<hr width="95%" noshade="" />
		</font>
		<h2>
				<font size="2">ANT的基本概念：Java的Makefile</font>
		</h2>
		<p>
				<font size="2">当一个代码项目大了以后，每次重新编译，打包，测试等都会变得非常复杂而且重复，因此c语言中有make脚本来帮助这些工作的批量完成。在Java中应用是平台无关性的，当然不会用平台相关的make脚本来完成这些批处理任务了，ANT本身就是这样一个流程脚本引擎，用于自动化调用程序完成项目的编译，打包，测试等。除了基于JAVA是平台无关的外，脚本的格式是基于XML的，比make脚本来说还要好维护一些。<br /></font>
		</p>
		<p>
				<font size="2">每个ant脚本（缺省叫build.xml）中设置了一系列任务(target)：比如对于一个一般的项目可能需要有以下任务。</font>
		</p>
		<ul>
				<li>
						<font size="2">任务1：usage 打印本脚本的帮助信息（缺省）</font>
				</li>
				<li>
						<font size="2">任务2：clean &lt;-- init 清空初始化环境</font>
				</li>
				<li>
						<font size="2">任务3：javadoc &lt;-- build &lt;-- init 生成JAVADOC</font>
				</li>
				<li>
						<font size="2">任务4：jar &lt;-- build &lt;-- init 生成JAR</font>
				</li>
				<li>
						<font size="2">任务5：all &lt;-- jar + javadoc &lt;-- build &lt;-- init 完成以上所有任务：jar javadoc</font>
				</li>
		</ul>
		<font size="2">而多个任务之间往往又包含了一定了依赖关系：比如把整个应用打包任务(jar)的这个依赖于编译任务(build)，而编译任务又依赖于整个环境初始化任务(init)等。<br /><br />注：我看到很多项目的ant脚本中的命名基本上都是一致的，比如：编译一般叫build或者compile；打包一般叫jar或war；生成文档一般命名为javadoc或javadocs；执行全部任务all。在每个任务的中，ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富，但其实最常用的就2，3个：比如javac javadoc jar等。</font>
		<h2>
				<font size="2">ANT的安装</font>
		</h2>
		<font size="2">解包后在系统可执行路径中加入指向ant的bin的路径就可以了，比如可以在GNU/Linux上把以下配置加入/etc/profile中：<br />export ANT_HOME=/home/ant<br />export JAVA_HOME=/usr/java/j2sdk1.4.1<br />export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin<br /><br />这样执行ant 后，如果不指定配置文件ant会缺省找build.xml这个配置文件，并根据配置文件执行任务，缺省的任务设置可以指向最常用的任务，比如：build，或指向打印帮助信息：usage，告诉用户有那些脚本选项可以使用。<br /><br /></font>
		<h2>
				<font size="2">ANT的使用</font>
		</h2>
		<div style="TEXT-ALIGN: left">
				<font size="2">最好的学习过程就是看懂那些open source项目中的build.xml脚本，然后根据自己的需要简化成一个更简单的，ANT和APACHE上很多非常工程派的项目：简单易用，而且适应性非常强，因为这些项目的建立往往来源于开发人员日常最直接的需求。<br />以下是的一个<a href="http://sourceforge.net/projects/weblucene/"><font color="#002c99">WebLucene</font></a>应用的例子：修改自<a href="http://www.jdom.org/"><font color="#002c99">JDOM</font></a>的build.xml：<br /><br /></font>
				<table class="c" cellspacing="1" width="90%" bgcolor="#ebebeb" border="1">
						<tbody>
								<tr>
										<td>
												<font size="2">&lt;project default="usage" basedir="."&gt;<br /><br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Initialization target                                               --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="init"&gt;<br />    &lt;tstamp/&gt;<br />    &lt;property file="${basedir}/build.properties" /&gt;<br />    &lt;property name="Name" value="ProjectFullName"/&gt;<br />    &lt;property name="name" value="project_name"/&gt;<br />    &lt;property name="version" value="0.2"/&gt;<br />    &lt;property name="year" value="2003"/&gt;<br /><br />    &lt;echo message="----------- ${Name} ${version} [${year}] ------------"/&gt;<br /><br />    &lt;property name="debug" value="off"/&gt;<br />    &lt;property name="optimize" value="on"/&gt;<br />    &lt;property name="deprecation" value="on"/&gt;<br /><br />    &lt;property name="src.dir" value="./src/WEB-INF/src"/&gt;<br />    &lt;property name="lib.dir" value="./src/WEB-INF/lib"/&gt;<br />    &lt;property name="packages" value="com.chedong.*,org.apache.lucene.*"/&gt;<br /><br />    &lt;property name="build.src" value="./src/WEB-INF/build"/&gt;<br />    &lt;property name="build.dest" value="./src/WEB-INF/classes"/&gt;<br />    &lt;property name="build.javadocs" value="./src/doc"/&gt;<br />   <br />    &lt;path id="classpath"&gt;<br />        &lt;pathelement path="${jsdk_jar}"/&gt;<br />        &lt;fileset dir="${lib.dir}"&gt;<br />           &lt;include name="**/*.jar"/&gt;<br />        &lt;/fileset&gt;<br />    &lt;/path&gt;<br />   <br />    &lt;filter token="year" value="${year}"/&gt;<br />    &lt;filter token="version" value="${version}"/&gt;<br />    &lt;filter token="date" value="${TODAY}"/&gt;<br />    &lt;filter token="log" value="true"/&gt;<br />    &lt;filter token="verbose" value="true"/&gt;<br />  &lt;/target&gt;<br /><br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Help on usage                                                       --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="usage" depends="init"&gt;<br />    &lt;echo message="${Name} Build file"/&gt;<br />    &lt;echo message="-------------------------------------------------------------"/&gt;<br />    &lt;echo message=""/&gt;<br />    &lt;echo message=" available targets are:"/&gt;<br />    &lt;echo message=""/&gt;<br />    &lt;echo message="   jar      --&gt; generates the ${name}.jar file"/&gt;<br />    &lt;echo message="   build    --&gt; compiles the source code"/&gt;<br />    &lt;echo message="   javadoc  --&gt; generates the API documentation"/&gt;<br />    &lt;echo message="   clean    --&gt; cleans up the directory"/&gt;<br />    &lt;echo message=""/&gt;<br />    &lt;echo message=" Please rename build.properties.default to build.properties"/&gt;<br />    &lt;echo message=" and edit build.properties to specify JSDK 2.3 classpath."/&gt;<br />    &lt;echo message=""/&gt;<br />    &lt;echo message=" See the comments inside the build.xml file for more details."/&gt;<br />    &lt;echo message="-------------------------------------------------------------"/&gt;<br />    &lt;echo message=""/&gt;<br />    &lt;echo message=""/&gt;<br />  &lt;/target&gt;<br /><br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Prepares the source code                                            --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="prepare-src" depends="init"&gt;<br />    &lt;!-- create directories --&gt;<br />    &lt;mkdir dir="${build.src}"/&gt;<br />    &lt;mkdir dir="${build.dest}"/&gt;<br />   <br />    &lt;!-- copy src files --&gt;<br />    &lt;copy todir="${build.src}"&gt;<br />      &lt;fileset dir="${src.dir}"/&gt;<br />    &lt;/copy&gt;<br />  &lt;/target&gt;<br /><br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Compiles the source directory                                       --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="build" depends="prepare-src"&gt;<br />    &lt;javac srcdir="${build.src}"<br />           destdir="${build.dest}"<br />           debug="${debug}"<br />           optimize="${optimize}"&gt;<br />      &lt;classpath refid="classpath"/&gt;<br />    &lt;/javac&gt;<br />  &lt;/target&gt;<br /><br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Creates the class package                                           --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="jar" depends="build"&gt;<br />    &lt;jar jarfile="${lib.dir}/${name}.jar"<br />         basedir="${build.dest}"<br />         includes="**"/&gt;<br />  &lt;/target&gt;<br /><br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Creates the API documentation                                       --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="javadoc" depends="build"&gt;<br />    &lt;mkdir dir="${build.javadocs}"/&gt;<br />    &lt;javadoc packagenames="${packages}"<br />             sourcepath="${build.src}"<br />             destdir="${build.javadocs}"<br />             author="true"<br />             version="true"<br />             use="true"<br />             splitindex="true"<br />             windowtitle="${Name} API"<br />             doctitle="${Name}"&gt;<br />      &lt;classpath refid="classpath"/&gt;<br />    &lt;/javadoc&gt;<br />  &lt;/target&gt;<br /><br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Clean targets                                                       --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="clean" depends="init"&gt;<br />    &lt;delete dir="${build.src}"/&gt;<br />    &lt;delete dir="${build.dest}/org"/&gt;<br />    &lt;delete dir="${build.dest}/com"/&gt;<br />    &lt;delete&gt;<br />      &lt;fileset dir="${build.dest}" includes="**/*.class"/&gt;<br />    &lt;/delete&gt;<br />  &lt;/target&gt;<br />&lt;/project&gt;<br />&lt;!-- End of file --&gt;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<font size="2">
								<br />
								<br />缺省任务：usage 打印帮助文档，告诉有那些任务选项：可用的有build, jar, javadoc和clean.<br /><br />初始化环境变量：init<br />所有任务都基于一些基本环境变量的设置初始化完成，是后续其他任务的基础，在环境初始化过程中，有2点比较可以方便设置：<br /><br />1 除了使用却缺省的property设置了JAVA源路径和输出路径外，引用了一个外部的build.properties文件中的设置，<br />&lt;property file="${basedir}/build.properties" /&gt;<br />这样大部分简单配置用户只要会看懂build.properties就可以了，毕竟XML比起key value的属性文件还是要可读性差一些。用build.properties也可以方便其他用户从编译的细节中解放出来。<br /><br />2 CLASSPATH设置：使用了其中的：</font>
				</p>
				<table class="c" cellspacing="1" width="90%" bgcolor="#ebebeb" border="1">
						<tbody>
								<tr>
										<td>
												<font size="2">    &lt;path id="classpath"&gt;<br />        &lt;pathelement path="${jsdk_jar}"/&gt;<br />        &lt;fileset dir="${lib.dir}"&gt;<br />           &lt;include name="**/*.jar"/&gt;<br />        &lt;/fileset&gt;<br />    &lt;/path&gt;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<font size="2">则相当于设置了：CLASSPATH=/path/to/resin/lib/jsdk23.jar;/path/to/project/lib/*.jar;<br /><br />文件复制：prepare-src<br />创建临时SRC存放目录和输出目录。</font>
				</p>
				<table class="c" cellspacing="1" width="90%" bgcolor="#ebebeb" border="1">
						<tbody>
								<tr>
										<td>
												<font size="2">&lt;!-- =================================================================== --&gt;<br />  &lt;!-- Prepares the source code                                            --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="prepare-src" depends="init"&gt;<br />    &lt;!-- create directories --&gt;<br />    &lt;mkdir dir="${build.src}"/&gt;<br />    &lt;mkdir dir="${build.dest}"/&gt;<br />   <br />    &lt;!-- copy src files --&gt;<br />    &lt;copy todir="${build.src}"&gt;<br />      &lt;fileset dir="${src.dir}"/&gt;<br />    &lt;/copy&gt;<br />  &lt;/target&gt;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<font size="2">编译任务：build<br />编译时的CLASSPATH环境通过一下方式找到引用一个path对象</font>
				</p>
				<table class="en" cellspacing="1" width="90%" bgcolor="#ebebeb" border="1">
						<tbody>
								<tr>
										<td class="c">
												<font size="2">&lt;classpath refid="classpath"/&gt;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<font size="2">打包任务：jar<br />对应用打包生成项目所写名的.jar文件</font>
				</p>
				<table class="c" cellspacing="1" width="90%" bgcolor="#ebebeb" border="1">
						<tbody>
								<tr>
										<td>
												<font size="2">
														<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Creates the class package                                           --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="jar" depends="build"&gt;<br />    &lt;jar jarfile="${lib.dir}/${name}.jar"<br />         basedir="${build.dest}"<br />         includes="**"/&gt;<br />  &lt;/target&gt;<br /><br />生成JAVADOC文档任务: javadoc<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Creates the API documentation                                       --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="javadoc" depends="build"&gt;<br />    &lt;mkdir dir="${build.javadocs}"/&gt;<br />    &lt;javadoc packagenames="${packages}"<br />             sourcepath="${build.src}"<br />             destdir="${build.javadocs}"<br />             author="true"<br />             version="true"<br />             use="true"<br />             splitindex="true"<br />             windowtitle="${Name} API"<br />             doctitle="${Name}"&gt;<br />      &lt;classpath refid="classpath"/&gt;<br />    &lt;/javadoc&gt;<br />  &lt;/target&gt;<br /><br />清空临时编译文件：clean<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;!-- Clean targets                                                       --&gt;<br />  &lt;!-- =================================================================== --&gt;<br />  &lt;target name="clean" depends="init"&gt;<br />    &lt;delete dir="${build.src}"/&gt;<br />    &lt;delete dir="${build.dest}/org"/&gt;<br />    &lt;delete dir="${build.dest}/com"/&gt;<br />    &lt;delete&gt;<br />      &lt;fileset dir="${build.dest}" includes="**/*.class"/&gt;<br />    &lt;/delete&gt;<br />  &lt;/target&gt;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<font size="2">TODO：<br />更多任务/扩展：（样例）<br /></font>
				</p>
		</div>
		<ul>
				<li>
						<font size="2">测试任务：JUnit测试</font>
				</li>
				<li>
						<font size="2">代码风格检查任务：CheckStyle，Jalopy等</font>
				</li>
				<li>
						<font size="2">邮件警报任务：可以把以上这些任务的输出警告发送到制定的用户列表中，这个任务可以设置每天自动运行。</font>
				</li>
		</ul>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:14 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我收集的Eclipse插件</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39335.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:08:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39335.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39335.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39335.html</trackback:ping><description><![CDATA[
		<font size="2">subversion<br />版本控制，相当于CVS<br />安装：</font>
		<a href="http://subclipse.tigris.org/install.html">
				<font color="#8d8c8c" size="2">http://subclipse.tigris.org/install.html</font>
		</a>
		<br />
		<font size="3">Name: Subclipse<br />URL:  http://subclipse.tigris.org/update_1.0.x<br /></font>
		<br />
		<br />
		<font size="2">CSS Editor for Eclipse<br /></font>
		<a href="http://csseditor.sourceforge.net/">
				<font color="#8d8c8c" size="2">http://csseditor.sourceforge.net/</font>
		</a>
		<br />
		<br />
		<font size="2">FacesIDE<br />FacesIDE是一个用于开发JSF的Eclispe插件.它可以可视化编辑faces-config.xml文件并且提供代码编辑与校验,预览JSF的JSP文件.FacesIDE包含MyFaces来作为JSF的实现<br /></font>
		<a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=FacesIDE">
				<font color="#8d8c8c">
						<font size="2">http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=FacesIDE</font>
				</font>
		</a>
		<br />
		<br />
		<span>
				<font size="2">Eclipse SQLExplorer plugin<br />一个数据库管理插件<br /></font>
		</span>
		<a href="http://sourceforge.net/projects/eclipsesql">
				<font color="#8d8c8c">
						<font size="2">http://sourceforge.net/projects/eclipsesql</font>
				</font>
		</a>
		<br />
		<br />
		<font size="2">Poperties Editor<br />一个在编辑完成后可以将资源文件中的中文编码格式转换为unicode编码的插件，在开发国际化应用程序的时候非常有用<br /></font>
		<a href="http://propedit.sourceforge.jp/eclipse/updates/">
				<font color="#8d8c8c">
						<font size="2">http://propedit.sourceforge.jp/eclipse/updates/</font>
				</font>
		</a>
		<p>
				<font size="2">eclipseME<br />  </font>
				<a href="http://eclipseme.org/updates/">
						<font color="#8d8c8c">
								<font size="2">http://eclipseme.org/updates/</font>
						</font>
				</a>
				<br />
		</p>
		<p>
				<font size="2">Eclipse加速插件KeepResident</font>
				<a href="http://suif.stanford.edu/pub/keepresident/">
						<br />
						<font color="#8d8c8c">
								<font size="2">http://suif.stanford.edu/pub/keepresident/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />MyEclipse  J2EE开发插件，支持SERVLET/JSP/EJB/数据库操纵等<br /></font>
				<a href="http://www.myeclipseide.com/">
						<font color="#8d8c8c">
								<font size="2">www.myeclipseide.com</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Properties Editor  编辑java的属性文件，并可以自动存盘为Unicode格式<br /></font>
				<a href="http://propedit.sourceforge.jp/index_en.html">
						<font color="#8d8c8c">
								<font size="2">http://propedit.sourceforge.jp/index_en.html</font>
						</font>
				</a>
				<br />
				<a href="http://propedit.sourceforge.jp/eclipse/updates/">
						<font color="#8d8c8c">
								<font size="2">http://propedit.sourceforge.jp/eclipse/updates/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Colorer Take  为上百种类型的文件按语法着色<br /></font>
				<a href="http://colorer.sourceforge.net/">
						<font color="#8d8c8c">
								<font size="2">http://colorer.sourceforge.net/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />XMLBuddy 编辑xml文件<br /></font>
				<a href="http://www.xmlbuddy.com/">
						<font color="#8d8c8c">
								<font size="2">www.xmlbuddy.com</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Code Folding  加入多种代码折叠功能（比eclipse自带的更多）<br /></font>
				<a href="http://www.coffee-bytes.com/servlet/PlatformSupport">
						<font color="#8d8c8c">
								<font size="2">http://www.coffee-bytes.com/servlet/PlatformSupport</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Easy Explorer  从eclipse中访问选定文件、目录所在的文件夹<br /></font>
				<a href="http://easystruts.sourceforge.net/">
						<font color="#8d8c8c">
								<font size="2">http://easystruts.sourceforge.net/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Fat Jar 打包插件，可以方便的完成各种打包任务，可以包含外部的包等<br /></font>
				<a href="http://fjep.sourceforge.net/">
						<font color="#8d8c8c">
								<font size="2">http://fjep.sourceforge.net/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />RegEx Test 测试正则表达式<br /></font>
				<a href="http://brosinski.com/stephan/archives/000028.php">
						<font color="#8d8c8c">
								<font size="2">http://brosinski.com/stephan/archives/000028.php</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />JasperAssistant 报表插件（强，要钱的）<br /></font>
				<a href="http://www.jasperassistant.com/">
						<font color="#8d8c8c">
								<font size="2">http://www.jasperassistant.com/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Jigloo GUI Builder ＪＡＶＡ的ＧＵＩ编辑插件<br /></font>
				<a href="http://cloudgarden.com/jigloo/">
						<font color="#8d8c8c">
								<font size="2">http://cloudgarden.com/jigloo/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Profiler 性能跟踪、测量工具，能跟踪、测量ＢＳ程序<br /></font>
				<a href="http://sourceforge.net/projects/eclipsecolorer/">
						<font color="#8d8c8c">
								<font size="2">http://sourceforge.net/projects/eclipsecolorer/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />AdvanQas 提供对if/else等条件语句的提示和快捷帮助（自动更改结构等）<br /></font>
				<a href="http://eclipsecolorer.sourceforge.net/advanqas/index.html">
						<font color="#8d8c8c">
								<font size="2">http://eclipsecolorer.sourceforge.net/advanqas/index.html</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Log4E     Log4j插件，提供各种和Log4j相关的任务，如为方法、类添加一个logger等<br /></font>
				<a href="http://log4e.jayefem.de/index.php/Main_Page">
						<font color="#8d8c8c">
								<font size="2">http://log4e.jayefem.de/index.php/Main_Page</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />VSSPlugin VSS插件<br /></font>
				<a href="http://sourceforge.net/projects/vssplugin">
						<font color="#8d8c8c">
								<font size="2">http://sourceforge.net/projects/vssplugin</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Implementors   提供跳转到一个方法的实现类，而不是接中的功能（实用!）<br /></font>
				<a href="http://eclipse-tools.sourceforge.net/implementors/">
						<font color="#8d8c8c">
								<font size="2">http://eclipse-tools.sourceforge.net/implementors/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Call Hierarchy 显示一个方法的调用层次（被哪些方法调，调了哪些方法）<br /></font>
				<a href="http://eclipse-tools.sourceforge.net/call-hierarchy/index.html">
						<font color="#8d8c8c">
								<font size="2">http://eclipse-tools.sourceforge.net/call-hierarchy/index.html</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />EclipseTidy 检查和格式化HTML/XML文件<br /></font>
				<a href="http://eclipsetidy.sourceforge.net/">
						<font color="#8d8c8c">
								<font size="2">http://eclipsetidy.sourceforge.net/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Checkclipse 检查代码的风格、写法是否符合规范<br /></font>
				<a href="http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm">
						<font color="#8d8c8c">
								<font size="2">http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />Hibernate Synchronizer Hibernate插件，自动映射等<br /></font>
				<a href="http://www.binamics.com/hibernatesync/">
						<font color="#8d8c8c">
								<font size="2">http://www.binamics.com/hibernatesync/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />spring updatesite 插件<br /></font>
				<a href="http://springide.org/updatesite/">
						<font color="#8d8c8c">
								<font size="2">http://springide.org/updatesite/</font>
						</font>
				</a>
		</p>
		<p>
				<font size="2">VeloEclipse  Velocity插件<br /></font>
				<a href="http://propsorter.sourceforge.net/">
						<font color="#8d8c8c">
								<font size="2">http://propsorter.sourceforge.net/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />EditorList   方便的列出所有打开的Editor<br /></font>
				<a href="http://editorlist.sourceforge.net/">
						<font color="#8d8c8c">
								<font size="2">http://editorlist.sourceforge.net/</font>
						</font>
				</a>
				<br />
				<font size="2"> <br />MemoryManager 内存占用率的监视<br /></font>
				<a href="http://cloudgarden.com/memorymanager/">
						<font color="#8d8c8c">
								<font size="2">http://cloudgarden.com/memorymanager/</font>
						</font>
				</a>
				<font size="2">
				</font>
		</p>
		<p>
				<font size="2">Eclipse的游戏插件<br /></font>
				<a href="http://eclipse-games.sourceforge.net/">
						<font color="#8d8c8c">
								<font size="2">http://eclipse-games.sourceforge.net/</font>
						</font>
				</a>
		</p>
		<p>
				<font size="2">JBoss-IDE<br /></font>
				<a href="http://jboss.sourceforge.net/jbosside/updates/">
						<font color="#8d8c8c">
								<font size="2">http://jboss.sourceforge.net/jbosside/updates/</font>
						</font>
				</a>
		</p>
		<p>
				<font size="2">自动反编译class，安装后要设定class文件缺省关联到jode<br /></font>
				<a href="http://www.technoetic.com/eclipse/update">
						<font color="#8d8c8c">
								<font size="2">http://www.technoetic.com/eclipse/update</font>
						</font>
				</a>
		</p>
		<p>
				<br />
				<font size="2">jigloo swing/sw设计工具，里面自带的form/anchor布局很好用！<br /></font>
				<a href="http://cloudgarden.soft-gems.net/update-site/">
						<font color="#8d8c8c">
								<font size="2">http://cloudgarden.soft-gems.net/update-site/</font>
						</font>
				</a>
		</p>
		<p>
				<font size="2">jinto的资源文件编辑工具，同时编辑多种语言，而且自动转换成iso8859-1编码。很好用！<br /></font>
				<a href="http://www.guh-software.de/eclipse/">
						<font color="#8d8c8c">
								<font size="2">http://www.guh-software.de/eclipse/</font>
						</font>
				</a>
				<br />
		</p>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:08 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Spring+Hibernate练习(完整)</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39331.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39331.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39331.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39331.html</trackback:ping><description><![CDATA[
		<div>工具：</div>
		<div>    Eclipse3.1、MyEclipse4.03、Tomcat5.5.9、Properties Editor插件、MySql4.1.13</div>
		<div> </div>
		<div>新建工程：名称为 login</div>
		<div> </div>
		<div>创建Struts框架</div>
		<div> </div>
		<div>创建 index.jsp，增加一链接指向 login.jsp</div>
		<div> </div>
		<div>按下Ctrl + N，创建 login.jsp、LoginAction，使用MyEclipse的向导就可以了，<strong>记得选对正确的版本</strong></div>
		<div> </div>
		<div>在ActionForm配置页中选择类型为动态Form，并继承于DynaValidatorForm，新增两个属性：username、password，在创建jsp文件打上钩，将路径改为/login.jsp，然后下一步，改LoginAction的Input source改为/login.jsp，点击完成</div>
		<div> </div>
		<div>按下Ctrl + N 创建一个forwards，<strong>记得选对正确的版本</strong></div>
		<div>name 输入 indexGo</div>
		<div>路径选择 /index.jsp</div>
		<div> </div>
		<div>
				<strong>配置validator</strong>
		</div>
		<div>先添加Struts插件，使用向导</div>
		<div>Plugin class : org.apache.struts.validator.ValidatorPlugIn</div>
		<div>Property : pathnames</div>
		<div>Value : <font color="#008000">/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml</font></div>
		<div>这里需要两个xml文件</div>
		<div>
				<font color="#000000">现在创建“</font>
				<font color="#000000">validation.xml</font>
				<font color="#000000">”</font> 文件</div>
		<div> </div>
		<div>
				<div>在这里说明一点，我使用MyEclipse创建的Struts框架中缺少了validator-rules.xml文件，需要动拷贝到WEB-INF目录中</div>
				<div>此文件可以到<a href="http://struts.apache.org/"><font color="#8d8c8c">http://struts.apache.org/</font></a>下载</div>
				<div> </div>
		</div>
		<div>文件内容如下：</div>
		<div>
				<font color="#0000ff">&lt;form-validation&gt;<br /> &lt;formset&gt;<br />  &lt;form name="loginForm"&gt;<br />   &lt;field property="username" depends="required"&gt;<br />    &lt;arg0 key="prompt.username" /&gt;<br />   &lt;/field&gt;<br />   &lt;field property="password" depends="required"&gt;<br />    &lt;arg0 key="prompt.password" /&gt;<br />   &lt;/field&gt;<br />  &lt;/form&gt;<br /> &lt;/formset&gt;<br />&lt;/form-validation&gt;</font>
		</div>
		<div>
				<font color="#0000ff">
				</font> </div>
		<div>
				<font color="#000000">
						<strong>编辑资源文件</strong>“ApplicationResources.properties”</font>
		</div>
		<div>增加以下内容</div>
		<div> </div>
		<div>
				<font color="#0000ff">prompt.username=User Name<br />prompt.password=User Password</font>
		</div>
		<div>
				<font color="#0000ff">errors.required={0} is required.</font>
		</div>
		<div>
				<font color="#0000ff">
				</font> </div>
		<div>
				<font color="#000000">再创建中文件资源文件“ApplicationResources_zh_CN.properties”</font>
		</div>
		<p>增加以下内容 </p>
		<div>
				<font color="#0000ff">prompt.username=用户名称<br />prompt.password=登录密码</font>
		</div>
		<div>
				<font color="#0000ff">errors.required={0} 必需填写！</font>
		</div>
		<div>
				<font color="#0000ff">
				</font> </div>
		<div>
				<font color="#000000">修改struts-config.xml文件</font>
		</div>
		<div>在以下位置增加绿色字体部份</div>
		<div>&lt;action-mappings &gt;<br />    &lt;action<br />      attribute="loginForm"<br />      input="/login.jsp"<br />      name="loginForm"<br />      path="/login"<br />      scope="request"<br />      <font color="#008000">validate="true"<br /></font>      type="com.test.struts.action.LoginAction" /&gt;</div>
		<div>  &lt;/action-mappings&gt;</div>
		<div> </div>
		<div>这里说明提交的数据必需经过验证，而验证则是通过validator框架进行的。</div>
		<div> </div>
		<div>修改LoginAction.java文件的execute方法，内容如下</div>
		<div>
				<font color="#0000ff">public ActionForward execute(<br />  ActionMapping mapping,<br />  ActionForm form,<br />  HttpServletRequest request,<br />  HttpServletResponse response) {<br />  DynaValidatorForm loginForm = (DynaValidatorForm) form;<br />  <font color="#008000">String username=loginForm.getString("username");<br />  String password=loginForm.getString("password");<br />  if(username.equals("test")||password.equals("test")){<br />   return mapping.findForward("indexGo");<br />  }else{<br />   return mapping.getInputForward();<br />  }<br /></font> }</font>
		</div>
		<div> </div>
		<div>现在再修改一下login.jsp</div>
		<div>增加以下绿色字体部份</div>
		<div>&lt;%@ page language="java" <font color="#008000">contentType="text/html; charset=UTF-8"</font> %&gt;</div>
		<div> </div>
		<div>其中<font color="#008000">charset=UTF-8 </font><font color="#000000">是使用UTF-8的字符编码，这也是为了支持国际化而使用的。</font></div>
		<div> </div>
		<div>好了，现在可以启动Tomcat进行测试了</div>
		<div>
				<a href="http://localhost/login/">
						<font color="#8d8c8c">http://localhost/login/</font>
				</a> 这里说明一下，我的Tomcat已经装端口号改为80了，所以就不必使用<a href="http://localhost:8080/login/"><font color="#8d8c8c">http://localhost:8080/login/</font></a>这样的方法了。</div>
		<div> </div>
		<div>如果不输入任何数据而直接提交表单的话就可以看到效果了。</div>
		<div> </div>
		<div>
				<font color="#ff0000">好了，如果没有什么问题的话就继续往下看吧，如果有问题的话就得往上看了^_^</font>
		</div>
		<div> </div>
		<div>现在创建Spring框架了，在这里我将Spring所有的包全部加载进去，因为我还不知道具体用到哪些类，全部加进去方便点</div>
		<div> </div>
		<div>单选框选第二个，这样的话所有的类库和标签等都将拷贝到项目中去，这样方便以后的布署</div>
		<div>下一步后是创建配置文件，将文件放到“WebRoot/WEB-INF”目录下，文件名称为“applicationContext.xml”</div>
		<div> </div>
		<div> </div>
		<div>
				<div>配置struts-config.xml文件，添加（spring）的插件</div>
				<div> </div>
				<div>
						<font color="#0000ff">&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />    &lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /&gt;<br />  &lt;/plug-in&gt;</font>
				</div>
				<div>
						<font color="#0000ff">
						</font> </div>
				<div>
						<font color="#0000ff">
						</font>  
<div><font color="#000000">修改LoginAction配置</font></div><div><font color="#0000ff"></font> </div><div><strong><font color="#000000">原：</font></strong></div><div><font color="#0000ff">&lt;action<br />      attribute="loginForm"<br />      input="/login.jsp"<br />      name="loginForm"<br />      path="/login"<br />      scope="request"<br />      validate="true"<br />      type="com.test.struts.action.LoginAction" /&gt;</font></div><div><font color="#0000ff"></font> </div><div><font color="#0000ff">  &lt;/action-mappings&gt;</font></div><div><font color="#0000ff"></font> </div><div><font color="#000000">改为：</font></div><div><div><font color="#0000ff">&lt;action<br />      attribute="loginForm"<br />      input="/login.jsp"<br />      name="loginForm"<br />      path="/login"<br />      scope="request"<br />      validate="true"<br />      type="<font color="#008000">org.springframework.web.struts.DelegatingActionProxy</font>" /&gt;</font></div><div><font color="#0000ff">  &lt;/action-mappings&gt;</font></div></div></div>
		</div>
		<div> </div>
		<div>  
<div><font color="#000000">绿色字体部份为修改内容</font></div><div><font color="#000000">这里将使用spring的代理器来对Action进行控制</font></div><div> </div><div>当提交到/login.do是将控制权交给了spring，然后由spring来决定是否转回到struts的Action</div><div> </div><div>现在来配置spring</div><div> </div><div><font color="#0000ff">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "</font><a href="http://www.springframework.org/dtd/spring-beans.dtd"><font color="#0000ff">http://www.springframework.org/dtd/spring-beans.dtd</font></a><font color="#0000ff">"&gt;</font></div><div><font color="#0000ff"></font> </div><div><font color="#0000ff">&lt;beans&gt;<br /> <font color="#008000">&lt;bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"&gt;&lt;/bean&gt;</font></font></div><div><font color="#0000ff">&lt;/beans&gt;</font></div><div><font color="#0000ff"></font> </div><div><font color="#000000">绿色字体是关于转交控制权的配置内容</font></div><div> </div><div>属性singleton="false"，指明了Action 的实例获取方式为每次重新创建。解决了Struts中令人诟病的线程安全问题（Struts中，由一个Action实例处理所有的请求，这就导致了类公用资源在并发请求中的线程同步问题。）（摘自spring开发指南）</div><div> </div><div><font color="#800080">这时如果你要进行测试也是可以的，不过为了省点时间就不进行测试了。</font></div><div>  
<div><strong>建立数据库在 </strong><font size="2">这里我使用的是mysql4.1.13</font></div><div><font size="2"></font> </div><div>CREATE TABLE `user` (<br />  `ID` int(11) NOT NULL auto_increment,<br />  `USERNAME` varchar(50) NOT NULL default '',<br />  `PASSWORD` varchar(50) NOT NULL default '',<br />  PRIMARY KEY  (`ID`)<br />) ENGINE=MyISAM DEFAULT CHARSET=latin1; </div><div> </div><div>添加记录 insert into user (USERNAME,PASSWORD) values ('test','test')</div><div> </div><div><strong>创建Hibernate框架</strong></div><div>在配置界面中配置数据库的连接部份，重要的是点击链接将jdbc拷贝到lib目录中</div><div>使用MyEclipse的数据Database Explorer工具创建User.hmb.xml、AbstractUser.java、User.java映射文件</div><div>创建完成后可以将自动生成的hibernate.cfg.xml删除</div><div> </div><div><strong>创建UserDAO.java、UserDAOImp.java</strong></div><div><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">UserDAO.java<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">public interface UserDAO {<o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">   </span>public abstract boolean isValidUser(String username, String password);<o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">}<o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p> </o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">UserDAOImp.java<o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">import java.util.List;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">import org.springframework.orm.hibernate3.support.HibernateDaoSupport;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">import com.test.Hibernate.SessionFactory;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">public class UserDAOImp extends HibernateDaoSupport implements UserDAO {<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">    </span>private SessionFactory sessionFactory;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">    </span>private static String hql = "from User u where u.username=? ";<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">    </span>public boolean isValidUser(String username, String password) {<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 2">       </span>List userList = this.getHibernateTemplate().find(hql, username);</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 2">       </span>if (userList.size() &gt; 0) {<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 3">           </span>return true;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 2">       </span>}<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 2">       </span>return false;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">    </span>}<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">}<o:p></o:p></span></p></div><div> </div><div><strong>修改LoginAction.java文件</strong>，使用userDao的方法来进行用户验证</div><div>package com.test.struts.action;</div><div> </div><div>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</div><div> </div><div>import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.validator.DynaValidatorForm;</div><div> </div><div><font color="#008000">import com.test.UserDAO;</font></div><div><br />public class LoginAction extends Action {</div><div><br /> <font color="#008000">private UserDAO userDAO</font>;</div><div> </div><div><font color="#008000"> public UserDAO getUserDAO() {<br />  return userDAO;<br /> }</font></div><div><font color="#008000"></font> </div><div><font color="#008000"> public void setUserDAO(UserDAO userDAO) {<br />  this.userDAO = userDAO;<br /> }</font></div><div> </div><div> public ActionForward execute(ActionMapping mapping, ActionForm form,<br />   HttpServletRequest request, HttpServletResponse response) {<br />  DynaValidatorForm loginForm = (DynaValidatorForm) form;<br />  // TODO Auto-generated method stub<br />  String username = (String) loginForm.get("username");<br />  String password = (String) loginForm.get("password");<br />  loginForm.set("password", null);<br />  <font color="#008000">if (userDAO.isValidUser(username,password)) {<br />   return mapping.findForward("indexGo");<br />  } else {<br />   return mapping.getInputForward();<br />  }<br /></font> }</div><div>}<br />绿色字体为修改部份</div><div> </div><div>现在剩下最后的spring配置了</div><div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd"><font color="#8d8c8c">http://www.springframework.org/dtd/spring-beans.dtd</font></a>"&gt;</div><div> </div><div>&lt;beans&gt;<br /> &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />  &lt;property name="driverClassName"&gt;<br />   &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;<br />  &lt;/property&gt;<br />  &lt;property name="url"&gt;<br />   &lt;value&gt;jdbc:mysql://localhost/test&lt;/value&gt;<br />  &lt;/property&gt;<br />  &lt;property name="username"&gt;<br />   &lt;value&gt;root&lt;/value&gt;<br />  &lt;/property&gt;<br />  &lt;property name="password"&gt;<br />   &lt;value&gt;root&lt;/value&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</div><div> </div><div> &lt;!-- 配置sessionFactory, 注意这里引入的包的不同  --&gt;<br /> &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />  &lt;property name="dataSource"&gt;<br />   &lt;ref local="dataSource" /&gt;<br />  &lt;/property&gt;<br />  &lt;property name="mappingResources"&gt;<br />   &lt;list&gt;<br />    &lt;value&gt;com/test/Hibernate/User.hbm.xml&lt;/value&gt;<br />   &lt;/list&gt;<br />  &lt;/property&gt;<br />  &lt;property name="hibernateProperties"&gt;<br />   &lt;props&gt;<br />    &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;<br />    &lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;<br />   &lt;/props&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</div><div> </div><div> &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />  &lt;property name="sessionFactory"&gt;<br />   &lt;ref local="sessionFactory" /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</div><div> </div><div> &lt;bean id="userDAO" class="com.test.UserDAOImp"&gt;<br />  &lt;property name="sessionFactory"&gt;<br />   &lt;ref local="sessionFactory" /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</div><div> </div><div> &lt;bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />  &lt;property name="transactionManager"&gt;<br />   &lt;ref bean="transactionManager" /&gt;<br />  &lt;/property&gt;<br />  &lt;property name="target"&gt;<br />   &lt;ref local="userDAO" /&gt;<br />  &lt;/property&gt;<br />  &lt;property name="transactionAttributes"&gt;<br />   &lt;props&gt;<br />    &lt;prop key="insert*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />    &lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />    &lt;prop key="is*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />   &lt;/props&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</div><div> </div><div> &lt;bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"&gt;<br />  &lt;property name="userDAO"&gt;<br />   &lt;ref bean="userDAOProxy" /&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;<br />&lt;/beans&gt;</div><div> </div><div>现在可以进行测试了！</div><div> </div><div>在编写代码有配置内容时一定要注意 hibernate 和 hibernate3 ，这两个包的名字就只差一个字，千万不要有错，否则找错误可是很难的。</div></div></div>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:05 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>