最近刚学习了S2SH,准备写一点小体会,希望各位大侠给予指导。
S2SH整合的基本架构:
Jsp作为前端展示页面,Struts2处理用户的Action,Hibernate3作为ORmapping工具,Spring2.5主要负责整合Struts2和Hibernate的配置文件。
一用户登录管理为例:
首先生成POJO类:(admininfo.java)
package com.model; /** * Admininfo entity. @author MyEclipse Persistence Tools */ public class Admininfo implements java.io.Serializable { // Fields private String aid; private String aname; private String apwd; private String alevel; // Constructors /** default constructor */ public Admininfo() { } /** minimal constructor */ public Admininfo(String aid, String aname, String apwd) { this.aid = aid; this.aname = aname; this.apwd = apwd; } /** full constructor */ public Admininfo(String aid, String aname, String apwd, String alevel) { this.aid = aid; this.aname = aname; this.apwd = apwd; this.alevel = alevel; } // Property accessors public String getAid() { return this.aid; } public void setAid(String aid) { this.aid = aid; } public String getAname() { return this.aname; } public void setAname(String aname) { this.aname = aname; } public String getApwd() { return this.apwd; } public void setApwd(String apwd) { this.apwd = apwd; } public String getAlevel() { return this.alevel; } public void setAlevel(String alevel) { this.alevel = alevel; }
然后是Pojo类的DAO
package com.dao; import java.util.List; import org.hibernate.LockMode; import com.model.Admininfo; public interface AdmininfoDAO{ public void save(Admininfo transientInstance); public void delete(Admininfo persistentInstance); public Admininfo findById( java.lang.String id); public List findByExample(Admininfo instance); public List findByProperty(String propertyName, Object value); public List findByAname(Object aname ); public List findByApwd(Object apwd ); public List findByAlevel(Object alevel ); public List findByNameAndPass(String name,String pass); public List findAll(); public Admininfo merge(Admininfo detachedInstance); public void attachDirty(Admininfo instance); public void attachClean(Admininfo instance); }
AdmininfoDAOimpl.java:
package com.dao.impl; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.LockMode; import org.springframework.orm.hibernate3.HibernateTemplate; import com.dao.AdmininfoDAO; import com.model.Admininfo; public class AdmininfoDAOimpl implements AdmininfoDAO{ private HibernateTemplate hibernateTemplate; private static final Log log = LogFactory.getLog(AdmininfoDAO.class); public static final String ANAME = "aname"; public static final String APWD = "apwd"; public static final String ALEVEL = "alevel"; public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public void save(Admininfo transientInstance) { log.debug("saving Admininfo instance"); try { getHibernateTemplate().save(transientInstance); log.debug("save successful"); } catch (RuntimeException re) { log.error("save failed", re); throw re; } } public void delete(Admininfo persistentInstance) { log.debug("deleting Admininfo instance"); try { getHibernateTemplate().delete(persistentInstance); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; } } public Admininfo findById( java.lang.String id) { log.debug("getting Admininfo instance with id: " + id); try { Admininfo instance = (Admininfo) getHibernateTemplate() .get("com.model.Admininfo", id); return instance; } catch (RuntimeException re) { log.error("get failed", re); throw re; } } public List findByExample(Admininfo instance) { log.debug("finding Admininfo instance by example"); try { List results = getHibernateTemplate().findByExample(instance); log.debug("find by example successful, result size: " + results.size()); return results; } catch (RuntimeException re) { log.error("find by example failed", re); throw re; } } public List findByProperty(String propertyName, Object value) { log.debug("finding Admininfo instance with property: " + propertyName + ", value: " + value); try { String queryString = "from Admininfo as model where model." + propertyName + "= ?"; return getHibernateTemplate().find(queryString, value); } catch (RuntimeException re) { log.error("find by property name failed", re); throw re; } } public List findByAname(Object aname ) { return findByProperty(ANAME, aname ); } public List findByApwd(Object apwd ) { return findByProperty(APWD, apwd ); } public List findByAlevel(Object alevel ) { return findByProperty(ALEVEL, alevel ); } public List findAll() { log.debug("finding all Admininfo instances"); try { String queryString = "from Admininfo"; return getHibernateTemplate().find(queryString); } catch (RuntimeException re) { log.error("find all failed", re); throw re; } } public Admininfo merge(Admininfo detachedInstance) { log.debug("merging Admininfo instance"); try { Admininfo result = (Admininfo) getHibernateTemplate() .merge(detachedInstance); log.debug("merge successful"); return result; } catch (RuntimeException re) { log.error("merge failed", re); throw re; } } public void attachDirty(Admininfo instance) { log.debug("attaching dirty Admininfo instance"); try { getHibernateTemplate().saveOrUpdate(instance); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } public void attachClean(Admininfo instance) { log.debug("attaching clean Admininfo instance"); try { getHibernateTemplate().lock(instance, LockMode.NONE); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } @Override public List findByNameAndPass(String name, String pass) { // TODO Auto-generated method stub return null; } }
以及Adimininfo的Hibernate配置文件:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="com.model.Admininfo" table="admininfo" catalog="pos"> <id name="aid" type="java.lang.String"> <column name="Aid" length="20" /> <generator class="assigned" /> </id> <property name="aname" type="java.lang.String"> <column name="Aname" length="50" not-null="true" /> </property> <property name="apwd" type="java.lang.String"> <column name="Apwd" length="20" not-null="true" /> </property> <property name="alevel" type="java.lang.String"> <column name="Alevel" length="20" /> </property> </class> </hibernate-mapping>
至此 系统的模型建立完毕。下面就是Struts2对用户输入的响应:
响应需要Action,下面是LoginAction.java
package com.web.Admin; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.dao.AdmininfoDAO; import com.model.Admininfo; import com.opensymphony.xwork2.ActionSupport; import com.service.UserService; public class LoginAction extends ActionSupport{ /** * */ private static final long serialVersionUID = 1L; private String aname; private String apwd; private UserService US; public void setAname(String aname) { this.aname = aname; } public String getAname() { return aname; } public void setApwd(String apwd) { this.apwd = apwd; } public String getApwd() { return apwd; } public String execute(){ System.out.println("yeyeyeye"); Admininfo ad=new Admininfo(); ad.setAname(aname); ad.setApwd(apwd); ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService a=(UserService) ctx.getBean("UserService"); System.out.println(aname); System.out.println(apwd); //AdmininfoDAO a=new AdmininfoDAOimpl(); //US.logincheck(aname, apwd); System.out.println(US); if(!a.logincheck(aname, apwd)){ return "Fail"; }else { return "Success"; } } public void setUS(UserService uS) { US = uS; } public UserService getUS() { return US; } }
为此还需配置Struts2的配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.i18n.encoding" value="gbk" /> <constant name="struts.objectFactory" value="spring" /> <include file="struts-default.xml"></include> <package name="com.web.Admin" extends="struts-default"> <!-- 登陆的Action --> <action name="login" class="com.web.Admin.LoginAction"> <result name="Success">/main.jsp</result> <result name="Fail">/adminlogin.jsp</result> </action> </package> </struts>
至此Struts2的响应处理完毕
Spring的作用是配置Hibernate和Struts2,bean文件如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!--配置数据源--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost/pos"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <property name="mappingResources"> <list> <value>com/model/Admininfo.hbm.xml</value> </list> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="AdmininfoDAO" class="com.dao.impl.AdmininfoDAOimpl"> <property name="hibernateTemplate"> <ref bean="hibernateTemplate"></ref> </property> </bean> <bean id="UserService" class="com.service.UserService"> <property name="admininfoDAO" ref="AdmininfoDAO"></property> </bean> </beans>
最后,使用AdminService类来管理业务逻辑,实现耦合分离
package com.service; import com.dao.AdmininfoDAO; public class UserService{ private AdmininfoDAO admininfoDAO; public AdmininfoDAO getAdmininfoDAO() { return admininfoDAO; } public void setAdmininfoDAO(AdmininfoDAO admininfoDAO) { this.admininfoDAO = admininfoDAO; } public boolean logincheck(String aname,String apwd){ if(admininfoDAO.findByAname(aname).size()==0){ return false; }else return true; } }
最后是现实的jsp
<%@ page contentType="text/html; charset=gbk" %> <html> <head> <title>登陆页面</title> <link rel=stylesheet href="css/style.css" mce_href="css/style.css" type="text/css"> <mce:script language="JavaScript" src="script/trim.js" mce_src="script/trim.js"></mce:script> <mce:script language="JavaScript"><!-- function check(){ var uname = document.all.uname.value; var upwd = document.all.upwd.value; if(uname.trim()==""){ alert("用户名为空,请重新输入!!!"); return; } if(upwd.trim()==""){ alert("密码为空,请重新输入!!!"); return; } document.all.mf.submit(); } // --></mce:script> </head> <body> <div class="out"> <div class="login_style"> <center> <form action="login" method="post" id="mf" target="bottom"> <table> <tr> <td>用户名:</td> <td><input type="text" id="uname" name="aname" value="zlf"/></td> </tr> <tr> <td>密 码:</td> <td><input type="password" id="upwd" name="apwd" value="12345"/></td> </tr> <tr> <td colspan="2" align="center"> <img border="0" src="img/ddl.gif" mce_src="img/ddl.gif" id="lg" onclick="JavaScript:check()" style="cursor:hand" mce_style="cursor:hand" onmouseover="document.all.lg.src='img/ddla.gif'" onmouseout="document.all.lg.src='img/ddl.gif'" onmouseup="document.all.lg.src='img/ddla.gif'" onmousedown="document.all.lg.src='img/ddlb.gif'"/> <img border="0" src="img/cz.gif" mce_src="img/cz.gif" id="cz" onclick="JavaScript:document.all.mf.reset()" style="cursor:hand" mce_style="cursor:hand" onmouseover="document.all.cz.src='img/cza.gif'" onmouseout="document.all.cz.src='img/cz.gif'" onmouseup="document.all.cz.src='img/cza.gif'" onmousedown="document.all.cz.src='img/czb.gif'"/></td> </tr> </table> <input type="hidden" name="action" value="login"/> </form> </center> </div> </div> </body> </html>