春节假期终于结束了,假期内在北京只出去转了两天,感觉很好!剩余时间呆在屋子里写了个练习程序收获颇丰。
依然迫不及待,迫不及待的学完课程赶紧回大连。我想除了我,很多同学和网友也都期待着今天由张考祥老师主讲的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可以到网上搜索一下Struts1与Struts2的对比,真是改头换面哈!~~
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框架的工作原理:
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,运行程序!访问页面,控制台输入了”你好!“。
六、contextMap和valueStack
我们在使用Struts1时,Struts1的Action为我们提供request、response...请求与回复信息。但在我们的Struts2的HelloWorld程序并未实现任何接口(也没有超类)。那我们应该如何获取这些数据?在Struts2的环境中ServletActionContext为我们提供了许多重要的静态方法,包括获取请求与回复信息对象。
ServletActionContext是从哪里获取这些对象的呢?就当contextMap看,当初始化一个新的请求时,一些重要的数据会被添加到contextMap中。需要时,去拿就可以了!
Struts 2框架使用OGNL作为默认的表达式语言,今天我们使用<s:debug>查看了contextMap和valueStack在内存中的内容,使用十分方便!
今天的总结就到此结束吧!这只是一个框架,很多细节都没有列出。但有视频还好,即使没有视频,我想也难不住我。