经过了一个月的理解,尝试,纠结,痛苦,终于通过自己理解编出我的第一个SSH整合应用。
其实应用很简单,在web页面通过ID查找用户名。
其中比较难理解是Spring的bean注入。其实Struts和Hibernate都是比较死的东西。
Struts处理web的请求和相应,如struts.xml所示
<struts> <package name="default" extends="struts-default" namespace="/"> <!-- extend继承struts一些默认的拦截器,这个不能不写,写错了也不行,我在里调了很久,很是郁闷。namespace命名空间其实也很重要,初学者也要注意 --> <action name="searchAction" class="SearchAction"> <!--这里到了关键地方,此class非彼class。如果不用Spring管理,class可以写成“action.SearchAction”。 但是现在用Spring管理,此class其实是一个bean的id --> <result name="success">categoryinfo.jsp</result> </action> </package> </struts>
我理解SSH整合框架前前后后用了三个星期,可能买的书不好,学起来很麻烦。
个人觉得,最难理解是spring吧,因为spring不像struts,hibernate那样有具体的功能,它类似一个项目管理工具。我是从spring mvc 开始入手学习的,理解比较容易点。
配完了struts.xml 就要配置 applicationContext.xml
applicationContext.xml配置文件中其实就是一堆的<bean>,每个<bean>都对应一个java类
<bean>下的<property>元素就是java类中的属性,java类会提供set方法,spring正是用这个关系来管理的
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 上面三个bean 是spring提供的hibernate管理工具,使用时记住一定要导入spring-orm的包,这个包中提供了对hibernate的支持。 --> <!-- property 对应类中的属性,value 相当于在向类中的setter方法注值,注过值后的类就不是一个空的类了,就是一个有属性的类 --> <bean id="categoryDAO" class="dao.impl.CategoryDAOImpl"> <property name="template" ref="hibernateTemplate"></property> </bean> <!-- 此处bean的被struts.xml中的action调用,调用的同时向action.SearchAction中注入categoryDao注值 --> <bean id="SearchAction" class="action.SearchAction" scope="prototype"> <property name="categoryDAO" ref="categoryDAO"></property> </bean>
最核心的依然是web.xml文件,个人觉得配置web.xml文件的方法应该有很多种,作为初学者这种应该比较好理解。
<listener>和<context-param>的作用是什么我也解释不清楚,暂时这样配吧。应该是项目启动自动加载配置文件。
这里用struts配置文件的形式接受请求。符合请求条件的会被指派到指定的action中执行java代码。
web.xml
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/applicationContext.xml</param-value> </context-param> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
action类,提供一个搜索功能,即根据ID搜索用户。
public class SearchAction extends ActionSupport { private CategoryDAO categoryDAO; public void setCategoryDAO(CategoryDAO categoryDAO) { this.categoryDAO = categoryDAO; } @Override public String execute() throws Exception { Integer id = Integer.valueOf(ServletActionContext.getRequest().getParameter("id")); Category category = categoryDAO.getById(id); ServletActionContext.getRequest().setAttribute("category", category); return SUCCESS; } }
hibernate部分我没有对象映射文件,即**.hbm.xml,而是用了注解的方式配置。但是依然用了hibernate.cfg.xml,其实该文件也可以不用写,可以写在applicationConfig.xml中。
因为在applicationConfig.xml做了这样的配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> </bean>
所以spring配置会自动到classpath下找hibernate配置文件。