SSH 环境搭建(Spring3+Struts2+Hibernate3)

2024-05-24 22:18

本文主要是介绍SSH 环境搭建(Spring3+Struts2+Hibernate3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先下载相应的文件和包:mysql tomcat spring3 struts2 hibernate3

1.先搭建一个struts2的web项目

打开Eclipse,File>>New>>Dynamic Web Project。在WebContent/WEB-INF文件夹下新建一个web.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app id="WebApp_9" version="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">  <!-- 配置struts2为项目的controller --><filter>  <filter-name>SSH</filter-name>  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  </filter>  <filter-mapping>  <filter-name>SSH</filter-name>  <url-pattern>/*</url-pattern>  </filter-mapping>  <welcome-file-list>  <welcome-file>index.html</welcome-file>  </welcome-file-list>  </web-app>  
这个web.xml中的<filter>元素定义了一个名为SSH的拦截器以及拦截器的实现类。<filter-mapping>定义了拦截器要拦截的用户请求,这里的话所有的请求都会被拦截下来,然后交给我们写的action来处理,这样的话,通过在web.xml中定义一个filter,完成了struts2的引入。

当然除此之外,我们还要导入struts2的jar包,下载解压后,将要用到的包复制到WebContent/WEB-INF/lib文件夹下。必须的jar包名字大致如下:

commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
freemarker-2.3.18.jar
ognl-3.0.4.jar
struts2-core-2.3.1.2.jar
xwork-core-2.3.1.2.jar
javassist-3.11.0.GA.jar

struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE struts PUBLIC  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  "http://struts.apache.org/dtds/struts-2.0.dtd">  <struts>  <include file="struts-default.xml" />  <package name="register" extends="struts-default">  <action name="register" class="com.edu.nju.firstSSH.Action.RegisterAction">  <result name="input">/WEB-INF/view/register.jsp</result>  <result name="success">/WEB-INF/view/success.jsp</result>  <result name="error">/WEB-INF/view/fail.jsp</result>  </action>  </package>  </struts>  



下面建立Action类,代码如下:

package com.edu.nju.firstSSH.Action;import com.edu.nju.firstSSH.FormBean.UserForm;
import com.edu.nju.firstSSH.Service.UserService;
import com.edu.nju.firstSSH.Service.UserServiceImp;
import com.opensymphony.xwork2.ActionSupport;public class RegisterAction extends ActionSupport{/*** */
private static final long serialVersionUID = 1L;
private UserForm userform;
private UserService userService;public String execute(){userService = new UserServiceImp();userService.register(userform);return "success";
}public UserForm getUserform() {return userform;
}public void setUserform(UserForm userform) {this.userform = userform;
}}

最后建立Userform类,封装表达数据:

package com.edu.nju.firstSSH.FormBean;public class UserForm {private String username;
private String password;
private int gender;public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}}
注册表单页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>  
<%@ taglib prefix="s" uri="/struts-tags"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>User Register Page</title>  
</head>  
<body>  <s:form action="register" method="post">  <s:textfield name="userform.username" label="用户名"></s:textfield>  <s:password name="userform.password" label="密码"></s:password>  <s:select list="#{'1':'男','0':'女'}" listKey="key" listValue="value"  name="userform.gender" label="性别" value="1"></s:select>  <s:submit value="注册"></s:submit>  </s:form>  </body>  
</html>

启动项目(run on server),浏览器访问如下:

说明struts2配置完成。

项目目录如下:



2.加入Hibernate

首先把要用到的hibernate包导入到lib下。

编写PO,首先写数据库实体类,User类,代码如下:

package com.edu.nju.firstSSH.Bean;public class User {private String name;private String password;private int gender;private int userid;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getGender() {return gender;}public void setGender(int gender) {this.gender = gender;}public int getUserid() {return userid;}public void setUserid(int userid) {this.userid = userid;}
}
User类与数据库中的表结构一一对应。

然后写PO的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 package="com.edu.nju.firstSSH.Bean">  <class name="User" table="test">  <id name="userid" column="id">  <generator class="native"></generator>  </id>  <property name="name" column="name" type="java.lang.String"  not-null="true" length="16"></property>  <property name="password" column="password" type="java.lang.String"  not-null="true" length="16" />  <property name="gender" column="gender" type="java.lang.Integer" length="1" />  </class>  
</hibernate-mapping>  
最后配置hibernate,在src中新建hibernate.cfg.xml,代码为:

<?xml version='1.0' encoding='utf-8'?>  
<!DOCTYPE hibernate-configuration PUBLIC  
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  <hibernate-configuration>  <session-factory>  <!-- Database connection settings -->  <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  <property name="connection.url">jdbc:mysql://localhost:3306/test</property>  <property name="connection.username">root</property>  <property name="connection.password"></property>  <!-- JDBC connection pool (use the built-in) -->  <!-- <property name="connection.pool_size">1</property> -->  <!-- SQL dialect -->  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  <!-- Enable Hibernate's automatic session context management -->  <!-- <property name="current_session_context_class">thread</property> -->  <!-- Disable the second-level cache  -->  <!-- <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> -->  <!-- Echo all executed SQL to stdout -->  <property name="show_sql">true</property>  <!-- Drop and re-create the database schema on startup -->  <!-- <property name="hbm2ddl.auto">update</property> -->  <mapping resource="com/edu/nju/firstSSH/Bean/User.hbm.xml"/>  </session-factory>  
</hibernate-configuration> 

这里还要引入数据库的驱动程序,放在lib下即可。这个配置文件指定了数据源的信息和POJO配置文件列表。


下面建立UserDao借口以及实现程序:

UserDao:

package com.edu.nju.firstSSH.UserDao;import org.hibernate.Session;public interface UserDao {public void save(Object o);public void setSession(Session session);}
UserDaoImp:

package com.edu.nju.firstSSH.UserDao;  import org.hibernate.HibernateException;  
import org.hibernate.Session;  public class UserDaoImp implements UserDao {  private Session session;  public Session getSession() {  return session;  }  public void setSession(Session session) {  this.session = session;  }  @Override  public void save(Object obj) throws HibernateException {  session.save(obj);  }  }

这里的session方法是为了使用sessionFactory的。

最后是service层:

UserService:

package com.edu.nju.firstSSH.Service;import com.edu.nju.firstSSH.FormBean.UserForm;public interface UserService {public void register(UserForm userForm);
}

UserServiceImp:

package com.edu.nju.firstSSH.Service;import org.hibernate.Session;
import org.hibernate.Transaction;import com.edu.nju.firstSSH.Bean.User;
import com.edu.nju.firstSSH.FormBean.UserForm;
import com.edu.nju.firstSSH.UserDao.UserDao;
import com.edu.nju.firstSSH.UserDao.UserDaoImp;public class UserServiceImp implements UserService{private Session session;private UserDao userDao;public UserServiceImp(){userDao = new UserDaoImp();}@Overridepublic void register(UserForm userForm) {session = HibernateSessionFactory.currentSession();  userDao.setSession(session);  // 获取事务  Transaction ts = session.beginTransaction();  // 构造User对象  User user = new User();  System.out.println("userForm:  "+userForm);user.setName(userForm.getUsername());  user.setPassword(userForm.getPassword());  user.setGender(userForm.getGender());  // 保存User对象  userDao.save(user);  // 提交事务  ts.commit();  // 关闭Session  HibernateSessionFactory.closeSession();  }public Session getSession() {return session;}public void setSession(Session session) {this.session = session;}}
HibernateSessionFactory类:

package com.edu.nju.firstSSH.Service;import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateSessionFactory {       private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();        private static final Configuration cfg = new Configuration() .configure();        private static SessionFactory sessionFactory;        public static Session currentSession() throws HibernateException {          Session session = threadLocal.get();            if (session == null || session.isOpen() == false) {                if (sessionFactory == null) {                  try {                     sessionFactory = cfg.buildSessionFactory();                  } catch (Exception e) {                      e.printStackTrace();                  }              }                session = sessionFactory.openSession();              threadLocal.set(session);            }            return session;      } public static void closeSession() throws HibernateException {  Session session = threadLocal.get();  threadLocal.set(null);  if (session != null) {  session.close();  }  }  
}

这是hibernate3获取hibernateFactory的方法。

项目目录为:


至此,项目中加入了hibernate3。


3.引入spring3

首先写spring的配置文件,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"  xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  <!-- 定义数据源的信息 -->  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  destroy-method="close">  <property name="driverClass">  <value>com.mysql.jdbc.Driver</value>  </property>  <property name="jdbcUrl">  <value>jdbc:mysql://localhost/test</value>  </property>  <property name="user">  <value>root</value>  </property>  <property name="password">  <value></value>  </property>  <property name="maxPoolSize">  <value>80</value>  </property>  <property name="minPoolSize">  <value>1</value>  </property>  <property name="initialPoolSize">  <value>1</value>  </property>  <property name="maxIdleTime">  <value>20</value>  </property>  </bean>  <!--定义Hibernate的SessionFactory -->  <!-- SessionFactory使用的数据源为上面的数据源 -->  <!-- 指定了Hibernate的映射文件和配置信息 -->  <bean id="sessionFactory"  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  <property name="dataSource">  <ref local="dataSource" />  </property>  <property name="mappingResources">  <list>  <value>com/edu/nju/firstSSH/Bean/User.hbm.xml</value>  </list>  </property>  <property name="hibernateProperties">  <props>  <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  <prop key="show_sql">true</prop>  <prop key="hibernate.jdbc.batch_size">20</prop>  </props>  </property>  </bean>   <!-- 注册Dao --><bean id="userDao" class="com.edu.nju.firstSSH.UserDao.UserDaoImp">  <property name="sessionFactory">  <ref bean="sessionFactory" />  </property> </bean>  <!-- 注册业务逻辑类 -->  <bean id="userService" class="com.edu.nju.firstSSH.Service.UserServiceImp">  <property name="userDao">  <ref bean="userDao" />  </property>  </bean>  <!-- 注册的Action -->  <bean id="reg" class="com.edu.nju.firstSSH.Action.RegisterAction">  <property name="userService">  <ref bean="userService" />  </property>  </bean>  <!-- more bean definitions go here -->  </beans> 
这个文件其实声明了所有要用的对象实例,spring通过这个文件来管理这些实例,每一个实例就是一个<bean>,这样的话java文件中的private属性就不需要初始化了,只需要声明,然后提供getter setter方法就可以,spring会为我们注入这些实例,把他们赋值。

下面修改struts.xml文件为:

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE struts PUBLIC  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  "http://struts.apache.org/dtds/struts-2.0.dtd">  <struts>  <include file="struts-default.xml" />  <package name="register" extends="struts-default">  <action name="register" class="reg">  <result name="input">/WEB-INF/view/register.jsp</result>  <result name="success">/WEB-INF/view/success.jsp</result>  <result name="error">/WEB-INF/view/fail.jsp</result>  </action>  </package>  </struts>  
这里主要改了<action>标签里面的class,原先直接写class=类名,但是这里的话action实例要被spring创建,也就是说交给spring管理,所以要用到applicationContext.xml里面配置好的action才行。这一点很重要,因为如果不用spring的action实例,那么action就是通过构造方法创建的,这样的话,action里面的属性就是空,因为没写初始化(要用spring啊),所以这里必须改为使用spring创建的action实例,这样action里面的属性才会被赋值,否则报nullpointer,我就是遇到这个问题了,开始还以为spring没有注入,但是我在run on server时,它提示了很多关于注入的错误(比如setter没写),所以我觉得spring是注入了,最后才发现是这里的问题。

但是把这里改了以后,又报了一个新错Action class  not found - action - file,大致就是说,reg这个东西并不是类,事实上它也确实不是一个类啊,它是spring管理的一个实例,也就是说struts2不认识spring创建的这个实例,查了半天,才发先是缺少一个包所致,这个包是struts2-spring-plugin-2.0.11.2.jar,它就是负责struts2与spring来整合的,说白了就是让spring来管理struts2的action实例,让struts2识别spring的action实例。到此,spring方面的解决了。

最后还得把spring配置加入到项目中,要修改web.xml为:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app id="WebApp_9" version="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">  <!-- 配置struts2为项目的controller --><filter>  <filter-name>SSH</filter-name>  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  </filter>  <filter-mapping>  <filter-name>SSH</filter-name>  <url-pattern>/*</url-pattern>  </filter-mapping>  <listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener><welcome-file-list>  <welcome-file>index.html</welcome-file>  </welcome-file-list>  </web-app>  
添加一个listerner即可。

当然其他的类也需要修改,大致的内容就是把原来写new实例化的地方去掉,然后为这个private属性添加getter 和setter方法。

另外,由于我这里的搭建过程是按照http://blog.csdn.net/yeohcooller/article/details/9316923这位大神的博文一步一步建立的,之前的两大部分大致相同。

删掉之前的HibernateSessionFactory 类,我们用spring来管理sessionFactory,需要调用session的地方就用下面的方式:

Session session = sessionFactory.openSession();   
session.save(obj);  

这是不使用事务的方式,如果要使用事务的话,要先从session得到事务,再save,再提交事务。

总之hibernate的数据操作流程就是先得到factory,这个又spring提供,然后由factory得到session,session才是操作数据的对象。

还要删掉hibernate.cfg.xml。

下面贴出其他的类的最终实现:

UserDao:

package com.edu.nju.firstSSH.UserDao;public interface UserDao {public void save(Object o);}

UserDaoImp:

package com.edu.nju.firstSSH.UserDao;  import org.hibernate.HibernateException;  
import org.hibernate.Session;  
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;public class UserDaoImp implements UserDao {  private SessionFactory sessionFactory;@Override  public void save(Object obj) throws HibernateException {  Session session = sessionFactory.openSession();//开始事务;Transaction tr = session.beginTransaction();//存储    ;session.save(obj); //提交事务    ;tr.commit();session.close();sessionFactory.close();}
public SessionFactory getSessionFactory() {return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;
}  }
UserService:

package com.edu.nju.firstSSH.Service;import com.edu.nju.firstSSH.FormBean.UserForm;public interface UserService {public void register(UserForm userForm);
}
UserServiceImp:

package com.edu.nju.firstSSH.Service;import com.edu.nju.firstSSH.Bean.User;
import com.edu.nju.firstSSH.FormBean.UserForm;
import com.edu.nju.firstSSH.UserDao.UserDao;public class UserServiceImp implements UserService{private UserDao userDao;@Overridepublic void register(UserForm userForm) {//userDao.setSession(session);  // 构造User对象  User user = new User();  user.setName(userForm.getUsername());  user.setPassword(userForm.getPassword());  user.setGender(userForm.getGender());  // 保存User对象  userDao.save(user);  }public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}}
UserForm:

package com.edu.nju.firstSSH.FormBean;public class UserForm {private String username;private String password;private int gender;public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getGender() {return gender;}public void setGender(int gender) {this.gender = gender;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}}
User:

package com.edu.nju.firstSSH.Bean;public class User {private String name;private String password;private int gender;private int userid;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getGender() {return gender;}public void setGender(int gender) {this.gender = gender;}public int getUserid() {return userid;}public void setUserid(int userid) {this.userid = userid;}
}
User.hbm.xml不变

RegisterAction:

package com.edu.nju.firstSSH.Action;import com.edu.nju.firstSSH.FormBean.UserForm;
import com.edu.nju.firstSSH.Service.UserService;
import com.opensymphony.xwork2.ActionSupport;public class RegisterAction extends ActionSupport{/*** */private static final long serialVersionUID = 1L;private UserForm userform;private UserService userService;public String execute(){//userService = new UserServiceImp();userService.register(userform);return "success";}public UserForm getUserform() {return userform;}public void setUserform(UserForm userform) {this.userform = userform;}public UserService getUserService() {return userService;}public void setUserService(UserService userService) {this.userService = userService;}}
项目目录结构:



访问:






搭建成功!

最后附上项目源码:

http://pan.baidu.com/s/1pKrBv43





这篇关于SSH 环境搭建(Spring3+Struts2+Hibernate3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999679

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推