SSH学习之——Spring、Struts和Hibernate整合开发
一、环境1、测试平台:MyEclipse8.5/JDK1.7(1.5以上都OK)2、开源框架:Spring3.0/Struts2.1/Hibernate3.33、UI界面:HTML/JSP/struts2标签 二、具体步骤1、新建Web项目,此处命名为“ssh”2、添加Spring的支持。 1)利用平台自身带有的Spring支持(如果熟悉各个库的作用以及
一、环境
1、测试平台:MyEclipse8.5/JDK1.7(1.5以上都OK)
2、开源框架:Spring3.0/Struts2.1/Hibernate3.3
3、UI界面:HTML/JSP/struts2标签
二、具体步骤
1、新建Web项目,此处命名为“ssh”
2、添加Spring的支持。
1)利用平台自身带有的Spring支持(如果熟悉各个库的作用以及配置文件的作用,最好是采用手动添加库来完成,这样的好处就是避免将过多的没必要的jar文件引入到项目中,造成项目的臃肿),此处我们添加Spring3.0
2)勾选五个Spring的库。Spring的核心支持库Core、面向方面编程支持库AOP、持久化核心支持库Persistence Core、JDBC持久化支持库Persistence JDBC、支持Web应用的的库Web(当然这次的开发内容中不包含AOP的东西,所以不选这个也行)
3)此时平台会提示用户自动创建Spring的配置文件“applicationContext.xml”,该文件在src目录下,也就是classpath下
4)配置Web.xml来使Web项目启动时自动启用Spring,在Web.xml中添加如下配置
<!-- 配置Spring配置文件的位置,多个可以以逗号分隔 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 不指定classpath时,默认为加载/WEB_INF/目录下的文件 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 项目启动时自动启用Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
5)Spring的支持基本配置好了
3、添加Struts的支持
1)这里我们也采用MyEclipse8.5自身的Struts来添加Struts,此处我们添加Struts2.1
2)勾选Struts的核心支持库Core
3)整合Spring和Struts。由于Spring是管理业务对象的,Struts的Action对象可以交由Spring来管理,所以这里我们添加一个插件“struts2-spring-plugin-2.1.6.jar”来达到整合Spring和Struts的目的,把该文件拷贝到/WEB-INF/lib目录下即可(这里我们也可以采用勾选MyEclipse8.5平台提供的Struts支持中的Struts-Spring库,但是这里面的很多jar添加Spring时已经有了,一面造成重复和臃肿,我们采用手动添加该文件的方式)。关于Struts是如何于Spring进行整合的,Struts的对象又是如何交由Spring管理的,可以参照该jar文件中的“struts-plugin.xml”以及代码来研究
4)此时平台在src目录下自动创建了struts的配置文件“struts.xml”
5)Struts的支持已经和Spring的整合这里就完成了
4、添加Hibernate的支持
1)采用平台自带的Hibernate,我们这里添加Hibernate3.3
2)勾选Hibernate的核心支持库Core就行了
3)整合Spring和Hibernate。Hibernate是用于数据库映射的,映射完后的具体的CURD对象可以交由Spring来管理。此时平台会让我们选择将Hibernate的配置放在“hibernat.cfg.xml”中,还是放在spring的“applicationContext.xml”中,这里我们选择放在Spring的配置文件中。在已经存在的“applicationContext.xml”中配置sessionFactory对象
4)配置Hibernate所用的数据源。
a、这里我们采用mysql数据库,所以首先添加mysql的数据库驱动“mysql-connector-java-5.0.7-bin.jar”,将该文件放在/WEB-INF/lib目录下
b、配置数据源。采用jdbc驱动。URL为“jdbc:mysql://localhost:3306/ssh”,Driver Class为“com.mysql.jdbc.Driver”,Dialect为“MySql”
5)因为我们将sessionFactory对象已经配置在Spring中,所用我们就不创建SessionFactory类了
6)Hibernate的支持和与Spring的整合都完成了,此时我们可以看到applicationContext.xml文件中自动创建了如下配置
<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:3306/ssh"></property>
<property name="username" value="root"></property>
<property name="password" value="111111"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>
三、开发测试
1、创建数据表user,脚本如下
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(255) default NULL,
`password` varchar(255) default NULL,
`age` varchar(255) default NULL,
`sex` enum('男','女') default '男',
`description` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、创建实体类User,代码如下
package org.cyxl.ssh.entity;
/**
* 实体类User
* @author cyxl
*
*/
public class User {
private long id;
private String username;
private String password;
private int age;
private String sex;
private String description;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
3、配置User表的Hibernate映射User.hbm.xml
<?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">
<hibernate-mapping>
<class name="org.cyxl.ssh.entity.User" table="user">
<id name="id" column="id">
<generator class="identity" />
</id>
<property name="username" column="username" type="string"/>
<property name="password" column="password" type="string"/>
<property name="age" column="age" type="int"/>
<property name="sex" column="sex" type="string"/>
<property name="description" column="description" type="string"/>
</class>
</hibernate-mapping>
4、修改sessionFactory的配置,将上述映射文件添加到hibernate中
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>org/cyxl/ssh/entity/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>
5、编写数据访问对象的接口和实现类,如下
package org.cyxl.ssh.dao;
import org.cyxl.ssh.entity.User;
/**
* 用户数据访问接口
* @author cyxl
*
*/
public interface UserDao {
boolean login(String username,String password);
boolean add(User user);
}
package org.cyxl.ssh.dao.hibernate.impl;
import java.util.List;
import org.cyxl.ssh.dao.UserDao;
import org.cyxl.ssh.entity.User;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
/**
* 用户数据访问Hibernate实现
* @author cyxl
*
*/
public class UserDaoImpl implements UserDao {
private SessionFactory factory;
private Session session;
public SessionFactory getFactory() {
return factory;
}
public void setFactory(SessionFactory factory) {
this.factory = factory;
//设置SessionFactory对象后,创建Session对象
this.session=factory.openSession();
}
public boolean add(User user) {
session.save(user);
return true;
}
public boolean login(String username, String password) {
String hql="from User user where username='"+username+"' and password='"+password+"'";
Query query=session.createQuery(hql);
List<User> list=query.list();
if(list!=null && list.size()>0)
{
return true;
}
return false;
}
}
6、编写用户服务接口和实现类,代码如下
package org.cyxl.ssh.service;
import org.cyxl.ssh.entity.User;
/**
* 用户服务接口
* @author cyxl
*
*/
public interface UserService {
boolean add(User user);
boolean login(String username,String password);
}
package org.cyxl.ssh.service.impl;
import org.cyxl.ssh.dao.UserDao;
import org.cyxl.ssh.entity.User;
import org.cyxl.ssh.service.UserService;
/**
* 用户服务实现
* @author cyxl
*
*/
public class UserServiceImpl implements UserService{
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public boolean add(User user) {
return userDao.add(user);
}
public boolean login(String username, String password) {
return userDao.login(username, password);
}
}
7、编写用户动作Action,代码如下
package org.cyxl.ssh.action;
import org.cyxl.ssh.entity.User;
import org.cyxl.ssh.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* 用户动作实现
* @author cyxl
*
*/
public class UserAction extends ActionSupport implements ModelDriven {
private User user=new User();
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public String login()
{
if(user!=null)
{
if(userService.login(user.getUsername(), user.getPassword()))
{
return this.SUCCESS;
}
}
return this.INPUT;
}
public Object getModel() {
return user;
}
}
这里有两点需要注意
a、该类实现了ModelDriven接口,该接口只有一个方法getModel。这个接口的作用是使请求的参数(如表单)中的name与实体中的字段自动相匹配。如在请求username时,如果采用模型驱动(ModelDriven)设置name时只要指定username,如果为字段驱动,那就需要指明user.username(这里可以参照login.jsp文件中的表单中的name属性来研究)
b、private User user=new User();这行代码中的user必须实例化,也就是必须new出一个对象来
8、发挥Spring的作用,配置各种对象的创建方式,在applicationContext.xml中添加如下配置
<bean id="userDao" class="org.cyxl.ssh.dao.hibernate.impl.UserDaoImpl">
<property name="factory" ref="sessionFactory" />
</bean>
<bean id="userService" class="org.cyxl.ssh.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao" />
</bean>
<bean id="userAction" class="org.cyxl.ssh.action.UserAction">
<property name="userService" ref="userService" />
</bean>
自下而上一次配置了userDao、userService、userAction的实现方式和所以来的对象,这里特别注意userDao的factory属性,我们将前面配置sessionFactory对象赋予了它
9、UI界面
1)index.jsp中写一行代码,作用是转向登陆界面,如下
<% response.sendRedirect("UserLogin.action"); %>
2)编写login.jsp的代码,只要为一个提交的表单,如下
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>login page</title>
</head>
<body>
<s:form action="UserLogin.action">
<s:textfield label="username" name="username"></s:textfield>
<s:password label="password" name="password"></s:password>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
从上面的用户名输入框我们来回忆前面的UserAction中实现了ModelDriven接口。实现的情况下name=“username”,不实现的情况下应该为name=“user.username”
3)编写登陆成功结果页面success.jsp,该页面就一句话提示登陆成功“success”
10、配置struts.xml。代码如下
<?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>
<package name="cyxl" extends="struts-default">
<action name="UserLogin" class="userAction" method="login">
<result name="success">/success.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
action为UserLogin的请求使用的类是userAction,该userAction的创建采用Spring管理,具体在applicationContext.xml文件中配置.method指定该请求使用userAction中的哪个方法。登陆成功转向success.jsp页面,失败则继续让用户输入,停留login.jsp页面
四、总结
以上开发内容主要注意一下几点(当然知识点需要查阅其它的相关资料才可能弄明白,这里只是大致引出了该知识点)
1、了解各个依赖的库文件的含义,各个配置文件的含义
2、了解Spring的自动启动方式(Web.xml)的配置
3、Spring整合Struts所依赖的库和struts-plugin.xml的作用
4、Spring整合Hibernate的方式和sessionFactory对象的配置及作用
5、Action实现ModelDriven的作用
6、Spring是如何配置各对象的创建的和创建的时间
7、注意Spring是强制开发者采用接口开发的,如接口UserDao,UserService等等
8、Struts的标签库已经包含在Core库中了,所以用的时候只需要在页面的引入该标签库即可
五、附录
1、Spring的日志记录可以整合log4j来实现,这里需要在web.xml文件中配置。在src目录创建log4j的配置文件log4j.properties
### set log levels ###
log4j.rootLogger = debug,stdout
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
2、完整的applicationContext.xml文件如下
<?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-3.0.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:3306/ssh"></property>
<property name="username" value="root"></property>
<property name="password" value="111111"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>org/cyxl/ssh/entity/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>
<bean id="userDao" class="org.cyxl.ssh.dao.hibernate.impl.UserDaoImpl">
<property name="factory" ref="sessionFactory" />
</bean>
<bean id="userService" class="org.cyxl.ssh.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao" />
</bean>
<bean id="userAction" class="org.cyxl.ssh.action.UserAction">
<property name="userService" ref="userService" />
</bean>
</beans>
3、完整的web.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置Spring配置文件的位置,多个可以以逗号分隔 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 不指定classpath时,默认为加载/WEB_INF/目录下的文件 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--由Spring载入的Log4j配置文件位置-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<!-- 项目启动时自动启用Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--Spring log4j Config loader-->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping></web-app>
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)