<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts/struts.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- session超时定义,单位为分钟 --> <session-config> <session-timeout>10</session-timeout> </session-config> <!-- 默认首页定义 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
然后创建struts.xml(String配置文件) 要注意这里集成了Spring插件,把全部Spring配置文件注入到ContextLoaderPlugIn中
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="loginVO" type="com.vo.LoginVO" /> </form-beans> <global-forwards> <forward name="error" path="/error.jsp"/> </global-forwards> <action-mappings> <action path="/login" name="loginVO" type="org.springframework.web.struts.DelegatingActionProxy" parameter="action" scope="request"> <forward name="login" path="/login.jsp"/> <forward name="index" path="/index.jsp"/> </action> </action-mappings> <!-- 集成Spring插件 --> <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/spring/*.xml" /> </plug-in> </struts-config>
配置Spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 读入属性文件 --> <bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:hibernate.properties</value> </list> </property> </bean> <!-- 配置数据源,可以其他方式 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${hibernate.driverClassName}" /> <property name="url" value="${hibernate.url}" /> <property name="username" value="${hibernate.username}" /> <property name="password" value="${hibernate.password}" /> <property name="maxActive" value="${hibernate.maxActive}" /> <property name="maxIdle" value="${hibernate.maxIdle}" /> <property name="maxWait" value="${hibernate.maxWait}" /> </bean> <!-- 配置Hibernate的Session工厂,注入数据源、映射文件 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref local="dataSource"/> </property> <property name="mappingResources"> <list> <value>com/po/login.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.showSQL}</prop> </props> </property> </bean> <!-- 声明Hibernate事务管理,注入Session工厂 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <!-- 配置事务代理,注入事务管理transactionManager,由Spring来代理事务,设置事务属性 --> <bean id="transactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager"/> </property> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="create*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> </beans>
配置Action将Service注入到Action
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 配置Action,singleton属性设置为false表示不使用单例,每次都重新创建实例,避免并发问题,注入事务管理的Service --> <bean name="/login" class="com.action.LoginAction" singleton="false"> <property name="loginService"> <ref bean="loginService"/> </property> </bean> </beans>
配置Service将Dao注入到Service
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 配置事务代理Service,先将Dao注入到Service,再将Service注入给事务代理 --> <bean id="loginService" parent="transactionProxy"> <property name="target"> <ref bean="loginTempService"/> </property> </bean> <bean id="loginTempService" class="com.service.LoginService"> <property name="loginDao"> <ref bean="loginDao"/> </property> </bean> </beans>
配置Dao 注入Session工厂
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 配置Dao,注入Session工厂 --> <bean id="loginDao" class="com.dao.LoginDao"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> </beans>
数据源属性文件(注意不是Hibernate的配置文件,是为了让Spring读入的)
hibernate.dialect=org.hibernate.dialect.SQLServerDialect hibernate.driverClassName=com.mysql.jdbc.Driver hibernate.url=jdbc:mysql://127.0.0.1:3306/ssh hibernate.username=root hibernate.password=5719 hibernate.showSQL=true hibernate.maxActive=50 hibernate.maxIdle=30 hibernate.maxWait=1000
log4j配置文件(简单)
log4j.rootLogger=ERROR,console,file log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%-5p %d [%F,%L] - %m%n log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=F:\\SSH.log #log4j.appender.file.MaxFileSize=100000KB #log4j.appender.file.MaxBackupIndex=1 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%-5p %d [%F,%L] - %m%n
下面是类文件
package com.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; import com.service.LoginService; import com.vo.LoginVO; public class LoginAction extends DispatchAction { private Log logger = LogFactory.getLog(LoginAction.class); private LoginService loginService; public void setLoginService(LoginService loginService) { this.loginService = loginService; } public ActionForward login(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) { try { LoginVO loginVO = (LoginVO) form; String username = loginVO.getUsername(); String password = loginVO.getPassword(); System.out.println(username+password); if(loginService.validate(username, password)) { return mapping.findForward("index"); } return mapping.findForward("error"); } catch (Exception e) { logger.error(e); return mapping.findForward("error"); } } public ActionForward save(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) { try { LoginVO loginVO = (LoginVO) form; loginService.saveUser(loginVO); return mapping.findForward("index"); } catch (Exception e) { logger.error(e); return mapping.findForward("error"); } } } package com.dao; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.po.LoginPO; public class LoginDao extends HibernateDaoSupport { @SuppressWarnings("unchecked") public String getPassword(String username) { String hql = "from LoginPO l where l.username=?"; List list = getSession().createQuery(hql).setString(0,username).list(); if(list!=null && list.size()>0) { LoginPO loginPO = (LoginPO) list.get(0); return loginPO.getPassword(); } return null; } public void save(LoginPO loginPO) { getSession().save(loginPO); } } package com.po; import java.io.Serializable; public class LoginPO implements Serializable { private static final long serialVersionUID = 1L; private Integer id = null; private String username = null; private String password = null; public Integer getId() { return id; } public String getPassword() { return password; } public String getUsername() { return username; } public void setId(Integer id) { this.id = id; } public void setPassword(String password) { this.password = password; } public void setUsername(String username) { this.username = username; } } package com.service; import com.dao.LoginDao; import com.po.LoginPO; import com.vo.LoginVO; public class LoginService { private LoginDao loginDao; public void setLoginDao(LoginDao loginDao) { this.loginDao = loginDao; } public boolean validate(String username,String password) { String pass = loginDao.getPassword(username); if(pass!=null) { if(pass.equals(password)) { return true; } } return false; } public void saveUser(LoginVO loginVO) { LoginPO loginPO = new LoginPO(); loginPO.setUsername(loginVO.getUsername()); loginPO.setPassword(loginVO.getPassword()); System.out.println(loginVO.getUsername()+"-"+loginVO.getPassword()+":save succeed..."); loginDao.save(loginPO); //故意制造异常,测试事务。 //loginDao.save(null); } } package com.vo; import org.apache.struts.action.ActionForm; public class LoginVO extends ActionForm { private static final long serialVersionUID = 1L; private String username = null; private String password = null; public String getPassword() { return password; } public String getUsername() { return username; } public void setPassword(String password) { this.password = password; } public void setUsername(String username) { this.username = username; } }
Hibernate映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.po.LoginPO" table="login"> <comment></comment> <id name="id" type="int"> <column name="id" /> <generator class="native" /> </id> <property name="username" type="string"> <column name="username" not-null="true"> <comment></comment> </column> </property> <property name="password" type="string"> <column name="password" not-null="true"> <comment></comment> </column> </property> </class> </hibernate-mapping>
jsp页面文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <form name="form" action="login.do?action=login" method="post"> <h1>Login</h1> <h4>username:</h4><input name="username" type="text"> <span id="message"></span> <h4>password:</h4><input name="password" type="password"> <br> <br> <input value="提交" type="button" onclick="form.submit();"> </form> <br> <br> <br> <form name="form" action="login.do?action=save" method="post"> <h1>Save</h1> <h4>username:</h4><input name="username" type="text"> <span id="message"></span> <h4>password:</h4><input name="password" type="password"> <br> <br> <input value="提交" type="button" onclick="form.submit();"> </form> </body> </html>