ssh框架的总结

一、spring:是基础,可以管理对象,也可以通过关键对象管理另一个框架。但是首先应该明确spring并不是只能应用于web方面,而是可以应用在一般的java项目中。只是如果在web环境下使用需要在web.xml中进行注册(启动IOC容器的servletContextListener)。还有就是获取方式稍有不同。

 1  <!-- 下面是有关spring在web中启动的配置,是spring提供的listener -->
 2     <!-- 启动IOC容器的servletContextListener -->
 3      <listener>
 4         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 5       </listener>
 6       <!-- 添加spring配置文件名称和位置 -->
 7       <context-param>
 8             <param-name>contextConfigLocation</param-name>
 9         <param-value>classpath:applicationContext.xml</param-value>
10       </context-param>

在web.xml注册spring启动监听器

  ①管理对象,所有对象都是通过spring配置,需要时通过其产生(IOC)。是解除紧耦合的第一步。

    通过spring管理的对象需要在配置文件中注册或者通过注释配置,就是一个<bean>,还可以为 构造函数参数/属性 注入值

  ②AOP面向切面编程的实现,我的简单理解就是业务层面的解耦。

    AOP同样可以通过配置和注释实现。 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans
 3     xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xmlns:p="http://www.springframework.org/schema/p"
 6     xmlns:aop="http://www.springframework.org/schema/aop"
 7     xmlns:context="http://www.springframework.org/schema/context"
 8     xsi:schemaLocation="http://www.springframework.org/schema/beans
 9         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
10          http://www.springframework.org/schema/aop
11          http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
12         http://www.springframework.org/schema/context
13         http://www.springframework.org/schema/context/spring-context-3.1.xsd">
14     <!-- 下面一句是开启spring的注释配置方式,需要在beans的属性中添加xmlns:context的命名空间
15         实质上是开启了注解的解析处理器,有四种
16     -->
17     <context:annotation-config/>
18
19
20     <!-- 注意:每个bean默认情况下都是单例对象 -->
21     <!-- 配置bean,id在获取时使用,class对应实际的javabean类-->
22     <bean id="stu" class="com.dqxst.domain.Stu">
23         <!--
24             1、 下面是设置构造器参数,按照顺序,对应可以接受这些值的构造器来构造对象,
25             例如下面的设置就是对应(String,int)参数的构造器,顺序不能乱
26             2、如果参数是自定义对象,则应该使用ref而非value,值为已经声明的bean的id
27         -->
28         <constructor-arg value="sfl"/>
29         <constructor-arg value="15"/>
30         <constructor-arg ref="helloWorld" />
31
32         <!--
33             下面是为javabean属性赋值,相当于使用set(),也称属性注入
34             当然,这种操作是在创建对象之后的,也就是在上面的构造器方法之后使用
35             同样,如果注入的是一个对象,使用的是ref
36          -->
37         <property name="name" value="test"></property>
38         <property name="study" ref="work"></property>
39         <!-- 声明一个内部类 -->
40         <property name="home">
41             <bean class="com.dqxst.domain.Home">
42                 <property name="father" value="ssk"></property>
43                 <property name="mother" value="wsp"></property>
44             </bean>
45         </property>
46     </bean>
47
48     <bean id="helloWorld" class="com.dqxst.domain.HelloWorld"></bean>
49
50     <!-- factory-method属性用于没有公开构造器的类创建对象,通常用于单例模式下的对象创建
51         称为静态工厂方法配置bean
52     -->
53     <bean id="classroom" class="com.dqxst.domain.Classroom"
54         factory-method="getInstance"/>
55
56     <!-- scope属性用于确定bean的作用域,即在那个范围中是唯一的 -->
57     <bean id="work" class="com.dqxst.domain.Work" scope="prototype" />
58
59     <bean id="collage" class="com.dqxst.domain.Collage"
60         factory-method="getInstance" />
61
62     <!-- 下面这个bean是用于AOP的 -->
63     <bean id="classes" class="com.dqxst.aop.Classes" />
64     <bean id="classes2" class="com.dqxst.aop.Classes2" />
65         <!-- 下面是AOP的一些配置,注意都是在一个节点之内的 -->
66     <aop:config>
67         <!-- 定义一个切面 -->
68         <aop:aspect ref="classes">
69             <!-- 定义一个通知,在内部声明切点,也可以引用一个外部声明的切点 -->
70             <aop:before pointcut="execution(* com.dqxst.domain.Stu.study(..))"
71                 method="stand"/>
72             <!-- 这个通知引用外部切点声明,注意多个同一点的切点按声明顺序执行,例如这里的两个前者通知 -->
73             <aop:before pointcut-ref="pointcut"
74                 method="sayHi"/>
75             <aop:after-throwing pointcut-ref="pointcut"
76                 method="delayed"/>
77             <aop:after pointcut-ref="pointcut"
78                 method="sayBye"/>
79             <!-- 外部切点声明 -->
80             <aop:pointcut id="pointcut"
81                 expression="execution(* com.dqxst.domain.Stu.study(..))"/>
82         </aop:aspect>
83         <aop:aspect ref="classes2">
84             <aop:pointcut expression="execution(* com.dqxst.domain.Stu.nowStudy(..))"
85                 id="pcut"/>
86             <aop:around pointcut-ref="pcut" method="onClass"/>
87         </aop:aspect>
88     </aop:config>
89 </beans>

spring配置文件

  ③springmvc:基于spring的mvc框架,优点是和spring结合紧密,不需多余配置。

参考:http://blog.csdn.net/lishuangzhe7047/article/details/20740209

http://www.blogjava.net/stevenjohn/archive/2012/08/20/385846.html

二、strut2:是用filter作为控制器的MVC框架,配置环境分三步:

  1、添加jar包,2、添加strut.xml配置文件,3、在web.xml中进行配置(配置strut的主要过滤器filter)

  需要注意的是strut配置文件默认不提示,联网情况下可以自动下载dtd约束文件,但是也可以手动配置本地约束文件

  struts2负责C(controller)的部分:主要负责将url/form中的数据发送到指定的url对应的Action类进行处理,具体的处理过程如下:

  1、首先,Struts2通过属性/模型驱动来自动封装数据为实体对象,节省了很多的重复操作,但是这也对实体属性命名和表单name属性命名有一些对应要求;

  2、这些Action类就是和servlet执行相同的工作,也可以获取域对象(即web资源)进行操作。

  3、最后定位到JSP页面进行输出。

  ①struct2数据传递的方式:值栈,可以通过struct2标签和OGNL表达式进行读取,这三个是struct2的重要基础

参考:http://blog.knowsky.com/188302.htm

http://blog.csdn.net/a549324766/article/details/7206876

http://blog.knowsky.com/194419.htm

三、hibernate:经典的关系对象映射框架,就是将数据库中关系型的数据转换成java中的对象型数据。主要有以下几点:

  ①编写pojo类,配置映射关系。重要

  ②hibernate使用:

    ①首先获取SessionFactory对象,然后得到Session对象。通过Session对象进行增删查改实际操作。注意:sessionFactory是线程安全的,但是Session线程不安全,由于servlet的单例特点,可能引发线程问题,所以需要注意。并且在Session管理中的对象有不同的状态还可以转化。和jdcb一样,基础操作比较复杂,可以使用工具类简化使用。

参考:http://lialiks.bokee.com/586567.html

http://blog.csdn.net/shrek_xu/article/details/740991

    ②HQL,面向对象查询,类似sql。多表查询差别大。真实使用的sql语句是hibernate通过HQL和映射文件自动生成的。缺点是不利于优化。

  1 import hibernate_g_query.domain.Department;
  2 import hibernate_g_query.domain.Employee;
  3
  4 import java.util.Arrays;
  5 import java.util.List;
  6
  7 import org.hibernate.Criteria;
  8 import org.hibernate.Session;
  9 import org.hibernate.Transaction;
 10 import org.hibernate.criterion.Restrictions;
 11 import org.junit.Test;
 12
 13 import com.dqxst.dao.DaoUtils;
 14
 15 public class Dao {
 16     @Test
 17     public void save() {
 18         Session session = DaoUtils.openSession();
 19         Transaction tx = null;
 20         try {
 21             tx = session.beginTransaction();
 22
 23             for (int i = 0; i < 10; i++) {
 24                 Department department = new Department();
 25                 department.setName("研发部" + i);
 26                 session.save(department);
 27             }
 28
 29             for (int i = 0; i < 20; i++) {
 30                 Employee employee = new Employee();
 31                 employee.setName("test" + i);
 32                 session.save(employee);
 33             }
 34
 35             tx.commit();
 36         } catch (Exception e) {
 37             tx.rollback();
 38             throw e;
 39         } finally {
 40         }
 41     }
 42
 43     // 练习hql查询语句
 44     @Test
 45     public void hql() {
 46         Session session = DaoUtils.openSession();
 47         Transaction tx = null;
 48         try {
 49             tx = session.beginTransaction();
 50             /*
 51              * 一般特点: 1、和sql语句相似,但是移植性好 2、hql查询的是对象及其属性,即from后的是对象;
 52              * 3、涉及到对象的部分需要区分大小写,其余部分不用。如果类名是唯一的可以直接使用, 否则需要使用全限定名
 53              */
 54             String hql;
 55             // 1、简单查询,不使用select,可以使用别名,也可以省略as,没有限定条件查询所有
 56             hql = "FROM Employee e";
 57
 58             // 2、使用过滤条件,即where语句
 59             hql = "FROM Employee e WHERE e.id<10";
 60
 61             // 3、使用order by排序
 62             hql = "FROM Employee e WHERE e.id<10 ORDER BY id DESC";
 63
 64             /*
 65              * 4、指定select子句, 1、不使用select时返回值是对象的List集合 2、查询单列:
 66              * 3、查询多列:返回的是集合的元素类型是Object数组 !!! 但是可以使用new将这些列封装为对象,需要有对应的构造函数
 67              */
 68             hql = "SELECT e.name FROM Employee e";
 69
 70             hql = "SELECT e.id,e.name FROM Employee e";
 71             // 对应的构造函数就是以该两列为参数的构造函数
 72             hql = "SELECT new Employee(e.id,e.name) FROM Employee e";
 73
 74             /*
 75              * 5、执行查询,获取结果 1、获取查询对象 2、获取结果集
 76              */
 77             // Query query=session.createQuery(hql);
 78             // //hibernate的分页
 79             // query.setFirstResult(0);
 80             // query.setMaxResults(10);
 81             // List<?> list=query.list();
 82
 83             // 6、hibernate支持方法链操作
 84             List<?> list = session.createQuery(hql)//
 85                     .setFirstResult(0)//
 86                     .setMaxResults(10)//
 87                     .list();
 88
 89             for (Object obj : list) {
 90                 if (obj.getClass().isArray()) {
 91                     System.out.println(Arrays.toString((Object[]) obj));
 92                 } else {
 93                     System.out.println(obj);
 94                 }
 95             }
 96             tx.commit();
 97         } catch (Exception e) {
 98             tx.rollback();
 99             throw e;
100         } finally {
101             session.close();
102         }
103     }
104
105     @Test
106     public void hql2() {
107         Session session = DaoUtils.openSession();
108         Transaction tx = null;
109         try {
110             tx = session.beginTransaction();
111
112             String hql;
113
114             /* 1,聚集函数:count() min() max() sum() avg()
115              * count()返回结果为Long型,其余返回为查询的属性的类型。使用Number类型最好
116              */
117             hql="SELECT COUNT(*) FROM Employee";
118             Number result=(Number) session.createQuery(hql).uniqueResult();
119             System.out.println(result);
120
121             // 2,分组 group by和having,一些子句可以使用列别名,但是不推荐使用
122             hql="SELECT e.name,COUNT(*) FROM Employee e GROUP BY e.name "
123                     + "HAVING COUNT(*)>6";
124
125             /* 3,连接查询 / HQL是面向对象的查询
126              * 默认是inner join内连接,还可以使用left (out)/right (out)进行查询
127              * 但是hql还有更简单的方式:可以像查询属性一样进行连接查询,内部会进行转换
128              */
129             //hql="SELECT e.id,e.name,d.name FROM Employee e JOIN e.department d";
130             hql="SELECT e.id,e.name,e.department.name FROM Employee e";
131
132             // 4,查询时使用参数:和jdbc中类似,防止sql注入
133             //     >>方式一:使用‘?‘占位
134 //            hql="FROM Employee WHERE id BETWEEN ? AND ?";
135 //            List<?> list=session.createQuery(hql)//
136 //                    .setParameter(0, 5)//
137 //                    .setParameter(1, 15)//
138 //                    .list();
139             //     >>方式二:使用变量名
140 //            hql="FROM Employee WHERE id BETWEEN :idMin AND :idMax";
141 //            List<?> list=session.createQuery(hql)//
142 //                    .setParameter("idMin", 5)//
143 //                    .setParameter("idMax", 15)//
144 //                    .list();
145             //    >>当参数不确定时可以使用集合传参
146 //            hql="FROM Employee WHERE id IN (:ids)";
147 //            List<?> list=session.createQuery(hql)//
148 //                    .setParameterList("ids", new Object[]{1,2,5,7})//
149 //                    .list();
150
151             /* 5,使用命名查询:就是将查询语句写到配置文件中而不是硬编码到程序中,
152              * 通过名字来查找sql语句,并生成Query对象,
153              * 该查询语句通常写到该实体的映射文件中
154              */
155             List<?> list=session.getNamedQuery("queryByIdRange")//
156                     .setParameter("idMin", 5)//
157                     .setParameter("idMax", 15)//
158                     .list();
159
160             /* 6,update与delete,不会通知Session缓存,也就是通过session获取时不能获取最新值
161              * 所以:在update或delete后,需要refresh(obj)一下以获取最新的状态
162              */
163             hql="UPDATE Employee e SET e.name=? WHERE e.id>15";
164             result=session.createQuery(hql)//
165                     .setParameter(0, "asd")//
166                     .executeUpdate();       //执行更新语句,返回受影响行数
167             session.refresh(list);
168             System.out.println(result);
169
170 //            List<?> list = session.createQuery(hql)//
171 //                    .list();
172
173             for (Object obj : list) {
174                 if (obj.getClass().isArray()) {
175                     System.out.println(Arrays.toString((Object[]) obj));
176                 } else {
177                     System.out.println(obj);
178                 }
179             }
180             tx.commit();
181         } catch (Exception e) {
182             tx.rollback();
183             throw e;
184         } finally {
185             session.close();
186         }
187     }
188
189     @Test
190     public void qbc(){
191         Session session = DaoUtils.openSession();
192         Transaction tx = null;
193         try {
194             tx = session.beginTransaction();
195
196             //创建对象
197             Criteria criteria=session.createCriteria(Employee.class);
198
199             //添加过滤条件
200             criteria.add(Restrictions.ge("id", 5));
201             criteria.add(Restrictions.le("id", 10));
202             //添加排序条件
203
204             //执行查询,获取结果集
205             List<?> list=criteria.list();
206             for (Object obj : list) {
207                 if (obj.getClass().isArray()) {
208                     System.out.println(Arrays.toString((Object[]) obj));
209                 } else {
210                     System.out.println(obj);
211                 }
212             }
213             tx.commit();
214         } catch (Exception e) {
215             tx.rollback();
216             throw e;
217         } finally {
218             session.close();
219         }
220     }
221 }

HQL使用

  ③高级部分:

    懒加载:就是关联查询时可以在使用之前在查询而不是直接查询

    使用连接池:在hibernate配置文件即可配置,但是如果和spring配合使用则在spring中进行配置。

    缓存(一级/二级)  参考:http://www.cnblogs.com/shanmu/p/3598509.html

四、框架整合,所谓的整合就是使用spring关联struct2和hibernate框架,然后使用tomcat生成spring。

  ①spring整合hibernate,主要是两个:管理sessionFactory,管理事务

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:p="http://www.springframework.org/schema/p"
 5     xmlns:tx="http://www.springframework.org/schema/tx"
 6     xmlns:context="http://www.springframework.org/schema/context"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans
 8         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
 9         http://www.springframework.org/schema/context
10         http://www.springframework.org/schema/context/spring-context-3.1.xsd
11         http://www.springframework.org/schema/tx
12         http://www.springframework.org/schema/tx/spring-tx.xsd">
13
14     <context:component-scan base-package="com.dqxst" />
15     <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
16
17     <!-- 导入资源文件 -->
18     <context:property-placeholder location="classpath:db.properties"/>
19
20     <!-- 配置C3P0资源,值使用的是properties中的值 -->
21     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
22         <property name="driverClass" value="${driverClass}"></property>
23         <property name="jdbcUrl" value="${jdbcUrl}"></property>
24         <property name="user" value="${user}"></property>
25         <property name="password" value="${password}"></property>
26         <property name="initialPoolSize" value="${initPoolSize}"></property>
27         <property name="maxPoolSize" value="${maxPoolSize}"></property>
28     </bean>
29
30     <!-- 配置hibernate的SessionFactory实例,其实是spring中的LocalSessionFactoryBean -->
31     <bean id="sessionFactory"
32         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
33
34         <!-- 引入数据源 -->
35         <property name="dataSource" ref="dataSource"></property>
36
37         <!-- 引入hibernate配置文件,最好是在该配置文件中进行配置 -->
38         <property name="configLocation"
39             value="file:src/hibernate.cfg.xml">
40         </property>
41             <!-- 在spring中配置hibernate属性 -->
42         <property name="hibernateProperties">
43             <props>
44                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
45             </props>
46         </property>
47
48         <!-- 引入映射文件 -->
49         <property name="mappingLocations" value="classpath:com/dqxst/domain/*.hbm.xml"></property>
50     </bean>
51
52     <bean id="transactionManager"
53         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
54         <property name="sessionFactory" ref="sessionFactory" />
55     </bean>
56     <tx:annotation-driven transaction-manager="transactionManager" />
57 </beans>

spring整合hibernate配置

  ②spring整合struct2,主要体现在通过spring来管理struct2使用的action对象,所以不需要过多的配置。但是struct2是通过拦截器链实现的,所以需要在web.xml中配置struct2使用的主过滤器,注意要在spring之后配置。

1   <!-- 配置Struts2的主过滤器 -->
2   <filter>
3     <filter-name>struts2</filter-name>
4     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
5   </filter>
6   <filter-mapping>
7     <filter-name>struts2</filter-name>
8     <url-pattern>/*</url-pattern>
9   </filter-mapping>

配置struct2主过滤器

时间: 2024-12-16 12:58:30

ssh框架的总结的相关文章

MVC+Spring.NET+NHibernate .NET SSH框架整合

在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MVC框架以后太灵活了(相比之前的web Form),嗯,关于.NET中的MVC框架我就不多说了,推荐这位大神的<MVC知多少系列>http://www.cnblogs.com/sheng-jie/p/6291915.html.下面进入正题,.NET中也有SSH框架,他们分别指MVC+Spring.NET和NHibernate. 其中Spring.NET是典型的IOC框架,类似的还

学习SSH框架

1.SSH框架的认知 在做相关的java的网页的开发制作时,良好的层次分解是十分有比要的,所以我们在云涌第三方的框架之下来简化还有名了我们相关的网站的开发. SSH框架实则为Struct + spring + hibernate 的三个组成的,其中struct,专注与前台的相关的请求的所对应的ActionForm还有其相关跳转的Action来 处理得到相关的JSP页面,从而来更新或是条状到相关用户的请求的服务页面,或是信息页面.而Hibernate的作用是体现在数据的持久化的层次中,我们对于页

SSH框架 jar包版本的选择

我搭建SSH框架,想选择最新的jar,但是由于jar版本的问题 报出各种各样的千奇百怪的问题.从网上找了一些,但都是用比较老的版本.在我的不懈努力,最后终于成功了.再次分享一下,由于才疏学浅,见识浅薄,仅供大家参考! hibernate框架的选择,取决于spring的支持.在spring-orm-XX.jar 文件中有对hibernate的支持情况,像这个spring-orm-4.1.6.RELEASE.jar支持hibernate3,hibernate4,不支持hibernate5.所以我只能

基于SSH框架的学生公寓管理系统的质量属性

系统名称:学生公寓管理系统 首先介绍一下学生公寓管理系统,在学生公寓管理方面,针对学生有关住宿信息问题进行管理,学生公寓管理系统主要包含了1)学生信息记录:包括学号.姓名.性别.院系.班级:2)住宿信息记录:包括宿舍楼号.宿舍号.电费信息.维修记录:3)报修信息记录:包括宿舍楼号.宿舍号.报修品.时间.维修状态:4)后勤人员记录:包括工号.姓名.联系方式:5)电费信息记录:包括宿舍楼号.宿舍号.电剩余量.使用量.缴费金额.剩余金额:6)学生晚归记录:晚归学生的学号.姓名.时间.宿舍号.日期.和原

SSH框架总结(框架分析+环境搭建+实例源代码下载)

首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是眼下较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据持久层和域模块层(实体层). Struts作为系统的总体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持.Spring一方面作为一个轻量级的IoC容器,负责查找.定位.创建和管理对象及

SSH框架搭建

闲来无事,来搞下SSH框架的搭建吧. 1.struts搭建 这个不用说了吧,新建一个web项目,把struts-2.3.7-all解压后的struts2-blank里面的lib下面的包全部复制到你新建的web项目里面,把web-inf下面的web.xml复制过去,把src目录下的struts.xml复制到新建的src目录下.最重要的是你要集成spring,那么问题来了,你少包了,亲.去struts-2.3.7-all文件夹的lib目录下把struts2-spring-plugin-2.3.7包拷

java教程(五)SSH框架-配置

前言:从这篇博客开始我将继续讲述Java教程:SSH篇,主要内容围绕SSH框架分析与搭建,今天先简单介绍一下SSH的配置. SSH配置顺序是: spring-->hibernate-->struts 1. 建立web-project ,并添加Spring支持,添加JAR包时注意,aop  core web commons等包要加载,然后一直下一步就可以成功添加spring支持: 2. 添加hibernate支持,同样注意包的选择, 下一步中注意,选择添加到spring中(spring conf

SSH框架--struts深入详解(一)

学习了struts,但是对于它的由来,以及为什么使用action和struts.xml的方式而不采用以前的servlet方式,有些疑问,到底之前的方式有什么弊端,struts又给我们带来了什么便利? 下面一一为大家解答! struts的由来: 随着JSP与Servlet 技术大量应用于以Web为基础的应用程序,为了提升Web 应用程序可维护性与重复使用性,Java开发人员提出了一些较佳的开发模式.比较常见的两种JSP应用架构分别为Model1 与Model 2.详情参见(JAVA学习篇--JAV

【课程分享】jQuery2.0应用开发:SSH框架整合jQuery2.0实战OA办公自动化(VSS、operamasks-UI框架)

我的qq是2059055336,对这个课程有兴趣的可以加我qq联系. 课程下载地址:链接:http://pan.baidu.com/share/link?shareid=395438909&uk=3611155194 密码:mlvl 课程下载地址:http://www.kuaipan.cn/file/id_192202874577496484.htm?source=1 一.本课程是怎么样的一门课程(全面介绍)    1.1.课程的背景 jQuery 2.0 正式版发布,不在支持 IE 6/7/8

JAVA SSH 框架介绍

SSH 为 struts+spring+hibernate 的一个集成框架,是目前较流行的一种JAVA Web应用程序开源框架. Struts Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注.Struts把Servlet.JSP.自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套M