<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JavaEye博客</title>
    <description>Java博客,Ruby on Rails博客,AJAX博客,Agile博客 -- JavaEye做最棒的软件开发交流社区</description>
    <link>http://www.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>input type=&quot;file&quot; 不能输入的问题</title>
        <author>super_094</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://super-094.javaeye.com">super_094</a>&nbsp;
          链接：<a href="http://super-094.javaeye.com/blog/234303" style="color:red;">http://super-094.javaeye.com/blog/234303</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          项目里要做一个文件上传的功能，于是我写了个jsp页面，部分代码如下：<br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br />&lt;html><br />	&lt;head>&lt;/head><br />	&lt;body><br />		&lt;form method="post" name="upform"><br />			&lt;table><br />				&lt;tr>&lt;/tr><br />				&lt;tr><br />					&lt;td>输入文件&lt;/td><br />					&lt;td><br />						&lt;input type ="file" name="f" UNSELECTABLE="on"/><br />					&lt;/td><br />				&lt;/tr><br />			&lt;/table><br />		&lt;/form><br />	&lt;/body><br />&lt;/html><br /><br />其中，&lt;input type ="file" name="f" UNSELECTABLE="on"/>指定这个文件控件只能通过浏览按钮去上传文件，不能由用户输入。<br /><br />但是，第一次打开页面的时候，如过在控件上双击鼠标，就会发现控件前面会出现光标。<br />还可以输入，如果按了回车，光标就跑到文件控件里去了！<br /><br />郁闷了好久，才在秋末同学的帮助下解决问题，把UNSELECTABLE="on"换成contentEditable="false"就可以了。
          <br/>
          <span style="color:red;">
            <a href="http://super-094.javaeye.com/blog/234303#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 10:24:51 +0800</pubDate>
        <link>http://super-094.javaeye.com/blog/234303</link>
        <guid>http://super-094.javaeye.com/blog/234303</guid>
      </item>
      <item>
        <title>我的SSH项目之旅(3.用户注册--后台)</title>
        <author>fantlam</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fantlam.javaeye.com">fantlam</a>&nbsp;
          链接：<a href="http://fantlam.javaeye.com/blog/234277" style="color:red;">http://fantlam.javaeye.com/blog/234277</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table class="blog-content" border="0">
<tbody>
<tr>
<td>
<p><br /><span style="font-family: 宋体;">以上是做好前台验证，接下来是做</span><span style="font-family: courier;">DAO</span><span style="font-family: 宋体;">接口，往数据库里插数据</span><span style="font-family: courier;"><br /></span><br /><img src="http://blog.ccidnet.com/attachment/223628_401c68d50910c92.jpg" border="0" alt="" /></p>
<div></div>
<div></div>
<div><span style="font-family: courier;">UserDAO.java
<div><strong><br /></strong></div>
</span></div>
</td>
</tr>
</tbody>
</table>
<pre name="code" class="java">package dj.fantlam.myssh.dao;



import dj.fantlam.myssh.vo.User;



public interface UserDAO {

  //注册

  public void register(User user)throws Exception;



}

</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: Courier;">UserDAOImpl.java</span></p>
<p>&nbsp;</p>
<pre name="code" class="java">package dj.fantlam.myssh.daoimpl;



import org.springframework.orm.hibernate3.support.HibernateDaoSupport;



import dj.fantlam.myssh.dao.UserDAO;

import dj.fantlam.myssh.vo.User;

注意要继承自HibernateDaoSupport

public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {



  public void register(User user) throws Exception {

    // TODO Auto-generated method stub

    super.getSession().save(user);



  }



}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div><span style="font-family: courier;">直接用JAVA代码测试,先把数据源改为JDBC方式<br /></span></div>
<div><span style="font-family: courier;"><strong>applicationContext.xml<br /></strong></span></div>
<div><span style="font-family: courier;"><strong>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;



&lt;beans&gt;

  &lt;bean id="dataSource"

    class="org.apache.commons.dbcp.BasicDataSource"

    destroy-method="close"&gt;

    &lt;property name="driverClassName"&gt;

      &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;

    &lt;/property&gt;

    &lt;property name="url"&gt;

      &lt;value&gt;jdbc:mysql://localhost:3306/myssh&lt;/value&gt;

    &lt;/property&gt;

    &lt;property name="username"&gt;

      &lt;value&gt;root&lt;/value&gt;

    &lt;/property&gt;

    &lt;property name="password"&gt;

      &lt;value&gt;123456&lt;/value&gt;

    &lt;/property&gt;

&lt;/bean&gt;

  &lt;!-- 

    &lt;bean id="dataSource"

    class="org.springframework.jndi.JndiObjectFactoryBean"&gt;

    &lt;property name="jndiName"&gt;

    &lt;value&gt;java:comp/env/jdbc/myssh&lt;/value&gt;

    &lt;/property&gt;

    &lt;/beans&gt;

  --&gt;

  &lt;bean id="sessionFactory"

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;

    &lt;property name="dataSource"&gt;

      &lt;ref bean="dataSource" /&gt;

    &lt;/property&gt;

    &lt;property name="hibernateProperties"&gt;

      &lt;props&gt;

        &lt;prop key="hibernate.dialect"&gt;

            org.hibernate.dialect.MySQLDialect

        &lt;/prop&gt;

        &lt;!-- 表示允许自动提交 --&gt;

        &lt;prop key="hibernate.connection.autocommit"&gt;true&lt;/prop&gt;

        &lt;!-- 显示sql语句 --&gt;

        &lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;

      &lt;/props&gt;

    &lt;/property&gt;

    &lt;property name="mappingResources"&gt;

      &lt;list&gt;

        &lt;value&gt;dj/fantlam/myssh/vo/User.hbm.xml&lt;/value&gt;

      &lt;/list&gt;

    &lt;/property&gt;



  &lt;/bean&gt;

  &lt;bean id="hibernateTemplate"

    class="org.springframework.orm.hibernate3.HibernateTemplate"&gt;

    &lt;property name="sessionFactory"&gt;

      &lt;ref bean="sessionFactory" /&gt;

    &lt;/property&gt;



  &lt;/bean&gt;

  &lt;bean id="userdao" class="dj.fantlam.myssh.dao.UserDAO"

    abstract="true"&gt;

  &lt;/bean&gt;

  &lt;bean id="userdaoimpl" class="dj.fantlam.myssh.daoimpl.UserDAOImpl"

    parent="userdao"&gt;

    &lt;property name="hibernateTemplate"&gt;

      &lt;ref bean="hibernateTemplate" /&gt;

    &lt;/property&gt;

  &lt;/bean&gt;



&lt;/beans&gt;
</pre>
&nbsp;</strong></span></div>
<div><span style="font-family: courier;"><strong></strong></span></div>
<div><span style="font-family: courier;">
<div><strong>
<div><span style="font-family: 宋体;">写一个测试类</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;"><strong>UserdaoTest.java</strong><br /></span></div>
<div><span style="font-family: 宋体;">可以成功插入数据</span><span style="font-family: courier;"> </span><span style="font-family: 宋体;">证明后台</span><span style="font-family: courier;">hibernate</span><span style="font-family: 宋体;">和</span><span style="font-family: courier;">spring</span><span style="font-family: 宋体;">的整合已经没有问题</span></div>
<div></div>
<div>
<pre name="code" class="java">package dj.fantlam.myssh.test;



import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;



import dj.fantlam.myssh.daoimpl.UserDAOImpl;

import dj.fantlam.myssh.vo.User;



public class UserdaoTest {



  /**

  * @param args

  * @throws Exception 

  */

  public static void main(String[] args) throws Exception {

    // TODO Auto-generated method stub

    ApplicationContext context = null;

        context = new ClassPathXmlApplicationContext("applicationContext.xml");

    UserDAOImpl udi = (UserDAOImpl) context.getBean("userdaoimpl");

    User user = new User();

    //user.setId(123);

    user.setUserid("22");

    udi.register(user);



  }



}

</pre>
&nbsp;</div>
<div><span style="font-family: 宋体;"><span style="color: #ff0000;">出现的错误</span><br /><br /></span><span><span style="color: #000000; font-family: courier;"><strong>1.</strong></span></span>
<p><span style="color: #ff0000;"><span style="font-family: courier;">Error creating bean with name 'dataSource' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is </span><span style="text-decoration: underline;"><span style="font-family: courier;">javax.naming.NoInitialContextException</span></span><span style="font-family: courier;">:<br /></span></span><br /><span style="color: #ff0000;"><span style="font-family: 宋体;">用</span><span style="font-family: courier;">java</span><span style="font-family: 宋体;">代码直接测试由于连接池要用到</span><span style="font-family: courier;">tomcat</span><span style="font-family: 宋体;">的问题，先改为</span><span style="font-family: courier;">JDBC</span><span style="font-family: 宋体;">连接方式</span><span style="font-family: courier;"><br /></span></span><br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><br /></span>2.<br /><span style="color: #ff0000;"><span style="font-family: courier;">Unknown entity: dj.fantlam.myssh.vo.User </span><span style="font-family: 宋体;">没有在</span><span style="font-family: courier;">spring</span><span style="font-family: 宋体;">配置</span><span style="font-family: courier;"><br /></span></span></p>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; &nbsp; </span><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">property </span><span style="font-family: courier;">name</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"mappingResources"</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; </span><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">list</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">value</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;">org/lxh/myzngt/vo/User.hbm.xml</span><span style="font-family: courier;">&lt;/</span><span style="font-family: courier;">value</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; </span><span style="font-family: courier;">&lt;/</span><span style="font-family: courier;">list</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></span></div>
<span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; &nbsp; </span><span style="font-family: courier;">&lt;/</span><span style="font-family: courier;">property</span><span style="font-family: courier;">&gt;<br /></span></span><br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><strong>3.</strong><br /></span><br /><span style="color: #ff0000;"><span style="font-family: courier;">Exception in thread "main" </span><span style="text-decoration: underline;"><span style="font-family: courier;">org.hibernate.exception.SQLGrammarException</span></span><span style="font-family: courier;">: could not insert: [dj.fantlam.myssh.vo.User]<br /></span></span><br /><span style="color: #ff0000;"><span style="font-family: courier;">Caused by: </span><span style="text-decoration: underline;"><span style="font-family: courier;">java.sql.SQLException</span></span><span style="font-family: courier;">: Table 'myssh.myssh__user' doesn't exist<br /></span></span><br /><span style="color: #ff0000;"><span style="font-family: 宋体;">在</span><span style="font-family: courier;">User.hbm.xml</span><span style="font-family: 宋体;">里面</span><span style="font-family: courier;"><br /></span></span><br />
<div><span style="color: #ff0000;"><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">hibernate-mapping</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">class </span><span style="font-family: courier;">name</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"dj.fantlam.myssh.vo.User" </span><span style="font-family: courier;">table</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"user" <br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: 宋体;">将</span><span style="font-family: 宋体;">（</span><span style="text-decoration: underline;"><span style="font-family: courier;">catalog="myssh"</span></span><span style="text-decoration: underline;"><span style="font-family: 宋体;">）</span></span><span style="font-family: 宋体;">去掉</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; &nbsp; </span><span style="font-family: courier;"><br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; </span><span style="font-family: courier;">&lt;/</span><span style="font-family: courier;">class</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></span></div>
<span style="color: #ff0000;"><span style="font-family: courier;">&lt;/</span><span style="font-family: courier;">hibernate-mapping</span><span style="font-family: courier;">&gt;</span></span><br /><span style="color: #ff0000;"><span style="font-family: courier;"><br /></span></span><br /><span style="font-family: courier;"><br /></span>4.<br /><span style="font-family: 宋体;"><span style="color: #ff0000;">严重</span></span><span style="color: #ff0000;"><span style="font-family: verdana;">: IOException while loading persisted sessions: java.io.EOFException<br /></span><span style="font-family: 宋体;">严重</span><span style="font-family: verdana;">: Exception loading sessions from persistent storage</span></span><span style="font-family: verdana;"><br /><br /></span><span style="font-family: 宋体;">原因是</span><span style="font-family: verdana;">tomcat</span><span style="font-family: 宋体;">对硬盘的</span><span style="font-family: verdana;">session</span><span style="font-family: 宋体;">读取失败，彻底解决办法一下：将</span><span style="font-family: verdana;">tomcat</span><span style="font-family: 宋体;">的</span><span style="font-family: verdana;">work</span><span style="font-family: 宋体;">目录下面的文件清空，主要是</span><span style="font-family: verdana;">*.ser</span><span style="font-family: 宋体;">文件，或者只是删除掉</span><span style="font-family: verdana;">session.ser</span><span style="font-family: 宋体;">即可以解决。</span><span style="font-family: verdana;"> <br /></span><br /><span style="font-family: verdana;"><br /></span><br /><span style="font-family: verdana;"><br /></span>5.<br /><strong><span style="font-family: verdana;">Struts</span><span style="font-family: 宋体;">无法验证</span></strong><span style="font-family: verdana;"> </span><span style="font-family: 宋体;">因为</span><span style="font-family: verdana;">Struts</span><span style="font-family: 宋体;">默认执行</span><span style="font-family: courier;">public</span><span style="font-family: courier;"> ActionForward execute<br /></span><br /><span style="font-family: 宋体;">用分发</span><span style="font-family: courier;">Action</span><span style="font-family: 宋体;">的时候注意把</span><span style="font-family: courier;">execute</span><span style="font-family: 宋体;">的名字改掉</span><span style="font-family: courier;"><br /></span><br /><span style="font-family: verdana;"><br /></span><br /><span style="font-family: verdana;"><br /></span>6.<br /><span style="font-family: 宋体;">在</span><span style="font-family: courier;">UserForm</span><span style="font-family: 宋体;">里面</span><span style="font-family: courier;"> </span><span style="font-family: 宋体;">最好所有属性都有</span><span style="font-family: courier;">setter</span><span style="font-family: 宋体;">和</span><span style="font-family: courier;">getter</span><span style="font-family: 宋体;">方法</span><span style="font-family: courier;"> <br /></span><br /><span style="font-family: 宋体;">由于</span><span style="font-family: courier;">type</span><span style="font-family: 宋体;">没有</span><span style="font-family: courier;">setter</span><span style="font-family: 宋体;">和</span><span style="font-family: courier;">getter</span><span style="font-family: 宋体;">方法</span><span style="font-family: courier;"> </span><span style="font-family: 宋体;">导致</span><span style="font-family: courier;">UserForm</span><span style="font-family: 宋体;">都无法验证错误信息</span><span style="font-family: courier;"> </span><span style="font-family: 宋体;">生成之后问题解决</span><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><br /></span><br />
<div><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;"><strong>7.<br /></strong></span></div>
<div><span style="font-family: courier;">spring</span><span style="font-family: 宋体;">没有把</span><span style="font-family: courier;">dataSource</span><span style="font-family: 宋体;">配上去</span><span style="font-family: courier;"> user.do</span><span style="font-family: 宋体;">会找不到</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">index.html <br /></span></div>
<div><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">html</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">head</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; </span><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">title</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;">fantlam</span><span style="font-family: courier;">&lt;/</span><span style="font-family: courier;">title</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<span style="font-family: courier;">&nbsp; </span><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">META</span><span style="font-family: courier;"> </span><span style="font-family: courier;">NAME</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"Generator" </span><span style="font-family: courier;">CONTENT</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"Struts + Spring + Hibernate + MySQL + Tomcat + CP"</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span><br />
<div><span style="font-family: courier;">&nbsp; </span><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">META </span><span style="font-family: courier;">NAME</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"Author" </span><span style="font-family: courier;">CONTENT</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"fantlam"</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; </span><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">META </span><span style="font-family: courier;">NAME</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"Keywords" </span><span style="font-family: courier;">CONTENT</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"SSH,tomcat,mysql"</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; </span><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">META </span><span style="font-family: courier;">NAME</span><span style="font-family: courier;">=</span><span style="font-family: courier;">"Description" </span><span style="font-family: courier;">CONTENT</span><span style="font-family: courier;">=</span><span style="font-family: courier;">" <a href="http://fantlam.blogbus.com%22/" target="_blank"><span style="color: #3d7db3;">http://fantlam.blogbus.com"</span></a></span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; </span><span style="font-family: courier;">&lt;META HTTP-EQUIV="refresh" CONTENT="0;URL=jsp/index.jsp"&gt;</span><span style="font-family: 宋体;">跳转页面</span></span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&lt;/</span><span style="font-family: courier;">head</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&lt;</span><span style="font-family: courier;">body</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&lt;/</span><span style="font-family: courier;">body</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&lt;/</span><span style="font-family: courier;">html</span><span style="font-family: courier;">&gt;</span><span style="font-family: courier;"><br /></span></div>
<span style="font-family: courier;">&nbsp; &nbsp; &nbsp; <br /></span><br /><span style="font-family: courier;">UserAction.java </span><span style="font-family: 宋体;">的</span><span style="font-family: courier;">register</span><span style="font-family: 宋体;">里</span><span style="font-family: courier;"> </span><span style="font-family: 宋体;">插入数据</span><span style="font-family: courier;"> </span><span style="font-family: 宋体;">密码进行加密</span><span style="font-family: courier;"><br /></span><br />
<div><span style="color: #0000ff;"><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; </span><span style="font-family: courier;">MD5Code mc=new MD5Code();<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; User user = new User();<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; user.setUserid(userForm.getUserid());<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; user.setUserpwd(mc.getMD5ofStr(userForm.getUserpwd()));<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; user.setUserques(userForm.getUserques());<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; user.setUserans(userForm.getUserans());<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; user.setGrade(1);<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; this.userdao.register(user);<br /></span></span></div>
<div><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;"><span style="color: #ff0000;">&nbsp; &nbsp; &nbsp; request.getSession().setAttribute("userid", user.getUserid());<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #ff0000;">&nbsp; &nbsp; &nbsp; request.getSession().setAttribute("grade", user.getGrade());<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; return mapping.findForward("regsuc");<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; } catch (Exception e) {<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; // TODO Auto-generated catch block<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; e.printStackTrace();<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; return mapping.findForward("regfail");<br /></span></span></div>
<span style="font-family: courier;"><span style="color: #0000ff;">&nbsp; &nbsp; }<br /></span></span><br />
<div><span style="color: #ff0000; font-family: courier;"><span style="color: #000000;"><strong>8.</strong></span>&nbsp;</span></div>
<div><span style="color: #ff0000; font-family: courier;"><strong>this</strong></span><span style="color: #ff0000; font-family: courier;"><strong>.userdao.register(user);</strong><br /></span></div>
<div><span style="color: #ff0000; font-family: 宋体;">出现空指针异常</span><span style="color: #ff0000; font-family: courier;">java.lang.NullPointerException<br /></span></div>
<div><span style="color: #ff0000;"><span style="font-family: 宋体;">出现原因：没有把</span><span style="font-family: courier;">struts</span><span style="font-family: 宋体;">交给</span><span style="font-family: courier;">spring</span><span style="font-family: 宋体;">管理</span><span style="font-family: courier;"> </span><span style="font-family: 宋体;">没有实例化</span><span style="font-family: courier;">UserDAO</span><span style="font-family: 宋体;">类</span></span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;"><span style="color: #ff0000;">解决办法:<br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: 宋体;">在</span><span style="font-family: courier;">applicationContext.xml</span><span style="font-family: 宋体;">中加入</span></span><span style="font-family: courier;"><br /></span></div>
<div><span style="color: #ff0000; font-family: courier;">&lt;bean name="/jsp/user" class="dj.fantlam.myssh.struts.action.UserAction"&gt;<br /></span></div>
<div><span style="color: #ff0000; font-family: courier;">&nbsp; &lt;property name="userdao"&gt;<br /></span></div>
<div><span style="color: #ff0000; font-family: courier;">&nbsp; &nbsp; &lt;ref bean="userdaoimpl" /&gt;<br /></span></div>
<div><span style="color: #ff0000; font-family: courier;">&nbsp; &lt;/property&gt;<br /></span></div>
<div><span style="color: #ff0000; font-family: courier;">&lt;/bean&gt;<br /></span></div>
<span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;">index.jsp<br /></span><br />
<div><span style="font-family: courier;"><span style="color: #ff0000;">&lt;logic:present name="userid" scope="session"&gt;<br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: 宋体;">欢迎</span><span style="font-family: courier;">${userid}</span><span style="font-family: 宋体;">光临</span><span style="font-family: courier;"> <br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: 宋体;">头衔：</span><span style="font-family: courier;">${grade}</span><span style="font-family: 宋体;">级</span><span style="font-family: courier;"><br /></span></span></div>
<p><span style="font-family: courier;"><span style="color: #ff0000;">&lt;/logic:present&gt;<br /></span></span><br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: 宋体;"><span style="color: #ff0000;">进行注册测试，可以成功插入</span></span><span style="font-family: courier;"><br /></span><br /><img src="http://blog.ccidnet.com/attachment/223628_363594c29688f54.jpg" border="0" alt="" /><br /><br /><span style="color: #ff0000;"><span style="font-family: 宋体;">以上用</span><span style="font-family: courier;">JDBC</span><span style="font-family: 宋体;">连接方式可以成功注册用户</span><span style="font-family: courier;"><br /></span></span><br /><span style="color: #ff0000;"><span style="font-family: 宋体;">现在改为用</span><span style="font-family: courier;"> JNDI </span><span style="font-family: 宋体;">数据源</span><span style="font-family: courier;"> </span><span style="font-family: 宋体;">又出现了这样的问题</span><span style="font-family: courier;"><br /></span></span><br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><span style="color: #ff0000;">org.hibernate.exception.GenericJDBCException: Cannot open connection<br /></span></span></p>
<p>这个地方暂时还没解决 以后的代码只能用JDBC方式代替了<br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: 宋体;">&nbsp;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">在注册之前要检查用户</span><span style="font-family: courier;">ID</span><span style="font-family: 宋体;">是否已经存在，不存在才插入，存在要返回错误信息</span><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><strong>UserDAOImpl</strong></span><span style="font-family: courier;"><strong>.java</strong><br /></span></p>
<div><span style="font-family: courier;">&nbsp; </span><span style="font-family: courier;">public</span><span style="font-family: courier;"> User queryByUserid(String userid) </span><span style="font-family: courier;">throws</span><span style="font-family: courier;"> Exception {</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; </span><span style="font-family: courier;">// </span><span style="font-family: courier;">TODO</span><span style="font-family: courier;"> Auto-generated method stub</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; // HibernateDaoSupport</span><span style="font-family: 宋体;">的方法取得</span><span style="font-family: courier;">session<br /></span></div>
<div><span style="font-family: courier;">&nbsp; // protected net.sf.hibernate.Session getSession() </span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; User user=</span><span style="font-family: courier;">null</span><span style="font-family: courier;">;</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; String hql=</span><span style="font-family: courier;">"from User as u where u.userid=?"</span><span style="font-family: courier;">;<br /></span></div>
<div><span style="font-family: courier;">User</span><span style="font-family: 宋体;">注意不要写成</span><span style="font-family: courier;">user<br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; <span style="color: #ff0000;">Query q=</span></span><span style="color: #ff0000;"><span style="font-family: courier;">super</span><span style="font-family: courier;">.getSession().createQuery(hql);</span><span style="font-family: courier;"><br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; &nbsp; </span><span style="font-family: courier;">q.setString(0, userid);<br /></span></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; List l=q.list();</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; </span><span style="font-family: courier;">if</span><span style="font-family: courier;">(l.size()&gt;0){</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; user=(User)l.get(0);</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; </span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; }</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; </span><span style="font-family: courier;">return</span><span style="font-family: courier;"> user;</span><span style="font-family: courier;"><br /></span></div>
<span style="font-family: courier;">&nbsp; }<br /></span><br /><span style="font-family: courier;"><span style="color: #ff0000;">org.hibernate.QueryException: Expected positional parameter count: 1, actual parameters: [] [from user as u where u.userid=?]<br /></span></span><br /><span style="color: #0000ff;"><span style="font-family: 宋体;">原因是忘了设值</span><span style="font-family: courier;">q.setString(0, userid);<br /></span></span><br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;">UserAction</span><span style="font-family: 宋体;">里</span><span style="font-family: courier;">register</span><span style="font-family: 宋体;">方法</span><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><br /></span><br /><span style="font-family: courier;"><br /></span><br />
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; &nbsp; </span><span style="font-family: courier;">User user =this.userdao.queryByUserid(userForm.getUserid());<br /></span></span></div>
<div><span style="color: #ff0000;"><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; </span><span style="font-family: courier;">if</span><span style="font-family: courier;"> (user == null) {<br /></span></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; &nbsp; user.setUserid(userForm.getUserid());</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; &nbsp; user.setUserpwd(mc.getMD5ofStr(userForm.getUserpwd()));</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; &nbsp; user.setUserques(userForm.getUserques());</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; &nbsp; user.setUserans(userForm.getUserans());</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; &nbsp; user.setGrade(1);</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="font-family: courier;">this</span><span style="font-family: courier;">.</span><span style="font-family: courier;">userdao</span><span style="font-family: courier;">.register(user);</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; request.getSession().setAttribute(</span><span style="font-family: courier;">"userid"</span><span style="font-family: courier;">, user.getUserid());</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; request.getSession().setAttribute(</span><span style="font-family: courier;">"grade"</span><span style="font-family: courier;">, user.getGrade());</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="font-family: courier;">return</span><span style="font-family: courier;"> mapping.findForward(</span><span style="font-family: courier;">"regsuc"</span><span style="font-family: courier;">);</span><span style="font-family: courier;"><br /></span></div>
<div><span style="font-family: courier;">&nbsp; &nbsp; &nbsp; </span><span style="font-family: courier;"><span style="color: #ff0000;">} else {<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #ff0000;">&nbsp; &nbsp; &nbsp; &nbsp; ActionMessages errors = new ActionMessages();<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #ff0000;">&nbsp; &nbsp; &nbsp; &nbsp; errors.add("exist", new ActionMessage("user.id.exist"));<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #ff0000;">&nbsp; &nbsp; &nbsp; &nbsp; super.saveErrors(request, errors);<br /></span></span></div>
<div><span style="font-family: courier;"><span style="color: #ff0000;">&nbsp; &nbsp; &nbsp; &nbsp; return mapping.getInputForward();<br /></span></span></div>
<div><span style="font-family: courier;"><br /></span></div>
<span style="font-family: courier;"><span style="color: #ff0000;">&nbsp; &nbsp; &nbsp; }<br /></span></span><br /><br /><br /></div>
</strong></div>
</span></div>
          <br/>
          <span style="color:red;">
            <a href="http://fantlam.javaeye.com/blog/234277#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 09:46:59 +0800</pubDate>
        <link>http://fantlam.javaeye.com/blog/234277</link>
        <guid>http://fantlam.javaeye.com/blog/234277</guid>
      </item>
      <item>
        <title>Deploy Rails Application On Debian</title>
        <author>zhangpeihao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangpeihao.javaeye.com">zhangpeihao</a>&nbsp;
          链接：<a href="http://zhangpeihao.javaeye.com/blog/234251" style="color:red;">http://zhangpeihao.javaeye.com/blog/234251</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<div id="swoj" style="text-align: center;">      <span style="font-size: medium;"><strong id="swoj1">Deploy Rails Application On Debian + PostgreSQL + </strong>
</span>
<span style="font-size: medium;"><strong id="kf930">Apache2 + </strong>
</span>
<span style="font-size: medium;"><strong id="kf932">Mongrel + Capistrano</strong>
</span>
<br id="swoj2" />
</div>
<p><br id="swoj3" />
</p>
<div id="nodf">文档说明： <span style="color: #0000ff;"><span style="color: #ff0000;">&lt;XXX&gt;<span style="color: #000000;">是根据各自环境设定的</span>
</span>
</span>
参数或名称， <span style="color: #0000ff;">蓝色文字</span>
表示文件中的内容或代码， <span style="color: #cc99ff;">紫色文字</span>
表示命令。<br id="nodf5" />
</div>
<div id="nodf6"><br id="nodf7" />
1. 安装Debian(全英文系统, 只安装最基本部分和gnome)<br id="g8qh" />
2. 为新用户增加sudo权限<br id="tplk" />
</div>
<div id="vznn" style="margin-left: 40px;">文件：/etc/sudoers<br id="c-55" />
增加：<span style="color: #0000ff;"><span style="color: #ff0000;">&lt;user_name&gt;</span>
 ALL=(ALL) ALL</span>
<br id="c-550" />
</div>
<p>
3. 设置sourcelist<br id="s3bn" />
</p>
<div id="vznn0">
<div id="vznn1" style="margin-left: 40px;">3.1 安装apt-spy(使用DVD安装盘)<br id="s3bn0" />
</div>
<div id="vznn2" style="margin-left: 40px;">
<div id="vznn3" style="margin-left: 40px;">命令：<span id="ruu:0" style="color: #9900ff;">sudo apt-get install apt-spy</span>
<br id="y1pf24" />
 * 如果使用CD安装盘可能没有apt-spy包，先运行sudo apt-get update，然后再执行 sudo apt-get install apt-spy。从默认的&ldquo;http://security.debian.org/&rdquo;镜像来安装。<br id="zb2v" />
</div>
</div>
<div id="zb2v0" style="margin-left: 40px;">
<div id="zb2v1">3.2 得到最快的镜像站点<br id="h_x2" />
</div>
</div>
<div id="h_x20" style="margin-left: 40px;">
<div id="h_x21">
<div id="h_x22" style="margin-left: 40px;">参考<a href="http://pwet.fr/man/linux/administration_systeme/apt_spy" title="apt-spy命令说明" id="qlx3">apt-spy命令说明</a>
 <br id="h582" />
命令：<span id="ruu:2" style="background-color: #ffffff; color: #9900ff;">apt-spy -d stable -a Asia -o ./asia_mirrors.lists</span>
<br id="zidn" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span id="wbzm" style="color: #9900ff;">apt-spy -d stable -a Oceania -o ./oceania_mirrors.lists</span>
<br id="oy.v" />
测
试下来，最快的镜像是：http://debian.cn99.com/debian/，但是由于这个镜像不太全，所以再用一个日本的镜像：&ldquo;http:
//ftp.jp.debian.org/debian/&rdquo;和一个台湾的镜像：&ldquo;ftp://ftp.tw.debian.org/debian/&rdquo;<br id="x_u0" />
修改后的文件：/etc/apt/sources.list<br id="falk" />
<span id="gbeo" style="color: #0000ff;">deb cdrom:[Debian GNU/Linux 4.0 r4a _Etch_ - Official i386 DVD Binary-1 20080803-20:48]/ etch contrib main</span>
<br id="falk0" style="color: #0000ff;" />
<span id="gbeo0" style="color: #0000ff;">&nbsp;</span>
<br id="falk1" style="color: #0000ff;" />
<span id="gbeo1" style="color: #0000ff;">deb ftp://ftp.tw.debian.org/debian/ stable main contrib non-free</span>
<br id="falk2" style="color: #0000ff;" />
<span id="gbeo2" style="color: #0000ff;">deb-src ftp://ftp.tw.debian.org/debian/ stable main contrib non-free</span>
<br id="falk3" style="color: #0000ff;" />
<span id="gbeo3" style="color: #0000ff;">&nbsp;</span>
<br id="falk4" style="color: #0000ff;" />
<span id="gbeo4" style="color: #0000ff;">deb http://ftp.jp.debian.org/debian/ stable main contrib non-free</span>
<br id="falk5" style="color: #0000ff;" />
<span id="gbeo5" style="color: #0000ff;">deb-src http://ftp.jp.debian.org/debian/ stable main contrib non-free</span>
<br id="falk6" style="color: #0000ff;" />
<span id="gbeo6" style="color: #0000ff;">&nbsp;</span>
<br id="falk7" style="color: #0000ff;" />
<span id="gbeo7" style="color: #0000ff;">deb http://debian.cn99.com/debian/ etch main</span>
<br id="falk8" style="color: #0000ff;" />
<span id="gbeo8" style="color: #0000ff;">deb-src http://debian.cn99.com/debian/ etch main</span>
<br id="falk9" style="color: #0000ff;" />
<span id="gbeo9" style="color: #0000ff;">&nbsp;</span>
<br id="falk10" style="color: #0000ff;" />
<span id="gbeo10" style="color: #0000ff;">deb http://security.debian.org/ etch/updates main contrib</span>
<br id="falk11" style="color: #0000ff;" />
<span id="gbeo11" style="color: #0000ff;">deb-src http://security.debian.org/ etch/updates main contrib</span>
<br id="falk12" style="color: #0000ff;" />
<br id="k-rk13" style="color: #0000ff;" />
</div>
</div>
</div>
<div id="eirs" style="margin-left: 40px;">
<div id="eirs0">
<div id="eirs1">3.3 更新镜像数据<br id="eirs2" />
</div>
</div>
</div>
<div id="eirs3" style="margin-left: 40px;">
<div id="eirs4">
<div id="eirs5">
<div id="eirs6" style="margin-left: 40px;">命令：<span id="eirs7" style="color: #9900ff;">sudo apt-get update</span>
<br id="eirs8" />
</div>
</div>
</div>
</div>
<div id="c6:q">
<div id="c6:q0">
<div id="c6:q1">
<div id="c6:q2">4. 安装ruby1.8<br id="c6:q3" />
<div id="c6:q4" style="margin-left: 40px;">4.1 安装build-essential, ruby1.8, ruby1.8-dev<br id="ad7:" />
</div>
<div id="hu6v" style="margin-left: 40px;">
<div id="hu6v0" style="margin-left: 40px;">命令：<span style="color: #9900ff;">sudo apt-get install build-essential ruby1.8 ruby1.8-dev</span>
<br id="oy.v0" />
</div>
</div>
</div>
</div>
</div>
</div>
<div id="llfi" style="margin-left: 40px;">4.2 检查ruby版本<br id="llfi0" />
</div>
<div id="llfi1" style="margin-left: 40px;">
<div id="llfi2" style="margin-left: 40px;">命令：<span id="llfi3" style="color: #9900ff;">ruby -v</span>
<br id="llfi4" />
</div>
</div>
<div id="llfi5" style="margin-left: 80px;">确认版本至少为1.8.5<br id="llfi6" />
</div>
5. 安装rubygems<br id="i:kp" />
<div id="i:kp0" style="margin-left: 40px;">5.1 下载指定版本的rubygems的tgz安装包。<a href="http://rubyforge.org/frs/?group_id=126&amp;release_id=23118" title="下载地址" id="p8:i">下载地址</a>
 , <a href="http://files.rubyforge.vm.bytemark.co.uk/" title="另一个地址" id="pmp7">另一个地址</a>
 <br id="l92o" />
</div>
<div id="coa1" style="margin-left: 40px;">
<div id="coa10" style="margin-left: 40px;">因为每个发行版本的程序不一定使用的是最新的gems，所以最好安装指定版本的gems。<br id="b-w." />
</div>
</div>
<div id="b-w.0" style="margin-left: 40px;">
<div id="b-w.1">5.2 安装rubygems<br id="xiwf" />
</div>
</div>
<div id="b-w.2" style="margin-left: 40px;">
<div id="b-w.3" style="margin-left: 40px;">命令：<span id="b-w.4" style="color: #9900ff;">tar xvf rubygems-<span id="b-w.5" style="color: #ff0000;">&lt;X.X.X&gt;</span>
.tgz</span>
<br id="nvyv" style="color: #9900ff;" />
<span id="b-w.6" style="color: #9900ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cd rubygems-<span id="b-w.7" style="color: #ff0000;">&lt;X.X.X&gt;</span>
</span>
<br id="nvyv0" style="color: #9900ff;" />
<span id="b-w.8" style="color: #9900ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ruby setup.rb</span>
<br id="llfi7" />
</div>
</div>
6. 安装rake<br id="hox9" />
<div id="hox90" style="margin-left: 40px;">6.1 下载指定版本的rake的gem安装包。<a href="http://rubyforge.org/frs/?group_id=50&amp;release_id=17414" title="下载地址" id="wclr">下载地址</a>
 （目前似乎可以使用最新版的Rake，但是还是建议使用指定的Rake）<br id="sig9" />
6.2 安装<br id="g3tm" />
</div>
<div id="g3tm0" style="margin-left: 40px;">
<div id="g3tm1" style="margin-left: 40px;">命令：<span id="zysb" style="color: #9900ff;">sudo gem install rake -l</span>
<br id="hox91" />
</div>
</div>
7. 安装rails<br id="ls4b" />
<div id="ls4b0" style="margin-left: 40px;">7.1 下载指定版本的rails的gem安装包。<a href="http://rubyforge.org/frs/?group_id=307&amp;release_id=22587" title="下载地址" id="qgnw">下载地址</a>
 , <a href="http://files.rubyforge.vm.bytemark.co.uk/" title="另一个地址" id="te_x0">另一个地址</a>
 <br id="zog7" />
7.2 下载指定版本的rails组件的gem安装包。<a href="http://rubyforge.org/frs/?group_id=361&amp;release_id=22581" title="actionmailer下载地址" id="yabw">actionmailer下载地址</a>
 ，<a href="http://rubyforge.org/frs/?group_id=249&amp;release_id=22580" title="actionpack下载地址" id="n:as">actionpack下载地址</a>
 ，<a href="http://rubyforge.org/frs/?group_id=182&amp;release_id=22579" title="activerecord下载地址" id="uldc">activerecord下载地址</a>
 ，<a href="http://rubyforge.org/frs/?group_id=3507&amp;release_id=22583" title="activeresource下载地址" id="d53-">activeresource下载地址</a>
 ，<a href="http://rubyforge.org/frs/?group_id=570&amp;release_id=22578" title="activesupport下载地址" id="ivoh">activesupport下载地址</a>
 <br id="ziyj" />
7.3 安装<br id="ziyj0" />
</div>
<div id="ziyj1" style="margin-left: 40px;">
<div id="ziyj2" style="margin-left: 40px;">命令：<span id="pe2." style="color: #9900ff;">sudo gem install rails -y -l</span>
<br id="llfi8" />
</div>
</div>
8. 安装ssh<br id="jz5a" />
<div id="jz5a0" style="margin-left: 40px;">8.1 就目前来看，直接使用Debian的最新ssh程序没问题。<br id="l.9l" />
</div>
<div id="l.9l0" style="margin-left: 40px;">
<div id="l.9l1" style="margin-left: 40px;">命令：<span id="zysb0" style="color: #9900ff;">sudo apt-get install openssh_server openssh_client</span>
<br id="zysb1" />
</div>
</div>
<div id="zysb2" style="margin-left: 40px;">
<div id="zysb3">8.2 为了安全起见，配置sshd_config，以禁止root用户使用ssh登录。<br id="juuw" />
</div>
</div>
<div id="juuw0" style="margin-left: 40px;">
<div id="juuw1">
<div id="juuw2" style="margin-left: 40px;">文件：/etc/ssh/sshd_config<br id="apdq" />
修改：<span id="jblm" style="color: #0000ff;">PermitRootLogin <span id="lalx" style="color: #ff0000;">yes</span>
</span>
<br id="apdq0" style="color: #0000ff;" />
<span id="jblm0" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &rarr; PermitRootLogin <span id="lalx0" style="color: #ff0000;">no</span>
</span>
<br id="lalx1" />
</div>
</div>
</div>
<div id="spl2">
<div id="spl20">
<div id="spl21">9. 安装PostgreSQL<br id="spl22" />
<div id="spl23" style="margin-left: 40px;">9.1 目前Debian的stable版PostgreSQL是8.0版（<a href="http://www.debian.org/distrib/packages" title="版本查询" id="a:xa">版本查询</a>
 ），如果可以使用，则直接安装<br id="anwk" />
</div>
<div id="anwk0" style="margin-left: 40px;">
<div id="anwk1" style="margin-left: 40px;">命令：<span id="zr2-" style="color: #9900ff;">sudo apt-get install postgresql</span>
<br id="zr2-0" />
</div>
</div>
<div id="zr2-1" style="margin-left: 40px;">
<div id="zr2-2">9.2 安装libpgsql_ruby<br id="zr2-3" />
</div>
</div>
<div id="zr2-4" style="margin-left: 40px;">
<div id="zr2-5">
<div id="zr2-10" style="margin-left: 40px;">命令：<span id="wai." style="color: #9900ff;">sudo apt-get install libpgsql_ruby</span>
&nbsp;&nbsp;&nbsp; <br id="spl24" />
</div>
</div>
</div>
<div id="oiu." style="margin-left: 80px;">如果不是使用Debian的最新PostgreSQL，那么要注意libpgsql_ruby的版本是否可用<br id="spl25" />
</div>
10. 安装Apache2<br id="mxr1" />
<div id="mxr10" style="margin-left: 40px;">10.1 目前Debian的stable版Apache2是8.0版（<a href="http://www.debian.org/distrib/packages" title="版本查询" id="bxin">版本查询</a>
 ），如果可以使用，则直接安装<br id="faff" />
</div>
<div id="faff0" style="margin-left: 40px;">
<div id="faff1" style="margin-left: 40px;">命令：<span id="faff2" style="color: #9900ff;">sudo apt-get install apache2<br id="faff3" />
</span>
</div>
</div>
<div id="m-sh" style="margin-left: 40px;">10.2 安装模块<br id="m-sh0" />
</div>
<div id="m-sh1" style="margin-left: 40px;">
<div id="m-sh2" style="margin-left: 40px;">命令：<span id="g9to" style="color: #9900ff;">sudo a2enmod proxy_balancer<br id="g9to0" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<span id="eyvt" style="color: #9900ff;">sudo a2enmod proxy_ftp</span>
<br id="g9to1" style="color: #9900ff;" />
<span id="eyvt0" style="color: #9900ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sudo a2enmod proxy_http</span>
<br id="g9to2" style="color: #9900ff;" />
<span id="eyvt1" style="color: #9900ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sudo a2enmod proxy_connect</span>
<br id="g9to3" style="color: #9900ff;" />
<span id="eyvt2" style="color: #9900ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sudo a2enmod rewrite</span>
</div>
</div>
11. 安装mongrel<br id="eif2" />
<div id="eif20" style="margin-left: 40px;">11.1 mongrel的版本需要与前面安装的rubygems版本向匹配。<a href="http://rubyforge.org/frs/?group_id=1306" title="下载地址" id="u_v2">下载地址</a>
  , <a href="http://files.rubyforge.vm.bytemark.co.uk/" title="另一个地址" id="bi9l">另一个地址</a>
 </div>
<div id="u-w20">
<div id="u-w21" style="margin-left: 40px;">11.2 下载mongrel_cluster。<a href="http://rubyforge.org/frs/?group_id=1306" title="下载地址" id="alc2">下载地址</a>
&nbsp; , <a href="http://files.rubyforge.vm.bytemark.co.uk/" title="另一个地址" id="yl2i">另一个地址</a>
<br id="q0wo" />
11.3 安装mongrel<br id="q0wo0" />
</div>
<div id="q0wo1" style="margin-left: 40px;">
<div id="q0wo2" style="margin-left: 40px;">命令：<span id="mt3r" style="color: #9900ff;">sudo gem install mongrel -y -l</span>
<br id="q0wo3" />
</div>
</div>
<div id="q0wo4" style="margin-left: 40px;">11.4 安装mongrel_cluster<br id="q0wo5" />
</div>
<div id="q0wo6" style="margin-left: 40px;">
<div id="q0wo7" style="margin-left: 40px;">命令：<span id="mt3r0" style="color: #9900ff;">sudo gem install mongrel_cluster -y -l</span>
<br id="spl27" />
</div>
</div>
</div>
12. 安装capistrano<br id="mt3r1" />
<div id="mt3r2" style="margin-left: 40px;">12.1 下载capistrano。<a href="http://rubyforge.org/frs/?group_id=1420&amp;release_id=23428" title="下载地址" id="n4rg">下载地址</a>
&nbsp; , <a href="http://files.rubyforge.vm.bytemark.co.uk/" title="另一个地址" id="g-75">另一个地址</a>
<br id="epw1" />
12.2 安装capistrano<br id="epw10" />
</div>
<div id="epw11" style="margin-left: 40px;">
<div id="epw12" style="margin-left: 40px;">命令：<span id="sbli" style="color: #9900ff;">sudo gem install capistrano -y -l</span>
<br id="spl28" />
</div>
</div>
13. 设置PATH<br id="pq.b" />
<div id="duf:" style="margin-left: 40px;">13.1 增加gem路径<br id="g-750" />
</div>
<div id="g-751" style="margin-left: 40px;">
<div id="g-752" style="margin-left: 40px;">命令：<span id="qhdi" style="color: #9900ff;">export PATH=</span>
<span id="fsau" style="color: #9900ff;">$PATH:/var/lib/gems/1.8/bin/</span>
</div>
</div>
<div id="g-753" style="margin-left: 40px;">13.2 修改sh配置文件：/etc/profile<br id="duf:0" />
</div>
<div id="v7ro" style="margin-left: 40px;">
<div id="v7ro0" style="margin-left: 40px;">在&quot;export PATH&quot;之前加上：<span id="g-754" style="color: #0000ff;">PATH=&quot;$PATH:/var/lib/gems/1.8/bin/&quot;</span>
<br id="v7ro1" />
</div>
</div>
<div id="v7ro2">14. 配置数据库<br id="ij_x" />
<div id="ij_x0" style="margin-left: 40px;">14.1 进入数据库<br id="y1nw" />
</div>
<div id="y1nw0" style="margin-left: 40px;">
<div id="y1nw1" style="margin-left: 40px;">命令：<span id="fsau0" style="color: #9900ff;">su postgres</span>
<br id="y1nw2" style="color: #9900ff;" />
<span id="fsau1" style="color: #9900ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psql</span>
<br id="veap" />
</div>
</div>
<div id="veap0" style="margin-left: 40px;">
<div id="veap1">14.2 新建用户<br id="y1nw3" />
</div>
</div>
<div id="veap2" style="margin-left: 40px;">
<div id="veap3" style="margin-left: 40px;">命令：<span id="fsau2" style="color: #9900ff;">CREATE USER <span id="mlr2" style="color: #ff0000;">&lt;db_account&gt;</span>
 WITH PASSWORD '<span id="mlr20" style="color: #ff0000;">&lt;db_password&gt;</span>
';</span>
<br id="veap4" />
</div>
</div>
<div id="veap5" style="margin-left: 40px;">
<div id="veap6">14.3 新建数据库<br id="z2e8" />
</div>
</div>
<div id="veap7" style="margin-left: 40px;">
<div id="veap8" style="margin-left: 40px;">命令：<span id="fsau3" style="color: #9900ff;">CREATE DATABASE <span id="mlr21" style="color: #ff0000;">&lt;bd_name&gt;</span>
 WITH OWNER = <span id="mlr22" style="color: #ff0000;">&lt;db_</span>
</span>
<span id="mlr23" style="color: #ff0000;">account</span>
<span id="mlr24" style="color: #9900ff;"><span id="mlr25" style="color: #ff0000;">&gt;</span>
 ENCODING = 'UTF8';</span>
<br id="i9lz" />
</div>
</div>
<div id="mzth" style="margin-left: 40px;">
<div id="mzth0">14.3 退出<br id="mzth1" />
</div>
</div>
<div id="mzth2" style="margin-left: 40px;">
<div id="mzth3">
<div id="mzth4" style="margin-left: 40px;">命令：<span id="fsau4" style="color: #9900ff;">\q</span>
<br id="mzth5" style="color: #9900ff;" />
<span id="fsau5" style="color: #9900ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit</span>
<br id="mzth6" />
</div>
</div>
</div>
<div id="mzth7">
<div id="mzth8">15. 安装SVN Client<br id="x4tr" />
<div id="fsau6" style="margin-left: 40px;">命令：<span class="oblog_text" id="fsau7"><span id="fsau8" style="color: #9900ff;">sudo apt-get install subversion</span>
<br id="fsau9" />
</span>
</div>
<span class="oblog_text" id="fsau10">16. </span>
<span class="oblog_text" id="mau44">在应用程序根目录<span id="d3kn" style="color: #ff0000;">&lt;application_path&gt;</span>
</span>
<span class="oblog_text" id="f:lx">从SVN得到代码<br id="mm0n" />
</span>
<div id="mm0n0" style="margin-left: 40px;"><span class="oblog_text" id="mm0n1">命令：<span id="oqf9" style="color: #9900ff;">svn co </span>
<span id="oqf90" style="color: #ff0000;">&lt;svn_URI&gt; &lt;application_name&gt;</span>
<br id="fsau11" />
</span>
</div>
<span class="oblog_text" id="mm0n4">17. </span>
<span class="oblog_text" id="ickm">mongrel_cluster设置</span>
<div id="ickm0" style="margin-left: 40px;"><span class="oblog_text" id="ickm1">17.1 </span>
<span class="oblog_text" id="ickm2">创建mongrel_cluster启动命令</span>
</div>
<div id="oee50" style="margin-left: 80px;"><span class="oblog_text" id="oee51">命令：<span id="oqf91" style="color: #9900ff;">mongrel_rails </span>
</span>
<span id="oqf92" style="color: #9900ff;">cluster::configure -e production -p <span id="oqf93" style="color: #ff0000;">&lt;start_post&gt;</span>
 -a 127.0.0.1 -N <span id="oqf94" style="color: #ff0000;">&lt;port_number&gt;</span>
 -c <span id="oqf95" style="color: #ff0000;">&lt;application_path&gt;</span>
</span>
<br id="xjkp" />
</div>
<div id="xjkp0" style="margin-left: 40px;">17.2 提交代码<br id="r1.7" />
</div>
<div id="r1.70" style="margin-left: 40px;">
<div id="r1.71" style="margin-left: 40px;"><span id="oqf96" style="color: #9900ff;">svn add ./config/mongrel_cluster.yml</span>
<br id="xjkp1" />
</div>
</div>
<div id="xjkp2" style="margin-left: 80px;"><span id="oqf97" style="color: #9900ff;">svn ci -m &quot;mongrel_cluster appended&quot;</span>
<br id="xjkp3" />
</div>
<div id="p4-5" style="margin-left: 40px;"><span class="oblog_text" id="oee54">17.3 启动monger_rails<br id="p4-50" />
</span>
</div>
<div id="p4-51" style="margin-left: 40px;">
<div id="p4-52" style="margin-left: 40px;"><span class="oblog_text" id="p4-53">命令：</span>
<span class="oblog_text" id="ao745"><span id="nc7o27" style="color: #0000ff;">mongrel_rails cluster::start<br id="lrfa" />
<span style="color: #000000;">启动之后便可以访问http://localhost:<span id="v_v1" style="color: #ff0000;">&lt;start_port&gt;</span>
</span>
<br id="lrfa1" />
</span>
</span>
</div>
</div>
<div id="y4uc" style="margin-left: 40px;"><span class="oblog_text" id="p4-510">17.4 停止monger_rails<br id="y4uc0" />
</span>
</div>
<div id="y4uc1" style="margin-left: 40px;">
<div id="y4uc2" style="margin-left: 40px;"><span class="oblog_text" id="y4uc3">命令：</span>
<span class="oblog_text" id="y4uc4"><span id="y4uc5" style="color: #0000ff;">mongrel_rails cluster::stop</span>
</span>
</div>
</div>
<span class="oblog_text" id="y4uc11">18. Capstrano配置<br id="oqf98" />
</span>
<div id="mau4" style="margin-left: 40px;"><span class="oblog_text" id="mau40">18.1 创建Capstrano脚本<br id="mau41" />
</span>
</div>
<div id="mau42" style="margin-left: 40px;">
<div id="mau43" style="margin-left: 40px;"><span class="oblog_text" id="f:lx0">在应用程序根目录<span id="f:lx1" style="color: #ff0000;">&lt;application_path&gt;</span>
执行：capify</span>
 .<br id="ji7s" />
会在<span id="d3kn0" style="color: #ff0000;">&lt;</span>
<span class="oblog_text" id="xfto"><span id="d3kn1" style="color: #ff0000;">application_path&gt;</span>
下面创建一个&quot;capfile&quot;文件，在<span id="d3kn2" style="color: #ff0000;">&lt;application_path&gt;</span>
/config下面创建一个&quot;deploy.rb&quot;文件<br id="xfto0" />
</span>
</div>
</div>
<div id="xfto1" style="margin-left: 40px;">
<div id="xfto2"><span class="oblog_text" id="xfto3">18.2 修改&quot;deploy.rb&quot;文件<br id="xfto4" />
</span>
</div>
</div>
<div id="i4a:" style="margin-left: 40px;">
<div id="i4a:0">
<div id="i4a:1" style="margin-left: 40px;"><span class="oblog_text" id="i4a:2">修改后如下：<br id="i4a:3" />
<span id="nc7o" style="color: #0000ff;">require 'erb'<br id="tril" />
<br id="tril0" />
set :application, &quot;</span>
</span>
<span class="oblog_text" id="nc7o0"><span id="nc7o1" style="color: #ff0000;">&lt;application_name&gt;</span>
</span>
<span class="oblog_text" id="nc7o2"><span id="nc7o3" style="color: #0000ff;">&quot;</span>
<br id="i4a:4" style="color: #0000ff;" />
<span id="nc7o4" style="color: #0000ff;">set :repository,&nbsp; &quot;</span>
</span>
<span class="oblog_text" id="ok05"><span id="ok050" style="color: #ff0000;">&lt;svn_URI&gt;</span>
</span>
<span class="oblog_text" id="ok051"><span id="ok052" style="color: #0000ff;">&quot;</span>
<br id="i4a:5" style="color: #0000ff;" />
<br id="i4a:7" style="color: #0000ff;" />
<span id="nc7o6" style="color: #0000ff;"># If you aren't deploying to /u/apps/#{application} on the target</span>
<br id="i4a:8" style="color: #0000ff;" />
<span id="nc7o7" style="color: #0000ff;"># servers (which is the default), you can specify the actual location</span>
<br id="i4a:9" style="color: #0000ff;" />
<span id="nc7o8" style="color: #0000ff;"># via the :deploy_to variable:</span>
<br id="i4a:10" style="color: #0000ff;" />
<span id="nc7o9" style="color: #0000ff;"># set :deploy_to, &quot;/var/www/#{application}&quot;</span>
<br id="i4a:11" style="color: #0000ff;" />
<span id="nc7o10" style="color: #0000ff;">set :deploy_to, &quot;</span>
</span>
<span class="oblog_text" id="qfti"><span id="qfti0" style="color: #ff0000;">&lt;deploy_path&gt;</span>
</span>
<span class="oblog_text" id="qfti1"><span id="qfti2" style="color: #0000ff;">/#{application}&quot;</span>
<br id="i4a:12" style="color: #0000ff;" />
<span id="nc7o11" style="color: #0000ff;">set :user, &quot;</span>
</span>
<span class="oblog_text" id="qfti3"><span id="qfti4" style="color: #ff0000;">&lt;username&gt;</span>
</span>
<span class="oblog_text" id="qfti5"><span id="qfti6" style="color: #0000ff;">&quot;<br id="us1i" />
set :use_sudo, false<br id="i4a:13" style="color: #0000ff;" />
</span>
<span id="nc7o12" style="color: #0000ff;">set :spinner, &quot;false&quot;</span>
<br id="i4a:14" style="color: #0000ff;" />
<br id="i4a:15" style="color: #0000ff;" />
<span id="nc7o13" style="color: #0000ff;"># If you aren't using Subversion to manage your source code, specify</span>
<br id="i4a:16" style="color: #0000ff;" />
<span id="nc7o14" style="color: #0000ff;"># your SCM below:</span>
<br id="i4a:17" style="color: #0000ff;" />
<span id="nc7o15" style="color: #0000ff;"># set :scm, :subversion</span>
<br id="i4a:18" style="color: #0000ff;" />
<br id="i4a:19" style="color: #0000ff;" />
<span id="nc7o16" style="color: #0000ff;">role :app, &quot;</span>
</span>
<span class="oblog_text" id="xk_e"><span id="xk_e0" style="color: #ff0000;">&lt;application_URI_or_IP&gt;</span>
</span>
<span class="oblog_text" id="xk_e1"><span id="xk_e2" style="color: #0000ff;">&quot;</span>
<br id="i4a:20" style="color: #0000ff;" />
<span id="nc7o17" style="color: #0000ff;">role :web, &quot;</span>
</span>
<span class="oblog_text" id="xk_e3"><span id="xk_e4" style="color: #ff0000;">&lt;application_URI_or_IP&gt;</span>
</span>
<span class="oblog_text" id="xk_e5"><span id="xk_e6" style="color: #0000ff;">&quot;</span>
<br id="i4a:21" style="color: #0000ff;" />
<span id="nc7o18" style="color: #0000ff;">role :db,&nbsp; &quot;</span>
</span>
<span class="oblog_text" id="xk_e7"><span id="xk_e8" style="color: #ff0000;">&lt;application_URI_or_IP&gt;</span>
</span>
<span class="oblog_text" id="xk_e9"><span id="xk_e10" style="color: #0000ff;">&quot;, :primary =&gt; true</span>
<br id="i4a:22" style="color: #0000ff;" />
<br id="i4a:23" style="color: #0000ff;" />
<span id="nc7o19" style="color: #0000ff;">set :mongrel_conf, &quot;#{current_path}/config/mongrel_cluster.yml&quot;</span>
<br id="i4a:24" style="color: #0000ff;" />
<span id="nc7o20" style="color: #0000ff;">set :mongrel_port, &quot;</span>
</span>
<span class="oblog_text" id="ao74"><span id="ao740" style="color: #ff0000;">&lt;start_port&gt;</span>
</span>
<span class="oblog_text" id="ao741"><span id="ao742" style="color: #0000ff;">&quot;</span>
<br id="i4a:25" style="color: #0000ff;" />
<span id="nc7o21" style="color: #0000ff;">set :mongrel_nodes, &quot;</span>
</span>
<span class="oblog_text" id="ao743"><span id="ao744" style="color: #ff0000;">&lt;port_number&gt;</span>
</span>
<span class="oblog_text" id="lrfa2"><span id="ao746" style="color: #0000ff;">&quot; </span>
<br id="i4a:26" style="color: #0000ff;" />
<span id="chp_" style="color: #0000ff;">set :db_name, &quot;<span id="chp_0" style="color: #ff0000;">&lt;db_name&gt;</span>
&quot;</span>
<br id="chp_1" style="color: #0000ff;" />
<span id="chp_2" style="color: #0000ff;">set :db_account, &quot;</span>
</span>
<span class="oblog_text" id="chp_3"><span id="chp_4" style="color: #0000ff;"><span id="chp_5" style="color: #ff0000;">&lt;db_account&gt;</span>
</span>
</span>
<span class="oblog_text" id="chp_6"><span id="chp_7" style="color: #0000ff;">&quot;</span>
<br id="chp_8" style="color: #0000ff;" />
<span id="chp_9" style="color: #0000ff;">set :db_password, &quot;</span>
</span>
<span class="oblog_text" id="chp_10"><span id="chp_11" style="color: #0000ff;"><span id="chp_12" style="color: #ff0000;">&lt;db_password&gt;</span>
</span>
</span>
<span class="oblog_text" id="chp_13"><span id="chp_14" style="color: #0000ff;">&quot;</span>
<br id="chp_15" style="color: #0000ff;" />
<br id="i4a:27" style="color: #0000ff;" />
<span id="nc7o23" style="color: #0000ff;">namespace :deploy do</span>
<br id="i4a:29" style="color: #0000ff;" />
<span id="nc7o24" style="color: #0000ff;">&nbsp;task :start, :roles =&gt; :app do</span>
<br id="i4a:31" style="color: #0000ff;" />
<span id="nc7o26" style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;
run &quot;cd #{current_path} &amp;&amp; mongrel_rails cluster::configure -e
production -p #{mongrel_port} -N #{mongrel_nodes} -c #{current_path} -P
#{deploy_to}/shared/pids -l #{deploy_to}/shared/log&quot;</span>
<br id="i4a:32" style="color: #0000ff;" />
<span id="lrfa3" style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp; run &quot;cd #{current_path} &amp;&amp; mongrel_rails cluster::start&quot;</span>
<br id="i4a:37" style="color: #0000ff;" />
<span id="nc7o32" style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp; run &quot;sudo -p 'sudo password: ' /etc/init.d/apache2 start&quot;</span>
<br id="i4a:38" style="color: #0000ff;" />
<span id="nc7o33" style="color: #0000ff;">&nbsp;&nbsp; end</span>
<br id="i4a:39" style="color: #0000ff;" />
<span id="nc7o34" style="color: #0000ff;">end</span>
<br id="i4a:41" style="color: #0000ff;" />
<br id="i4a:42" style="color: #0000ff;" />
<span id="nc7o37" style="color: #0000ff;">namespace :deploy do </span>
<br id="i4a:43" style="color: #0000ff;" />
<span id="nc7o38" style="color: #0000ff;">&nbsp;task :restart, :roles =&gt; :app do</span>
<br id="i4a:45" style="color: #0000ff;" />
<span id="nc7o40" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; run &quot;cd #{current_path} &amp;&amp; mongrel_rails cluster::restart&quot;</span>
<br id="i4a:46" style="color: #0000ff;" />
<span id="nc7o41" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; run &quot;sudo</span>
</span>
<span class="oblog_text" id="it.e"><span id="it.e0" style="color: #0000ff;"> -p 'sudo password: '</span>
</span>
<span class="oblog_text" id="it.e1"><span id="it.e2" style="color: #0000ff;"> /etc/init.d/apache2 restart&quot;</span>
<br id="i4a:47" style="color: #0000ff;" />
<span id="nc7o42" style="color: #0000ff;">&nbsp;&nbsp; end</span>
<br id="i4a:48" style="color: #0000ff;" />
<span id="nc7o43" style="color: #0000ff;">end<br id="hl58" />
<br id="hl580" />
namespace :deploy do<br id="hl581" />
&nbsp;after &quot;deploy:update_code&quot;, :link_production_db<br id="hl582" />
&nbsp;after &quot;deploy:setup&quot;, :create_db_setting<br id="hl583" />
end<br id="hl584" />
<br id="hl585" />
# database.yml task<br id="hl586" />
desc &quot;Link in the production database.yml&quot;<br id="hl587" />
task :link_production_db do<br id="hl588" />
&nbsp; run &quot;ln -nfs #{deploy_to}/shared/config/database.yml #{release_path}/config/database.yml&quot;<br id="hl589" />
end<br id="hl5810" />
<br id="hl5811" />
task :create_db_setting do<br id="hl5812" />
&nbsp; database_configuration = ERB.new &lt;&lt;DB_TEMPLATE<br id="hl5813" />
&nbsp; development:<br id="hl5814" />
&nbsp;&nbsp;&nbsp; adapter: sqlite3<br id="hl5815" />
&nbsp;&nbsp;&nbsp; database: db/development.sqlite3<br id="hl5816" />
&nbsp;&nbsp;&nbsp; timeout: 5000<br id="hl5817" />
&nbsp; test:<br id="hl5818" />
&nbsp;&nbsp;&nbsp; adapter: sqlite3<br id="hl5819" />
&nbsp;&nbsp;&nbsp; database: db/test.sqlite3<br id="hl5820" />
&nbsp;&nbsp;&nbsp; timeout: 5000<br id="hl5821" />
&nbsp; production:<br id="hl5822" />
&nbsp;&nbsp;&nbsp; adapter: postgresql <br id="hl5823" />
&nbsp;&nbsp;&nbsp; host: localhost <br id="hl5824" />
&nbsp;&nbsp;&nbsp; database: #{db_name}<br id="hl5825" />
&nbsp;&nbsp;&nbsp; username: #{db_account}<br id="hl5826" />
&nbsp;&nbsp;&nbsp; password: #{db_password}<br id="hl5827" />
&nbsp;&nbsp;&nbsp; encoding: utf8<br id="hl5828" />
DB_TEMPLATE<br id="hl5829" />
<br id="hl5830" />
&nbsp; run &quot;mkdir -p #{deploy_to}/shared/config&quot; <br id="hl5831" />
&nbsp; put database_configuration.result, &quot;#{deploy_to}/shared/config/database.yml&quot; <br id="hl5832" />
end<br id="hl5833" />
<br id="i4a:49" />
</span>
</span>
</div>
</div>
</div>
<div id="j3y1" style="margin-left: 40px;">
<div id="j3y10">
<div id="j3y11"><span class="oblog_text" id="j3y12">18.3 创建deploy目录结构</span>
<br id="acl0" />
</div>
</div>
</div>
<div id="acl00" style="margin-left: 40px;">
<div id="acl01">
<div id="acl02">
<div id="acl03" style="margin-left: 40px;">命令：<span id="acl04" style="color: #9900ff;">cap deploy:setup</span>
<br id="lvpo" />
通过命令：<span id="lvpo0" style="color: #9900ff;">cap -q deploy:check</span>
，可以检查是否配置正确。<br id="xfto5" />
</div>
</div>
</div>
</div>
<div id="jp6g2">
<div id="jp6g3">
<div id="jp6g4">
<div id="jp6g5">
<div id="jp6g6" style="margin-left: 40px;"><br id="jp6g12" />

</div>
</div>
</div>
</div>
</div>
<span class="oblog_text" id="mau410">19. Appache设置<br id="orqw" />
</span>
<div id="orqw0" style="margin-left: 40px;"><span class="oblog_text" id="orqw1">19.1 修改Appache的default站点配置（如果服务器上只有一个应用）<br id="w8oc" />
</span>
</div>
<div id="w8oc0" style="margin-left: 40px;">
<div id="w8oc1" style="margin-left: 40px;"><span class="oblog_text" id="w8oc2">文件：/etc/apache2/sites-avaiable/default</span>
<br id="wm-h" />
修改为：<br id="wm-h0" />
<span id="wm-h1" style="color: #0000ff;">NameVirtualHost *</span>
<br id="wm-h2" style="color: #0000ff;" />
<span id="wm-h3" style="color: #0000ff;">&lt;VirtualHost *&gt;</span>
<br id="wm-h4" style="color: #0000ff;" />
<span id="wm-h5" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; ServerAdmin webmaster@localhost</span>
<br id="wm-h6" style="color: #0000ff;" />
<span id="wm-h7" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; </span>
<br id="wm-h8" style="color: #0000ff;" />
<span id="wm-h9" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; DocumentRoot </span>
<span class="oblog_text" id="h1od"><span id="h1od0" style="color: #ff0000;">&lt;deploy_path&gt;</span>
</span>
<span id="h1od1" style="color: #0000ff;">/</span>
<span class="oblog_text" id="h1od2"><span id="h1od3" style="color: #ff0000;">&lt;application_name&gt;</span>
</span>
<span id="h1od4" style="color: #0000ff;">/current</span>
<br id="wm-h10" style="color: #0000ff;" />
<span id="wm-h11" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; RewriteEngine On</span>
<br id="wm-h12" style="color: #0000ff;" />
<span id="wm-h13" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &lt;Proxy balancer://mongrel1&gt;</span>
<br id="wm-h14" style="color: #0000ff;" />
<span id="wm-h15" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BalancerMember http://127.0.0.1:</span>
<span id="cgu5" style="color: #ff0000;">&lt;start_post&gt;</span>
<br id="wm-h16" style="color: #0000ff;" />
<span id="wm-h17" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BalancerMember http://127.0.0.1:</span>
<span id="cgu50" style="color: #ff0000;">&lt;start_post+1&gt;</span>
<br id="wm-h18" style="color: #0000ff;" />
<span id="wm-h19" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BalancerMember http://127.0.0.1:</span>
<span id="cgu51" style="color: #ff0000;">&lt;start_post+2&gt;</span>
<br id="cgu52" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span id="vkxe" style="color: #ff0000;">&lt;...&gt;</span>
<br id="wm-h20" style="color: #0000ff;" />
<span id="wm-h21" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &lt;/Proxy&gt;</span>
<br id="wm-h22" style="color: #0000ff;" />
<br id="wm-h23" style="color: #0000ff;" />
<span id="wm-h24" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; # Redirect all non-static requests to thin</span>
<br id="wm-h25" style="color: #0000ff;" />
<span id="wm-h26" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f</span>
<br id="wm-h27" style="color: #0000ff;" />
<span id="wm-h28" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; RewriteRule ^/(.*)$ balancer://mongrel1%{REQUEST_URI} [P,QSA,L]</span>
<br id="wm-h29" style="color: #0000ff;" />
<br id="wm-h30" style="color: #0000ff;" />
<span id="wm-h31" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; ProxyPass / balancer://mongrel1/</span>
<br id="wm-h32" style="color: #0000ff;" />
<span id="wm-h33" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; ProxyPassReverse / balancer://mongrel1/</span>
<br id="wm-h34" style="color: #0000ff;" />
<span id="wm-h35" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; ProxyPreserveHost on</span>
<br id="wm-h36" style="color: #0000ff;" />
<br id="wm-h37" style="color: #0000ff;" />
<span id="wm-h38" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &lt;Proxy *&gt;</span>
<br id="wm-h39" style="color: #0000ff;" />
<span id="wm-h40" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Order deny,allow</span>
<br id="wm-h41" style="color: #0000ff;" />
<span id="wm-h42" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Allow from all</span>
<br id="wm-h43" style="color: #0000ff;" />
<span id="wm-h44" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/Proxy&gt;</span>
<br id="wm-h45" style="color: #0000ff;" />
<br id="wm-h46" style="color: #0000ff;" />
<span id="wm-h47" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; # Custom log file locations</span>
<br id="wm-h48" style="color: #0000ff;" />
<span id="wm-h49" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; ErrorLog&nbsp; </span>
<span class="oblog_text" id="e3ci"><span id="e3ci0" style="color: #ff0000;">&lt;deploy_path&gt;</span>
</span>
<span id="e3ci1" style="color: #0000ff;">/</span>
<span class="oblog_text" id="e3ci2"><span id="e3ci3" style="color: #ff0000;">&lt;application_name&gt;</span>
</span>
<span id="e3ci4" style="color: #0000ff;">/current</span>
<span id="e3ci5" style="color: #0000ff;">/log/error.log</span>
<br id="wm-h50" style="color: #0000ff;" />
<span id="wm-h51" style="color: #0000ff;">&nbsp;&nbsp;&nbsp; CustomLog </span>
<span class="oblog_text" id="e3ci6"><span id="e3ci7" style="color: #ff0000;">&lt;deploy_path&gt;</span>
</span>
<span id="e3ci8" style="color: #0000ff;">/</span>
<span class="oblog_text" id="e3ci9"><span id="e3ci10" style="color: #ff0000;">&lt;application_name&gt;</span>
</span>
<span id="e3ci11" style="color: #0000ff;">/current</span>
<span id="e3ci12" style="color: #0000ff;">/log/access.log combined</span>
<br id="wm-h52" style="color: #0000ff;" />
<br id="wm-h53" style="color: #0000ff;" />
<span id="wm-h54" style="color: #0000ff;">&lt;/VirtualHost&gt;</span>
<br id="fsau13" />
</div>
</div>
<span class="oblog_text" id="orqw4">20. 通过capistrano提交<br id="e3ci13" />
</span>
<div id="e3ci14" style="margin-left: 40px;"><span class="oblog_text" id="e3ci15">20.1 冷提交</span>
<br id="fsau14" />
</div>
<div id="t55o" style="margin-left: 80px;"><span class="oblog_text" id="e3ci18">命令：<span id="d0.0" style="color: #0000ff;">cap deploy:cold</span>
</span>
<br id="t55o0" />
提交过程会从SVN将代码取下来，并执行rake db:migrate来创建数据库，然后启动Mongral_cluster和Apache2<br id="bphj" />
</div>
<div id="bphj0" style="margin-left: 40px;">20.2 修改后的热提交<br id="bphj1" />
</div>
<div id="bphj2" style="margin-left: 40px;">
<div id="bphj3" style="margin-left: 40px;">修改代码，并提交到SVN后，使用命令：<span class="oblog_text" id="okir"><span id="d0.00" style="color: #0000ff;">cap deploy</span>
，来提交新代码，并自动重启Mongral和Apache2</span>
</div>
</div>
<br id="t55o1" />
<br id="t55o2" />
参考与引用：<br id="swoj4" />
<a href="http://www.unfish.net/archives/202-20071022.html" target="_blank">http://www.unfish.net/archives/202-20071022.html</a><br id="nfn2" />
<a href="http://ariejan.net/2007/06/20/rails-production-server-setup-and-deployment-on-ubuntudebian/" target="_blank">http://ariejan.net/2007/06/20/rails-production-server-setup-and-deployment-on-ubuntudebian/</a><br id="w.dz" />
<a href="http://www.jkraemer.net/2006/7/7/mongrel-apache-and-rails-on-debian-sarge" target="_blank">http://www.jkraemer.net/2006/7/7/mongrel-apache-and-rails-on-debian-sarge</a><br id="t55o3" />
<br id="t55o4" />
<br id="t55o5" />
<br id="t55o6" />
<br id="t55o7" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p><br id="v7fn" />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://zhangpeihao.javaeye.com/blog/234251#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 09:12:55 +0800</pubDate>
        <link>http://zhangpeihao.javaeye.com/blog/234251</link>
        <guid>http://zhangpeihao.javaeye.com/blog/234251</guid>
      </item>
      <item>
        <title>《精通CSS与HTML设计模式》精彩片段</title>
        <author>xiawuchalyj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xiawuchalyj.javaeye.com">xiawuchalyj</a>&nbsp;
          链接：<a href="http://xiawuchalyj.javaeye.com/blog/234238" style="color:red;">http://xiawuchalyj.javaeye.com/blog/234238</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          设计模式已经在软件开发领域取得了巨大的成功。它们大大提升了网页设计和开发中的生产力、创新力和效率，与此同时还大大减少了代码量和复杂性。在CSS和HTML中，设计模式可以看作是一系列常用功能的组合，它使网站可运行于不同的浏览器和读屏器上，却无需牺牲设计值、可访问性或者依靠其他旁门左道的技术。不过至今为止，设计模式还没有很系统地应用于HTML和CSS网页设计与开发中。<br />    设计模式是所有创造性活动的基础。当我们交谈、写作和创造时，都要依照某种模式来思考。设计模式就好比是文档的模板，我们可以向其中添加自己的内容。在文学作品中，它们就像是原型角色和情节。在音乐中，它们就好比主题和变奏。在编程中，它们就相当于可复用的算法，可以系统地改变这些算法，并互相结合以求达到理想的效果。<br />    一旦发现了某种设计模式，就会大幅度地提高创新力和生产力。它可以独立使用，并可迅速得到成品；也可与其他的模式相结合，以创造更加复杂的效果。设计模式简化并增强了创新的过程。它们使创造就如同垒砖块或搭乐高积木一样简单。仅需选择预先设计好的模式，改造它们并使它们相互结合，即可得到想要的结果。模式并不会限制创新——它们会为你解开创新的枷锁。<br />    开创性著作Design Patterns: Elements of Reusable Object-Oriented Software（中文版《设计模式：可复用面向对象软件的基础》，作者为Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides，原版由Addison-Wesley出版于1995年）曾阐述过，设计模式由4部分组成：模式的名字、要解决的问题、解决方案和各方面的权衡。本书将遵循这一方式。<br />    既然这是一本实用性的书，那么它直接关注的是一些可用于各种主流浏览器中的具体的CSS和HTML设计模式。本书也通过组合内建的模式创造出更高级别的新模式。<br />    简而言之，这是一本关于模式的书，你可以把这些模式应用到实际的设计当中去。
          <br/>
          <span style="color:red;">
            <a href="http://xiawuchalyj.javaeye.com/blog/234238#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 08:48:53 +0800</pubDate>
        <link>http://xiawuchalyj.javaeye.com/blog/234238</link>
        <guid>http://xiawuchalyj.javaeye.com/blog/234238</guid>
      </item>
      <item>
        <title>Spring+Hibernate+Struts2整合文档</title>
        <author>anysky131</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://anysky131.javaeye.com">anysky131</a>&nbsp;
          链接：<a href="http://anysky131.javaeye.com/blog/234237" style="color:red;">http://anysky131.javaeye.com/blog/234237</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、	Spring+Hibernate整合：<br />Spring整合Hibernate，是做了一个很大的调整的，因为spring可以把管理Hibernate的工作都做了，以前的hibernate.cfg.xml文件都去掉了，而将这些内容都交给了spring来管理了。<br />1、 applicationContext.xml文件中应该配置如下内容：<br /><pre name="code" class="java">
//配置数据连接类
&lt;bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		&lt;property name="driverClassName"
			value="org.gjt.mm.mysql.Driver">
		&lt;/property>
		&lt;property name="url" value="jdbc:mysql://localhost:3306/test">&lt;/property>
		&lt;property name="username" value="root">&lt;/property>
&lt;/bean>
//配置session工厂类
&lt;bean id="sessionFactory"
	class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		&lt;property name="dataSource">
			&lt;ref bean="dataSource" />
		&lt;/property>
		&lt;property name="hibernateProperties">
			&lt;props>
				&lt;prop key="hibernate.dialect">
					org.hibernate.dialect.MySQLDialect
				&lt;/prop>
				&lt;prop key="hibernate.show_sql">true&lt;/prop>
			&lt;/props>
		&lt;/property>
		&lt;property name="mappingResources">
		 &lt;value>com/hejianjiao/vo/Person.hbm.xml&lt;/value>
		&lt;/property>
&lt;/bean>

</pre><br />2、可以使用spring中的HibernateDAOSupport与HibernateTemplate类来进行数据持久化操作：<br />A、HibernateDAOSupport类中定义了对session、sessionFactory的操作方法与getHibernateTemplate方法来获得一个HibernateTemplate实例； <br />B、HibernateTemplate类中定义了对数据持久化的各种封装的方法，我们可以用它来对数据进行操作。<br />因此在使用时，我们可以继承HibernateDAOSupport类，然后实例化HibernateTemplate类来进行数据持久化。<br /><br />二、	Spring+Struts2整合：<br />1、spring配置在web.xml文件中的上下文监听器:<br /><pre name="code" class="java">
&lt;context-param>
  &lt;param-name>contextConfigLocation&lt;/param-name>
  &lt;param-value>/WEB-INF/applicationContext*.xml&lt;/param-value>
&lt;/context-param>

&lt;listener>
&lt;listener-class>org.springframwork.web.content.ContextLoaderListener&lt;/listener-class>
&lt;/listener>

</pre><br /><br />2、struts2配置在web.xml文件中的过滤器:<br /><pre name="code" class="java">
&lt;filter>
&lt;filter-name>struts2&lt;/filter-name>
&lt;filter-class>org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class>
&lt;/filter>

&lt;filter-mapping>
  &lt;filter-name>struts2&lt;/filter-name>
  &lt;url-patter>/*&lt;/url-patter>
&lt;/filter-mapping>

</pre><br /><br />3、设置struts.xml文件，就可以使用spring的IOC来管理struts的Action：<br /><pre name="code" class="java">
&lt;content name="struts.objectFactory" value="spring" >
</pre><br /><br />4、第三步设置后，以后在struts.xml 文件中配置一个action时，它的class就不是一个类了，而是在applicationContext.xml文件中定义过的类的ID,在struts.xml文件中就只需要引用定义好的类的id 就可以了。<br />然后特别要注意的一个问题：action是一个请求就是一个action对象，而在spring中则不是的，它是自动分配类的实例的，是使用的单态模式来生产类的实例的，不符合action，因此在applicationContext.xml文件中定义每个action时，都要在类后加上:<br /><pre name="code" class="java">
scope="prototype" 属性
</pre><br /><br />三、	三者组合开发：<br />一般在组合开发时，没有什么难的，只要把上面两步做好就可以是三个组合开发了。<br />[img]<br /><br />[/img]<br /><br />[img][/img]<br /><br />上图则是对于进行组合开发时，一般使用的系统架构：<br />1、	先从最底层开发，先开发POJO类，和Hibernate映射文件。它相当于系统的数据库层。<br />2、	再开发DAO层，它是对于数据进行持久化的一层，专门处理各种数据增、删、改、查的功能。并且使用DAO工厂模式，以保证和上层没有任何的联系，并且可以方便于类与接口的扩展。<br />3、	第三是开发manager层，它相当于软件的业务逻辑层，即专门处理各种业务逻辑。实现系统的业务处理功能。并且它隔离事务，使与下层的数据持久和上层的数据操作没有任何的联系。<br />4、	Action层，也即软件的表示层，处理action的接收与回复。各action由spring管理。<br /><br />五、	组合开发中的一些问题：<br /><br />1、	在组合开发中，常见的一个问题就是session的管理，当我们使用HibernateTemplate操作数据库时，可以不对session进行显示的操作，spring可以自动处理session的打开与关闭。<br />我们可以在web.xml文件中显示的配置一个session管理的过滤器，它专门帮助我们关闭session：<br /><br /><pre name="code" class="java">
&lt;filter>
        &lt;filter-name>lazyLoadingFilter&lt;/filter-name>
&lt;filter-class>
org.springframwork.orm.hibernate3.support.OpenSessionInViewFilter
&lt;/filter-class>
&lt;/filter>

&lt;filter-mapping>
         &lt;filter-name>lazyLoadingFilter&lt;/filter-name>
         &lt;url-pattern>*.action&lt;/url-pattern>
&lt;/filter-mapping>
注：它一定要在struts2的过滤器之前。因为web.xml文件的过滤器执行是有顺序的。而session一定在前面进行。


</pre><br />它会在所有的action处理完了，页面显示完了，就会自动关闭session。<br /><br />六、	spring事务处理<br /><br />1、事务的处理也交给了spring来管理，要在applicationContext.xml文件中上配置事务管理类：<br /><pre name="code" class="java">
//实施事务管理的bean
&lt;bean id=”transactionManager” 
class=”org.springframwork.orm.hibernate3.HibernateTransactionManager”>
       &lt;property name=”sessionFactory”>
           &lt;ref bean=”sessionFactory” />
&lt;/property>
&lt;/bean>

</pre><br />它是通过sessionFactory来管理，因此在传进来一个sessionFactory来接管事务处理。<br />2、	声明式事务处理：<br />在spring中对事务进行管理时，可以显示地进行事务处理的定义：<br /><pre name="code" class="java">
//给事务添加的属性
&lt;tx:advice id=”txAdvice” transaction-manager=”transactionManager”>
     &lt;tx:attributes >
//propagation表示的是事务的传播特性，使用required时，是当检测到add开头的方法时，就看此时有没有开启的事务，如果有则将方法放进事务中去，如果没有，则新建一个事务。然后将方法放进去。
          &lt;tx:method name=”add*” propagation=”REQUIRED”>
          &lt;tx:method name=”delete*” propagation=”REQUIRED”>
           &lt;tx:method name=”update*” propagation=”REQUIRED”>
//如果检测到其它的方法，则给其只读数据库的属性。即当本方法在读时，其它的方法不能再去写了。保证一个事务的完整性。
           &lt;tx:method name=”*” read-only=”true”>
&lt;/tx:attributes>
&lt;/tx:advice>

</pre><br />对于事务的其它传播属性，则可以参考其它文档进行相关的了解。<br /><br />上一个配置是针对于所有包中类的事务处理方法的设置。下面一段是&lt;aop:config/> 的定义，它确保由 'txAdvice' bean定义的事务通知在应用中合适的点被执行。首先我们定义了 一个切面，它匹配 HibernateDAO 接口定义的所有操作，我们把该切面叫做 'allManagerMethod'。然后我们用一个通知器（advisor）把这个切面与 'txAdvice' 绑定在一起，表示当 'allManagerMethod' 执行时，'txAdvice' 定义的通知事务逻辑将被执行。这就是AOP切面工程：<br /><pre name="code" class="java">
&lt;aop:config>
      &lt;aop:pointcut id=”allManagerMethod” 
expression=”execution(*  com.hejianjiao.hibernate.HibernateDAO.*(..))”/>
//调用上面配置的事务属性，可以将它给本aop pointcut。
      &lt;aop:advisor advice-ref=”txAdvice” pointcut-ref=”allManagerMethod”/>
//如果还有其它的定义，则可以再加上pointcut、advisor来定义本切面点的事务逻辑。
&lt;/aop:config>

</pre><br />//expression中的内容是要执行本切面的一个接口，中的所有方法：如：一个接口中定义了操作数据的方法：com.hejianjiao.hibernate.HibernateDAO，则下面execution括号中的内容就为：* com.hejianjiao.hibernate.HibernateDAO.*(..)。而如果在com.hejianjiao.hibernate包中还有其它的类也有操作方法，我们要一起定义的话，就可以写为：*  com.hejianjiao.*.*(..)，其中(..)表示的是方法，前面的第一个*是操作的接口或者类。<br />上面的配置将为由 'HibernateDAO' 定义的bean创建一个代理对象，这个代理对象被装配了事务通知，所以当它的相应方法被调用时，一个事务将被启动、挂起、被标记为只读，或者其它（根据该方法所配置的事务语义）。
          <br/>
          <span style="color:red;">
            <a href="http://anysky131.javaeye.com/blog/234237#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 08:47:58 +0800</pubDate>
        <link>http://anysky131.javaeye.com/blog/234237</link>
        <guid>http://anysky131.javaeye.com/blog/234237</guid>
      </item>
      <item>
        <title>我也谈政治： 未来一万年战争指南！</title>
        <author>sunfengcheng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunfengcheng.javaeye.com">sunfengcheng</a>&nbsp;
          链接：<a href="http://sunfengcheng.javaeye.com/blog/234235" style="color:red;">http://sunfengcheng.javaeye.com/blog/234235</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: x-large"><br />未来一万年战争指南！<br />    最近的国际社会令我十分不安！第一次是着书写关于这方面的，东东！不知道，javaEye里面有没有好这口的！我是经常关注世界的经济，政治。今天在这里引用了一些文摘！收集了一下！<br /><br /> 南沙问题：2008年8月1日，越南声称为南沙“不惜一战”，此前越南与美国埃克森—美孚公司达成南沙油气勘测协议。<br /><br />伊核问题：2008年8月25日，伊朗最高领袖哈梅内伊支持内贾德连任总统，继续在核问题上抵抗西方压力。<br /><br />俄格冲突：2008年8月26日，俄罗斯宣布南奥塞梯和阿布哈兹独立，回应美国导演的科索沃独立，新冷战已然成形。<br /><br />朝核问题：2008年8月26日，朝鲜终止宁边核设施去功能化，中美俄新冷战爆发。<br /><br />48小时之内，伊朗、俄罗斯、朝鲜相继强硬表态，如此连贯，纯属巧合？<br /><br />一个月之内，三个大国，四个小国，三个问题，一个冲突，如此集中，纯属巧合？<br /><br />中国在为打越南造势，何时出手？<br /><br />美国在为打伊朗备战，何时开战？<br /><br />俄罗斯在格鲁吉亚驻军，何时收兵？<br /><br />三个大国对三个小国虎视眈眈，世界大战蕴酿中......<br /><br />最坏情况：四场局部战争同时开打，人类滑向第三次世界大战！<br /><br />美国军队援战格鲁吉亚，同时攻打伊朗，准备同时打赢两场战争。俄罗斯与美国在格鲁吉亚决战，企图拖住美国，减轻伊朗压力。中国乘机教训越南，分散美国注意力。中俄援助伊朗抗击美国。英国和日本力挺美国与中俄决战。美国煽动印度趁火打劫，中印边境战火重燃。<br /><br />四场局部战争同时开打，美伊俄格中越印日英9国相继参战，人类滑向第三次世界大战！<br /><br />最好情况：四个热点同时降温，中美俄继续和谐......<br /><br />俄罗斯军队撤出格鲁吉亚，美俄在科索沃和南奥塞梯问题上求同存异。美国承认科索沃独立，不承认南奥塞梯独立，但不使用武力改变现状。俄罗斯承认南奥塞梯独立，不承认科索沃独立，但不使用武力改变现状。<br /><br />美国把朝鲜从支持恐怖主义的国家名单中删除，朝鲜继续对宁边核设施进行去功能化。<br /><br />小布什把打伊朗这个问题留给下一任总统。美国打伊朗至少等到美国新总统上任之后。伊朗继续玩太极，一边搞铀浓缩，一边搞军事演习，一边继续谈判。<br /><br />中国对越南一忍再忍，在南沙按兵不动。<br /><br />实际情况：小国在跳舞，大国在观望，时机尚未成熟......<br /><br />俄罗斯暂时保留在格鲁吉亚的驻军，美欧在外交上抗议一下，等待时机。<br /><br />美国暂时不会把朝鲜从支持恐怖主义的国家名单中删除，美朝继续讨价还价。<br /><br />小布什摩拳擦掌，准备在任期结束前寻机拿下伊朗，为其石油财团谋福利。<br /><br />中国暂时按兵不动，寻机教训越南。</span>
          <br/>
          <span style="color:red;">
            <a href="http://sunfengcheng.javaeye.com/blog/234235#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 07:46:45 +0800</pubDate>
        <link>http://sunfengcheng.javaeye.com/blog/234235</link>
        <guid>http://sunfengcheng.javaeye.com/blog/234235</guid>
      </item>
      <item>
        <title>算法笔记（第一部分）-- 排序之白话快速排序</title>
        <author>SCYForce</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://scyforce.javaeye.com">SCYForce</a>&nbsp;
          链接：<a href="http://scyforce.javaeye.com/blog/234227" style="color:red;">http://scyforce.javaeye.com/blog/234227</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          记得今年暑假找实习的时候，去过一家小公司Xoopit做On-Site interview，里面有个工程师给我出了一道Hardcode的问题：给定一个无序数组，以及一个数组中的元素，要求输出的数组中小于这个数的数都有序的排在它之前，大于它的数都有序的排在它之后。当时想了半天才写出一个很烂的解法。最近重新复习排序，发现这不就是典型的Quick Sort的应用么。<br /><br />快速排序的步骤：<br />1. 从数组中选出一个中枢数(pivot)<br />2. 重新排列该数组，让数组中比该数小的数都排在该数的前面，比该数大的数都排在该数的后面。经过这次排列，该数处于其最终位置，并将原数组分为了两个子数组（大于它的数组和小于它的数组），这就是分段的过程。<br />3. 递归的排列各个子数组，直至最后整个数组排序完成。<br /><br />快速排序的平均时间复杂度为O(nlogn)，空间复杂度依据各种实现方式有所不同。<br /><br />快速排序的动画：<br /><img src="http://upload.wikimedia.org/wikipedia/commons/6/6a/Sorting_quicksort_anim.gif" /><br /><br />快速排序代码－partition:<br /><pre name="code" class="java">
public int partition(int[] data, int left, int right, int pivotIndex){
           int pivotValue = data[pivotIndex];
           swap(data, pivotIndex, right);// Move pivot to end
           int storeIndex = left;
           for(int i=left; i&lt;right; i++){
             if(data[i]&lt;=pivotValue){
                   swap(data, i, storeIndex);
                   storeIndex = storeIndex + 1;
             }
           }
           swap(data, storeIndex, right);// Move pivot to its final place 
           return storeIndex;
      }
</pre><br /><br />quickSort:<br /><pre name="code" class="java">
public void quick_sort(int[] data, int left, int right){
            if(right>left){
                  int pivotIndex = left;
                  int pivotNewIndex = partition(data, left,right, pivotIndex);
                  quicksort(data, left, pivotNewIndex - 1);
                  quicksort(data, pivotNewIndex + 1, right);
            }
      }
</pre><br /><br />partition的过程（递增）：<br />1. 将中枢数移至数据集的最右边<br />2. 建立一个中枢数最终位置的下标值。从数据集的最左边循环至最右边，依次与该中枢数相比较，若该数小于中枢数，则将该数与中枢数最终位置值交换，最终位置的下标加一<br />3. 最终将中枢数移至最终位置，返回最终位置下标<br /><br />这种实现方法的空间复杂度是O(nlogn)，它是in-place的算法，并且因为在一个partition的过程中可能会交换两数的位置，因此它是不稳定的。感觉初次理解快排有些难度，自己写出来就好多了。
          <br/>
          <span style="color:red;">
            <a href="http://scyforce.javaeye.com/blog/234227#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 01:08:41 +0800</pubDate>
        <link>http://scyforce.javaeye.com/blog/234227</link>
        <guid>http://scyforce.javaeye.com/blog/234227</guid>
      </item>
      <item>
        <title>罗杰，你拿什么拯救你的&quot;NO1&quot; </title>
        <author>longgue</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://longgue.javaeye.com">longgue</a>&nbsp;
          链接：<a href="http://longgue.javaeye.com/blog/234211" style="color:red;">http://longgue.javaeye.com/blog/234211</a>&nbsp;
          发表时间: 2008年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          费德勒输球了？费德勒又输球了？费德勒赢球了！费德勒何时会再赢球？费德勒会赢球吗？从08年初的澳网开始，费天王的表现好像是处到了抛物线轨迹的下降阶段；从前几年打败费天王视为奇迹，到今年人人都可能宰牛的巨大变化，似乎人们从内心深处无法接收这么打的转变。媒体也都纷纷暂停了满篇的赞美、减少了折服的语调，他们现在变成了质疑，天王的神话已被打破，很多以前不会奢望从费德勒身上赢球的球员，似乎至少从心理层面上已近拂去了这层阴影。<br /><br />单核细胞增多症也许是费德勒以及他的经纪人曾经可以减少人们对费德勒能力有微词媒体舆论的说法之一，不过从3月初向世人声称已近痊愈到现在，费德勒的竞技水平和他的心理状态似乎没有像他从病魔中回复那么快；除了红土差强人意的表现使费天王成就大满贯今年成为幻影外，连一向都是费天王占据绝对统治地位的草地，今年也被纳达尔在温网中被拉下马，若不是今年温网变幻莫测的雨天和费德勒第三盘的拼命挽救，差点让红土小子在草地上以3：0结束温网的桂冠之争而让这场比赛变成惊心动魄的世纪之战；红土输了，草地输了，连费天王一向是优势的硬地比赛也总是表现的跌跌撞撞。往年不管红土赛季表现如何，从6月份的温网开始，费德勒似乎就有了绝对让自己尽情去表演自己的舞台，今年似乎风向变了，从法网、温网到之后的硬地大师赛，费德勒似乎永远徘徊在向世人展现曾经的自己但却无法从失利中解脱的尴尬困境中。费德勒现在考虑的也许是已从超越桑神的14大满贯变成了调整自己的心理状态，向世人展示自己应有的采，力夺本年度的最后一座大满贯奖杯－美网桂冠，而不是获得一个安慰自己的奥运双打冠军。<br /><br />罗杰，你到底怎么了？<br /><br />费天王也许应该从如下方面调整来捍卫自己的王者之威，以便在正在进行的美网中有上佳表现，巩固球迷和媒体对昔日天王的盛赞。<br /><br /><strong>&#149;&nbsp;心理调整</strong><br /><br />费德勒的心理也许从澳网之后起了很大的波动，而温网和之后的大师赛又更让他的内心变得脆弱。在当今网球技术不断发展，在纳达尔、德约科维奇等生力军步步紧逼，男子网球界全体研究找破费之计的情况下，费德勒越来越承受了太多的压力，似乎网球界从来没有像现今这样让人感慨，让罗杰触动。费德勒也是人，在这种处境下，在进入决赛甚至四强的时候，他就表现出担忧进而是对自己技术的不自信。曾经强大甚至无敌的正手，优雅精准的单反，高难度的网前截击现在变得频频失误；当然像纳达尔那样的强大对手回球质量的不断提高是一方面，但从心理方面对自己的回球不自信导致挥拍速度变慢和动作变形才是费德勒需要考虑如何有效解决的。在今年的很多场比赛中，我们能明显的看到，费德勒再前期比赛时还是勇往直前，但是随着后期对手不断地改变策略或制造麻烦之后，费德勒的心理起伏就业明显的变化，导致很多无谓的非受迫性失误，甚至在握有对方多个破发点的情况下无法实时成功破发。<br /><br /><strong>&#149;&nbsp;反手的加强</strong><br /><br />费德勒的反手可以说一直是每位和他比赛的选手寻求制胜他的最主要的出发点。以前在面对质量不是很高的反手攻击时，费德勒似乎总是以令每位现场观众欢悦的精准单反或快速转身正手大角度回球来制胜对方；但现在他的竞争对手都回给他的是快速、大角度、甚至是具有很强旋转的反手，而且是持续的多拍反手位；这这种情况下，费德勒的回球似乎以防守为主了，以便在下一拍中寻找进攻的机会。费德勒应该逐渐地适应对方的这种回球方式，进而在<br />此基础上寻求角度的变化并加强回球的稳定性，以便实时地问自己创造机会。<br /><br /><strong>&#149;&nbsp;观念的调整</strong><br /><br />以往的打球，费天王似乎一直在秉持他贵族式的优雅风度，无论输赢，尤其是输球的时候，他都表面保持得足够矜持，足够平静；它是网球界的雅皮士，它是网球界的绅士，这样是不错，但是当你有了强大的对手，当你赢了对手一个很精彩的球，罗杰，请你大声喊出来；当你为一个自己很后把握的球由于自己的失误而让对方得分时，罗杰，请你皱起你的脸，捂住你的眼，甚至偶尔的学学其它球员摔摔牌子。我相信，绝大部分球迷也会乐意在比赛场上看到一个不同的但又是一个真实的罗杰。另一方面，费德勒有时似乎热衷于打难度很高的球，诚然这话博得现场观众的欢呼，但在特定和关键的时候比较实用的方式回球打败对方，取得成绩才是最重要的。<br /><br />随着年龄的逐渐增加和生力军的不断崛起，费德勒也许注定永远要被赶超；如何面对这场长久的竞争，也许能挽救的只有他自己。<br /><br /><span style="color: red">罗杰，我们期待王者归来!</span>
          <br/>
          <span style="color:red;">
            <a href="http://longgue.javaeye.com/blog/234211#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 23:51:31 +0800</pubDate>
        <link>http://longgue.javaeye.com/blog/234211</link>
        <guid>http://longgue.javaeye.com/blog/234211</guid>
      </item>
      <item>
        <title>ruby冒泡排序</title>
        <author>loamy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://loamy.javaeye.com">loamy</a>&nbsp;
          链接：<a href="http://loamy.javaeye.com/blog/234140" style="color:red;">http://loamy.javaeye.com/blog/234140</a>&nbsp;
          发表时间: 2008年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          class BubbleSorting<br />  array=[8,12,3,1,2,5,9,6,3,4,5,6,4,3,8]  <br /> <br />  for i in (0..array.length) <br />    for j in (1..array.length-1) <br />      unless array[j]&lt;array[j-1]<br />      (array[j],array[j-1]=array[j-1],array[j])  <br />      end<br />    end<br />  end <br /><br />  print array.join(",")<br />end
          <br/>
          <span style="color:red;">
            <a href="http://loamy.javaeye.com/blog/234140#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 20:16:42 +0800</pubDate>
        <link>http://loamy.javaeye.com/blog/234140</link>
        <guid>http://loamy.javaeye.com/blog/234140</guid>
      </item>
      <item>
        <title>fileupload文件上传简单实例</title>
        <author>plkong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://plkong.javaeye.com">plkong</a>&nbsp;
          链接：<a href="http://plkong.javaeye.com/blog/234119" style="color:red;">http://plkong.javaeye.com/blog/234119</a>&nbsp;
          发表时间: 2008年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="0" style="text-indent: 21pt; text-align: justify;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">1. 首先需要下载需要的组件。</span>
</span>

</p>
<p class="0" style="text-indent: 21pt; text-align: justify;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">下载commons-fileupload-1.2.1-bin.zip，下载网址：</span>
</span>

<span><a href="http://commons.apache.org/downloads/download_fileupload.cgi"></a>
</span>
</p>
<p class="0" style="text-indent: 21pt; text-align: justify;"><span><a href="http://commons.apache.org/downloads/download_fileupload.cgi"><span class="15" style="text-decoration: underline; font-size: 10pt; font-family: '宋体'; color: #0000ff;">http://commons.apache.org/downloads/download_fileupload.cgi</span>
</a>
</span>

</p>
<p class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">&nbsp;&nbsp; 下载commons-io-1.4-bin.zip，下载网址：</span>
</span>
</p>
<p class="0">&nbsp; &nbsp; &nbsp;&nbsp; <span><a href="http://commons.apache.org/downloads/download_io.cgi"><span class="15" style="text-decoration: underline; font-size: 10pt; font-family: '宋体'; color: #0000ff;">http://commons.apache.org/downloads/download_io.cgi</span>
</a>
</span>
</p>
<p class="0" style="text-indent: 21pt; text-align: justify;">2. 用开源的FileUpload组件，可以很方便的给自己的系统添加功能强大的文件上传模块。下图为文件上传的基本流程图。</p>
<p class="0" style="text-indent: 21pt; text-align: justify;">&nbsp;</p>
<p class="0" style="text-indent: 21pt; text-align: center;"><img src="http://www.javaeye.com/upload/attachment/36619/e8aab0ee-6b61-3ab6-85a4-90324ff5418a.jpg" height="532" alt="文件上传流程图" style="vertical-align: middle;" width="440" />
</p>
<p class="0" style="text-indent: 21pt; text-align: justify;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">3. 将commons-fileupload-1.2.1-bin.zip包中的commons-fileupload-1.2.1.jar文件和commons-io-1.4-bin.zip包中的commons-io-1.4.jar文件拷贝到web工程下的WEB-INF\lib目录下。</span>
</span>
</p>
<p class="0" style="text-indent: 21pt; text-align: justify;">4. 在服务器端创建处理文件上传的Servlet类。源代码如下：</p>
<pre name="code" class="java">import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


public class FileUploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public FileUploadServlet() {
		super();
	}
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		final long MAX_SIZE = 300 * 1024 * 1024;// 设置上传文件最大值
		// 允许上传的文件格式的列表
		final String[] allowedExt = new String[] {&quot;jpg&quot;, &quot;jpeg&quot;, &quot;gif&quot;, &quot;txt&quot;,
				&quot;doc&quot;,&quot;mp3&quot;, &quot;wma&quot;, &quot;m4a&quot;,&quot;rar&quot;,&quot;zip&quot; };
		response.setContentType(&quot;text/html&quot;);
		// 设置字符编码为UTF-8, 统一编码，处理出现乱码问题
		response.setCharacterEncoding(&quot;UTF-8&quot;);

		// 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
		DiskFileItemFactory dfif = new DiskFileItemFactory();
		dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
		dfif.setRepository(new File(request.getRealPath(&quot;/&quot;)
				+ &quot;ImagesUploadTemp&quot;));// 设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录

		// 用以上工厂实例化上传组件
		ServletFileUpload sfu = new ServletFileUpload(dfif);
		// 设置最大上传大小
		sfu.setSizeMax(MAX_SIZE);

		PrintWriter out = response.getWriter();
		// 从request得到所有上传域的列表
		List fileList = null;
		try {
			fileList = sfu.parseRequest(request);
		} catch (FileUploadException e) {// 处理文件尺寸过大异常
			if (e instanceof SizeLimitExceededException) {
				out.println(&quot;文件尺寸超过规定大小:&quot; + MAX_SIZE + &quot;字节&lt;p /&gt;&quot;);
				out
						.println(&quot;&lt;a href=\&quot;FileUpload.html\&quot; target=\&quot;_top\&quot;&gt;返回&lt;/a&gt;&quot;);
				return;
			}
			e.printStackTrace();
		}
		// 没有文件上传
		if (fileList == null || fileList.size() == 0) {
			out.println(&quot;请选择上传文件&lt;p /&gt;&quot;);
			out.println(&quot;&lt;a href=\&quot;FileUpload.html\&quot; target=\&quot;_top\&quot;&gt;返回&lt;/a&gt;&quot;);
			return;
		}
		// 得到所有上传的文件
		Iterator fileItr = fileList.iterator();
		// 循环处理所有文件
		while (fileItr.hasNext()) {
			FileItem fileItem = null;
			String path = null;
			long size = 0;
			// 得到当前文件
			fileItem = (FileItem) fileItr.next();
			// 忽略简单form字段而不是上传域的文件域(&lt;input type=&quot;text&quot; /&gt;等)
			if (fileItem == null || fileItem.isFormField()) {
				continue;
			}
			// 得到文件的完整路径
			path = fileItem.getName();
			// 得到文件的大小
			size = fileItem.getSize();
			if (&quot;&quot;.equals(path) || size == 0) {
				out.println(&quot;请选择上传文件&lt;p /&gt;&quot;);
				out
						.println(&quot;&lt;a href=\&quot;FileUpload.html\&quot; target=\&quot;_top\&quot;&gt;返回&lt;/a&gt;&quot;);
				return;
			}

			// 得到去除路径的文件名
			String t_name = path.substring(path.lastIndexOf(&quot;\\&quot;) + 1);
			// 得到文件的扩展名(无扩展名时将得到全名)
			String t_ext = t_name.substring(t_name.lastIndexOf(&quot;.&quot;) + 1);
			// 拒绝接受规定文件格式之外的文件类型
			int allowFlag = 0;
			int allowedExtCount = allowedExt.length;
			for (; allowFlag &lt; allowedExtCount; allowFlag++) {
				if (allowedExt[allowFlag].equals(t_ext))
					break;
			}
			if (allowFlag == allowedExtCount) {
				out.println(&quot;请上传以下类型的文件&lt;p /&gt;&quot;);
				for (allowFlag = 0; allowFlag &lt; allowedExtCount; allowFlag++)
					out.println(&quot;*.&quot; + allowedExt[allowFlag]
							+ &quot;   &quot;);
				out
						.println(&quot;&lt;p /&gt;&lt;a href=\&quot;FileUpload.html\&quot; target=\&quot;_top\&quot;&gt;返回&lt;/a&gt;&quot;);
				return;
			}

			long now = System.currentTimeMillis();
			// 根据系统时间生成上传后保存的文件名
			String prefix = String.valueOf(now);
			// 保存的最终文件完整路径,保存在web根目录下的ImagesUploaded目录下
//			String u_name = request.getRealPath(&quot;/&quot;) + &quot;ImagesUploaded/&quot;
//					+ prefix + &quot;.&quot; + t_ext;
			String filename = prefix + &quot;.&quot; + t_ext;
			try {
				// 保存文件到C:\\upload目录下
				fileItem.write(new File(&quot;C:\\upload\\&quot;+filename));
				System.out.println(filename);
				out.println(&quot;文件上传成功. 已保存为: &quot; + prefix + &quot;.&quot; + t_ext
						+ &quot;   文件大小: &quot; + size + &quot;字节&lt;p /&gt;&quot;);
				out
						.println(&quot;&lt;a href=\&quot;FileUpload.html\&quot; target=\&quot;_top\&quot;&gt;继续上传&lt;/a&gt;&quot;);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
</pre>
<p>&nbsp;5. 在客户端创建上传文件页面</p>
<pre name="code" class="html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;文件上传&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form action=&quot;FileUploadServlet&quot; method=&quot;post&quot;
	enctype=&quot;multipart/form-data&quot;&gt;
	&lt;input type=&quot;file&quot; size=&quot;30&quot;
	name=&quot;file01&quot; /&gt; &lt;br /&gt;
		&lt;input type=&quot;file&quot; size=&quot;30&quot;
	name=&quot;file02&quot; /&gt; &lt;br /&gt;
&lt;input name=&quot;up&quot; type=&quot;submit&quot; value=&quot;上传&quot; /&gt;&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://plkong.javaeye.com/blog/234119#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 19:11:48 +0800</pubDate>
        <link>http://plkong.javaeye.com/blog/234119</link>
        <guid>http://plkong.javaeye.com/blog/234119</guid>
      </item>
      <item>
        <title>如何在Spring中集成Acegi安全框架</title>
        <author>raymond.chen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chenjumin.javaeye.com">raymond.chen</a>&nbsp;
          链接：<a href="http://chenjumin.javaeye.com/blog/234085" style="color:red;">http://chenjumin.javaeye.com/blog/234085</a>&nbsp;
          发表时间: 2008年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Acegi Security是一个能为基于Spring的企业应用提供强大而灵活安全访问控制解决方案的框架，Acegi已经成为Spring官方的一个子项目，所以也称为Spring Security。它通过在Spring容器中配置一组Bean，充分利用Spring的IoC和AOP功能，提供声明式安全访问控制的功能。<br />    下面将详细介绍Acegi在Spring中如何配置，配置范例是在acegi-security-1.0.6版本下测试通过的。<br /><br /><br />1、在web.xml中的配置<br /><pre name="code" class="xml">

	&lt;!-- 声明Spring Bean的配置文件列表 -->
	&lt;context-param>
		&lt;param-name>contextConfigLocation&lt;/param-name>
		&lt;param-value>
			/WEB-INF/config/applicationContext.xml,
			/WEB-INF/config/ beans-acegi.xml
		&lt;/param-value>
	&lt;/context-param>
	
	&lt;!-- 声明Acegi过滤器 -->
	&lt;filter>
		&lt;filter-name>securityFilter&lt;/filter-name>   
		&lt;filter-class>org.acegisecurity.util.FilterToBeanProxy&lt;/filter-class>   
		&lt;init-param>   
			&lt;param-name>targetClass&lt;/param-name>   
			&lt;param-value>org.acegisecurity.util.FilterChainProxy&lt;/param-value>   
		&lt;/init-param>   
	&lt;/filter>

	&lt;filter-mapping>
		&lt;filter-name>securityFilter&lt;/filter-name>
			&lt;url-pattern>/j_security_check&lt;/url-pattern>
		&lt;/filter-mapping>
	&lt;filter-mapping>
		&lt;filter-name>securityFilter&lt;/filter-name>   
		&lt;url-pattern>/*&lt;/url-pattern>   
	&lt;/filter-mapping>
		
	说明：
		1）安全框架会对/j_security_check和所有的请求进行权限控制。
		2）Acegi通过实现了Filter接口的FilterToBeanProxy提供一种特殊的使用Servlet Filter的方式，它委托Spring中的Bean -- FilterChainProxy来完成过滤功能，以便简化web.xml的配置，并且可以充分利用Spring IOC的优势。FilterChainProxy包含了处理认证过程的filter列表，每个filter都有各自的功能。
</pre><br /><br />2、filterChainProxy的配置<br /><pre name="code" class="xml">
	&lt;bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
		&lt;property name="filterInvocationDefinitionSource">
			&lt;value>
				CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
				PATTERN_TYPE_APACHE_ANT
				/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor&lt;/value>   
		&lt;/property>
	&lt;/bean>
	说明：
		1）	过滤器列表必须位于同一行内，中间不能换行。这些过滤器将按顺序被调用。
		2）	CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON：表示URL比较前先转为小写。
		3）	PATTERN_TYPE_APACHE_ANT：表示使用Apache Ant的匹配模式
</pre><br /><br />3、httpSessionContextIntegrationFilter的配置<br /><pre name="code" class="xml">
	&lt;bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>
	说明：
		1）	必须将该Filter配置为过滤器链中第一个过滤器，使验证信息能跨越多个请求。
		2）	为了解决认证主体安全信息能在多个Http请求之间保持共享，Acegi将认证主体安全信息缓存于HttpSession中，当用户请求一个受限的资源时，Acegi通过HttpSessionContextIntegrationFilter将认证主体信息从HttpSession中加载到SecurityContext实例中，认证主体关联的SecurityContext实例则保存在Acegi容器级的SecurityContextHolder里。当请求结束之后，HttpSessionContextIntegrationFilter执行相反的操作，将SecurityContext中的认证主体安全信息重新转存到HttpSession中，然后从SecurityContextHolder中清除对应的SecurityContext实例。
		3）	SecurityContextHolder是框架级的容器，它保存着和所有用户关联SecurityContext实例，SecurityContext承载着用户的帐号及权限信息，通过以下方法可以取到这些信息：SecurityContextHolder.getContext().getAuthentication()。
</pre><br /><br />4、logoutFilter的配置<br /><pre name="code" class="xml">
	&lt;bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
		&lt;constructor-arg value="/index.jsp"/>
		&lt;constructor-arg>
			&lt;list>
				&lt;bean class="org.a