废话不多说,这里我就ssh整合的基础配置进行一下简单的分析(数据库是oracle11g,web容器tomcat7,jdk版本java7,eclipse版本indigo,并且劝诫大家暂时不要使用eclipse juno虽然它增加了预览等等功能,但是由于优化问题,对于jsp页面和xml页面基本卡到不行,请大家等待更新)(主要是分析每个配置的作用。)
首先是基本的包结构,我做了一个简单的登录程序为例子。
lib中的jar包搭配这里就不讲了,我自己也不能完全弄清楚,只知道基本的几个包的作用,如果误导大家就是过错了。
首先我搭建项目的做法是从model做起。因为MVC中有这么一句话:一个model对应对个视图。并且,如果能了解数据的流向,那么很容易把握整个程序的流程。(使用struts1为核心的框架,这一点更加的明显。)
这个程序中只有一个model就是User。所有的getter和setter我在此都省略掉。
User.java
public class User {
// 标识属性
private Integer id;
// 用户名
private String username;
// 密码
private String password;
}
在这里如果我们使用Xml配置hibernate数据映射
User.hbm.xml
<hibernate-mapping>
<!-- 这里的name是POJO所在的位置,table是数据库中的表名 -->
<class name="com.ssh.demo.bean.User" table="user_gyb">
<!-- 这里name是User中的id属性 -->
<id name="id" type="java.lang.Integer">
<!-- column就是列名,也就是数据表中的列名 -->
<column name="ID"/>
<!-- generator在此是“生成”的意思,也就是这个id是如何生成,因为我在数据库中将它设为主键,所以我是根据sequence生成的,根据使用的数据库不同,大家自行设置 -->
<generator class="sequence"/>
</id>
<!-- 因为这个文件我是使用工具生成的,所以它会有generated和lazy-->
<!-- generated设置该属性的数据列的值是如何生成,可以设置为never(从不自动生成),insert(在insert时生成,但是update不会重新生成),always(总是重新生成) -->
<!-- lazy指定该属性第一个被访问时,是否启动延迟加载,默认为false,如果是组件或者是集合,设置为true可以提高效率 -->
<property generated="never" lazy="false"
name="username" type="java.lang.String">
<column name="username"/>
</property>
<property generated="never" lazy="false" name="password" type="java.lang.String">
<column name="password"/>
</property>
</class>
</hibernate-mapping>
在完成了model之后,然后再把hibernate交给spring来管理,这个过程中我们至少需要完成三件事:
1.配置数据库连接;
2.定义Hibernate的SessionFactory;
3.注入bean。
在application中添加如下代码
<!-- 定义数据源Bean,使用C3P0数据源实现 --> <!-- 设置连接数据库的驱动、URL、用户名、密码、连接池最大连接数、 最小连接数、初始连接数等参数 --> <!-- 这里我使用了P标签,那么在<beans>中应该加入xmlns:p="http://www.springframework.org/schema/p"如果不实用"p:"的形式,这里可以替换为<property name="" value=""/>的形式 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:driverClass="oracle.jdbc.driver.OracleDriver" p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:ORCL" p:user="scott" p:password="123" p:maxPoolSize="40" p:minPoolSize="1" p:initialPoolSize="1" p:maxIdleTime="20" /> <!-- 定义Hibernate的SessionFactory --> <!-- 依赖注入数据源,注入正是上面定义的dataSource --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" p:dataSource-ref="dataSource"> <!-- mappingResouces属性用来列出全部映射文件 --> <!-- 如果使用Annotation配置,那么name改成annotatedClasses --> <!-- 如果使用properties配置,那么name改成hibernateProperties --> <property name="mappingResources"> <!-- 以下用来列出Hibernate映射文件 --> <list> <!-- Annotation <value>com.ssh.demo.bean.User</value> --> <!-- properties <value>properties文件位置</value> --> <value>com/ssh/demo/bean/User.hbm.xml</value> </list> </property> <!-- 定义Hibernate的SessionFactory的属性 --> <property name="hibernateProperties"> <!-- 指定数据库方言、是否自动建表 是否生成SQL语句等 --> <value> hibernate.dialect=org.hibernate.dialect.OracleDialect hibernate.show_sql=true hibernate.hbm2ddl.auto=update hibernate.current_session_context_class=thread </value> </property> </bean> <!-- 注入bean User --> <bean id="user" class="com.ssh.demo.bean.User"></bean>
完成这个部分之后,我们就该考虑控制层和视图了。regist.jsp
但是regist.jsp在WEB-INF中,是无法被直接访问的,所以在欢迎页面应该给一个路径请求到这个页面。如果需要直接请求,拿到WEB-INF外面来。这里我在index中提供了一个链接请求到这个页面。<s:a action="newUser.action" namespace="index">注册</s:a><s:form action="regist.action" namespace="loginModule" method="post" id="form_regist"> <s:textfield name="user.username" key="username" required="true"></s:textfield> <s:password name="user.password" key="password" required="true"></s:password> <s:submit name="submit_regist" key="regist"></s:submit> </s:form>
struts.xml中映射路径:
messageSource.properties<struts> <constant name="struts.devMode" value="true"></constant> <constant name="struts.custom.i18n.resources" value="messageSource"></constant> <package name="loginModule" extends="struts-default"> <action name="regist" class="registAction"> <result name="error">/WEB-INF/jsp/loginModule/error.jsp</result> <result name="success">/WEB-INF/jsp/loginModule/success.jsp</result> </action> </package> <package name="index" extends="struts-default"> <action name="newUser"> <result>/WEB-INF/jsp/loginModule/regist.jsp</result> </action> </package> </struts>
处理User注册的服务UserService.javausername=\u7528\u6237\u540D password=\u5BC6\u7801 welcome=\u9996\u9875 errorPage=\u9519\u8BEF\u9875\u9762 successPage=\u6210\u529F\u9875\u9762
RegistAction.javapublic class UserService { private SessionFactory sessionFactory = null; public User save(User user){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); session.save(user); session.getTransaction().commit(); return user; } }
由于这些属性都需要通过spring来注入public class RegistAction extends ActionSupport { private static final long serialVersionUID = 5305314154058136201L; private UserService service; private User user; public String execute() { if (service.save(user) != null) { return SUCCESS; } else { return ERROR; } } }
在ApplicationContext.xml中添加
由于我使用了log4j的日志功能,所以还需要配置log4j.properties,这里不再具体说了。error.jsp和success.jsp可以根据个人想法输出想要的信息。<!-- 注入bean UserService --> <bean id="userService" class="com.ssh.demo.service.UserService"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 注入action RegistAction --> <bean id="registAction" class="com.ssh.demo.action.RegistAction"> <property name="user" ref="user"></property> <property name="service" ref="userService"></property> </bean>
到此一个简单的ssh框架就配置完成了。