Struts和Spring的新版本变动很大,搭建开发环境时配置文件的内容也随着改变了,前段时间为了搭建开发环境费了不小劲,现在发布出来希望能给新手一点帮助。网上关于ssh开发环境的说明都是基于Struts1.2和Spring2的,而且都是以Eclipse为IDE,当然IDE对开发环境的搭建没有明显的影响,但是在NetBeans下搭建ssh开发环境还是快捷得多的。
NetBeans6.1自带了Spring2.5,Struts1.2,没有Hibernate支持,所以为了搭建Struts2.0+Spring2.5+Hibernate3的开发环境,必需下载Struts2.0和Hibernate3的NetBeans插件,这都是很容易找到的,确实找不到就留下邮箱吧。在NetBeans里安装插件的方法: 工具-插件- 已下载-添加插件-安装。
好了,插件安装完毕,重启NetBeans后新建Web项目,修改项目名之后一路默认走下去,在框架选择那一步把Struts2.0、Spring2.5和Hibernate勾上,完成,这样就创建了一个具有ssh支持的Web项目。但是,要整合使用ssh还得进入最麻烦的一步:修改配置文件。下面就以一例子来说明修改配置文件的过程。
新建了上面的项目后,NetBeans自动为你生成了一个HelloWorld的Struts例子,就在这个例子上面改吧。
在源包-缺省包里有一个Struts配置文件example.xml,内容如下
1
<
struts
>
2 < package name ="example" namespace ="/example" extends ="struts-default" >
3 < action name ="HelloWorld" class ="example.HelloWorld" >
4 < result > /example/HelloWorld.jsp </ result >
5 </ action >
6 </ package >
7 </ struts >
这只是一个简单的action配置节,这个文件被struts.xml 包含(include),所以服务器能找到它。
2 < package name ="example" namespace ="/example" extends ="struts-default" >
3 < action name ="HelloWorld" class ="example.HelloWorld" >
4 < result > /example/HelloWorld.jsp </ result >
5 </ action >
6 </ package >
7 </ struts >
接下来是最关键的配置--Spring配置文件applicationContext.xml,以下内容都在<Beans>配置节里添加:
1。首先添加数据源Bean
1
<
bean
id
="dataSource"
class
="org.springframework.jdbc.datasource.DriverManagerDataSource"
>
2 <!-- 指定连接数据库的驱动 -->
3 < property name ="driverClassName" value ="com.mysql.jdbc.Driver" />
4 <!-- 指定连接数据库的URL -->
5 < property name ="url" value ="jdbc:mysql://localhost:3306/sunsite" />
6 <!-- 指定连接数据库的用户名 -->
7 < property name ="username" value ="root" />
8 <!-- 指定连接数据库的密码 -->
9 < property name ="password" value ="123" />
10 </ bean >
添加mysql驱动包这些与主题不靠紧的话就不多说了,注意上面这段配置内容要根据你的实际情况配置url、username和password。
2 <!-- 指定连接数据库的驱动 -->
3 < property name ="driverClassName" value ="com.mysql.jdbc.Driver" />
4 <!-- 指定连接数据库的URL -->
5 < property name ="url" value ="jdbc:mysql://localhost:3306/sunsite" />
6 <!-- 指定连接数据库的用户名 -->
7 < property name ="username" value ="root" />
8 <!-- 指定连接数据库的密码 -->
9 < property name ="password" value ="123" />
10 </ bean >
2。让Spring管理Hibernate
1
<!--
管理Hibernate
-->
2 < bean id ="sessionFactory" class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
3 < property name ="dataSource" ref ="dataSource" >
4 </ property >
5 < property name ="mappingResources" >
6 </ property >
7 < property name ="hibernateProperties" >
8 < value >
9 hibernate.dialect=org.hibernate.dialect.MySQLDialect
10 </ value >
11 </ property >
12 </ bean >
这样就将SSH整合了。
2 < bean id ="sessionFactory" class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
3 < property name ="dataSource" ref ="dataSource" >
4 </ property >
5 < property name ="mappingResources" >
6 </ property >
7 < property name ="hibernateProperties" >
8 < value >
9 hibernate.dialect=org.hibernate.dialect.MySQLDialect
10 </ value >
11 </ property >
12 </ bean >
在源包新建类User,里面只有一个字段user
1
public
class
User
{
2 private String name;
3 public String getName() {
4 return name;
5 }
6 public void setName(String name) {
7 this.name = name;
8 }
9}
2 private String name;
3 public String getName() {
4 return name;
5 }
6 public void setName(String name) {
7 this.name = name;
8 }
9}
然后修改Action类HelloWorld.java,它继承于com.opensymphony.xwork2.ActionSupport,继承这个类的好处是你只需要覆盖一个简单的execute()并通过返回字符串来标识跳转到的页面。
在HelloWorld.java添加私有字段user和对应的set方法(可在添加字段后用Netbeans的 重构-封装字段 生成set方法)
添加message字段和get方法(为什么这里是get?因为message是为了后面让jsp读取的,而user是为了让Spring写入的)
1
public
class
HelloWorld
extends
ActionSupport
{
2
3 private User user;
4 public void setUser(User user) {
5 this.user = user;
6 }
7 private String message;
8 public String getMessage() {
9 return message;
10 }
11
12 @Override
13 public String execute() throws Exception {
14 this.message = user.getName();
15 return SUCCESS;
16 }
17}
然后在applicationContext.xml里为User实体和HelloWorld Action增加配置节
2
3 private User user;
4 public void setUser(User user) {
5 this.user = user;
6 }
7 private String message;
8 public String getMessage() {
9 return message;
10 }
11
12 @Override
13 public String execute() throws Exception {
14 this.message = user.getName();
15 return SUCCESS;
16 }
17}
1
<
bean
name
="user"
class
="sunsite.po.User"
>
2 < property name ="name" value ="Ruby" ></ property >
3 </ bean >
4 < bean id ="helloAction" class ="example.HelloWorld" >
5 < property name ="user" ref ="user" />
6 </ bean >
2 < property name ="name" value ="Ruby" ></ property >
3 </ bean >
4 < bean id ="helloAction" class ="example.HelloWorld" >
5 < property name ="user" ref ="user" />
6 </ bean >
这样,实体和Action就在Spring的管理之下了,于是可以在example.xml这样配置Action(修改自动生成的配置文件如下)
1
<
struts
>
2 < package name ="example" namespace ="/example" extends ="struts-default" >
3 < action name ="HelloWorld" class ="helloAction" >
4 < result > /example/HelloWorld.jsp </ result >
5 </ action >
6 </ package >
7 </ struts >
这里class的值就是前面Spring配置文件里定义的Action Bean,每当有请求发送到HelloWorld时,就会交由这个Bean处理。
2 < package name ="example" namespace ="/example" extends ="struts-default" >
3 < action name ="HelloWorld" class ="helloAction" >
4 < result > /example/HelloWorld.jsp </ result >
5 </ action >
6 </ package >
7 </ struts >
修改HelloWorld.jsp的内容如下
1
<%
@ page contentType="text/html; charset=UTF-8"
%>
2 <% @ taglib prefix="s" uri="/struts-tags" %>
3 < html >
4 < head >
5 < title ></ title >
6 </ head >
7 < body >
8 < h2 >< s:property value ="message" /></ h2 >
9 < ul >
10 < li >
11 < s:url id ="url" action ="HelloWorld" >
12 </ s:url >
13 < s:a href ="%{url}" > 获得User的名字 </ s:a >
14 </ li >
15 </ ul >
16 </ body >
17 </ html >
运行这个页面,点击“获得User的名字”超链接就能看见“Ruby”了,这是你在Spring配置文件里定义的。到这里Struts和Spring整合的例子就完成了,如果要把Hibernate部分也包含进去,则要增加一个dao类用作数据存取。
2 <% @ taglib prefix="s" uri="/struts-tags" %>
3 < html >
4 < head >
5 < title ></ title >
6 </ head >
7 < body >
8 < h2 >< s:property value ="message" /></ h2 >
9 < ul >
10 < li >
11 < s:url id ="url" action ="HelloWorld" >
12 </ s:url >
13 < s:a href ="%{url}" > 获得User的名字 </ s:a >
14 </ li >
15 </ ul >
16 </ body >
17 </ html >
首先在源包增加一个Hibernate映射文件user.hbm.xml(可用Netbeans的向导辅助)
1
<?
xml version="1.0" encoding="UTF-8"
?>
2 <! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
3 < hibernate-mapping >
4 < class dynamic-insert ="false" dynamic-update ="false" mutable ="true" name ="User" optimistic-lock ="version" polymorphism ="implicit" select-before-update ="false" table ="user" >
5 < property column ="userName" name ="name" type ="string" />
6 </ class >
7 </ hibernate-mapping >
(这里假设你已经建立mysql数据和user表,里面有userName这个字段)
2 <! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
3 < hibernate-mapping >
4 < class dynamic-insert ="false" dynamic-update ="false" mutable ="true" name ="User" optimistic-lock ="version" polymorphism ="implicit" select-before-update ="false" table ="user" >
5 < property column ="userName" name ="name" type ="string" />
6 </ class >
7 </ hibernate-mapping >
在Spring配置文件找到刚才的管理Hibernate的配置节,如下方法把Hibernate映射文件添加进去
1
<!--
管理Hibernate
-->
2 < bean id ="sessionFactory" class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
3 < property name ="dataSource" ref ="dataSource" >
4 </ property >
5 < property name ="mappingResources" >
6 < list >
7 < value > user.hbm.xml </ value >
8 </ list >
9 </ property >
10 < property name ="hibernateProperties" >
11 < value >
12 hibernate.dialect=org.hibernate.dialect.MySQLDialect
13 </ value >
14 </ property >
15 </ bean >
2 < bean id ="sessionFactory" class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
3 < property name ="dataSource" ref ="dataSource" >
4 </ property >
5 < property name ="mappingResources" >
6 < list >
7 < value > user.hbm.xml </ value >
8 </ list >
9 </ property >
10 < property name ="hibernateProperties" >
11 < value >
12 hibernate.dialect=org.hibernate.dialect.MySQLDialect
13 </ value >
14 </ property >
15 </ bean >
然后在源包添加类UserDao.java
1
import
org.springframework.orm.hibernate3.support.HibernateDaoSupport;
2
3 public class UserDao extends HibernateDaoSupport {
4 public void save(User user) throws Exception
5 {
6 try
7 {
8 getHibernateTemplate().save(user);
9 }
10 catch(Exception err)
11 {
12 throw err;
13 }
14 }
15
16 public User getUser(String userName) {
17 return (User)getHibernateTemplate().find("from User as u where u.name = ?", userName).get(0);
18 }
19}
(必须继承于HibernateDaoSupport ,否则无法获取Hibernate上下文)
2
3 public class UserDao extends HibernateDaoSupport {
4 public void save(User user) throws Exception
5 {
6 try
7 {
8 getHibernateTemplate().save(user);
9 }
10 catch(Exception err)
11 {
12 throw err;
13 }
14 }
15
16 public User getUser(String userName) {
17 return (User)getHibernateTemplate().find("from User as u where u.name = ?", userName).get(0);
18 }
19}
代码很容易明白,不多说了,然后在applicationContext.xml增加如下配置节
1
<
bean
id
="userDao"
class
="UserDao"
>
2 < property name ="sessionFactory" >
3 < ref bean ="sessionFactory" ></ ref >
4 </ property >
5 </ bean >
这里之所以要设置sessionFactory属性,是因为这个dao类继承了HibernateDaoSupport ,dao类正式通过这获得Hibernate支持的。
2 < property name ="sessionFactory" >
3 < ref bean ="sessionFactory" ></ ref >
4 </ property >
5 </ bean >
然后就要修改HelloWorld.java,给它添加一个UserDao私有字段和set方法,删掉原来的user字段。
1
public
class
HelloWorld
extends
ActionSupport
{
2
3 private UserDao userDao;
4 public void setUserDao(UserDao userDao) {
5 this.userDao = userDao;
6 }
7
8 @Override
9 public String execute() throws Exception {
10 User user = userDao.getUser("ruby");
11 this.message = user.getName();
12 return SUCCESS;
13 }
14}
2
3 private UserDao userDao;
4 public void setUserDao(UserDao userDao) {
5 this.userDao = userDao;
6 }
7
8 @Override
9 public String execute() throws Exception {
10 User user = userDao.getUser("ruby");
11 this.message = user.getName();
12 return SUCCESS;
13 }
14}