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,构建一个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)基于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, 设置操作权限为只读,一般用于查询的方法,优化作用.
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"));
}}
<!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>