Structs+Spring+Hibernate快速入门

本文介绍了一个使用Structs+Spring+Hibernate的经典组合进行用户注册功能开发的实例,详细展示了从注册页面到业务逻辑的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Structs+Spring+Hibernate,这是很经典的一个搭配,它的开发流程也比较程式化,下面以用户注册为例。
注册页面代码:
<%@pagecontentType="text/html;charset=GBK"%>
<html>
<head><title>Spring、Struts和Hibernate整合之用户注册</title></head>
<body>${msg}
<formname="user"action="/myHibernate/regedit.do"method="post">
用户名
<inputtype="text"name="username"value="${user.username}"/><br>
密码
<inputtype="password"name="password"value="${user.password}"/><br>
<inputtype="submit"name="method"value="提交"/>
</form>
</body>
</html>

实体Bean类:

packagecom.myHibernate.bean;
publicclassUser1{
//定义id
privateStringid=null;
//定义用户名
privateStringusername=null;
//定义密码
privateStringpassword=null;
//设定id
publicvoidsetId(Stringid){
this.id=id;
}

//获取id
publicStringgetId(){
returnthis.id;
}

//设定用户名
publicvoidsetUsername(Stringusername){
this.username=username;
}

//获取用户名
publicStringgetUsername(){
returnthis.username;
}

//设定密码
publicvoidsetPassword(Stringpassword){
this.password=password;
}

//获取密码
publicStringgetPassword(){
returnthis.password;
}


}

对应的映射文件User.hbm.xml:
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mappingpackage="com.myHibernate.bean">
<classname="User"table="user">
<!--定义id-->
<idname="id"column="id">
<generatorclass="native"/>
</id>
<!--定义用户名-->
<propertyname="username"/>
<!--定义密码-->
<propertyname="password"/>
</class>
</hibernate-mapping>
用户DAO接口:

packagecom.myHibernate.dao;
importcom.myHibernate.bean.User;
publicinterfaceUserDAO{
//查询用户
publicabstractUserqueryUser(Stringname);
//新增用户
publicabstractvoidinsertUser(Useruser);
//修改用户
publicabstractvoidupdateUser(Useruser);
//删除用户
publicabstractvoiddeleteUser(Useruser);
}

用户DAO接口实现类:
packagecom.myHibernate.dao.impl;
importorg.hibernate.SessionFactory;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;

importcom.myHibernate.bean.User;
importcom.myHibernate.dao.UserDAO;
publicclassUserDAOImplextendsHibernateDaoSupportimplementsUserDAO{
privateSessionFactorysessionFactory;
privateStringhql="fromUseruwhereu.username=?";
//查询用户
publicUserqueryUser(Stringname){
Useruser
=null;
//如果查询结果为空
if(this.getHibernateTemplate().find(hql,name)==null){
user
=null;
}
else{
//不为空时,取第一笔
user=(User)this.getHibernateTemplate().find(hql,name).get(0);
}

returnuser;
}

//新增用户
publicvoidinsertUser(Useruser){
this.getHibernateTemplate().save(user);
}

//修改用户
publicvoidupdateUser(Useruser){
this.getHibernateTemplate().update(user);
}

//删除用户
publicvoiddeleteUser(Useruser){
this.getHibernateTemplate().delete(user);
}

}

注册的业务逻辑接口:


packagecom.myHibernate.domain;
importcom.myHibernate.bean.User;
publicinterfaceRegedit{
//保存用户
publicabstractvoidsaveUser(Useruser);
//修改用户
publicabstractvoidupdateUser(Useruser);
//删除用户
publicabstractvoiddeleteUser(Useruser);
//获取是否保存成功的消息
publicabstractStringgetMsg();
}

注册的业务逻辑实现:

packagecom.myHibernate.domain.impl;

importcom.myHibernate.bean.User;
importcom.myHibernate.dao.UserDAO;
importcom.myHibernate.domain.Regedit;

publicclassRegeditImplimplementsRegedit{
privateStringmsg;
privateUserDAOuserDao;
//保存用户
publicvoidsaveUser(Useruser){
userDao.insertUser(user);
msg
="保存成功";
}

//修改用户
publicvoidupdateUser(Useruser){
userDao.updateUser(user);
}

//删除用户
publicvoiddeleteUser(Useruser){
userDao.deleteUser(user);
}

//获取是否保存成功的消息
publicStringgetMsg(){
returnmsg;
}

/***//**
*@返回userDao
*/

publicUserDAOgetUserDao(){
returnuserDao;
}

/***//**
*@注入userDao
*/

publicvoidsetUserDao(UserDAOuserDao){
this.userDao=userDao;
}

}

用户注册控制器类:
packagecom.myHibernate.action;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
//导入struts包
importorg.apache.struts.action.Action;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping;

importcom.myHibernate.bean.User;
importcom.myHibernate.domain.Regedit;
//继承action
publicclassRegeditActionextendsAction{
//定义接口Regedit
privateRegeditregedit;
//获取值
publicRegeditgetRegedit(){
returnregedit;
}

//依赖注入值
publicvoidsetRegedit(Regeditregedit){
this.regedit=regedit;
}

publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
//获取用户提交的信息
Useruser=(User)form;
//保存用户提交的信息
getRegedit().saveUser(user);
//将用户提交的信息和是否保存成功的信息存放在request中
request.setAttribute("user",user);
request.setAttribute(
"msg",regedit.getMsg());
//返回页面
returnmapping.findForward("regedit");
}

}

下面是配置文件方面,首先是Hibernate的配置文件hibernate.cfg.xml,定义了访问数据库所需要的一些值:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>
<hibernate-configuration>
<session-factory>
<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<propertyname="hibernate.connection.url">jdbc:mysql://localhost/myHibernate</property>
<propertyname="hibernate.connection.username">root</property>
<propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<propertyname="show_sql">true</property>
<mappingresource="com/myHibernate/bean/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

然后是Spring的配置文件spring-config.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--定义数据源-->
<beanid="dataSource"
class
="org.apache.commons.dbcp.BasicDataSource"
destroy-method
="close">
<!--设定驱动-->
<propertyname="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<!--设定url-->
<propertyname="url">
<value>jdbc:mysql://localhost/myHibernate</value>
</property>
<!--设定用户名-->
<propertyname="username">
<value>root</value>
</property>
</bean>
<!--通过org.springframework.orm.hibernate3.LocalSessionFactoryBean建立联系-->
<beanid="sessionFactory"
class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<propertyname="dataSource">
<reflocal="dataSource"/>
</property>
<!--定义要使用的映射文件-->
<propertyname="mappingResources">
<list>
<value>com/myHibernate/bean/User.hbm.xml</value>
</list>
</property>
<!--定义要使用的方言和是否显示sql-->
<propertyname="hibernateProperties">
<props>
<propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<propkey="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!--这里添加对事务处理的支持,当然也可以不用-->
<beanid="transactionManager"
class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
<propertyname="sessionFactory">
<reflocal="sessionFactory"/>
</property>
</bean>
<!--表示要将下面定义的userDao置于事务处理之下-->
<beanid="userDaoProxy"
class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<propertyname="transactionManager">
<refbean="transactionManager"/>
</property>
<!--要代理userDao-->
<propertyname="target">
<reflocal="userDao"/>
</property>
<!--定义不同情况下,事务处理的方式-->
<propertyname="transactionAttributes">
<props>
<propkey="create*">PROPAGATION_REQUIRED</prop>
<propkey="update*">PROPAGATION_REQUIRED</prop>
<propkey="delete*">PROPAGATION_REQUIRED</prop>
<propkey="query*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!--定义userDao-->
<beanid="userDao"class="com.myHibernate.dao.impl.UserDAOImpl">
<propertyname="sessionFactory">
<reflocal="sessionFactory"/>
</property>
</bean>
<!--定义regedit,将UserDAO进行注入-->
<beanid="regedit"class="com.myHibernate.domain.impl.RegeditImpl">
<propertyname="userDao">
<reflocal="userDao"/>
</property>
</bean>
<!--定义login,将UserDAO进行注入-->
<beanid="login"class="com.myHibernate.domain.impl.LoginImpl">
<propertyname="userDao">
<reflocal="userDao"/>
</property>
</bean>
<!--定义和Struts相应的映射,将regedit进行注入-->
<beanname="/regedit"class="com.myHibernate.action.RegeditAction">
<propertyname="regedit">
<refbean="regedit"/>
</property>
</bean>
<!--定义和Struts相应的映射,将login进行注入-->
<beanname="/login"class="com.myHibernate.action.LoginAction">
<propertyname="login">
<refbean="login"/>
</property>
</bean>
</beans>
然后是Struts的配置文件struts-config.xml:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.2//EN""http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config><!--定义formbean--><form-beans><form-beanname="user"type="com.myHibernate.bean.User"/></form-beans>
<action-mappings>
<!--定义和SPring配置文件相同的路径-->
<actionpath="/regedit"type="org.springframework.web.struts.DelegatingActionProxy"name="user">
<forwardname="regedit"path="/jsp/regedit.jsp"/>
</action>
<!--定义初次访问时的路径-->
<actionpath="/input"
type
="org.apache.struts.actions.ForwardAction"
parameter
="/jsp/regedit.jsp"/>
<!--定义和SPring配置文件相同的路径-->
<actionpath="/login"
type
="org.springframework.web.struts.DelegatingActionProxy"name="user">
<forwardname="login"path="/jsp/login.jsp"/>
</action>
<!--定义初次访问时的路径-->
<actionpath="/loginTemp"
type
="org.apache.struts.actions.ForwardAction"
parameter
="/jsp/login.jsp"/>
</action-mappings>
<!--注册ContextLoaderPlugIn插件-->
<plug-inclassName="org.springframework.web.struts.ContextLoaderPlugIn">
<set-propertyproperty="contextConfigLocation"value="/WEB-INF/spring-config.xml"/>
</plug-in>
</struts-config>

最后是Web应用程序配置文件web.xml:
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appversion="2.4"
xmlns
="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
<servlet>
<servlet-name>actionServlet</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>
<load-on-startup>1</load-on-startup>
</servlet>
<!--处理所有后缀为do的请求-->
<servlet-mapping>
<servlet-name>actionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
可以看到,MVC的三层架构思路很清晰,但缺点也很明显,配置文件太过于冗杂,CRUD代码随处冗余,不够简约,下一篇文章中我们将见识到一个解决这个问题的优秀框架—SpringSide



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值