小弟是一位SSH菜鸟,想快速精通SSH的相关知识和经验,避免走一些弯路,所以在这里想请教大家一下相关经验:
1.有没有这方面的经典书籍?最好能从基本配置开始,注重实例而不是一些宽泛的知识
2.开发IDE,因为大一一进来就用netbeans,所以一直就用这个,但是发现貌似网上的实例都是使用Eclipse,所以问下大家推荐使用哪个IDE谢谢大家了。。

解决方案 »

  1.   

    其实我也想知道怎么学好SSH,现在我只学了Struts1和hibernate,本来想继续去学spring的,但感觉自己还是需要先拿Struts1和hibernate多练练!
    我也不知道自己这样做对不对~~
      

  2.   

    想快速精通SSH的相关知识和经验这个不太现实,如果基础打牢了SSH很快就会了,如果不打牢SSH你也不可能学的很好,SSH学还是要学的,不建议一次三个都学,可以一个一个的学,这样学的才通。至于IDE,使用Eclipse吧,Eclipse本身就是一个很好的东西(OSGI的最好实现equinox)。其实用熟了什么工具都无所谓了。
      

  3.   

    2楼兄弟说的很经典,个人感觉Spring可以放到最后学,我工作一年了,感觉这框架还是没有理解透
      

  4.   

    书籍的话 就比较多了 spring实战 struts中文教程等等 很多了配置, 按照这个搞就不会有问题了   这是吉祥onlyflag整理的
    第一步:准备工作
    MyEclipse 6.0------Tomcat6.0
    所需jar文件:(注意:ssh_test项目中采用的是MySql 数据库。
    而本文档中配置的是Oracle数据库,注意其中配置的不同之处哦(在相应的地方有注明)第二步:(建立项目,包结构,导入所需jar文件)
    各包功能说明:
    com.ssh.config : 配置文件(*.properties),如数据库配置信息
        com.ssh.resource :  资源文件 
        com.ssh.util.comm :  公共工具(util)包
        com.ssh.util.orm.hibernate :  hibernate DAO 模板
        com.ssh.model : 各实体类文件
    com.ssh.service : 业务逻辑包  相当于biz 
      com.ssh..test : 测试包 
    com.ssh.action : struts Action 

          包结构可以根据自己需要自行划分
      导入jar文件: 第三步:撰写资源文件
    jdbc.properties
    在jdbc.properties 里写上连接数据库的配置信息,此文件的配置信息用于在spring的配置文件中使用,数据库的配置信息也可以写到Spring 的配置文件中,这在一个jdbc.properties文件中是为了方便更改.
    在com.ssh.resource包中新建下列文件:

    各文件详细内容及说明如下:
    -----------------------------------------------------------------------------------------------------------------------------------------
    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"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
    default-lazy-init="true">
    <description>Spring公共配置文件</description>

    <!-- 属性文件读入 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <list>
    <value>classpath*:com/ssh/config/jdbc.properties</value>
    </list>
    </property>
    </bean>
    <!-- 数据源配置,主要用于开发测试环境 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    </bean> <!-- 数据源配置,在生产环境使用应用服务器的数据库连接池 -->
    <!-- <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/store" />--> <!-- Hibernate配置 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><!—此处hibernate 的映射采用的是.xml 配置则应设置为:class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”-->
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.cache.use_query_cache">true</prop>
    <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
    <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache-hibernate.xml</prop>
    </props>
    </property>
    <property name="annotatedClasses"> <!—此处hibernate 的映射采用的是.xml 配置同则应设置name=”mappingResource”-->
    <list>
    <value>com.ssh.model.User</value><!—此处hibernate 的映射采用的是.xml 配置同则应设置<value>具体配置文件名(*.hbm.xml)</value>-->
    </list>
    </property>
    </bean> <!-- 事务配置 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean> <!--
    JTA环境的事务配置 <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager or
    WebLogicJtaTransactionManager"/>
    --> <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 保证POJO中标注@Required的属性被注入 -->
    <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />
    </beans>-----------------------------------------------------------------------------------------------------------------------------------------
    applicationContext-security.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="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-2.5.xsd
                            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"
    default-autowire="byType" default-lazy-init="true">
    </beans:beans>此文件用于AOP的安全验证,也可不添加
    -----------------------------------------------------------------------------------------------------------------------------------------
    applicationContext-service.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-2.5.xsd"
    default-autowire="byType" default-lazy-init="true">
    <bean name="userService" class="com.ssh.service.UserService"></bean>
    <bean name="/hello" class="com.ssh.action.HelloAction"></bean>
    </beans>Service(业务逻辑类)的注入
    -----------------------------------------------------------------------------------------------------------------------------------------
    ehcache-hibernate.xml:
    <ehcache>
    <diskStore path="d:\cache" />
    <!-- Object cache -->
    <!-- 特别设定User类的Cache,内存中最多只保存5000个User实例,而且idle 600秒过期
     而Role类没有设置,则使用defaultCache中的默认设定 -->
    <cache name="com.ssh.model.User" maxElementsInMemory="4" eternal="false" overflowToDisk="true" timeToIdleSeconds="600" />
    <defaultCache maxElementsInMemory="100000" eternal="true" overflowToDisk="true" />
    </ehcache>Hibernate 缓存的配置(可以不做配置,如果需要才使用缓存才做配置,建议配置上)
    -----------------------------------------------------------------------------------------------------------------------------------------
    第四步:在com.ssh.util.comm 包下添加下列文件

    此包为hibernate DAO模板中用到的各种工具类,各文件可以在打包的ssh_test项目中找到.
    第五步:添加hibernate DAO 模板此包为hibernate DAO模板,SimpleHibernateTemplate.java 中包含了对各实体(增,删,改,查,分页查等)的泛形方法。各文件可以在打包的ssh_test项目中找到.。
      

  5.   


    第六步:以上的工作还不够,我们还需要进行WEB方面的配置

    配置web.xml , struts-config.xml , action-servlet.xml
    各文件内容如下:
    -----------------------------------------------------------------------------------------------------------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <!-- Spring start-->
    <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
    </listener>
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    classpath:com/ssh/resource/applicationContext*.xml
    </param-value>
    </context-param>
    <!-- Spring end --> <!-- Struts Action Mapping-->
    <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>
    org.apache.struts.action.ActionServlet
    </servlet-class>
    <init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    <!-- session超时定义,单位为分钟 -->
    <session-config>
    <session-timeout>20</session-timeout>
    </session-config>

    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>-----------------------------------------------------------------------------------------------------------------------------------------
    struts-config.xml: 
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts-config PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
              "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
    <struts-config>
    <!-- Form配置 -->
    <form-beans>
    <form-bean name="loginForm"
    type="org.apache.struts.action.DynaActionForm">
    <form-property name="username" type="java.lang.String"></form-property>
    </form-bean>
    </form-beans>
    <action-mappings>
    <!-- HELLO -->
    <action path="/hello" type="com.ssh.action.LoginAction"
    name="loginForm">
    <forward name="ok" path="/ok.jsp"></forward>
    </action>
    </action-mappings>
    <controller>
    <set-property property="processorClass"
    value="org.springframework.web.struts.DelegatingRequestProcessor" />
    </controller>
    <plug-in
    className="org.springframework.web.struts.ContextLoaderPlugIn" />
    </struts-config>
    -----------------------------------------------------------------------------------------------------------------------------------------
    action-servlet.xml: 注意:此文件struts 1.x 必须配置,而struts 2.x 不需要配置
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
    default-autowire="byName" default-lazy-init="true">
    </beans>
    至此,我们的Spring+Struts+Hibernate集成工作完成!下面我们做测试:
    com.ssh.model  包下建立 User.java
    package com.ssh.model;import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Entity;@Entity
    @Table(name = "user")
    public class User {

    private Integer id;
    private String username;
    private String password;


    public User() {
    super();
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Integer getId() {
    return id;
    }
    public void setId(Integer id) {
    this.id = id;
    }
    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;
    }
    }com.ssh.service 包下建立 UserService.javapackage com.ssh.service;import java.util.List;import com.ssh.model.User;
    import com.ssh.util.orm.hibernate.Page;
    import com.ssh.util.orm.hibernate.SimpleHibernateTemplate;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Required;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.util.StringUtils;
    /*
     *@author onlyflag
     */
    @Transactional
    public class UserService {
    private SimpleHibernateTemplate<User,Long> userDao;
    @Required
    public void setSessionFactory(SessionFactory sessionFactory)
    {
    userDao = new SimpleHibernateTemplate<User,Long>(sessionFactory,User.class);
    }
    @Transactional(readOnly=true)
    public User getUser(Long id)
    {
    return userDao.get(id);
    }
    @Transactional(readOnly=true)
    public Page<User> getAllUser(Page<User> page)
    {
    return userDao.findAll(page);
    }
    @Transactional(readOnly=true)
    public User getUserByLoginName(String loginName)
    {
    return userDao.findUniqueByProperty("loginName",loginName);
    }

    public void saveUser(User user)
    {
    userDao.save(user);
    }

    public void deleteUser(Long id)
    {
    User user = userDao.get(id);
    userDao.delete(user);
    }

    public List<User> findByProperty(String propertyName,String value)
    {
    return userDao.findByProperty(propertyName, value);
    }
    public User findUniqueByProperty(String propertyName,String value)
    {
    return userDao.findUniqueByProperty(propertyName, value);
    }

    @Transactional
    public boolean isLoginNameUnique(String loginName,String orgLoginName)
    {
    return userDao.isUnique("loginName",loginName, orgLoginName);
    }
    public SimpleHibernateTemplate<User, Long> getUserDao() {
    return userDao;
    }
    }有了:User  和 UserService 我们就可写一个测试类来进行User 类的各种操作:
    com.ssh.test  下建立 Test.javapackage com.ssh.test;import com.ssh.model.User;
    import com.ssh.service.UserService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {
    public static void main(String[] args){
    ApplicationContext ctx=new ClassPathXmlApplicationContext("com.ssh /resource/applicationContext*.xml");
    UserService us=(UserService) ctx.getBean("userService");
    User user=new User();
    user.setPassword("123");
    user.setUsername("onlyflag");
    us.saveUser(user);
    }
    }运行Test.java  我们将成功的在数据库里插入一条数据
      

  6.   

    SSH优缺点: 优点: struts: 相对于之前的框架turbine和直接使用servlet,使用配置文件减少了代码的编写量,提高了易用性,以及对url管理的一致性,增加了表单验证、formbean等特性,提高了程序的规范性。还有一个很重要的优点是稳定性高,经过多年的使用,相比于其他的控制层框架,对稳定性高要求高的话,用struts可以保证稳定性。 hibernate:相对于jdbc,以操作对象的方式去操作数据库,程序员可以不用考虑数据库的sql语句的具体形式,直接在对象上操作,对象在数据库上的操作,交给了hibernate API去转换执行。减少了代码量,减轻了程序的耦合度,与数据库无关。可以“一次编写,到处运行”。 spring:令人称赞的是IOC、AOP和数据库事务的自动管理,集成对各种其他框架的良好支持,配置过程中高度动态化,低耦合和低侵入性,在应用中起一个小型容器(contaioner)的作用,可以管理在容器中的框架、servlet、bean,管理他们的生命周期和内存分配,具“一站式架构”的特点。 缺点: struts:action被设计成线程不安全的,配置文件众多、繁杂,代码和Servlet的耦合度比较高。 hibernate:因为使用了ORM映射,把对对象的操作转换成对数据库的操作,实际上还是转成了调用JDBC来操作数据库,比直接使用JDBC的效率低。再者就是hibernate的特性强大,如果不深入了解hibernate的特性,发挥不出hibernate的强大特性。使用好hibernate的前提是对数据库和sql的高度熟悉,否则也用不好hibernate. spring:使用了反射来管理其容器中的bean,在程序中增大了内存和运行计算的时间,当然,这和spring带来的管理方便的好处来比,可以把此缺点忽略不计。框架是可复用的设计构件,同时也规定了应用的体系结构,是实现了某应用领域通用完备功能(除去特殊应用的部分)的底层服务。使用框架的编程人员可以在一个通用功能已经实现的基础上开始具体的系统开发。用更多的精力去关注业务的东西struts1.x最大的问题是难于测试,以及和spring的集成方式,他自带的那些个插件机制是出了名的BUG多,而且一定要继承他的Action,formbean也要继承...侵入非常严重,action亦不是线程安全,使用ajax不太方便,视图本身只支持JSP,通过plugin机制扩展...很不爽 Hibernate 有点是ORM,面向对象方式开放数据库,有OO的思想即可各种操作,避免了各种开放效率高之后通过注解,多种底层事务管理机制以及一些代码生成工具,同时也兼容了JDBC,基本上JDBC可以做,Hibernate就可以做,而且方便的提供了缓存管理机制,最方便的还是通过结合Spring进行声明式的事务管理了。缺点可能是设计太过于复杂,学习曲线比较堵,对于过于复杂的SQL显得力不从心 Spring 的IOC容器是一大亮点,可以通过一个或者多个配置文件方便管理bean的生命周期,通过DI在应用程序上下文启动时注入依赖关系 低侵入的设计,AOP则主要用来事务管理和日志,提供了一个设计良好的MVC框架与自身集成非常良好,另外还有测试 webflow等等等等 。总之Spring海纳百川,从持久层到表现层甚至webservice标准提供了支持和对多种框架的封装,使得API更加统一和易用,缺点还是JAVA框架的通病----大项目时,即使拆分处理,配置文件仍然过于庞大不易于管理如果action是singleton并且定义了可变的实例变量(如某个状态标识),则线程不安全; 这不影响你用spring ioc,因为注入的东西往往也都是datasource、service、dao等,它们都是初始化以后就不会再被改变了,并且它们本身也是可以做到线程安全的。 至于它们如何保证线程安全,道理同上。struts2 优点:mvc的action,view层分离,c使用配置文件控制方便,2比1的线程安全,而且不需要使用接口,可以完全脱离容易缺点:插件结构多而且复杂,配置起来麻烦.自定义标签需要改写结果集,也就是要改造框架,巨麻烦.无论是使用tag或freeerspring优点,aop的切面开发给事务编程带来了非常大的实惠,配置事务容易缺点,过度编程,太重细节,配置方式太多样hiber优点:把数据转化弄成配置方式,为object关系,到entity的er关系转换带来优势,提供了应用到数据的完整映射. 间接带来soa发展,cacha结构带来实质上的好处,带来实质上的数据访问优化缺点.还是配置.hql已经标准化了struts第一个优点应该是实现了MVC。 并且针对线程安全的问题,struts1会有,因为它默认是采用单例,struts2就不是·一个请求一个实例。 struts2对于表现层的支持已经很不错了。并且做的很全面 2.spring的核心就是IOC和管理。 还有一个更重要的原因就是spring因为有大团队支持的原因所以对于其他开源框架的支持快速并且优秀。 对于spring的缺点目前我觉得是太过于臃肿了,当然这个也不能避免了。至于lz你说的他利用反射来做,我只能说,没有任何一个框架不会用到反射,因为框架是用一致的形式去解决未知的代码,只能用反射做。 3.hibernate的优点·我仅仅认为它是第一个ORM的框架,在MVC的切分和JDBC的封装上做的靠前。 对于他的HQL和他的缓存我并不认同 HQL会导致你根本无法执行你真正想执行的sql,调错或者自己查看代码的时候十分困难,这种hql设计已经起到干扰作用了,当然平时我们写一个类似于select * from user where username=‘jason’的这种sql是无所谓的,但是在大型应用中sql是复杂的,多变的,所以对于这一点iBATIS做的很好,不从根本上去干扰sql,但是又起到管理和切分的作用 hibernate的缓存并不是高效的,在一般的开发中对于缓存都会有专门的缓存框架,如果使用了hibernate,就会太过于依赖它的缓存,没有缓存他的效率不会太高,所以一般的企业开发不采用hibernate线程安全的问题本来就应该交给容器去做,一个真正高速的应用程序应该是Prototype调用,而不应该老和spring默认的singleton一样,因为singleton必然带来多用户使用时的同步问题,所以一般我都不会选择singleton,确实不得已要使用,也会使用部分同步,或者使用原子操作避免同步的发生 举个简单的例:HashMap和HashTable内部实现一样,唯一不同的就是同步,后者是同步的,但是前者效率是后则的2倍以上