您的位置:首页 > 编程语言 > Java开发

struts+Spring+Hibernate整合(2)

2010-12-13 09:09 471 查看
我们以把三个框架都导进来了,接上来我把JAR包给出来,如下图:



大家把多余的jar文件删除(在WEB-INF/lib下)。然后我们开始创建实体类和映射文件,我们找到“DB Browser”选项卡,如下



在我们前面建的数据库连接"mysql"上右键--Open connection...开始连接数据库。如下图:



点击那个小三角找到我们要找的库“test”,然后在库中找到我们要创建映射的表,我这里是user表,表中字段有三个,id
intege他是主键,username varchar(45) 用户名,password varchar(45)密码。

然后我们在要创建映射的表上点右键,选择“Hibernate Reverse Engineering...”弹出对话框,如下图:



按照上图配置:先选择映射文件要存放的路径(点java package
后面的那个“Browser”按钮,选择MySSH项目下的一个包,我建的包叫:com.zgh.hibernate.vo,大家也可在上图中看一下我的目录结构),然后按图钩选即可,说明上面图片中有。最后点“Next”进入下一步,如图:



在上图中选择主键生成方式,按图选择即可。点“Finish”完成。

生成两个文件在com.zgh.hibernate.vo中,如下图(包括我项目的路径情况,大家可参考):



这样实体类和其映射文件就创建完成了。我们要修改一个User.hbm.xml文件,把catalog="test"删除,否则Hibernate生成的SQL会出错。下面给出User.hbm.xml的代码,如下:


<?xml version="1.0"?>


<!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 - Hibernate Tools


-->


<hibernate-mapping>


<class name="com.zgh.hibernate.vo.User" table="user">


<id name="id" type="java.lang.Integer">


<column name="id" />


<generator class="increment" />


</id>


<property name="username" type="java.lang.String">


<column name="username" length="45" not-null="true" />


</property>


<property name="password" type="java.lang.String">


<column name="password" length="45" not-null="true" />


</property>


</class>


</hibernate-mapping>



User.java代码:

/** *//**


* @author zhu国辉


*/


package com.zgh.hibernate.vo;







/** *//**


* User generated by MyEclipse - Hibernate Tools


*/
public class User implements java.io.Serializable ...{






// Fields




private Integer id;


private String username;


private String password;






// Constructors



/** *//** default constructor */
public User() ...{


}





/** *//** full constructor */
public User(String username, String password) ...{


this.username = username;


this.password = password;


}






// Property accessors



public Integer getId() ...{


return this.id;


}



public void setId(Integer id) ...{


this.id = id;


}



public String getUsername() ...{


return this.username;


}



public void setUsername(String username) ...{


this.username = username;


}



public String getPassword() ...{


return this.password;


}



public void setPassword(String password) ...{


this.password = password;


}




















}

接下来我们创建Dao层,我们在com.zgh.spring.dao中创建一个接口和一类实现类:

IUserLoginDao.java代码:

/** *//**


* @author zhu国辉


*/


package com.zgh.spring.dao;




import java.util.List;



public interface IUserLoginDao ...{


List getUser(String username,String password);




}



UserLoginDao.java代码:

/** *//**


* @author zhu国辉


*/


package com.zgh.spring.dao;




import java.util.List;




import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/** *//**


* 记住一定要引入org.springframework.orm.(hibernate3).support.HibernateDaoSupport


* 也就是此类的父类.


* @author zhu国辉


*


*/
public class UserLoginDao extends HibernateDaoSupport implements IUserLoginDao ...{



public List getUser(String username, String password) ...{
List users=getHibernateTemplate().find("from User u where username=? and password=?",new Object[]...{username,password});


return users;


}




}



以上是Dao层,通过Spring提供的Hibernate模板,实现持久层的操作。比单用Hibernate代码少多了,不用开启和关闭事务和session。

接下来是service层,我们会把事务添加到这层里,这一层一般会把Action中Form的数据转换成实体类给Dao层用,但本例只做登陆,没有体现出来。

我们在com.zgh.spring.service包中创建一个接口和一个实现类。IUserLoginService.java接口代码:

/** *//**


* @author zhu国辉


*/


package com.zgh.spring.service;




import java.util.List;



public interface IUserLoginService ...{


List getUser(String username,String password);




}



UserLoginService.java代码:

/** *//**


* @author zhu国辉


*/


package com.zgh.spring.service;




import java.util.List;


import com.zgh.spring.dao.IUserLoginDao;;



public class UserLoginService implements IUserLoginService ...{


private IUserLoginDao userLoginDao;



public void setUserLoginDao(IUserLoginDao userLoginDao) ...{


this.userLoginDao = userLoginDao;


}



public List getUser(String username, String password) ...{




return userLoginDao.getUser(username, password);


}




}



接下来我们开始写Struts的程序,下一页吧,太多了。

下面我们开始创建Struts的程序,我们在WEB-INF下双击打开struts-config.xml文件,在视图中的空白处右键--New--"Form,Action
and JSP":


弹出一对话框,如下图:



此步是创建Form,在User
case中输入user,在下面添加Form的属性(点"Add"按钮添加),然后我们我们选择“JSP”选项卡,如下图:



按图中配置即可,创建的jsp文件会出现在WebRoot/jsp文件夹中(应该在WebRoot下创建个jsp文件夹),

然后点击"Next"进入下一步,如下图:



此步是创建Action,在上面输入Path,因为是登陆,这里我们输入"/login",然后确定Type中是com.zgh.struts.action.LoginAction然后点击“Forwards”选项卡,如下图:



按图中的步骤一步一步输入(或选择),先点击“Add”
(第2步)在弹出框中的“Name”中输入“success”(第4步),然后点"Browser"按钮(第5步),选择一个登陆成的的页面(第6步,这个页面应该先建好,后面会给出代码),然后点OK(第7步),然后点"Add"按钮(第8步),然后点“Close”关闭(第9步),然后点"Finish"完成(第10步)。完成。在struts-config.xml中生成视图如下:



以下是struts-config.xml的代码,如下:


<?xml version="1.0" encoding="gbk"?>


<!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>


<data-sources />


<form-beans >


<form-bean name="userForm" type="com.zgh.struts.form.UserForm" />




</form-beans>




<global-exceptions />


<global-forwards />


<action-mappings >


<!-- 把type="com.zgh.struts.action.LoginAction" 改成:type="org.springframework.web.struts.DelegatingActionProxy" -->


<!-- 这样才能合Spring整合,把控制权交给Spring -->


<action


attribute="userForm"


input="/jsp/login.jsp"


name="userForm"


path="/login"


scope="request"




type="org.springframework.web.struts.DelegatingActionProxy">


<forward name="success" path="/jsp/loginSuccess.jsp" />


</action>




</action-mappings>




<message-resources parameter="com.zgh.struts.ApplicationResources" />


<!-- 添加Spring的插件 -->


<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">


<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>


</plug-in>




</struts-config>





注意下上面的action元素的type属性,这是与Spring整合的一种方法,还有后面的plug-in是必须的,而且一定要写到最后,Struts的配置文件必须按先后顺序。

下面是LoginAction.java代码:

/**//*


* Generated by MyEclipse Struts


* Template path: templates/java/JavaClass.vtl


*/
/** *//**


* @author zhu国辉


*/


package com.zgh.struts.action;




import java.util.List;




import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;




import org.apache.struts.action.Action;


import org.apache.struts.action.ActionForm;


import org.apache.struts.action.ActionForward;


import org.apache.struts.action.ActionMapping;




import com.zgh.spring.service.IUserLoginService;


import com.zgh.struts.form.UserForm;



/** *//**


* MyEclipse Struts


* Creation date: 01-07-2008


*


* XDoclet definition:


* @struts.action path="/login" name="userForm" input="/jsp/login.jsp" scope="request" validate="true"


* @struts.action-forward name="success" path="/jsp/loginSuccess.jsp"


*/
public class LoginAction extends Action ...{
/**//*


* Generated Methods


*/




private IUserLoginService userLoginService;



public void setUserLoginService(IUserLoginService userLoginService) ...{


this.userLoginService = userLoginService;


}



/** *//**


* Method execute


* @param mapping


* @param form


* @param request


* @param response


* @return ActionForward


*/


public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) ...{


UserForm userForm = (UserForm) form;// TODO Auto-generated method stub


List users=userLoginService.getUser(userForm.getUsername(), userForm.getPassword());
if(users!=null && users.size()>0)...{


return mapping.findForward("success");


}


return mapping.getInputForward();


}


}

下面是login.jsp的代码:

<%...@ page language="java"%>
<%...@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%...@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>




<html>


<head>


<title>JSP for UserForm form</title>


</head>


<body>


<html:form action="/login">




username : <html:text property="username"/><html:errors property="username"/><br/>


password : <html:password property="password"/><html:errors property="password"/><br/>


<html:submit/><html:cancel/>


</html:form>


</body>


</html>





以下是loginSuccess.jsp代码:

<%...@ page language="java" contentType="text/html; charset=GBK"


pageEncoding="GBK"%>
<%...@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%...@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


<html>


<head>


<meta http-equiv="Content-Type" content="text/html; charset=GBK">


<title>Insert title here</title>


</head>


<body>


亲爱的<bean:write name="userForm" property="username"/>:


<br/>


欢迎您!


</body>


</html>

好,接下来的在下一页继续。

接下来是UserForm的代码:

/**//*


* Generated by MyEclipse Struts


* Template path: templates/java/JavaClass.vtl


*/
/** *//**


* @author zhu国辉


*/


package com.zgh.struts.form;




import javax.servlet.http.HttpServletRequest;


import org.apache.struts.action.ActionErrors;


import org.apache.struts.action.ActionForm;


import org.apache.struts.action.ActionMapping;



/** *//**


* MyEclipse Struts


* Creation date: 01-07-2008


*


* XDoclet definition:


* @struts.form name="userForm"


*/
public class UserForm extends ActionForm ...{
/**//*


* Generated fields


*/



/** *//** id property */


private String id;



/** *//** username property */


private String username;



/** *//** password property */


private String password;



/**//*


* Generated Methods


*/



/** *//**


* Method validate


* @param mapping


* @param request


* @return ActionErrors


*/


public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) ...{


// TODO Auto-generated method stub


return null;


}



/** *//**


* Method reset


* @param mapping


* @param request


*/
public void reset(ActionMapping mapping, HttpServletRequest request) ...{


// TODO Auto-generated method stub


}



/** *//**


* Returns the id.


* @return String


*/
public String getId() ...{


return id;


}



/** *//**


* Set the id.


* @param id The id to set


*/
public void setId(String id) ...{


this.id = id;


}



/** *//**


* Returns the username.


* @return String


*/
public String getUsername() ...{


return username;


}



/** *//**


* Set the username.


* @param username The username to set


*/
public void setUsername(String username) ...{


this.username = username;


}



/** *//**


* Returns the password.


* @return String


*/
public String getPassword() ...{


return password;


}



/** *//**


* Set the password.


* @param password The password to set


*/
public void setPassword(String password) ...{


this.password = password;


}


}

以下是applicationContext.xml的代码:


<?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="myDataSource"


class="org.apache.commons.dbcp.BasicDataSource">


<property name="driverClassName">


<value>com.mysql.jdbc.Driver</value>


</property>


<property name="url">


<value>jdbc:mysql://localhost:3306/test</value>


</property>


<property name="username">


<value>root</value>


</property>


<property name="password">


<value>root</value>


</property>


</bean>




<!--==================== 连接工厂======================= -->


<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">


<property name="mappingResources">


<list>


<value>com/zgh/hibernate/vo/User.hbm.xml</value></list>


</property>


<property name="dataSource">


<ref bean="myDataSource" />


</property>


<property name="hibernateProperties">


<props>


<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>


<prop key="hibernate.show_sql">true</prop>


</props>


</property>


</bean>




<!--==================== DAO======================= -->


<bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao">


<property name="sessionFactory">


<ref local="mySessionFactory"/>


</property>


</bean>




<!--====================Service======================= -->


<bean id="userLoginService" class="com.zgh.spring.service.UserLoginService">


<property name="userLoginDao">


<ref local="userLoginDao"/>


</property>


</bean>




<!--====================hibernate事务管理器======================= -->


<bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">


<property name="sessionFactory">


<ref local="mySessionFactory"/>


</property>


</bean>




<!--====================事务代理======================= -->


<!-- 第一个属性:transactionManager是设置事务管理器 -->


<!-- 第二个属性:target是设置要代理的对象 -->


<!-- 第三个属性:transactionAttributes是设置代理对象的方法的事务属性.这里设置的是:开启一个事务,并且是只读的(因为是查询) -->


<bean id="proxyUserLoginService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">


<property name="transactionManager">


<ref local="hibernateTransactionManager"/>


</property>


<property name="target">


<ref local="userLoginService"/>


</property>


<property name="transactionAttributes">


<props>


<prop key="getUser*">PROPAGATION_REQUIRED,readOnly</prop>


</props>


</property>


</bean>




<!--====================Action======================= -->


<!-- 此时要用bean的name属性,不要用id属性 -->


<bean name="/login" class="com.zgh.struts.action.LoginAction">


<property name="userLoginService">


<ref bean="proxyUserLoginService"/>


</property>


</bean>


</beans>

上面的xml中,大部分得自己写,如有哪处不明白,留言吧,

数据源和SessionFactory是配置时创建的。下面是Web.xml:


<?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">

<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-config.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>


</web-app>





下面是我的项目的结构:



最后总结:在这个项目中,通过Struts建立视图,并担任控制器角色,Spring则把整个项目的耦合度减到最小,通过Spring的aop实现声明式事务(只需在配置文件中配置),通过Spring提供的Hibernate模板,我们甚至都不用关心Session的创建与关闭.还要说明一点登陆时不要输入中文,这里面没进行转码,我会在以后补充的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: