Struts 2 + Spring 2 + Hibernate 3 整合入门详解

Struts2+Spring+Hibernate搭建全解! 1.先组合实现Hibernate3.2+Spring2.5支持,删除hibernate.cfg.xml文件,修改applicationContext.xml文件的内容,增加SessionFactory和dataSource的设置。9.修改web.xml文件,配置Spring监听器,和上下文变量。6.组合Struts2和Spring2.5,修改web.xml文件,增加struts2的所需要的过滤器配置。我用这个框架,实现的是基本的CRUD功能的一个雇员管理系统,本来打算丰富一下功能,但是一直没能抽出空去搞。 阅读详情
看完之后发点感慨: 不知道搞这么多配置文件算不算增加了程序员的负担呢? 而且任意一个地方写错都不能通过. Spring, 应该向 Java EE 5 的标注开发学习学习, 每种框架和 Spring 整合都要写各式各样的配置文件, 天啊, 配置文件的海洋. 如果这也叫所谓的高端 Java 技术, 我只能说 Shit! JSP 也没搞的这样折磨人过.

作者:  Liu Liu 转载请注明出处

基本概念和典型实用例子。

一、基本概念

      Struts:作为基于 MVC 模式的 Web 应用最经典框架,两个项目Struts 和webwork已经集成,成为现在的Struts2。目前的最新版本是2.0.9(2007-7)。

      Spring:是一个轻型的容器,利用它可以使用一个外部 XML 配置文件方便地将对象连接在一起。每个对象都可以通过显示一个 JavaBean 属性收到一个到依赖对象的引用,留给您的简单任务就只是在一个 XML 配置文件中把它们连接好。

      Hibernate 是一个纯 Java 的对象关系映射和持久性框架,它允许您用 XML 配置文件把普通 Java 对象映射到关系数据库表。使用 Hibernate 能够节约大量项目开发时间,因为整个 JDBC 层都由这个框架管理。这意味着您的应用程序的数据访问层位于 Hibernate 之上,完全是从底层数据模型中抽象出来的。

      三种技术到目前已经比较成熟,而且他们都是免费的!让我们对三者集成进行一个初览(简单而不专业):

      我们用Struts实现从Web(网页,MVC中的View)到后台系统的映射(WebàAction),然后由Spring管理这些Action,把它们作为Bean和其他对象一起处理。这些Bean之间处理业务逻辑、数据、系统状态等,且它们被Spring统一管理,为了区分,就算大概包括MVC的MC部分吧。然后需要持久化的数据由Spring和Hibernate之间的接口交由Hibernate处理(这个属于持久层)。

      必须基础:只要Java基础,一点HTML知识、XML基础就可以了。本文的目的就是从零开始建立第一个Struts+Spring+Hibernate应用。即使它是最简单的,我们也希望初学者能够从中理解一些思想,其中也包括系统架构的设计思想。

 

二、环境搭建

      我们坚持免费才是硬道理,开源才是好事情,所以我们全部使用开源免费的工具和软件。如果使用MyEclipse,其中的工具将有助于简化下面演示的工程开发,但本文不用。

      所需软件包如下表:

序号

包

下载地址和文件(包)名

说明

1

JDK5.0

http://java.sun.com/javase/downloads/index.jsp

JDK5.0

2

Eclipse WTP

Eclipse IDE for Java EE Developers

下载All in One,这样不用自己下载其他插件

包含网站开发的Eclipse,v3.3,下载All in One

3

HibernateSynchronizer-3.1.9

https://sourceforge.net/project/showfiles.php?group_id=99370

帮助开发Hibernate应用的Eclipse插件

4

Hibernate3

http://sourceforge.net/project/showfiles.php?group_id=40712àhibernate3所指示的包

Hibernate支持包

5

Spring

http://sourceforge.net/project/showfiles.php?group_id=73357

 

spring-framework-2.0.6-with-dependencies.zip

6

SpringIDE(可选)

http://springide.org/updatesite/包名如
springide_updatesite_2.0.1_v200707300600.zip

7

Struts

http://struts.apache.org/download.cgi

 

为了较全的例子和文档,建议下载
struts-2.0.9-all.zip
否则只下载lib:struts-2.0.9-lib.zip

8

Tomcat

http://tomcat.apache.org?

建议下载v5.5以上版本,应用服务器(支持JSP等)Apache项目之一

9

MySQL

 

Hibernate演示需要

         

 

      1、下载了eclipse以后安装。在所安装的目录下有两个子目录plugins和features,这是两个放eclipse插件的目录,即可以通过拷贝需要的文件到这些目录里面,从而给eclipse添加新的功能。

      2、将第3、6的包解压,将其中的plugins目录直接复制到eclipse安装目录下,选择“全部”替换。

      3、运行eclipse,选择一个空目录作为工作区(WorkSpace),启动以后可以看到Welcome.html的欢迎界面。现在建立新工程FileàNewàProject,在打开的New Project窗口中选择WebàDynamic Web Project。输入Project name,在Target Runtime一项选择新建(New),选择你所安装的Apache Tomcat,在弹出窗口输入相关信息(Tomcat安装目录等)。

      新建工程流程如下图。

工程结构如下:

 

其中我们要写的Java代码在Java Resource: src(以后直接称src)下,网站根目录内容在WebContent下,类所在根目录是WEB-INF/classes,Eclipse会自动将build/classes里面已经编译的类同步过去。

向WEB-INF下的lib目录添加如下所列的jar包。 

(1)这些包在下载解压后Spring,Struts,Hibernate的lib目录或者dist/module目录下面(如果不在,可以到网上google一把。列表中mysql-*.jar包是MySQL数据库的JDBC Driver)。也可以把所有lib和dist下的jar包拷贝过来(可以在系统复制这些jar包,然后到Eclipse里面选中WEB-INF里面的lib包,然后粘帖就可以了)。但要注意全拷贝可能会存在冲突,如struts*plugin.jar等包不能引入,否则不能运行。

(2)这些Jar包是:

antlr-2.7.2.jar

cglib-nodep-2.1_3.jar

commons-beanutils-1.6.jar

commons-chain-1.1.jar

commons-collections-2.1.1.jar

commons-dbcp.jar

commons-digester.jar

commons-logging-1.0.4.jar

commons-logging-api-1.1.jar

commons-pool.jar

commons-validator-1.3.0.jar

dom4j-1.6.1.jar

el-api.jar

el-ri.jar

freemarker-2.3.8.jar

hibernate3.jar

jsf-api.jar

jta.jar

mysql-connector-java-3.0.14-production-bin.jar

ognl-2.6.11.jar

oro-2.0.8.jar

spring-hibernate3.jar

spring.jar

struts-config.xml

struts-core-1.3.5.jar

struts2-codebehind-plugin-2.0.9.jar

struts2-config-browser-plugin-2.0.9.jar

struts2-core-2.0.9.jar

struts2-jasperreports-plugin-2.0.9.jar

struts2-jfreechart-plugin-2.0.9.jar

struts2-jsf-plugin-2.0.9.jar

struts2-pell-multipart-plugin-2.0.9.jar

struts2-plexus-plugin-2.0.9.jar

struts2-sitegraph-plugin-2.0.9.jar

struts2-sitemesh-plugin-2.0.9.jar

struts2-spring-plugin-2.0.9.jar

struts2-struts1-plugin-2.0.9.jar

struts2-tiles-plugin-2.0.9.jar

tiles-api-2.0.4.jar

tiles-core-2.0.4.jar

tiles-jsp-2.0.4.jar

xwork-2.0.4.jar

三、开始工作

在WebContent下建立index.jsp,建立方式如图。

index.jsp的内容如表,我们暂时不分析。

<%@ page contentType="text/html; charset=UTF-8" %>

<html>

 <head> <title>Example by Doer Liu@UTStarcom sz </title></head>

 <body>

    This is my JSP page. <br>

    <form name="userInfoForm" action="login.do" method="post">

    用户名:

    <input name="username" type="text" />

    密码:

    <input name="password" type="password">

    <input name="sub" type="submit" value="增加" />

    <input name="res" type="reset" value="重置" />

 </form>

 </body>

</html>

 

此时就可以运行该工程,忙了这么久,看看效果吧。

运行方式:右键点击index.jsp,选择Run/Debug AsàRun on Server,在弹出窗口中默认我们使用的Tomcat Server,点击finish完成。可以看到eclipse中内嵌的浏览器显示我们的网页。其中表单的输入在我们的工程中将得到输入数据(用户名和密码),这些数据会传给我们将要建立的Action处理。

 

现在来看看如何建立我们的Action。在src下新建一个package(包)名为action用于保存响应Web请求的Action类。在action包下新建Action类LoginAction(action.LoginAction)如下,注意类的继承关系。

package action;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.validator.DynaValidatorForm;

import org.springframework.web.struts.ActionSupport;

//我们继承spring提供的Action衍生类org.springframework.web.struts.ActionSupport

publicclassLoginActionextendsActionSupport{

    public ActionForward execute(

            ActionMapping mapping,

            ActionForm form,

            HttpServletRequest request,

            HttpServletResponse response) {

       return mapping.findForward("success");

      

    }

}

 

但是现在index.jsp的内容怎么和LoginAction的数据匹配呢,我们看到LoginAction的execute方法有一个属性ActionForm,于是我们建立一个类forms.UserInfoForm如下,继承ActionForm。

package forms;

import org.apache.struts.action.ActionForm;

publicclass UserInfoForm extends ActionForm {

    private String username;

    private String password;

   

    public String getUsername() { return username; }

    publicvoid setUsername(String username)

    { this.username = username; }

    public String getPassword() { return password; }

    publicvoid setPassword(String password)

    { this.password = password; }

}

 

 

有了两个头,又有了保持内容的类,现在看看我们如何用struts把他们联系起来吧。

现在需要在WEB-INF下建立文件struts-config.xml。其中form-beans定义了表单是如何映射的,这里用我们刚刚定义的forms.UserInfoForm。

<?xml version=”1.0”encoding="ISO-8859-1"?>

<!DOCTYPE struts-config PUBLIC   "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"         "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>

    <form-beans>

       <form-bean name="userInfoForm" type="forms.UserInfoForm"/>

    </form-beans>

  

    <action-mappings>

       <action attribute="userInfoForm" path="/login"input="/index.jsp"type="org.springframework.web.struts.DelegatingActionProxy"

              name="userInfoForm" scope="session" validate="false">

           <forward name="success" path="/success.html"/>

       </action>

    </action-mappings>

</struts-config>

 

在<action-mappings>中定义了我们的Action。它的属性attribute指出Action的内容输入是我们自定义的ActionForm,path给Action赋予一个路径,input指明只接受index.jsp的输入,<forward标签定义了当Action返回"success"的时候,将定向到/success.html这个网页。最重要的是type,它定义了这个处理这个请求的Action类,本来应该是我们自定义的LoginAction,但我们却用了spring的一个Action,为什么?因为我们要用Spring管理我们自定义的Action。看,struts和Spring在这里就开始连接起来了。

 

但还有两个问题,Struts和Spring又是如何知道对方的存在,如何沟通呢?Spring如何知道把控制权交给我们自定义的LoginAction呢?

我们先来解决第一个问题,web.xml是Tomcat这些应用服务器管理的,因此我们在这里将struts和Spring配置联系起来。这是整个web.xml。请看注释。

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" id="WebApp"

    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">

<display-name> Struts2+Spring2+Hibernate3 simple example by Doer Liu@UTstarcom</display-name>

 <!-- filter就理解为一些对网页请求的过滤吧 -->

 <!-- encodingFilter是为了处理国际化,交由Spring处理,设置为UTF-8 -->

 <filter>

 <filter-name>encodingFilter</filter-name>

 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

 <init-param>

 <param-name>encoding</param-name>

 <param-value>UTF-8</param-value>

 </init-param>

 </filter>

 <!-- struts 是struts的filter,这个定义就将可以将请求交给struts过滤一番了 -->

 <filter>

 <filter-name>struts</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

 </filter>

<!-- 那么哪些请求交给struts过滤呢,这里包括 /struts2spring2hib3bydoer下和根目录/下的所有请求-->

 <filter-mapping>

 <filter-name>struts</filter-name>

 <url-pattern>/struts2spring2hib3bydoer/*</url-pattern>

 <url-pattern>/*</url-pattern>

 </filter-mapping>

 

 <!-- 定义一个监听器,处理整个WebContext,简单的理解为整个网站的上下文环境监听器吧这个属于Spring-->

 <listener>

 <listener-class>

   org.springframework.web.context.ContextLoaderListener

 </listener-class>

 </listener>

<!-- servlet定义一个servlet为struts的ActionServlet -->

    <servlet>

       <servlet-name>doertest</servlet-name>

       <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

       <load-on-startup>1</load-on-startup>

    </servlet>

<!-- servlet-mapping将servlet和请求对应起来,这里是所有*.do的请求交由上面定义的doertest处理 -->

    <servlet-mapping>

       <servlet-name>doertest</servlet-name>

       <url-pattern>*.do</url-pattern>

    </servlet-mapping>

<!-- 定义默认返回页,如输入http://127.0.0.1/那么根目录下的index.html或者其他文件就被请求 -->

    <welcome-file-list>

        <welcome-file>index.html</welcome-file>

       <welcome-file>index.htm</welcome-file>

       <welcome-file>index.jsp</welcome-file>

       <welcome-file>default.html</welcome-file>

       <welcome-file>default.htm</welcome-file>

       <welcome-file>default.jsp</welcome-file>

    </welcome-file-list>

</web-app>

 

 

通过web.xml两者联系上了。现在它们各自还需要一些配置。

Struts在我们的例子里比较简单,在build/class下面(最终会被eclipse同步到网站的WEB-INF/classes下面)建立struts.xml:

<!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" />

</struts>

Spring的默认配置文件是WEB-INF/applicationContext.xml,目前其内容很简单,我们只是把struts的Bean放进来,如下:

映射的规则:bean的name属性必须等于struts-config.xml里面定义的action的path属性,class就是这个bean的类action.LoginAction。

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans>

 <!-- Action Bean , 对应的部分 struts-config.xml form-bean and action-mappings -->

 <bean name="/login" class="action.LoginAction " singleton="false">

  

 </property>

 </bean>

</beans>

 

现在在WebContent下面建立success时重定向的目标success.html,方法和index.jsp类似,但选择THML类型,随便输入内容以便测试。这时候struts和Spring就简单的连接起来了。先停掉刚才运行起来的Tomcat,重新启动,运行index.jsp,点击网页中的按钮<添加>,看看有什么效果。

现在,然我们简略描述一下数据和请求的流程。

点击<添加>,index.jsp的这个表单发送的请求是login.do(<form name="userInfoForm" action="login.do" method="post">),请求被传给后台,生成了doertest(处理*.do的请求)集合的一个servlet,然后传到path为/login的action,被Spring的org.springframework.web.struts.DelegatingActionProxy处理,该类找到name是/login的Bean,转交处理权,等待结果。这个Bean就是我们的action.LoginAction。我们的execute中返回一个forward是"success"对应的网页,就是success.html。所以……,你已经看到了,struts和spring已经联系起来了。OK!

 

下面我们需要把hibernate整合进来了,本来考虑到例子的简单性,打算用更简单的类,但既然用三者整合,就是要有良好的设计。我们需要以下几个层次的设计:表现层,业务层,持久层。表现层就是网页;表现层和业务层之间的接口就是网页和action的接口,由struts处理了;业务层包括业务逻辑和事务管理等,由Spring管理,我们只是建立具体处理对象;业务层和持久层之间由数据访问对象DAO处理,持久层交给hibernate处理。贯穿这些层的是领域对象(domain object),即表示现实世界的对象(base object),如订单对象,人物信息对象等等。现在看看我们需要的剩余设计结构。

业务层:放进包service

数据访问对象: 放进包dao

持久层:hibernate

领域对象:放进包bo

既然领域对象是最基本的对象,我们就得首先建立,本例中,可以借助HibernateSynchronizer生成:

首先在mysql中创建表

CREATE TABLE `userinfo` (                                                                                                                                                    

            `id` int(11) primary key auto_increment,                                                                                                                                       

            `username` varchar(20) default NULL,                                                                                                                                         

            `Password` varchar(20) default NULL                                                                                                                                       

          )

在Eclipse中,建立hibernate的map文件:右键点击WEB-INF(或其他目录都可,后面会提到如何使用该文件),选择newàother,在弹出窗口中选择Hibernate Mapping File。在弹出窗口输入url,用户名和密码后点击Refresh,可以看到你选择的数据库的表,选中userinfo表。输入包bo,用来保存从数据库提取的领域对象。在Properties中将Id generator改为native。

HibernateSynchronizer将在WEB-INF下生成Uerinfo.hbm.xml文件。

右键点击该文件,选择Hibernate SynchronizeràSynchronize Files。将自动生成bo.base.BaseUserinfo和bo.Userinfo类。这两个就是领域对象。工具正好啊!

 

现在bo包里面的对象自动生成了。

下面建立dao包中对象dao.UserinfoDAO:

package dao;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import bo.Userinfo;

//从HibernateDaoSupport继承,从而可以使用getHibernateTemplate().save保存数据。

publicclass UserinfoDAO extends HibernateDaoSupport {

    publicvoid save(Userinfo userinfo) {

       System.out.println("saved!");

       getHibernateTemplate().save(userinfo);

    }

}

 

再建立service包中的业务对象,service.UserinfoService:

package service;

import dao.UserinfoDAO;

import bo.Userinfo;

package service;

publicclass LoginService {

    private UserinfoDAO userinfoDAO;

    public UserinfoDAO getUserinfoDAO() {

       System.out.println("shit");

       returnuserinfoDAO;

    }

    publicvoid setUserinfoDAO(UserinfoDAO userinfoDAO) {

       System.out.println("LoginService:setAdminDAO");

       this.userinfoDAO = userinfoDAO;

    }

    publicvoid saveinfo(Userinfo userinfo) {

         //进行相关业务处理,比如validate之类的。

       userinfoDAO.save(userinfo);

    }

}

 

好了,所有我们应该建立的对象都生成了,现在把hibernate整合进来再进行一些后续处理。

首先,在applicationContext.xml文件中加入必需的Bean定义,成为如下内容,注意其中注释。

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans>

 <!-- Action Bean , 对应的部分 struts-config.xml form-bean and action-mappings -->

 <bean name="/login" class="action.LoginAction" singleton="false">

 <!-- property是该bean的属性,如下面的property,在类LoginAction 中必有字段定义LoginService loginService;和getLoginService()以及setLoginService方法-->

 <property name="loginService">

  <ref bean="loginService" />

 </property>

 

 </bean>

 

 <!-- 定义DBCP的数据库连接属性,该数据源会被hibernate使用,DBCP是连接池开源包,其中的url,username,password需要替换成你的数据库访问属性 -->

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

 <property name="driverClassName">

   <value>com.mysql.jdbc.Driver</value>

 </property>

 <property name="url">

   <value>jdbc:mysql://localhost/mysql</value>

 </property>

 <property name="username">

   <value>root</value>

 </property>

 <property name="password">

   <value>doerliu</value>

 </property>

 </bean>

 

 <!-- 配置sessionFactory, 为Hibernate配置属性 -->

 <bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

 <property name="dataSource">

   <ref local="dataSource" />

 </property>

 <property name="mappingResources">

   <list>

    <!—Hibernate的map 文件在这里配置了,注意文件的相对位置。 -->

    <value>../Userinfo.hbm.xml</value>

   </list>

 </property>

 <property name="hibernateProperties">

   <props>

    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

    <prop key="hibernate.show_sql">true</prop>

   </props>

 </property>

 </bean>

 

 <!-- 业务层的事务管理由该bean管理-->

 <bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">

 <property name="sessionFactory">

   <ref local="sessionFactory" />

 </property>

 </bean>

 <!-- 事务处理环境(代理)配置,为业务处理LoginService定义一个事务处理*****-->

 <bean id="userDAOProxy"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

 <property name="transactionManager">

   <ref bean="transactionManager" />

 </property>

 <property name="target">

   <ref local="loginService" />

 </property>

 <property name="transactionAttributes">

   <props>

    <prop key="save*">PROPAGATION_REQUIRED</prop>

    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

    <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>

   </props>

  </property>

 </bean>

 

 <!-- 业务处理Bean定义 -->

 <bean id="loginService" class="service.LoginService">

 <property name="userinfoDAO">

   <ref bean="userinfoDAO" />

 </property>

 </bean>

 

 <!-- 数据访问对象的Bean -->

 <bean id="userinfoDAO" class="dao.UserinfoDAO">

 <property name="sessionFactory"><ref local="sessionFactory"/></property>

 </bean>

 

</beans>

 

最后,LoginAction可以处理请求并和业务层进行交流了。因此需要增加实质性内容:

package action;

 

/* @sample for training.

 * @author doer.liu@utstarcom

 * @date 2007-7-30

 */

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import org.springframework.web.struts.ActionSupport;

 

import bo.Userinfo;

 

import forms.UserInfoForm;

 

import service.LoginService;

 

//我们继承spring提供的Action衍生类org.springframework.web.struts.ActionSupport

public class LoginAction extends ActionSupport {

 

      LoginService loginService;

 

      public ActionForward execute(ActionMapping mapping, ActionForm form,

                 HttpServletRequest request, HttpServletResponse response) {

           UserInfoForm userInfoForm = (UserInfoForm) form;

           String username = userInfoForm.getUsername();

           String password = userInfoForm.getPassword();

           Userinfo userinfo = new Userinfo();

           userinfo.setUsername(username);

           userinfo.setPassword(password);

           loginService.saveinfo(userinfo);// 保存前台的数据,插入数据库

 

           return mapping.findForward("success"); //返回页。

 

      }

 

      public LoginService getLoginService() {

           return loginService;

      }

 

      public void setLoginService(LoginService loginService) {

           System.out.println("setLoginService=" + loginService);

           this.loginService = loginService;

      }

}

 

Ok!整个流程到此就走通了。运行看看吧。还有什么说的呢,动手开始吧,在此基础上不断修改测试,再参考相关文档,一切都将越来越简单!——有问题,看日志!

    附件是导出的WAR文件,其中lib已被清空,只要加入文中列出的lib文件即可运行(可以将WAR导入eclipse,或者将war文件放到Tomcat的webaspps下)http://dl2.youkuaiyun.com/down4/20070806/06111224839.war

      当然这个例子为了清晰起见,在各种模式,java编程习惯上是不合适的,比如应该面向接口编程,而不是统统拿类,拿对象来处理。应该定义如ILoginService, ILoginDAO等接口,使得系统更灵活,更易移植。当然为了说明,我们这样做是可以原谅的,但工作中切记不要只图简单!否则还不如不用这种高级优秀的构架,因为你一用就把它破坏殆尽了。

      让我们前进吧

Java Web框架整合实践:Struts2, Hibernate3.2, Spring2.0 本文还有配套的精品资源,点击获取 简介:Struts2、Hibernate3.2和Spring2.0是Java Web开发的关键框架,通常被整合用于企业级应用。Struts2处理用户请求和展示结果,Hibernate简化数据库操作,而Spring提供依赖注入和面向切面编程。整合这三个框架可以提供强大的MVC解决方案、高效的数据持久化和灵活的事务管理。本文将探讨这三个框架的整... 阅读详情

相关推荐

SSH(Struts+Spring+Hibernate)三层架构.

本程序采用的是SSH(Struts+Spring+Hibernate)三层架构. (1)Struts用于表现层,负责页面数据提取,页面动作响应。 (2)Spring是一种轻量级的框架模型,主要负责业务逻辑层的对象创建,表现层的Action的创建,以及持久层的DAO的创建。 (3)Hibernate负责把内存中的数据对象保存到数据库中。

三大框架理解

常听人提起三大框架,关于三大框架,我做了如下了解 :      三大框架: Struts+Hibernate+Spring  Java 三大框架主要用来做 WEN 应用。  Struts 主要负责表示层的显示  Spring 利用它的 IOC 和 AOP 来处理控制业务(负责对数据库的操作)  Hibernate 主要是数据持久化到数据库    再用 jsp 的 servlet 做网页

十年饮冰,难凉热血 1736

(目录)微气候模型ENVI-met模拟的基本使用教程

ENVI-met模拟操作系列(一) 介绍:

ysqzhatian的博客 2万+

Struts+Spring+Hibernate整合入门详解

Java 5.0 Struts 2.0.9Spring 2.0.6Hibernate 3.2.4                                              作者:  Liu Liu 转载请注明出处基本概念和典型实用例子。一、基本概念       Str

doliu6的专栏 6185

不用敲命令!用宝塔面板可视化部署pbootCMS的保姆级教程(2024最新版)

本文提供2024年最新版pbootCMS可视化部署教程,全程使用宝塔面板操作,无需任何命令行知识。从服务器初始化、LNMP环境配置到源码上传、安装向导,手把手指导用户通过图形化界面快速搭建专业网站,适合零基础新手和追求高效建站的用户。

weixin_42509507的博客 491

Python小白也能玩转迅投QMT量化交易?手把手教你从安装到第一个策略

本文为零基础Python用户提供了上手迅投QMT量化交易平台的完整指南。从Python 3.6环境配置、QMT客户端获取安装,到核心概念讲解,并手把手教你编写并回测一个经典的双均线交易策略,帮助初学者快速迈出量化交易的第一步。

weixin_29103191的博客 763

SSH

 SSH 为 struts+spring+hibernate 的一个集成框架,是目前较流行的一种JAVA Web应用程序开源框架。  [size=large][color=red]Struts[/color][/size]   Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷...

麒麟阁 376

tongweb中间件selectApp.jsp存在任意文件上传(含批量验证poc)

tongweb中间件selectApp.jsp存在任意文件上传(含批量验证poc)

weixin_43567873的博客 1988

Struts2、Hibernate3、Spring2、Sitemesh、FreeMarker整合

1.SitemeshSiteMesh是一个网页的外观,布局,导航框架,它能够将网页中的静态内容与动态内容进行分离,使整个网站拥有同一的外观,统一的装饰,并且易于今后更改外观样式设计。2.FreeMarkerFreeMarker 我认为要比老掉牙的Velocity要强大得多,FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写

阿布客栈 6568

CE电流法测试中的dBμV负值解析

传导发射(CE)电流法测试中出现的dBμV负值现象表明被测设备干扰电平低于1μV参考基准。这源于对数计算特性(小于1μV的电压转换后为负值)、设备优良的EMC设计(如滤波效果显著)及测试环境的影响(LISN隔离、屏蔽室低噪声)。负值虽不代表实际负电压,但反映干扰水平优于标准限值,为系统集成预留电磁裕度。工程应用中需结合设备灵敏度、环境背景噪声等因素综合分析,避免误判,这类数据可用于评估EMI设计冗余度。

硬核科技 298

C和C++Everything教程的简介

C和C++Everything教程的简介 C和C++Everything教程,该专栏目前已有8000博文,订阅该专栏相当于同时订阅以下所有收费专栏

希望我的博客,能帮上你解决学习中工作中所遇到的问题 4392

JavaWeb开发之SSH框架整合——Struts2+Spring3+Hibernate3三大框架的整合

Struts2+Spring3+Hibernate3导包 Struts2导包与配置 Struts2/apps/struts2-blank.war/WEB-INF/lib/*.jar 如下图所示: 导入与Spring整合的jar包 struts2-spring-plugin-2.3.15.1.jar  用于Struts2整合Springstruts2-json-plugin

3119

大模型的实践应用31-基于通义千问大模型改进台风和海浪预测研究,利用机器学习与通义千问结合的思路实现对台风和海浪预测分析

通义千问大模型是阿里巴巴云推出的一款大规模语言模型,旨在通过强大的自然语言处理能力提供更广泛的服务。从最初的构想到如今的广泛应用,通义千问的发展见证了人工智能领域尤其是自然语言处理技术的巨大进步。自发布以来,通义千问不断迭代升级,不仅在规模上实现了飞跃式的增长,在性能方面也得到了显著提升。本次研究尝试将通义千问强大的自然语言处理能力与经典的时间序列预测算法相结合,旨在提高对未来天气状况预测的精度。具体来说,首先使用通义千问生成高质量的文字描述来增强特征表达力;

微学AI的博客 936

Spring2.5+Struts2+Hibernate3整合之五

转载请注明:来自http://blog.youkuaiyun.com/M_ChangGong/ 作者:张燕广该篇主要编写Service层代码以及针对Service层功能的Junit测试代码在src下创建包com.zyg.ssh.service,在该包下创建接口StudentService,其代码如下:package com.zyg.ssh.service;import java.util.

长弓的专栏 4088

初探802.11协议(6)——Wi-Fi 6新特性简介

Wi-Fi 6新机制(特性)介绍

FanFF的博客 1523

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Struts2+Hibernate+Spring 整合示例

Struts2+Hibernate+Spring 整合示例 Spring整合Struts2、Hibernate原理概述:         从用户角度来看,用户发出HTTP请求,当MVC框架的控制器组件拦截到用户请求时,将调用系统的业务逻辑组件,业务逻辑组件则调用系统的DAO组件,而DAO组件则依赖于SessionFactory和DataSource等底层组件实现数据库访问。

TKD03072010的专栏 2万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

struts2+spring4+hibernate5整合实例

struts2作为一个很传统的mvc框架,在一些项目中,仍然发挥着重要的作用,另外hibernate和spring的结合也是很常见的,这里介绍struts2+hibernate5+spring4的整合,因为struts2支持最高的spring是4版本,所以这里采用的是spring4。整合的思路比较简单,可以从struts2+spring整合,然后接着整合hibernate+spring。也可以反过...

feinifi的博客 1778

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring、Struts2、Hibernate整合

一、   Struts 2框架整合Spring步骤 工作之后这些框架很久都没接触了,作为备忘,记录一下,以后用到的时候方便查看 1、 复制文件。复制struts2-spring-plugin-x-x-x.jar和spring.jar到WEB-INF/lib目录下。其中的x对应了Spring的版本号。还需要复制commons-logging.jar文件到WEB-INF/lib目录下。

hantianjie_的专栏 999

IntelliJ IDEA 下Spring整合Struts2、Hibernate

1. 整合原理: Spring与Struts2整合实际上是将Action对象交给Spring容器来负责创建。 Spring与Hibernate整合就是将sessionFactory交给Spring来负责维护,以及Spring维护session和aop事务。 2. 需要导入的特殊jar包 Hibernate中 java persist api java的持久化规范(接口) MySQL数据...

Coder Wang 2015

Struts2+Spring+Hibernate整合的例子

最近学习了Struts2,Spring,Hibernate的内容。并做了一个简单的消息发送的例子,因为系统很小,所以也不好意思叫系统。虽然例子简单,但SSH整合的基本内容都包含了。就记录下来,方便以后查阅。 这个是系统的基本需求。 用户能够发送消息(多选用户进行群发),查看自己的收件箱(其实是看自己接收到的消息),查看发件箱(查看发送消息记录)。用户进行分组,每个分组也可以包含多个子分组。

u010585448的专栏 3499

SSH三大框架搭建整合struts2+spring+hibernate

SSH框架整合理论: 在SSH框架的JAVAweb项目的开发过程中,WEB层通常使用的是Struts2+jsp,service层使用的是javaBean,DAO层使用的是hibernate,而spring的使用覆盖三层。 使用了spring框架之后,我们可以把对象交给spring来管理。在WEB层中,所有action对象的创建和管理都可以交给spring来完成,这样Struts2就不用自己来new...

子非鱼的博客 1081

Struts2-Spring3-Hibernate3整合开发

Struts2-Spring3-Hibernate3整合开发的底层构建

XHKJOE的专栏 1045

整合Struts2+Spring3+Hibernate3三大框架实现淘宝商城

本系统采用SSH(Struts,Spring,Hibernate)框架来开发。SSH框架是目前J2EE领域里最热门而且用得较为成熟的一套开源框架,它是基于MVC设计模式之上,在充分发挥MVC设计模式优点的同时,也创造出了自己的开发特点,降低了应用程序的耦合性,更进一步提高了应用程序的复用性、移植性、灵活性、扩展性和应用性能。SSH是一套轻量级的开发框架,相对于EJB重量级开发框架,SSH在继承了它

极客未来的博客 3407

Struts2、spring、hibernate框架整合

Struts2、spring、hibernate框架整合一、整合原理二、导入依赖包2.1 hibernate包2.1.1 hibernate/lib/required2.1.2 hibernate/lib/jpa | java persist api java的持久化规范(接口)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200205122954250.p...

tianzhen620的博客 336

Maven中整合Struts2、Spring3与Hibernate

利用Maven对项目进行管理,引入Jar包 首先引入Struts2相管理的jar包,Struts2安全的版本在2.15.1以上 org.apache.struts struts2-core 2.3.16 org.apache.struts struts2-spring-plugin 2.3.16

林海潜的博客专栏 1896
上一篇: JDK1.6,JDK1.5官方下载|JDK1.6和JDK1.5中文CHM中文API下载
下一篇: Hibernate中自带ID生成策略中属性“ generator”的含义
dw_java08
博客等级 码龄15年 122粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值