环境配置
1.导入JAR包
2.Spring整合Hibernate
该过程通过在applicationContext.xml中配置实现,需要对定义数据源、配置SessionFactory以及指定映射文件的路径。
这一步相当于将原来在hibernate.cfg.xml文件中需要配置的内容,放置到Spring中配置。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/hibernate
</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" >
<ref local="dataSource"/>
</property>
<!-- 配置Hibernate的属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 指定Hibernate映射文件的路径 -->
<property name="mappingResources">
<list>
<value>com/integration/entity/User.hbm.xml</value>
</list>
</property>
</bean>
3.Struts 2整合Spring
修改web.xml文件,通过配置listener和contextConfigLocation来找到applicationContext.xml文件,并以此创建Spring容器。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation </param-name>
<param-value>/WEB-INF/classes/applicationContext.xml </param-value>
</context-param>
<!-- 如此配置后,applicationContext.xml文件可以放在WEB-INF根目录下,也可以放在src根目录下 -->
同时在web.xml文件中配置struts 2
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在struts.xml文件中,定义objectFactory的值为spring
<constant name="struts.objectFactory" value="spring" />
也可以选择进行一些其他的常量配置
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.reload" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />
<constant name="struts.custom.i18n.resources" value="globalMessages" />
<constant name="struts.url.includeParams" value="none" />
<constant name="struts.ui.theme" value="xhtml" />
工程构建
下面通过构建一个简单的信息管理系统,简单地梳理一下。系统的结构主要分为以下几层:
1.表现层:由JSP页面构成
2.MVC层:使用Struts 2框架技术
3.业务逻辑层:使用业务逻辑组件构成
4.DAO层:由DAO组件构成
5.Hibernate持久层:使用Hibernate 3框架
6.数据库层:使用MySQL数据库存储数据
1.数据库层
这一层主要是设计相应的SQL表单,在配置SessionFactory参数时,我们将hibernate.hbm2ddl.auto设置为create或update,则可以根据Java对象自动建表。
2.Hibernate持久层
这一层主要是创建Java对象类和相应的映射文件。
(1)User.java类:
public class User{
private int id; //用户标识
private String name; //用户名
private String password; //密码
private String type; //类型
//默认构造方法
public User() {
}
//包含全部属性的构造方法
public User(int id, String name, String password, String type) {
this.id = id;
this.name = name;
this.password = password;
this.type = type;
}
// 各个属性的getter和setter方法
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public String getType() {
return this.type;
}
public void setType(String type) {
this.type = type;
}
}
(2)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="com.integration.entity.User" table="USER">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="22" scale="0" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="100" not-null="false">
<comment>用户名</comment>
</column>
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" length="100" not-null="false">
<comment>密码</comment>
</column>
</property>
<property name="type" type="java.lang.String">
<column name="TYPE" length="500" not-null="false">
<comment>类型</comment>
</column>
</property>
</class>
</hibernate-mapping>
3.DAO层
这一层主要是创建DAO接口,和DAO接口的实现类。DAO层不直接处理用户的需求,只负责完成数据入库工作。
(1)接口类 UserDao.java
public interface UserDAO {
void save(User user);
User getUser(String name);
void delete(int id);
void update(User user);
User findById(int id);
List<User> findAll();
}
(2)接口实现类 UserDAOImpl.java:
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO{
// 保存
public void save(User user) {
this.getHibernateTemplate().save(user);
}
// 由姓名查找
public User getUser(String name)
{
String hsql="from User u where u.name='"+name+"'";
User result=(User)((Query) this.getHibernateTemplate().find(hsql)).uniqueResult();
return result;
}
// 删除
public void delete(int id) {
this.getHibernateTemplate().delete(findById(id));
}
// 修改
public void update(User user){
this.getHibernateTemplate().update(user);
}
// 由id查找
public User findById(int id) {
User user = (User) this.getHibernateTemplate().get(User.class, id);
return user;
}
// 查找全部
@SuppressWarnings("unchecked")
public List<User> findAll() {
String queryString = "from User";
List<User> list = this.getHibernateTemplate().find(queryString);
return list;
}
}
(3)在applicationContext.xml中注册DAO实现类,以便进行持久化工作
<bean id="userDAO" class="com.integration.dao.UserDAOImpl" abstract="false"
lazy-init="default" autowire="default">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
4.业务逻辑层
这一层与DAO层对应,用于向上层提供功能。主要是创建业务逻辑组件接口,以及业务逻辑组件的实现类。在实现类中,除了使用DAO实现类完成数据持久化工作,还可以进行一些其他的业务操作。
(1)业务接口类 UserService.java
public interface UserService {
void saveUser(User user);
User getUser(String name);
void deleteUser(int id);
void updateUser(User user);
User findUserById(int id);
List<User> findAll();
}
(2)接口实现类 UserServiceImpl.java
public class UserServiceImpl implements UserService {
private UserDAO userDAO; // 通过调用DAO组件实现业务逻辑操作
public void setUserDAO(UserDAO userDAO){
this.userDAO=userDAO;
}
public User getUser(String name) {
return userDAO.getUser(name);
}
public void saveUser(User user) {
if(userDAO.findById(user.getId())==null)
userDAO.save(user);
}
public void deleteUser(int id) {
if(userDAO.findById(id)!=null)
userDAO.delete(id);
}
public void updateUser(User user) {
if(userDAO.findById(user.getId())!=null)
userDAO.update(user);
}
public User findUserById(int id) {
return userDAO.findById(id);
}
public List<User> findAll() {
return userDAO.findAll();
}
}
(3)在applicationContext.xml中注册业务逻辑组件实现类,以便进行持久化工作
<bean id="userService" class="com.integration.service.UserServiceImpl">
<property name="userDAO" ref="userDAO"></property>
</bean>
5.MVC层
这一层主要是进行Action类的创建和对Struts.xml文件的配置,接受表现层传来的请求,并向下寻找合适的模型和方法,最后用合适的JSP页面将结果返回呈现给用户。
(1)用户登录的Action文件 LoginAction.java
public class LoginAction extends ActionSupport {
String username;
String password;
String usertype;
public String getUsertype() {
return usertype;
}
public void setUsertype(String usertype) {
this.usertype = usertype;
}
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;
}
// 定义业务逻辑组件
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public String execute(){
List<User> list = (List<User>) userService.findAll();
User u = new User();
Iterator<User> it=list.iterator();
while(it.hasNext()){ // 将网页提交的username与库中读取u的name比较
u = (User)it.next();
if(username.trim().equals(u.getName()) && password.trim().equals(u.getPassword())
&& usertype.trim().equals(u.getType()))
return "success";
else return "failer";
}
String page = "failer";
return page;
}
}
(2)配置applicationContext.xml,为Action注入处理方法
<bean id="loginAction" class="com.integration.action.LoginAction">
<property name="userService" ref="userService" />
</bean>
(3)配置struts.xml,完成对用户的结果返回
<action name="login" class="loginAction">
<result name="success">/success.jsp</result>
<result name="failer">/error.jsp</result>
</action>
6.表现层
这一层由具体的JSP页面构成,用于和用户之间的信息交互。设计登录界面,和结果返回界面。
(1)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>用户登录</title>
</head>
<body>
<s:form action="login" method="post">
<s:textfield name="username" label="用户名"></s:textfield>
<s:password name="password" label="密码"></s:password>
<s:textfield name="usertype" label="类型"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
(2)success.jsp
<body>
登录成功 <br>
</body>
(3)error.jsp
<body>
错误,请注册! <br>
<a href="save.jsp">用户注册</a>
</body>
至此,一个简易版的SSH项目框架便搭建完毕,之后可以在此基础上,添加各项细节功能。