SSH框架的搭建
步骤:
1,构建一个web工程,配置xml文件如下
<filter>
<filter-name>struts2</filter-name>
<filter-class>
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>注意:1),由于从struts2.1.3之后的版本不再建议采用org.apache.struts2.dispatcher.FilterDispatcher,所以,我们最好配置成StrutsPrepareAndExecuteFilter或者StrutsExecuteFilter以及StrutsPrepareFilter,需要注意的是:如配置成StrutsExecuteFilter需要将StrutsPrepareFilter也配置上,否则将会报错。所以建议就只直接采用StrutsPrepareAndExecuteFilter。
2),将来配置OpenSessionInViewFilter,必须在struts2过滤器之前2,添加struts配置文件。 在WEB-INF/classes目录下,新建struts.xml,模版如下:<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

</struts>3,导入struts的核心包,发布到tomcat上去测试,服务器启动正常,说明配置成功
4,书写一个struts,action,然后测试
比如简单的login
5,配置hibernate
1) 创建Hibernate配置文件,hibernate.cfg.xml
2)配置表的映射文件
3)结合struts运行,注意操作框架的分层处理6,配置Spring相关操作
1)首先修改web.xml文件,增加如下代码:
<!--
* 从类路径下加载spring的配置文件, 多个配置文件可以用逗号和空格区分
* classpath: 关键字特指类路径下加载-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
            classpath:applicationContext*.xml
</param-value>
</context-param>
 <!-- 开启监听 -->
    <listener>
        <listener-class> org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <!-- 配置OpenSessionInViewFilter,必须在struts2监听之前 -->
    <filter>
        <filter-name>lazyLoadingFilter</filter-name>
        <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        </filter-class>
    </filter>
<filter-mapping>
    <filter-name>lazyLoadingFilter</filter-name>
    <url-pattern>*.action</url-pattern>
    </filter-mapping>注意:OpenSessionInViewFilter:这主要是为了实现Hibernate的延迟加载功能。基于一个请求
一个hibernate session的原则。
spring中对OpenSessionInViewFilter的描述如下:
它是一个Servlet2.3过滤器,用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现"Open Session in View"的模式。
例如: 它允许在事务提交之后延迟加载显示所需要的对象。
这个过滤器和 HibernateInterceptor 有点类似:它是通过线程实现的。无论是没有事务的应用,还是有业务层事务的应用(通过HibernateTransactionManager 或
JtaTransactionManager的方式实现)它都适用。在后一种情况下,事务会自动采用由这个filter绑定的Session来进行相关的操作以及根据实际情况完成提交操作。 
2)根据配置书写spring配置文件
3)书写一个测试类,测试spring的配置是否成功7,整合structs框架
1)导入struts2-spring-plugin.jar
2) 配置web.xml文件。在web.xml中加入以下代码:
<listener>
<listener-class>      org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
3)struts和Spring集成
1)将struts2.xml委托spring管理
<constant name="struts.objectFactory" value="spring"/>
2)将structs的action注入给spring
以struts示例中的login.action为例,首先创建一个LoginAction类的Bean。在applicationContext.xml中增加如下代码:
<bean id="loginAction" class="test.action.LoginAction" scope="prototype">
</bean>这里,我们把这个bean的id设为loginAction。Scope设为prototype,含义是每一次请求创建一个LoginAction类的实例,Scope还有另一个值“singleton”意为“单例模式”。
接下来修改struts.xml文件,把原来login.action的配置做如下修改:
把<action name="login" class=" test.action.LoginAction ">
改为
<action name="login" class="loginAction"> 8,整合hibernate框架
配置sessionFactory有两种方式,直接配置或者注入参照文档ds_tran
9,配置事务管理器。增加如下代码:
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>这里创建了一个id为transactionManager的事务管理器,它匹配一个session工厂,<ref bean="sessionFactory"/>这个sessionFactory是指session工厂的ID。
10,对事务管理器进行事务设置,并应用
参照文档:ds_tran

解决方案 »

  1.   

    dataSource:
    1)基于java.sql 相关操作
    <bean name="dataSource1" class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
    <property name="networkProtocol">
    <value>tcp</value>
    </property>
    <property name="databaseName">
    <value>xe</value>
    </property>
    <property name="driverType">
    <value>thin</value>
    </property>
    <property name="portNumber">
    <value>1521</value>
    </property>
    <property name="user">
    <value>briup</value>
    </property>
    <property name="serverName">
    <value>localhost</value>
    </property>
    <property name="password">
    <value>briup</value>
    </property>
    </bean>2)基于dbcp配置
    <bean class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"
    name="dataSource2">
    <property name="driverClassName">
    <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="url">
    <value>jdbc:oracle:thin:@localhost:1521:xe</value>
    </property>
    <property name="username">
    <value>briup</value>
    </property>
    <property name="password">
    <value>briup</value>
    </property>
    </bean>或者
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
     <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
        <property name="url"><value>${jdbc.url}</value></property>
        <property name="username"><value>${jdbc.username}</value></property>
        <property name="password"><value>${jdbc.password}</value></property>
        <property name="maxActive"><value>80</value></property> 
        <property name="maxIdle"><value>20</value></property> 
        <property name="maxWait"><value>3000</value></property> 
    </bean>3) 使用Spring提供的jdbc实现
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
      <property name="url"><value>${jdbc.url}</value></property>
      <property name="username"><value>${jdbc.username}</value></property>
      <property name="password"><value>${jdbc.password}</value></property>
     </bean>4)<!-- 在中间件(tomcat)上
    配置数据源并通过jndi查找 -->
    <!--<bean id="dataSource"  class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
    <value>java:comp/env/spring/ds</value>
    </property>
    </bean>-->
    =====================================
    spring 集成hibernate:
    使用Spring整合Hibernate时我们不需要hibernate.cfg.xml文件。操作步骤:
    1,在applicationContext.xml中配置数据源(dataSource)
    2,在applicationContext.xml配置session工厂bean(sessionFactory)bean。
    <bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
    name="sessionFactory">
    注入的信息有:
    1)数据源bean
    <property name="dataSource">
        <ref local="dataSource"/>
    </property>
    2)所有持久化类的配置文件
    <property name="mappingResources">
        <list>
         <value>account.hbm.xml</value>
        </list>
    </property>
    3)Hibernate的SessionFactory的属性
    <property name="hibernateProperties">
        <props>
         <prop  key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
        <prop key="hibernate.show_sql">true</prop>
       </props>
    </property>或者先配置hibernate_cfg.xml<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>classpath:spring/hibernate.cfg.xml</value>
    </property>
    </bean>3,书写dao的实现
    1)在dao的实现中注入sessionFactory,获取session-->hibernate基本操作
    2)使用HibernateTemplate来实现4,事务管理
    编程式事务管理:
       编程式事务提供了TransactionTemplate模板类,用的时候必须向其体提供一个PlatformTransactionManager实例。只要TransactionTemplate获取了PlatformTransactionManager的引用,TransactionTemplate就可以完成事务操作了。TransactionTemplate提供了一个execute方法,它接收一个TransactionCallback实例。TransactionCallback包含如下方法:Object doInTransaction(TransactionStatus status)
    这是需要有返回值的情况。如果不需要有返回值的话,我们可以用TransactionCallbackWithOutResult类来代替TransactionCallback类,它也有一个方法:
    void doInTransaction(TransactionStatus status)
       在这个两个方法中,在出现异常时,TransactionStatus的实例status可以调用setRollbackOnly()方法进行回滚。   一般情况下,向execute方法传入TransactionCallback或TransactionCallbackWithOutResult实例时,采用的是匿名内部类的形式。--------------------------------
    eg:AccountServiceImpl{private TransactionTemplate transactionTemplate;

    public void setTransactionTemplate(PlatformTransactionManager manager) {
    this.transactionTemplate = new TransactionTemplate(manager);
    } public void delete(Order order) throws OrderException {
    transactionTemplate.execute(new TransactionCallback(){
    public Object doInTransaction(TransactionStatus status) {
    return null;
    }}); }<beans>
    <bean class="com.briup.transaction.program.OrderServiceImpl"
    name="orderService">
    <property name="transactionTemplate">
    <ref bean="transactionManager" />
    </property>
    </bean>
    </beans>
    -------------------------------------------------------- 声明式事务管理: 声明式事务管理的配置方式通常有三种:    使用TransactionProxyFactoryBean为目标bean生成事务代理的配置。     使用BeanNameAutoProxyCreator,根据bean name自动生成事务代理的方式,这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所了解。     使用DefaultAdvisorAutoProxyCreator,这也是直接利用Spring的AOP框架配置事务代理的方式,只是这种配置方式的可读性不如使用BeanNameAutoProxyCreator的配置方式。<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
           <property name="sessionFactory">
               <ref local="sessionFactory" />
           </property>
        </bean>或者<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    name="transactionManager">
    <property name="dataSource">
    <ref bean="dataSource" />
    </property>
    </bean>   <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
         <property name="transactionManager">
             <ref bean="transactionManager" />
         </property>
         <property name="target">
             <ref local="AccountDAO" />
         </property>
         <property name="transactionAttributes">
             <props>
                <prop key="create*">PROPAGATION_REQUIRED</prop>
             </props>
         </property>
       </bean>
    </beans>-----
    <!-- 定义BeanNameAutoProxyCreator,该bean是个bean后处理器,无需被引用,因此没有id属性  
    这个bean后处理器,根据事务拦截器为目标bean自动创建事务代理  
         <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
               指定对满足哪些bean name的bean自动生成业务代理 -->  
     <property name="beanNames">  
                <!--   下面是所有需要自动创建事务代理的bean-->  
                <list>  
                    <value>accountDao</value>  
                </list>  
                <!--   此处可增加其他需要自动创建事务代理的bean-->  
            </property>  
            <!--   下面定义BeanNameAutoProxyCreator所需的事务拦截器-->  
            <property name="interceptorNames">  
                <list>  
                    <value>transactionInterceptor</value>   
                        <!-- 此处可增加其他新的Interceptor -->  
                </list>  
            </property>  
        </bean>  
    ----------------------
    或者使用新的语法
    -----------------------
    <!-- 配置事务管理器 --><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean>
    这里创建了一个id为transactionManager的事务管理器,它匹配一个session工厂,<ref bean="sessionFactory"/>这个sessionFactory是指session工厂的ID。对事务管理器进行事务设置。增加如下代码:
    <tx:advice id="smAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="save*" propagation="REQUIRED"/>
    <tx:method name="del*" propagation="REQUIRED"/>
    <tx:method name="update*" propagation="REQUIRED"/>
    </tx:attributes>
    </tx:advice>这里创建了一个advice(通知),对事务管理器进行事务设置,这里意思是指,对于以save、del、update开头的方法应用事务。应用:
    <aop:config>
    <aop:pointcut id="smMethod"
    expression="execution(* test.service.impl.*.*(..))"/>
    <aop:advisor pointcut-ref="smMethod" advice-ref="smAdvice"/>
    </aop:config> 
    注意:
    transactionAttributes:
    PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
    PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
    PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
    PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
    PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。另外,如果出现<prop key="myMethod">PROPAGATION_REQUIRED,readOnly,-Exception</prop>
    这样的配置,其中:-Exception表示有Exception抛出时,事务回滚. -代表回滚+就代表提交
    readonly 就是read only, 设置操作权限为只读,一般用于查询的方法,优化作用. 
      

  2.   

    哎,现在网上有很多的关于SSH2的搭建步骤,甚至还有图解,关键是很多人都不知道配置的是什么意思,LZ要是能把那里面的配置文件的意思都整理出来那就太有水平了……呵呵……
      

  3.   

    MD5.javapackage com.briup.woss.common.util;//import required classespublic class MD5 {
    private static MD5 md5 = null; static final int S11 = 7; static final int S12 = 12; static final int S13 = 17; static final int S14 = 22; static final int S21 = 5; static final int S22 = 9; static final int S23 = 14; static final int S24 = 20; static final int S31 = 4; static final int S32 = 11; static final int S33 = 16; static final int S34 = 23; static final int S41 = 6; static final int S42 = 10; static final int S43 = 15; static final int S44 = 21; static final byte PADDING[] = { -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0 }; private long state[]; private long count[]; private byte buffer[]; public String digestHexStr; private byte digest[]; public static synchronized MD5 getInstance() {
    if (md5 == null)
    md5 = new MD5();
    return md5;
    } public String getMD5ofStr(String s) {
    md5Init();
    md5Update(s.getBytes(), s.length());
    md5Final();
    digestHexStr = "";
    for (int i = 0; i < 16; i++) {
    digestHexStr += byteHEX(digest[i]);
    } return digestHexStr;
    } private MD5() {
    state = new long[4];
    count = new long[2];
    buffer = new byte[64];
    digest = new byte[16];
    md5Init();
    } private void md5Init() {
    count[0] = 0L;
    count[1] = 0L;
    state[0] = 0x67452301L;
    state[1] = 0xefcdab89L;
    state[2] = 0x98badcfeL;
    state[3] = 0x10325476L;
    } private long F(long l, long l1, long l2) {
    return l & l1 | ~l & l2;
    } private long G(long l, long l1, long l2) {
    return l & l2 | l1 & ~l2;
    } private long H(long l, long l1, long l2) {
    return l ^ l1 ^ l2;
    } private long I(long l, long l1, long l2) {
    return l1 ^ (l | ~l2);
    } private long FF(long l, long l1, long l2, long l3, long l4, long l5, long l6) {
    l += F(l1, l2, l3) + l4 + l6;
    l = (int) l << (int) l5 | (int) l >>> (int) (32L - l5);
    l += l1;
    return l;
    } private long GG(long l, long l1, long l2, long l3, long l4, long l5, long l6) {
    l += G(l1, l2, l3) + l4 + l6;
    l = (int) l << (int) l5 | (int) l >>> (int) (32L - l5);
    l += l1;
    return l;
    } private long HH(long l, long l1, long l2, long l3, long l4, long l5, long l6) {
    l += H(l1, l2, l3) + l4 + l6;
    l = (int) l << (int) l5 | (int) l >>> (int) (32L - l5);
    l += l1;
    return l;
    } private long II(long l, long l1, long l2, long l3, long l4, long l5, long l6) {
    l += I(l1, l2, l3) + l4 + l6;
    l = (int) l << (int) l5 | (int) l >>> (int) (32L - l5);
    l += l1;
    return l;
    } private void md5Update(byte abyte0[], int i) {
    byte abyte1[] = new byte[64];
    int k = (int) (count[0] >>> 3) & 0x3f;
    if ((count[0] += i << 3) < (long) (i << 3)) {
    count[1]++;
    }
    count[1] += i >>> 29;
    int l = 64 - k;
    int j;
    if (i >= l) {
    md5Memcpy(buffer, abyte0, k, 0, l);
    md5Transform(buffer);
    for (j = l; j + 63 < i; j += 64) {
    md5Memcpy(abyte1, abyte0, 0, j, 64);
    md5Transform(abyte1);
    } k = 0;
    } else {
    j = 0;
    }
    md5Memcpy(buffer, abyte0, k, j, i - j);
    } private void md5Final() {
    byte abyte0[] = new byte[8];
    Encode(abyte0, count, 8);
    int i = (int) (count[0] >>> 3) & 0x3f;
    int j = i >= 56 ? 120 - i : 56 - i;
    md5Update(PADDING, j);
    md5Update(abyte0, 8);
    Encode(digest, state, 16);
    } private void md5Memcpy(byte abyte0[], byte abyte1[], int i, int j, int k) {
    for (int l = 0; l < k; l++) {
    abyte0[i + l] = abyte1[j + l];
    } } private void md5Transform(byte abyte0[]) {
    long l = state[0];
    long l1 = state[1];
    long l2 = state[2];
    long l3 = state[3];
    long al[] = new long[16];
    Decode(al, abyte0, 64);
    l = FF(l, l1, l2, l3, al[0], 7L, 0xd76aa478L);
    l3 = FF(l3, l, l1, l2, al[1], 12L, 0xe8c7b756L);
    l2 = FF(l2, l3, l, l1, al[2], 17L, 0x242070dbL);
    l1 = FF(l1, l2, l3, l, al[3], 22L, 0xc1bdceeeL);
    l = FF(l, l1, l2, l3, al[4], 7L, 0xf57c0fafL);
    l3 = FF(l3, l, l1, l2, al[5], 12L, 0x4787c62aL);
    l2 = FF(l2, l3, l, l1, al[6], 17L, 0xa8304613L);
    l1 = FF(l1, l2, l3, l, al[7], 22L, 0xfd469501L);
    l = FF(l, l1, l2, l3, al[8], 7L, 0x698098d8L);
    l3 = FF(l3, l, l1, l2, al[9], 12L, 0x8b44f7afL);
    l2 = FF(l2, l3, l, l1, al[10], 17L, 0xffff5bb1L);
    l1 = FF(l1, l2, l3, l, al[11], 22L, 0x895cd7beL);
    l = FF(l, l1, l2, l3, al[12], 7L, 0x6b901122L);
    l3 = FF(l3, l, l1, l2, al[13], 12L, 0xfd987193L);
    l2 = FF(l2, l3, l, l1, al[14], 17L, 0xa679438eL);
    l1 = FF(l1, l2, l3, l, al[15], 22L, 0x49b40821L);
    l = GG(l, l1, l2, l3, al[1], 5L, 0xf61e2562L);
    l3 = GG(l3, l, l1, l2, al[6], 9L, 0xc040b340L);
    l2 = GG(l2, l3, l, l1, al[11], 14L, 0x265e5a51L);
    l1 = GG(l1, l2, l3, l, al[0], 20L, 0xe9b6c7aaL);
    l = GG(l, l1, l2, l3, al[5], 5L, 0xd62f105dL);
    l3 = GG(l3, l, l1, l2, al[10], 9L, 0x2441453L);
    l2 = GG(l2, l3, l, l1, al[15], 14L, 0xd8a1e681L);
    l1 = GG(l1, l2, l3, l, al[4], 20L, 0xe7d3fbc8L);
    l = GG(l, l1, l2, l3, al[9], 5L, 0x21e1cde6L);
    l3 = GG(l3, l, l1, l2, al[14], 9L, 0xc33707d6L);
    l2 = GG(l2, l3, l, l1, al[3], 14L, 0xf4d50d87L);
    l1 = GG(l1, l2, l3, l, al[8], 20L, 0x455a14edL);
    l = GG(l, l1, l2, l3, al[13], 5L, 0xa9e3e905L);
    l3 = GG(l3, l, l1, l2, al[2], 9L, 0xfcefa3f8L);
    l2 = GG(l2, l3, l, l1, al[7], 14L, 0x676f02d9L);
    l1 = GG(l1, l2, l3, l, al[12], 20L, 0x8d2a4c8aL);
    l = HH(l, l1, l2, l3, al[5], 4L, 0xfffa3942L);
    l3 = HH(l3, l, l1, l2, al[8], 11L, 0x8771f681L);
    l2 = HH(l2, l3, l, l1, al[11], 16L, 0x6d9d6122L);
    l1 = HH(l1, l2, l3, l, al[14], 23L, 0xfde5380cL);
    l = HH(l, l1, l2, l3, al[1], 4L, 0xa4beea44L);
    l3 = HH(l3, l, l1, l2, al[4], 11L, 0x4bdecfa9L);
    l2 = HH(l2, l3, l, l1, al[7], 16L, 0xf6bb4b60L);
    l1 = HH(l1, l2, l3, l, al[10], 23L, 0xbebfbc70L);
    l = HH(l, l1, l2, l3, al[13], 4L, 0x289b7ec6L);
    l3 = HH(l3, l, l1, l2, al[0], 11L, 0xeaa127faL);
    l2 = HH(l2, l3, l, l1, al[3], 16L, 0xd4ef3085L);
    l1 = HH(l1, l2, l3, l, al[6], 23L, 0x4881d05L);
    l = HH(l, l1, l2, l3, al[9], 4L, 0xd9d4d039L);
    l3 = HH(l3, l, l1, l2, al[12], 11L, 0xe6db99e5L);
    l2 = HH(l2, l3, l, l1, al[15], 16L, 0x1fa27cf8L);
    l1 = HH(l1, l2, l3, l, al[2], 23L, 0xc4ac5665L);
    l = II(l, l1, l2, l3, al[0], 6L, 0xf4292244L);
    l3 = II(l3, l, l1, l2, al[7], 10L, 0x432aff97L);
    l2 = II(l2, l3, l, l1, al[14], 15L, 0xab9423a7L);
    l1 = II(l1, l2, l3, l, al[5], 21L, 0xfc93a039L);
    l = II(l, l1, l2, l3, al[12], 6L, 0x655b59c3L);
    l3 = II(l3, l, l1, l2, al[3], 10L, 0x8f0ccc92L);
    l2 = II(l2, l3, l, l1, al[10], 15L, 0xffeff47dL);
    l1 = II(l1, l2, l3, l, al[1], 21L, 0x85845dd1L);
    l = II(l, l1, l2, l3, al[8], 6L, 0x6fa87e4fL);
    l3 = II(l3, l, l1, l2, al[15], 10L, 0xfe2ce6e0L);
    l2 = II(l2, l3, l, l1, al[6], 15L, 0xa3014314L);
    l1 = II(l1, l2, l3, l, al[13], 21L, 0x4e0811a1L);
    l = II(l, l1, l2, l3, al[4], 6L, 0xf7537e82L);
    l3 = II(l3, l, l1, l2, al[11], 10L, 0xbd3af235L);
    l2 = II(l2, l3, l, l1, al[2], 15L, 0x2ad7d2bbL);
    l1 = II(l1, l2, l3, l, al[9], 21L, 0xeb86d391L);
    state[0] += l;
    state[1] += l1;
    state[2] += l2;
    state[3] += l3;
    } private void Encode(byte abyte0[], long al[], int i) {
    int j = 0;
    for (int k = 0; k < i; k += 4) {
    abyte0[k] = (byte) (int) (al[j] & 255L);
    abyte0[k + 1] = (byte) (int) (al[j] >>> 8 & 255L);
    abyte0[k + 2] = (byte) (int) (al[j] >>> 16 & 255L);
    abyte0[k + 3] = (byte) (int) (al[j] >>> 24 & 255L);
    j++;
    } } private void Decode(long al[], byte abyte0[], int i) {
    int j = 0;
    for (int k = 0; k < i; k += 4) {
    al[j] = b2iu(abyte0[k]) | b2iu(abyte0[k + 1]) << 8
    | b2iu(abyte0[k + 2]) << 16 | b2iu(abyte0[k + 3]) << 24;
    j++;
    } } public static long b2iu(byte byte0) {
    return byte0 >= 0 ? byte0 : byte0 & 0xff;
    } public static String byteHEX(byte byte0) {
    char ac[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
    'B', 'C', 'D', 'E', 'F' };
    char ac1[] = new char[2];
    ac1[0] = ac[byte0 >>> 4 & 0xf];
    ac1[1] = ac[byte0 & 0xf];
    String s = new String(ac1);
    return s;
    } public static String getMD5Str(String string) {
    return getInstance().getMD5ofStr(string);
    } public static void main(String args[]) {
    MD5 md5 = new MD5();
    System.out.println(md5.getMD5ofStr("stupid"));
    }}
      

  4.   

    struts.xml<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
    <constant name="struts.custom.i18n.resources" value="Message"/>
    <package name="basic" extends="struts-default" namespace="/basic">
    <action name="first" class="com.briup.basic.FirstAction">
    <result name="success">/basic/first.jsp</result>
    <result name="error">/index.jsp</result>
    </action>
    <action name="register" class="com.briup.basic.RegisterAction">
    <result name="success">/basic/registerSuccess.jsp</result>
    <result name="error">/basic/registererror.jsp</result>
    </action>
    <action name="login" class="com.briup.basic.LoginAction">
    <result name="success">/basic/loginSuccess.jsp</result>
    <result name="error">/basic/loginError.jsp</result>
    <result name="input">/index.jsp</result>
    </action>

    <action name="welcome" class="com.briup.advance.WelcomAction">
    </action>
    </package>
     <!--定义默认的action -->
    <!-- 
    <default-action-ref name="notFound"></default-action-ref>-->

    <package name="advance" extends="struts-default" namespace="/advance">
    <!-- 配置全局的结果集  --><!--
    <global-results>
    <result>/index.jsp</result>
    </global-results>
    --><!--  如果配置了则会覆盖全局结果集 -->
    <!-- 方式一 -->
    <action name="loginRegister" class="com.briup.advance.LoginRegisterAction">
    <result name="registerSuccess">/advance/RegisterSuccess.jsp</result>
    <result name="registerError">/advance/RegisterError.jsp</result>
    <result name="loginSuccess">/advance/LoginSuccess.jsp</result>
    <result name="loginError">/advance/LoginError.jsp</result>
    <result name="input">/index.jsp</result>
    </action>

    <!-- 方式二 -->
    <action name="login" class="com.briup.advance.LoginRegisterAction" method="login">
    <result name="loginSuccess">/advance/LoginSuccess.jsp</result>
    <result name="loginError">/advance/LoginError.jsp</result>
    <result name="input">/index.jsp</result>
    </action>
    <action name="register" class="com.briup.advance.LoginRegisterAction" method="register">
    <result name="registerSuccess">/advance/RegisterSuccess.jsp</result>
    <result name="registerError">/advance/RegisterError.jsp</result>
     <result name="input">/index.jsp</result> 
    </action>
    <!-- 方式三 -->
    <action name="*Action" class="com.briup.advance.LoginRegisterAction" method="{1}">
    <result name="{1}Success">/advance/{1}Success.jsp</result>
    <!--<result name="{1}Error">/advance/{1}Error.jsp</result>
    --><result name="{1}Error">/index.jsp</result>
    <result name="input">/index.jsp</result>
    </action><!--

    <action name="welcome" class="com.briup.advance.WelcomAction"></action>
    --><!-- <action name="*">
                 <result name="success">
                    /index.jsp
                    </result>
        </action>--><!--
        <action name="*">
    </action>
    --></package>
    <package name="ognltags" extends="struts-default" namespace="/ognltags">
    <action name="ognl" class="com.briup.ognltags.OgnlAction">
    <result name="success">/ognltags/ognl.jsp</result>
    </action>
    </package>
    <package name="book" extends="struts-default" namespace="/book">
    <!--<action name="book" class="com.briup.book.bookAction">
    <result name="addOrEdit">/book/addBook.jsp</result>
    <result name="delete">/book/listBooks.jsp</result>
    <result name="list">/book/listBooks.jsp</result>
    <result name="load">/book/editBook.jsp</result>
    <result name="input">/index.jsp</result>
    </action>
    -->
    <action name="addOrEdit" class="com.briup.book.bookAction" method="addOrEdit">
    <result name="addOrEditSuccess" type="chain">list</result>
    <result name="addOrEditError">/index.jsp</result>
    <result name="input" >/index.jsp</result>
    </action>
    <action name="delete" class="com.briup.book.bookAction" method="delete">
    <result name="deleteSuccess" type="chain">list</result>
    <result name="deletError" >/index.jsp</result>
    <result name="input" >/index.jsp</result>
    </action>
    <action name="list" class="com.briup.book.bookAction" method="list">
    <result name="listSuccess">/book/listBooks.jsp</result>
    <result name="listError">/index.jsp</result>
    <result name="input">/index.jsp</result>
    </action>
    <action name="load" class="com.briup.book.bookAction" method="load">
    <result name="loadSuccess">/book/editBook.jsp</result>
    <result name="loadError">/index.jsp</result>
    <result name="input">/index.jsp</result>
    </action>
    </package>
    <package name="converter" extends="struts-default" namespace="/converter">
    <action name="converter" class="com.briup.converter.ConverterAction">
    <result name="success">/converter/show.jsp</result>
    <result name="input">/index.jsp</result>
    </action>
    </package>
    <package name="interceptor" extends="struts-default" namespace="/interceptor">

    <interceptors>
    <interceptor name="login1" class="com.briup.interceptor.LoginInterceptor"></interceptor>
    <interceptor name="time" class="com.briup.interceptor.TimeInterceptor"></interceptor>
    <interceptor-stack name="myInterceptor">
    <interceptor-ref name="login1"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <interceptor-ref name="time"></interceptor-ref>
    </interceptor-stack>
    </interceptors>
    <!-- 设置默认拦截器 -->
    <default-interceptor-ref name="myInterceptor"></default-interceptor-ref>

    <action name="first" class="com.briup.interceptor.FirstAction">
    <!--<interceptor-ref name="myInterceptor"></interceptor-ref>-->
    <result name="success">/interceptor/first.jsp</result>
    <result name="input">/interceptor/isLogin.jsp</result>
    </action>
    <action name="second" class="com.briup.interceptor.SecondAction">
    <!--<interceptor-ref name="myInterceptor"></interceptor-ref>-->
    <result name="success">/interceptor/second.jsp</result>
    <result name="input">/interceptor/isLogin.jsp</result>
    </action>
    <action name="third" class="com.briup.interceptor.ThirdAction">
    <!--<interceptor-ref name="myInterceptor"></interceptor-ref>-->
    <result name="success">/interceptor/third.jsp</result>
    <result name="input">/interceptor/isLogin.jsp</result>
    </action>
    <action name="login" class="com.briup.interceptor.LoginAction">
    <!-- 用time拦截器覆盖默认拦截器 -->
    <interceptor-ref name="time"></interceptor-ref>
    <result name="success">/interceptor/loginSuccess.jsp</result>
    <result name="input">/index.jsp</result>
    </action>
    </package>
    <package name="i18n" extends="struts-default" namespace="/i18n">
    <action name="local" class="com.briup.i18n.LocalAction">
    <result name="success">/i18/i18.jsp</result>
    </action>
    </package>
    </struts>