struts-2.3.1+spring-framework-3.2.2+hibernate-4.1.1整合历程<第一部分>(详解)

    从事JavaEE工作已经许久了,在这个期间学习了很多的知识,也熟练了很多之前总是语罢于嘴的技术,在这个过程中收获着很多的东西,但是由于现在工作的局限性,很多之前学止于书的技术都渐渐忘却,在整理这篇文章的时候,一则出于对知识的回顾,因此可以作为刚学习SSH搭建的程序员参考资料,二则在搭建框架之余,尽量去表达出我对整个过程中可能遇到的问题,并如何去解决问题的思路和方法。如果在阅读本文时候遇到了错误或者有着自己独到的见解,还请提出来,在此感激不尽。 

    现在JavaEE最热的框架也就属SSH了,但是每种技术所起的作用是什么我仅仅做简单介绍,最终的理解还是靠整个过程的搭建实践才可以明白。(本文搭建完成的SSH代码我已经上传到CSDN资源,有需要的读者可以通过http://download.csdn.net/detail/songdeitao/6730819这个链接进行下载)

  • Struts主要是MVC思想的具体实现,
  • Spring利用它的IOC和AOP来处理控制业务,
  • Hibernate是操作数据库的一种框架,它简化了直接使用jdbc api的代码操作数据库的复杂性和冗余性。

    下面便开始整个SSH框架的搭建过程。

   本文选取struts-2.3.1,spring-framework-3.2.2,hibernate-4.1.1的搭建过程,首先这几个版本都是比较新的版本,也是通过测试,比较通用稳定的版本。

 

框架名称

版本

最后发布时间

下载链接

Struts2

2.3.1

2011-12-13

http://archive.apache.org/dist/struts/binaries/


Hibernate

4.1.1

2012-03-08

http://sourceforge.net/projects/hibernate/files/hibernate4/4.1.1.Final/hibernate-release-4.1.1.Final.zip/download


Spring

3.2.2

2013-03-14

http://www.oschina.net/news/38595/spring-3-2-2


    下载完成之后进行解压缩,如图1所示:

                                                                       图1

环境搭建:MyEclipse8.5+JDK1.6+Apache-tomcat-6.0.33

    在整个搭建过程中,我尽量一步步做演示,从Struts开始,然后到Hibernate的整合,然后在整合Spring,整个过程中会遇到常见的异常,然后进行解决,并且总结出注意事项。

    首先是最后搭建成功后的目录结构(项目名称为SSHDemo,下文为SSH,这里仅仅呈现的是目录结构,下文将一步步搭建成这样的结果),如图2所示:


               图2

             下面开始创建项目SSH,打开MyEclipse,File—>New—>Web Project,输入项目名称SSH,如图3所示:


                                      图3

    点击Finish完成项目创建,如图4所示:


             图4

     紧接着需要完成Struts框架的引入,搭建成一个Struts项目,打开解压完成后的struts-2.3.1目录struts-2.3.1\apps\struts2-blank.war,解压缩struts2-blank.war到struts2-blank目录中,

    步骤一:进入到struts-2.3.1\apps\struts2-blank\WEB-INF目录下,将其中web.xml文件中的内容全部复制到项目目录结构中web.xml文件中并且替换掉原来的所有内容,修改后的文件内容如下web.xml所示:

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  5.   
  6.     <!-- Struts2过滤器,将所有的请求进行拦截并进行处理 -->  
  7.     <filter>  
  8.         <filter-name>struts2</filter-name>  
  9.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  10.     </filter>  
  11.   
  12.     <filter-mapping>  
  13.         <filter-name>struts2</filter-name>  
  14.         <url-pattern>/*</url-pattern>  
  15.     </filter-mapping>  
  16.   
  17.     <welcome-file-list>  
  18.         <welcome-file>index.jsp</welcome-file>  
  19.     </welcome-file-list>  
  20.   
  21. </web-app>  

    步骤二:将struts-2.3.1\apps\struts2-blank\WEB-INF\lib文件夹中的所有jar包添加到web项目目录结构lib中,添加后如图5所示:


             图5

    其中jar包以及其作用如下讲解,

jar(.jar)

作用

asm-3.3

操作java字节码的类库

asm-commons-3.3

提供了基于事件的表现形式

asm-tree-3.3

提供了基于对象的表现形式

commons-fileupload-1.2.2

Struts 文件的上传和下载功能的实现

commons-io-2.0.1

commons项目(commons项目就是java中一些常用的公共的组件)的io子项目,是处理异常的

commons-lang-2.5

java.lang提供扩展

freemarker-2.3.18

支持freemarkerstruts2UI标签的模板使用FreeMarker编写)的,在webwork中也有

javassist-3.11.0.GA

一个开源的分析、编辑和创建Java字节码的类库(hibernate中也需要,引入其中一个即可)

ognl-3.0.3

支持ognl语言(对象图导航语言(Object Graph Navigation  Language))的,struts2框架通过其读写对象的属性,webwork也支持ognl语言

struts2-core-2.3.1

struts2的核心jar

xwork-core-2.3.1

xwork的核心jar包,由于struts2webwork的升级版本,所以必定对其有所依赖(struts2在其基础上构建)


    步骤三:将路径struts-2.3.1\apps\struts2-blank\WEB-INF\src\java下的struts.xml文件拷贝到项目总src下,修改后的文件内容如下所示:

struts.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <!--  
  8.         动态方法调用,如果为true,开发时候可以使用,代表可以通过 url地址动态调用执行相应的方法,不推荐,如果为false,  
  9.         不可以动态方法调用,但可以通过进行通配符的设置进行动态方法调用,推荐为false  
  10.     -->  
  11.     <constant name="struts.enable.DynamicMethodInvocation" value="true" />  
  12.     <!-- 开发者模式,为true时候,如果改动配置文件不需要重启服务器就可以自动更新,开发时候建议开启 -->  
  13.     <constant name="struts.devMode" value="false" />  
  14.   
  15.     <!-- name代指包名,namespace是命名空间,是在url中照写的部分 -->  
  16.     <package name="user" namespace="/" extends="struts-default">  
  17.         <!-- name指代url中写在namespace中的部分,class指代将执行的action -->  
  18.         <action name="user" class="com.steven.action.UserAction">  
  19.             <!-- 如果方法返回success,则执行以下部分 -->  
  20.             <result name="success">  
  21.                 WEB-INF/jsp/welcome.jsp  
  22.             </result>  
  23.         </action>  
  24.     </package>  
  25. </struts>  
紧接着按照配置文件中的class建立相应的包和类, 建立过后的目录结构如图 6 所示


                    图6
此时,文件index.jsp,welcome.jsp,UserAction.java,User.java内容分别如下:

index.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>SSH index</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!-- 
  19.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  20.     -->  
  21.   </head>  
  22.     
  23.   <body>  
  24.     <h2>这是一个SSH项目,请点击<a href="user">这里</a> 显示用户列表。</h2>  
  25.   </body>  
  26. </html>  
welcome.jsp
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3.     String path = request.getContextPath();  
  4.     String basePath = request.getScheme() + "://"  
  5.             + request.getServerName() + ":" + request.getServerPort()  
  6.             + path + "/";  
  7. %>  
  8. <!-- 引入Struts2的标签库 -->  
  9. <%@taglib prefix="s" uri="/struts-tags"%>  
  10. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  11. <html>  
  12. <head>  
  13.     <base href="<%=basePath%>">  
  14.   
  15.     <title>welcome</title>  
  16.   
  17.     <meta http-equiv="pragma" content="no-cache">  
  18.     <meta http-equiv="cache-control" content="no-cache">  
  19.     <meta http-equiv="expires" content="0">  
  20.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  21.     <meta http-equiv="description" content="This is my page">  
  22.     <!-- 
  23. <link rel="stylesheet" type="text/css" href="styles.css"> 
  24. -->  
  25.   
  26. </head>  
  27.   
  28. <body>  
  29.     <table border="1" cellpadding="0" cellspacing="0" width="600"  
  30.         style="text-align: center;">  
  31.         <tr>  
  32.             <th>姓名</th>  
  33.             <th>年龄</th>  
  34.             <th>生日</th>  
  35.             <th>是否是VIP</th>  
  36.         </tr>  
  37.         <!-- OGNL表达式的输出 -->  
  38.         <s:iterator value="#request.userList" var="user">  
  39.             <tr>  
  40.                 <td>  
  41.                     <!-- EL表达式输出 -->  
  42.                     ${user.userName }  
  43.                 </td>  
  44.                 <td>${user.age }</td>  
  45.                 <td>  
  46.                     <!-- struts标签日期格式标签 -->  
  47.                     <s:date name="#user.birthday" format="yyyy-MM-dd" />  
  48.                 </td>  
  49.                 <td>  
  50.                     <!-- struts2中条件输出 -->  
  51.                     <s:if test="#user.isVip == true">  
  52.                         是VIP  
  53.                     </s:if>  
  54.                     <s:else>  
  55.                         不是VIP  
  56.                     </s:else>  
  57.                 </td>  
  58.             </tr>  
  59.         </s:iterator>  
  60.     </table>  
  61. </body>  
  62. </html>  

UserAction.java

  1. package com.steven.action;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Date;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.apache.struts2.interceptor.RequestAware;  
  9.   
  10. import com.opensymphony.xwork2.ActionSupport;  
  11. import com.steven.entity.User;  
  12.   
  13. /** 
  14.  * 通过继承ActionSupport获得Struts2的已有功能, 
  15.  * 通过实现RequestAware获取request(这种方式常用,还有其他三种方式,这里不再赘述) 
  16.  * 四种获取request方式请参照http://blog.csdn.net/ms2146/article/details/5406004 
  17.  *  
  18.  * @author Steven 
  19.  *  
  20.  */  
  21. public class UserAction extends ActionSupport implements RequestAware {  
  22.     private static final long serialVersionUID = 1L;  
  23.     private Map<String, Object> request;  
  24.   
  25.     @Override  
  26.     public String execute() throws Exception {  
  27.         // 创建一个用户集合  
  28.         List<User> userList = new ArrayList<User>();  
  29.         // 创建用户并添加到用户集合中  
  30.         userList.add(new User("Steven"1new Date(), true));  
  31.         userList.add(new User("Lily"1new Date(), false));  
  32.         userList.add(new User("Tom"1new Date(), false));  
  33.   
  34.         // 将用户存储到ActionContext中(可以通过ognl表达式获取)  
  35.         request.put("userList", userList);  
  36.         return SUCCESS;  
  37.     }  
  38.   
  39.     public void setRequest(Map<String, Object> request) {  
  40.         this.request = request;  
  41.     }  
  42.   
  43. }  
User.java
  1. package com.steven.entity;  
  2.   
  3. import java.util.Date;  
  4.   
  5. /** 
  6.  * 实体类 
  7.  *  
  8.  * @author Steven 
  9.  *  
  10.  */  
  11. public class User {  
  12.     // 用户Id  
  13.     private int userId;  
  14.     // 用户名  
  15.     private String userName;  
  16.     // 用户年龄  
  17.     private int age;  
  18.     // 用户生日  
  19.     private Date birthday;  
  20.     // 用户是否是会员 true:是 false:不是  
  21.     private boolean isVip;  
  22.   
  23.     public User() {  
  24.     }  
  25.   
  26.     // 有参构造  
  27.     public User(String userName, int age, Date birthday, boolean isVip) {  
  28.         this.userName = userName;  
  29.         this.age = age;  
  30.         this.birthday = birthday;  
  31.         this.isVip = isVip;  
  32.     }  
  33.   
  34.     public int getUserId() {  
  35.         return userId;  
  36.     }  
  37.   
  38.     public void setUserId(int userId) {  
  39.         this.userId = userId;  
  40.     }  
  41.   
  42.     public String getUserName() {  
  43.         return userName;  
  44.     }  
  45.   
  46.     public void setUserName(String userName) {  
  47.         this.userName = userName;  
  48.     }  
  49.   
  50.     public int getAge() {  
  51.         return age;  
  52.     }  
  53.   
  54.     public void setAge(int age) {  
  55.         this.age = age;  
  56.     }  
  57.   
  58.     public Date getBirthday() {  
  59.         return birthday;  
  60.     }  
  61.   
  62.     public void setBirthday(Date birthday) {  
  63.         this.birthday = birthday;  
  64.     }  
  65.   
  66.     public boolean getIsVip() {  
  67.         return isVip;  
  68.     }  
  69.   
  70.     public void setIsVip(boolean isVip) {  
  71.         this.isVip = isVip;  
  72.     }  
  73.   
  74.     @Override  
  75.     public String toString() {  
  76.         return "用户信息: [年龄是" + this.getAge() + ", 生日是" + this.getBirthday()  
  77.                 + ", 用户编号是" + this.getUserId() + ", 用户名是" + userName  
  78.                 + isVip(this.getIsVip()) + "]";  
  79.     }  
  80.   
  81.     /** 
  82.      * 用来进行测试使用 
  83.      *  
  84.      * @param isVip 
  85.      * @return 
  86.      */  
  87.     public String isVip(boolean isVip) {  
  88.         return ", " + (isVip == true ? "是" : "不是") + "会员";  
  89.     }  
  90.   
  91. }  
    注:在这个过程中,首先配置struts.xml中请求的URL,然后配置处理请求所需要的action以及result,更新index.jsp,建立所需要的User.java,UserAction.java,然后建立请求执行后所跳转的页面welcome.jsp,然后进行部署暂时的Struts2项目,具体的过程参照以下讲解。
    

    通过MyEclipse部署项目到Tomcat,具体的过程如下:

    点击部署按钮,如图7所示:


                                                                                     图7

     进行部署操作,如图8,9所示:


                            图8


                           图9

      部署后启动服务器,如下图10,11所示:


                          图10

                                            图11

    然后打开浏览器,输入URL(http://localhost:8080)观察tomcat是否启动成功,成功如图12所示,成功后URL后添加项目名称SSH,即(http://localhost:8080/SSH)打开首页,如图13所示:


                       图12


                         图13

   点击这里,即可显示用户列表,如图14所示:


                        图14

    注:至此,struts2的搭建就算是完成了,在这个过程中不难看出struts2的执行原理:

  • 客户端通过浏览器填写URL,发送一个请求到服务器端(Tomcat)
  • 根据web.xml配置,该请求被FilterDispatcher接收
  • 根据struts.xml配置,通过URL,匹配namespace和action name,这里的URL是http://localhost:8080/SSH/user,namespace 为“/”,action name为“user”,找到需要调用的action类UserAction.java和方法(默认执行方法execute()), 并通过IoC(控制反转,以后讲到spring会讲到)方式,将值注入给Aciton
  • Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证(本程序没有给出,可以参照其他博客进一步了解Struts的功能)
  • Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
  • 将最后的结果返回,即通过HTTP协议响应到客户端浏览器
    接下来进行整合Hibernate和Spring,余下讲解考虑到文章太长,余后的文章在进行讲解,在此恭祝学习愉快。
转载至:http://blog.csdn.net/songdeitao/article/details/17220675
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值