posts - 78, comments - 34, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2010-02-20 传智播客—Struts2

Posted on 2010-02-20 23:56 長城 阅读(569) 评论(0)  编辑  收藏

         春节假期终于结束了,假期内在北京只出去转了两天,感觉很好!剩余时间呆在屋子里写了个练习程序收获颇丰。

 

       依然迫不及待,迫不及待的学完课程赶紧回大连。我想除了我,很多同学和网友也都期待着今天由张考祥老师主讲的Struts2。张老师也说了,如果只讲Struts2的应用一天足够了。但我们都知道传智的特色,就是往深里控,讲应用+原理。

 

       Struts2共为期四天的课程,且内容较多。我在做总结时不可能面面具到,也就把一些重点总结一下吧!张老师的精神依然另人敬佩,讲了一天,休息的时间并不多。时而让我想起在来传智之前看他的视频,他提到了个人的理想,让我十分敬佩。

 

一、Struts2简介

       虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度上来讲,Struts2没有继承Struts 1的血统,而是继承WebWork的血统。或者说,WebWork衍生出了Struts2,而不是Struts 1衍生了Struts2。因为Struts2是WebWork的升级,而不是一个全新的框架,因此稳定性、性能等各方面都有很好的保证:而且吸收了Struts 1和WebWork两者的优势,因此,是一个非常优秀的框架。

 

       如果你以前有学习过Struts1可以到网上搜索一下Struts1Struts2的对比,真是改头换面哈!~~

      

       Struts2的官方:http://struts.apache.org/2.x/

 

二、HelloWorld

       我们依然使用eclipse做为开发工具,这款工具虽然开发效率没有MyEclipse高。但在以后的企业开发中,Eclipse是比较常用的。

 

       1.创建DynamicWebProject

 

       2.导入Jar(我们使用的是struts-2.1.8.1)

       没必要一个一个手动的往里加了,对于新人来说更没必要(你知道都需要哪几个包吗?难道要重复的跑程序,导Jar包?)。在struts-2.1.8.1目录下有一个apps目录,这里边的war文件全是例子文件,我们使用解压缩工具,解压其中任何一个。将WEB-INF目录下的lib目录中的jar文件全部添加到工程中。

 

       3.添加struts.xml

       将WEB-INF\classes目录下的struts.xml文件复制到工程的源码目录(src)下。修改其内容为:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">

 

<struts>

       <package name="default" namespace="/" extends="struts-default">

              <action name="helloWorld"

                     class="cn.itcast.cc.web.struts2.actions.HelloWorld"

                            method="helloWorld">

                     <result name="say" type="dispatcher">

                            <param name="location">/WEB-INF/pages/helloworld.jsp</param>

                     </result>

              </action>

       </package>

</struts>

 

       4.添加类HelloWorld

package cn.itcast.cc.web.struts2.actions;

 

public class HelloWorld {

       public String helloWorld(){

              return "say";

       }

}

 

       5.web.xml添加一个过滤器:

<filter>

       <filter-name>struts2</filter-name>

       <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

 

<filter-mapping>

       <filter-name>struts2</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

 

       6.我们的helloworld.jsp页面内容(body部分):

<body>

<h1>Hello World!</h1>

</body>

 

       7.运行程序,在地址栏中输入:http://localhost:8080/Struts2HelloWorld/helloWorld

 

       OK,我们的HelloWorld跑起来了!

三、struts.xml详解

       张老师讲课比较细致,这也是他对技术的研究和对学生负责的体现。网上的struts.xml配置文件详解较多,在此就不列出了。(我们都知道他们的文档做的十分好)

 

       我们在配置文件中使用一个action配置一个请求路径,那在应用开发中这是一件十分恐怖的事。Struts2为我们提供了一个特殊符号“!”,这是做什么用的呢?使用“!”相当于Struts1的DispatchAction。我们在请求路径的最后(action)后边添加“!”符号并在“!”符号后添加指定的类的方法名,我们的请求就会调用那个方法。

 

       struts2的文档中不建议使用“!”,因为“!”会泄漏我们类的具休方法名称,可能会带个安全隐患。所以Struts2又为我们提供了通配符”*”,统配符十分方便,推荐使用!在action元素的其他属性class和method以及result元素中可以引用*通配符在访问期间实际匹配的内容。

 

四、StrutsPrepareAndExecuteFilter

       我们先来看一下Struts2框架的工作原理:

clip_image002

       FilterDispatcher是Struts2.0.X的过滤器,OtherFilter是其他过滤器必须放在FilterDispathcer之前,因为FilterDispatcher过滤到的内容不会向下传递。

 

       FilterDispatcher接收到过滤内容后,传给ActionProxy。ActionProxy会根据struts.xml配置文件调用相应的拦截器,然后再调用Action。Action返回结果,指定向应的页面,然后再交由过滤器处理。最后返回给浏览器。

 

       在我们使用的struts-2.1.8.1,Struts使用StrutsPrepareAndExecuteFilter替换了之前使用的StrutsPrepareFilter与StrutsExecuteFilter的功能。

 

       StrutsPrepareAndExecuteFilter有三种过滤:

         1).什么也不是,直接交给Tomat

         2).是我的Action

       3).是我的静态资源,这一点很特别。直接查看帮助手册吧,不过它不并不常用。

 

五、拦截器

       通过四我们知道,在进行Action调用的前后都可以添加过滤器。为我们HelloWorld的程序添加一个过滤器,实现在显示HelloWorld页面之前在控制台输出你好!,添加Class文件:

package cn.itcast.cc.web.struts2.interceptors;

 

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.Interceptor;

 

public class HelloWorldInterceptor implements Interceptor {

 

         private static final long serialVersionUID = 1L;

 

         @Override

         public void destroy() {}

 

         @Override

         public void init() {}

 

         @Override

         public String intercept(ActionInvocation invocation) throws Exception {

                   System.out.println("你好!");

                   return invocation.invoke();

         }

}

 

       修改struts.xml配置文件:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">

 

<struts>

         <package name="default" namespace="/" extends="struts-default">

                   <interceptors>

                            <interceptor name="nihao"

                                     class="cn.itcast.cc.web.struts2.interceptors.HelloWorldInterceptor" />

                   </interceptors>

                   <action name="helloWorld" class="cn.itcast.cc.web.struts2.actions.HelloWorld"

                            method="helloWorld">

                            <interceptor-ref name="nihao" />

                            <result name="say" type="dispatcher">

                                     <param name="location">/WEB-INF/pages/helloworld.jsp</param>

                            </result>

                   </action>

         </package>

</struts>

 

       OK,运行程序!访问页面,控制台输入了你好!

 

六、contextMapvalueStack

       我们在使用Struts1时,Struts1Action为我们提供requestresponse...请求与回复信息。但在我们的Struts2HelloWorld程序并未实现任何接口(也没有超类)。那我们应该如何获取这些数据?在Struts2的环境中ServletActionContext为我们提供了许多重要的静态方法,包括获取请求与回复信息对象。

 

       ServletActionContext是从哪里获取这些对象的呢?就当contextMap看,当初始化一个新的请求时,一些重要的数据会被添加到contextMap中。需要时,去拿就可以了!

 

       Struts 2框架使用OGNL作为默认的表达式语言,今天我们使用<s:debug>查看了contextMapvalueStack在内存中的内容,使用十分方便!

 

       今天的总结就到此结束吧!这只是一个框架,很多细节都没有列出。但有视频还好,即使没有视频,我想也难不住我。

 


只有注册用户登录后才能发表评论。


网站导航: