博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
9、ssh的集成方式1
阅读量:6450 次
发布时间:2019-06-23

本文共 14715 字,大约阅读时间需要 49 分钟。

 

 

集成方式1:核心

我们没有创建applicationContext-action.xml配置文件,在该配置文件里面让Spring去管理我们的AddUserAction,但是AddUserAction的创建却是Spring产生的,但是没有对AddUserAction进行管理,

AddUserAction中使用到的依赖对象,Spring默认会根据名称自动装配

 

在该方式中Spring创建action对象依赖于struts2-spring-plugin.jar,该struts2-spring-plugin.jar中 在struts2-spring-plugin.jar中有一个struts-plugin.xml,里面声明了action类由spring工厂创建

 上面这个属性表示的就是action由Spring来进行创建

 在我们集成struts2+spring+hibernate,也就是所谓的S2SH,不可避免的要引入struts2-spring-plugin.jar插件。当引入这个插件后,原先所struts创建的action类,交给了spring创建。在struts2-spring-plugin.jar中有一个struts-plugin.xml,里面声明了action类由spring工厂创建

 

我们来看下具体的操作步骤:

 

集成Struts2+Spring+Hibernate

第一种方案:让Spring创建Struts2的Action,不让Spring完全管理Struts2的Action

Struts2 Action中的依赖对象,默认会根据名称自动装配

1、创建web项目

2、引入Struts2的依赖包,将依赖包拷贝到WEB-INF/lib下

* commons-logging-1.0.4.jar
* freemarker-2.3.15.jar
* ognl-2.7.3.jar
* struts2-core-2.1.8.1.jar
* xwork-core-2.1.6.jar
* commons-fileupload-1.2.1.jar
3、引入Spring的依赖包,将依赖包拷贝到WEB-INF/lib下
* spring.jar
* lib/aspectj/*.jar
4、引入hibernate相关依赖包,将依赖包拷贝到WEB-INF/lib下
* hibernate3.jar
* lib/*.jar
5、数据库驱动
* MySQl JDBC Driver
6、将Struts2和Spring集成的依赖包拷贝到WEB-INF/lib下
* struts2-spring-plugin-2.1.8.1.jar
7、在web.xml文件中配置StrutsPrepareAndExecuteFilter
<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>/*</url-pattern>
</filter-mapping>
8、提供struts.xml配置文件,提供必要属性的配置
* struts.i18n.encoding=GB18030
* struts.configuration.xml.reload=true
* struts.devMode=true
9、提供Spring的配置文件
* applicationContext-service.xml
* applicationContext-dao.xml
* applicationContext-common.xml
10、提供hibernate.cfg.xml配置文件,提供log4j

11、在web.xml文件中配置Spring的ContextLoaderListener,创建BeanFactory

<context-param>
<param-name>contextConfigLocation</param-name>
<!--
<param-value>classpath:applicationContext-*.xml</param-value>
-->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>、
11、在web.xml文件中配置OpenSessionInViewFilter(需要放到Struts2的Filter前面)
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
12、提供用户添加表单和add_success.jsp

13、建立User实体类,编写hibernate映射文件,将映射文件加入到hibernate.cfg.xml中

14、建立UserDao和UserService,并进行实现

15、建立Struts2的Action,并配置到Struts2的配置文件中

16、在jsp中调用Action

17、我们没有创建applicationContext-action.xml配置文件,在该配置文件里面去管理我们的AddUserAction,但是AddUserAction的创建却是Spring产生的,但是没有对AddUserAction进行管理,
AddUserAction中使用到的依赖对象,Spring默认会根据名称自动装配

我们来看下整个项目的视图

 首先来看配置文件

注意点:

第一hibernate的配置文件:

hibernate.cfg.xml

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test
root
123456
org.hibernate.dialect.MySQLDialect
true
update

 

表示要连接的数据库是test,用户名是root,密码是123456

如果使用的mysql必须配置 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

 <property name="hibernate.show_sql">true</property>表示在打印台输出创建的sql语言

Hibernate配置文件的hbm2ddl.auto属性

问题就出在我把hbm2ddl.auto的值设为create了,根据Hibernate的文档,hbm2ddl.auto有四个可选值:

值 定义

update 最常用的值,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会
validate 每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值
create 每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行
create-drop 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除

<mapping resource="/com/weiyuan/test/domain/User.hbm.xml"/> 表示通过实体类和数据库映射的配置文件,表示把/com/weiyuan/test/domain/User映射到数据库中的字段

当程序运行的时候,会自动运行加载hibernate.cfg.xml,和数据库进行连接,然后通过mapping 对于的配置文件,在数据库中创建对应的数据库表

2、配置Spring的配置文件

先在web.xml中进行配置

SSH_01
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
OpenSessionInViewFilter
/*
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener

 

web.xml配置了三种:

1、配置了struct2

<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>/*</url-pattern>
</filter-mapping>

2、配置了spring

<!-- 配置spring的配置文件 -->

<context-param>
<param-name>contextConfigLocation</param-name>
<!--
<param-value>classpath:applicationContext-*.xml</param-value>
-->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

3、配置了OpenSessionInViewFilter

该类主要实现Hibernate延迟加载,但是必须注意的是在web.xml中该类配置的顺序必须在配置struct2之前才有效果

不能写成

<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>/*</url-pattern>
</filter-mapping>

 

<filter>

<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

4、我们来分析下web.xml中对spring配置文件的理解

contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener

 

这里<param-value>classpath:applicationContext.xml</param-value>  表示要加载的配置文件的路径在当前classpath目录下,就是src目录下

applicationContext.xml文件的内容是:

在该文件夹中加载applicationContext-service.xml,applicationContext-dao.xml,applicationContext-common.xml配置文件,就是在程序运行的时候就去加载这三个配置文件

applicationContext-service.xml该配置文件主要用于spring对mvc中的业务层serivice对象进行管理,所有的Service层都需要在该配置文件中配置
applicationContext-dao.xml该配置文件主要对mvc层中的数据库dao层进行配置管理
applicationContext-common.xml主要对一些常用的公共类进行配置和管理,一些常用的Utils工具类就在该文件中进行配置

3、现在我们来看看具体的实体类,先创建实体类,对应

package com.weiyuan.test.domain;public class User {    private String userCode;        private String userName;        private String age;    public String getUserCode() {        return userCode;    }    public void setUserCode(String userCode) {        this.userCode = userCode;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    @Override    public String toString() {        return "User [userCode=" + userCode + ", userName=" + userName                + ", age=" + age + "]";    }      }

 

然后在该名下com.weiyuan.test.domain下创建对应的hibernate的配置文件,该配置文件为

配置文件必须和实体类在同一个包名下User.hbm.xml,中User必须和实体类的名字一样,hbm.xml后面是默认的

 

该文件的内容

 property 属性的值必须和实体类的属性的名称一一对应

在hibernate中一个数据模型的主键常用有三种形式:uuid、native、assigned,分别是通用唯一标识、自增、自定义。

1、uuid是系统产生的,insert数据库时相比native要快很多,但是uuid是一长串无序字符串,理论上讲查找起来会慢一点,但是不太会影响开发的。而native是数据库生成,在insert时会先计算所以会比uuid慢一点,但是在查找和删除数据时,会比较方便。
2、uuid和assigned的生成是在程序中完成的,一个是自动,一个是手动。所以在进行session.save()时,不会产生sql语句,数据库中也不会有数据。而native需要读取数据库数据才能完成自动递增,所以在执行session.save()时,就会产生相应的sql语句,数据库中就会有数据(缓存中id是有值的)。

这样当程序运行的就会在数据库中创建t_user这张表

CREATE TABLE `t_user` (  `userCode` varchar(255) NOT NULL,  `userName` varchar(255) default NULL,  `age` varchar(255) default NULL,  PRIMARY KEY  (`userCode`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

4、创建dao类

package com.weiyuan.test.dao;import com.weiyuan.test.domain.User;public interface UserDao {    public void add(User user) ;}

 

对应的实现类为:

package com.weiyuan.test.dao;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.weiyuan.test.domain.User;/** *  * 继承:HibernateDaoSupport中使用到了sessionFactroy * 我们需要在配置文件中使用spring自动产生sessionFactroy * 我们需要在配置文件中使用spring自动产生UserDaoImpl * */public class UserDaoImpl extends HibernateDaoSupport implements UserDao {    /**     * 需要hibernate的sessionFactory将用户添加到数据库中     * */    @Override    public void add(User user) {        // TODO Auto-generated method stub       getHibernateTemplate().save(user);    }}

 

该实现类继承了HibernateDaoSupport ,然后将对象插入到数据库表t_user中

由于Hibernate集成了JDBC,所以在访问数据库时,与直接使用JDBC访问数据库相比,Hibernate在连接、访问数据库时的代码减少了很大一大半。但由此而来也相应必须增加访问Hibernate配置文件和SessionFactory、Session的打开、关闭的代码。为了解决以上相同代码出现的复用问题,Hibernate对此又进行了再一次封装,于是,幸运地出现了HibernateDaoSupport。因此,在使用HibernateDaoSupport模板对数据库访问时,更加方便、简单,特别是进行简单的增删改查。    下面是我自己写的一点代码参考:/**   * @author wifygoo   * 对企业信息的简单增删改查。   */ public class EnterpriseDaoImpl extends HibernateDaoSupport implements         EnterpriseDao {      /**       * @param Enterprise       * 删除某条企业信息。       */     public void del(Enterprise enterprise) {          this.getHibernateTemplate().delete(enterprise);      }      /**       * @return 所有的企业信息。       * 查询所有的企业信息。       */     @SuppressWarnings("unchecked")      public List
findAllEnterprises() { String hql = "from Enterprise enterprise"; return this.getHibernateTemplate().find(hql); } /** * @param Integer,企业编号。 * @return 某个企业信息。 * 通过企业编号查询企业信息。 */ public Enterprise findEnterpriseById(Integer id) { return (Enterprise) this.getHibernateTemplate().load(Enterprise.class, id); } /** * @param Enterprise * 添加企业信息。 */ public void save(Enterprise enterprise) { this.getHibernateTemplate().save(enterprise); } /** * @param Enterprise * 修改企业信息。 */ public void update(Enterprise enterprise) { this.getHibernateTemplate().update(enterprise); } }

 

使用借助于HibernateTemplate的模板访问方式访问数据库,大大减少了代码,但是必须依赖于SessionFactory这个对象,这个SessionFactory对象的产生我们可以让Spring来给我们产生,并对该对象进行管理,我们可以在上面创建的applicationContext-common.xml来产生了管理SessionFactory这个对象

applicationContext-common.xml配置文件内容如下:

 

上面这个配置文件有两个地方需要注意的:

<property name="configLocation" value="classpath:hibernate.cfg.xml"/> 加载hibernate配置文件的路径和名称是当前的src目录下

  <aop:pointcut id="allManagerMethod" expression="execution(* com.weiyuan.test.service.*.*(..))"/>事务有效的函数的名称是在所有的包名下com.weiyuan.test.service的函数调用dao层访问数据库事务都有效

 然后在applicationContext-dao.xml对dao进行配置,让Spring进行管理和配置

 

上面就是创建userDao对象的时候,因为该对象继承了HibernateDaoSupport ,创建HibernateDaoSupport 对象的时候需要使用到sessionFactory对象,所以上面ref了applicationContext-common.xml中配置的sessionFactory对象

 

5、编写Service业务操作类

 

package com.weiyuan.test.service;import com.weiyuan.test.domain.User;public interface UserService {    public void add(User user);}

 

实现类:

package com.weiyuan.test.service;import com.weiyuan.test.dao.UserDao;import com.weiyuan.test.domain.User;public class UserServiceImpl implements UserService {     /**     * 记得在applicationContext-service.xml配置使用Spring自动产生UserDao类     * */    private UserDao userDao;        @Override    public void add(User user) {        // TODO Auto-generated method stub       userDao.add(user);    }    public UserDao getUserDao() {        return userDao;    }    public void setUserDao(UserDao userDao) {        this.userDao = userDao;    }}

 

现在我们要在applicationContext-service.xml对实现类进行配置和管理

 

5、接下来创建文明的action

package com.weiyuan.test.web.action;import com.weiyuan.test.domain.User;import com.weiyuan.test.service.UserService;public class AddUserAction {    private User user;        /**     * 这里的名字必须和applicationContext-service.xml中配置的名字一一对应起来     * 
* */ private UserService userService; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public String execute() throws Exception{ System.out.println(""+user.toString()); userService.add(user); return "sucess"; } }

 

这里action的创建和管理就没有单独的applicationContext-action.xml对其进行配置,因为引入了

它会由spring自动创建action对象,但是不会对action对象进行管理,

我们没有创建applicationContext-action.xml配置文件,在该配置文件里面让Spring去管理我们的AddUserAction,但是AddUserAction的创建却是Spring产生的,但是没有对AddUserAction进行管理,

AddUserAction中使用到的依赖对象private UserService userService;,Spring默认会根据名称自动装配,名称必须和

这里的名字必须和applicationContext-service.xml中配置的名字一一对应起来

* <bean id="userService" class="com.weiyuan.test.service.UserServiceImpl">

文明来看看struct.xml对action的配置

/add_success.jsp

 

文明来看看index.jsp文件,该文件就是程序的入口文件

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>           
用户代码:
用户姓名:
年龄:

 

添加用户成功的页面:

add_success.jsp

 代码下载地址为:

https://pan.baidu.com/s/1bVF9pG

转载于:https://www.cnblogs.com/kebibuluan/p/8058491.html

你可能感兴趣的文章
linux pbs 用户时间,【Linux】单计算机安装PBS系统(Torque)与运维
查看>>
linux系统可用内存减少,在Linux中检查可用内存的5种方法
查看>>
linux 脚本map,Linux Shell Map的用法详解
查看>>
如何在linux系统下配置共享文件夹,如何在windows和Linux系统之间共享文件夹.doc
查看>>
thinkpad装linux无线网卡驱动,ThinkPad E530 Fedora 20 下无线网卡驱动的安装
查看>>
linux操作系统加固软件,系统安全:教你Linux操作系统的安全加固
查看>>
linux中yum源安装dhcp,24.Linux系统下动态网络源部署方法(dhcpd)
查看>>
linux屏幕复制显示出来的,linux – stdout到gnu屏幕复制缓冲区
查看>>
一起学Shell(十)之可称植性议题与扩展
查看>>
部署Ganglia监控Hadoop&Hbase
查看>>
gitlab的用户使用手册
查看>>
论Optimizer的工作模式ALL_ROWS&FIRST_ROWS
查看>>
生产环境高并发MySQL SQL语句优化案例
查看>>
Lync 小技巧-24-PDF 加密文件-转-Word-操作手册
查看>>
ASP.NET性能优化之分布式Session
查看>>
TaffyDB Introduction
查看>>
Piwik 1.9.1 发布,网站访问统计系统
查看>>
【转】ie6 png 透明终极解决方案
查看>>
CentOS6.5菜鸟之旅:关于搜索的shell命令
查看>>
扩展ViewFlow避免和ViewPager滑动冲突,同时支持无限循环,并完美和CircleFlowIndicator结合...
查看>>