我们以把三个框架都导进来了,接上来我把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的代码,如下:
<! 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的代码,如下:
<! 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的代码:
<% ... @ 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代码:
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的代码:
<! 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:
< 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的创建与关闭.还要说明一点登陆时不要输入中文,这里面没进行转码,我会在以后补充的.