`

传智播客课程——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放在同一个包下。
2. 配置包时必须指定name属性,如果其他包要继承该包,必须通过该属性进行引用。
3. 包的namespace属性用于定义该包的命名空间。该属性可以不配置,对本例而言,如果不指定该属性,默认的命名空间为“”(空字符串)。
4.通常每个包都应该继承struts-default包, struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型。Struts2很多核心的功能都是通过这些内置的拦截器实现的。如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2提供的这些功能。 struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。 struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。
5.包还可以通过abstract=“true”定义为抽象包,抽象包中不能包含action。

6。package 配置相关

属性名

是否必须

说明

name

Package 的唯一标识,不允许同名

extends

指定要继承的包

namespace

指定名称空间

abstract

声明包为抽象否

login.jsp主要代码
<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>
 failure.jsp主要代码
<body>
登录失败,错误的用户名:
<s:property value="userName" />
<br>
<a href="<%=request.getContextPath()%>/login.jsp">返回</a>
</body>
 说明:使用了标签库,在struts2中使用标签库非常简单,只需要像上面那样导入标签库便可以使用所有的struts2的所有标签
success.jsp主要代码
<body>	${userName }登录成功!</body>
 步骤五、配置web.xml。完成核心监听器注册。内容如下:
<?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>
 说明:注释掉的部分为以前2.1.4版本中用的核心filter类。StrutsPrepareAndExecuteFilter类的init方法将会读取类路径下默认的配置文件struts.xml,并以javabean形式存放在内存中,以后struts2对用户的每次请求将使用内存中数据,而不是重读struts.xml文件。
步骤六、发布测试:
当输入http://localhost:8080/struts_helloworld/login.jsp访问jsp页面填写完相关信息并提交给login.action时,它会首先被在web.xml中配置的过滤器监听到,过滤器会去查找strust.xml文件,并结合namespace查找名为login的action,查找到此action便交给其处理,LoginAction内部会执行execute方法,并返回结果result(result也是参照的struts.xml中action下的result配置)。
我的这个struts_helloworld中另一个例子HelloWorld的访问方式为:
http://localhost:8080/struts_helloworld/demo/helloWorld
附件是struts_hellworld在eclipse环境中的完整程序。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics