废话不多说,这里我就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
<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>
但是regist.jsp在WEB-INF中,是无法被直接访问的,所以在欢迎页面应该给一个路径请求到这个页面。如果需要直接请求,拿到WEB-INF外面来。这里我在index中提供了一个链接请求到这个页面。<s:a action="newUser.action" namespace="index">注册</s:a>
struts.xml中映射路径:
<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>
messageSource.properties
username=\u7528\u6237\u540D
password=\u5BC6\u7801
welcome=\u9996\u9875
errorPage=\u9519\u8BEF\u9875\u9762
successPage=\u6210\u529F\u9875\u9762
处理User注册的服务UserService.java
public 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;
}
}
RegistAction.java
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;
}
}
}
由于这些属性都需要通过spring来注入
在ApplicationContext.xml中添加
<!-- 注入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>
由于我使用了log4j的日志功能,所以还需要配置log4j.properties,这里不再具体说了。error.jsp和success.jsp可以根据个人想法输出想要的信息。
到此一个简单的ssh框架就配置完成了。