传智播客教程——Struts 2 学习笔记(一)初识struts2
http://blog.sina.com.cn/s/blog_5de48f8b0100e6ii.html
Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度上来讲,Struts2没有继承Struts 1的血统,而是继承WebWork的血统。或者说,WebWork衍生出了Struts2,而不是Struts 1衍生了Struts2。因为Struts2是WebWork的升级,而不是一个全新的框架,因此稳定性、性能等各方面都有很好的保证:而且吸收了Struts 1和WebWork两者的优势,因此,是一个非常好的MVC框架.
1. Struts2相比于Struts1的优点:
<1> Struts2没有像Struts1那样跟Servlet API和Struts API有着紧密的耦合,Struts2的应用可以不依赖于Servlet API和Struts API。 Struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计。
下面的代码是Struts1的请求处理Action模版:
public class OrderListAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { } }
在execute方法的参数中有HttpServletRequest和HttpServletResponse对象,所以与Servlet API有紧密的耦合.
<2> Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。
<3> Strut2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。在Struts1中,如果我们要实现同样的功能,就必须向Struts1的底层实现BeanUtil注册类型转换器才行。
<4> Struts2提供支持多种表现层技术,如:JSP、freeMarker、Velocity等
<5> Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。
2.搭建Struts2开发环境:
.搭建Struts2开发环境首先你得核对你的java环境是否满足以下的最低要求:
Servlet API 2.4及以上版本, JSP 2.0 及以上版本,同时 Java 5或以上版本.
搭建Struts2环境时,我们一般需要做以下几个步骤的工作:
<1> 找到开发Struts2应用需要使用到的jar文件;
到官网下载struts-2.x.x-all.zip。下载完后解压文件,开发struts2应用需要依赖的jar文件在解压目录的lib文件夹下。不同的应用需要的JAR包是不同的。下面给出了开发Struts 2程序最少需要的JAR。
struts2-core-2.x.x.jar :Struts 2框架的核心类库;
xwork-2.x.x.jar :XWork类库,Struts 2在其基础上构建;
ognl-2.x.x.jar :对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性;
freemarker-2.3.x.jar :Struts 2的UI标签的模板使用FreeMarker编写;
commons-logging-1.1.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录;
commons-fileupload-1.2.1.jar 文件上传组件,在此 jar 包中包含了 RequestContext 类,如果不导入该 jar 包将会报异常。 2.1.6版本后需要加入此文件。
以上jar 文件的说明是针对struts-2.1.6的,我这里的示例程序都是使用的struts-2.2.1,所以在jar上面有些变化。
struts-2.2.1除了要加入上面的六个jar之外,还需要加入javassist-3.7.ga.jar.
推荐方法:
其实没有必要按上面的方法自己去一个一个的加入jar文件,那太麻烦了,你可以在你下载的struts的zip解压文件的app目录下,找到一个struts2-blank-2.x.x.war文件,你可以把它放到tomcat的wepabbs下面运行tomcat将其解压,或者是从cmd中进入到此目录下,然后运行命令
jar -xf struts2-blank-2.2.1.war
解压到当前文件夹中。然后将它WEB-INF/lib目录下面的所有jar拷到你的工程的lib上当即可。同样struts.xlm以及web.xml文件都可以在这个示例程序中拷贝。这是最安全快速的方法。因为struts2-blank-2.x.x.war这个示例程序就是给你提供一个空的struts2工程模板的。
还有一种最省事的做法是:
如果不需要跟第三方框架集成,把struts-2.x.x\lib目录下不带-plugin结尾的jar文件都添加入类路径即可。如果需要跟第三方框架集成,这时候还需要加入对应的-plugin jar文件。例如跟spring集成,需要加入struts2-spring-plugin-2.x.x.jar.不过这种方法不推荐使用,因为会导入多余的很多jar,且因为plugin这些jar是与第三方集成的,你导入了反而会报错,因为你要集成的第三方的jar文件没有导入。
<2> Struts2的配置文件说明:
(1).web.xml文件
主要完成对StrutsPrepareAndExecuteFilter的配置(在以前的版本中是对FilterDispatcher配置,新版本同样支持用FilterDispatcher配置),它的实质是一个过滤器,它负责初始化整个Struts框架并且处理所有的请求。这个过滤器可以包括一些初始化参数,有的参数指定了要加载哪些额外的xml配置文件,还有的会影响struts框架的行为。除了StrutsPrepareAndExecuteFilter外,Struts还提供了一个ActionContexCleanUp类,它的主要任务是当有其它一些过滤器要访问一个初始化好了的struts框架的时候,负责处理一些特殊的清除任务。
(2).struts.xml文件
框架的核心配置文件就是这个默认的struts.xml文件,在这个默认的配置文件里面我们可以根据需要再包括其它一些配置文件。在通常的应用开发中,我们可能想为每个不同的模块单独配置一个struts.xml文件,这样也利于管理和维护。这也是我们要配置的主要文件。
Struts2默认的配置文件为struts.xml ,此配置文件要放在src目录下,实质就是成为classpath环境变量下的文件.该文件的配置模版如下:
<?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> </struts>
(3).struts.properties(参default.properties)
在Struts框架使用了很多属性,我们可以通过改变这些属性来满足我们的需求。要改变这些属性,只需在struts.properties文件中指定属性的key和value即可。属性文件可以放在任何一个包含在classpath中的路径上,但是通常我们都把它放在/WEB-INF/classes目录下面。我们可以在struts-default.properties文件中找到一个属性的列表。
(4)struts-default.xml
此文件是struts2框架默认加载的配置文件,它定义了struts2一些核心bean和拦截器,它会自动包含(included)到struts.xml文件中(实质是通过<package extends="struts-default">),并为我们提供了一些标准的配置。我们可以在struts2-core.jar中找到这个文件。
(5)其它配置文件
velocity.properties,struts-default.vm,struts-plugin.xml
更详细的说明请参见 struts2 reference文件。
<3>现在来开发一个示例程序struts_helloworld
步骤一,新建struts_helloworld项目,并导入struts2的基本jar包。
步骤二,建立LoginAction文件,主要代码如下:
public class LoginAction implements Action { private String userName; private String password; ...省略get/set方法 public String execute() throws Exception { if (userName.equals("struts2")) { return "loginSuccess"; } else { return "loginFailure"; } } }
说明:实现了Action接口,主要是为了保证execute的正确定义,其实我们也可以不实现此接口,只要能保证execute方法书写的正确书写(方法名,返回值)。如我struts_helloworld这个工程示例中的HelloWorldAction。
步骤三,在struts.xml文件中注册LoginAction。此配置文件要放在src目录下,实质就是成为classpath环境变量下的文件。主要代码如下:
<?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="myDemo" namespace="/demo" extends="struts-default"> <action name="helloWorld" class="demo.helloworld.action.HelloWorldAction" method="execute"> <result name="success">/WEB-INF/jsp/hello.jsp</result> </action> <action name="login" class="demo.login.action.LoginAction" > <result name="loginSuccess">/WEB-INF/jsp/success.jsp</result> <result name="loginFailure">/WEB-INF/jsp/failure.jsp</result> </action> </package> </struts>1. 在struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
6。package 配置相关
属性名 |
是否必须 |
说明 |
name |
是 |
Package 的唯一标识,不允许同名 |
extends |
否 |
指定要继承的包 |
namespace |
否 |
指定名称空间 |
abstract |
否 |
声明包为抽象否 |
<body> <form action="<%=request.getContextPath()%>/demo/login.action" method="get"> 户名:<input type="text" name="userName"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="login"> </form> </body>
<body> 登录失败,错误的用户名: <s:property value="userName" /> <br> <a href="<%=request.getContextPath()%>/login.jsp">返回</a> </body>
<body> ${userName }登录成功!</body>
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>struts2</filter-name> <!-- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> --> <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> </web-app>