首页 > WEB开发 > 后台开发 > Struts2入门:配置文件、动作类
2014
09-09

Struts2入门:配置文件、动作类

01. Struts2入门:配置文件、动作类19

一、简介

Struts2是一个非常优秀的MVC框架,由传统的Struts1和WebWork两个经典框架发展而来。

Struts2是一个表现层技术(☆),它改变了三层架构中表现层的编码方式,固定了编码步骤,提高了编码效率。关于软件开发中的三层架构见《开发模型和三层架构》一文。

采用Struts2技术的表现层架构如下,其它层架构不变:

01. Struts2入门:配置文件、动作类261

由上图可看出引入Struts2后表现层的组成部分有:

① 控制器:StrutsPrepareAndExecuteFilter,核心组件,由框架提供。

distinctive between servlet and filter

② 配置文件:指挥控制器运作(开发人员编写 ☆)

③ 动作类:处理逻辑(开发人员编写 ☆)

④ JSP:展现结果(开发人员编写 ☆)

二、HelloWorld

1、Struts2编码步骤

新建一个web project,项目名为:strutsdemo。

1)搭建开发环境

在Struts2的开发包中自带了一个空白项目(apps/struts2-blank.war),该项目中含有运行Struts2的基本环境,搭建Struts开发环境时可以以该项目为模板。

① 拷贝jar包(Struts2.3共13个)

② 配置Struts控制器:

<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>

③ 建立struts.xml的配置文件,放在类路径的的顶端(即/WEB-INF/classes下)。因此在MyEclipse中开发时,只需将该文件置于src目录下即可(☆)。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<!-- 开发模式开关,true为开发模式,false为生产环境 -->
    <constant name="struts.devMode" value="true" />
</struts>

2)在struts.xml文件中配置一个action元素,需放在一个包(package)下:

<package name="demo" extends="struts-default">
	<action name="hello" class="org.flyne.action.HelloWorldAction" method="hello">
		<result name="success">/success.jsp</result>
	</action>
</package>

3)创建org.flyne.action.HelloWorldAction类:

public class HelloWorldAction {//定义动作类
	public String hello(){//定义动作方法
		System.out.println("执行了Hello,world");
		return "success";
	}
}

4)在根目录下编写success.jsp,在<body>中随便写一行话:This is success.jsp。

5)访问http://localhost:8080/strutsdemo/hello.action,可以看到页面输出This is success.jsp,同时控制台打印”执行了Hello,world”。说明浏览器访问的是HelloWorldAction,同时控制器将请求转发到success.jsp。

2、写HelloWorld时遇到的问题

1)建立struts.xml配置文件时报错,在写配置文件时也没有提示,为啥?

这是因为struts.xml找不到dtd文件(没有联网)。解决办法(两步):

① 拷贝dtd文件到当前应用下

在WEB-INF下新建dtd目录,将struts-core.jar包根目录下的struts-2.3.dtd复制到该目录下。

② 进入MyEclipse的window — preferences — xml catalog,添加一条catalog entry(目录项),配置如下:

01. Struts2入门:配置文件、动作类2411

2)struts2项目的jar包都是干啥的?

配置struts2开发环境时可以参考Struts2自带的struts2-blank项目,该项目下有如下jar包:

  • struts2-core-2.3.1.1.jar:Struts 2框架的核心类库
  • xwork-core-2.3.1.1.jar:WebWork和Struts2都基于xwork
  • ognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language), struts2框架通过其读写对象的属性
  • freemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写
  • commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
  • commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本后需要加入此文件
  • commons-io-2.0.1.jar:传文件依赖的jar包
  • commons-lang-2.5.jar:对java.lang包的增强,如StringUtils:if(str!=null&&!str.equals(“”)){……} –> if(StringUtils.isEmpty(str)){……}
  • javassist-3.11.0.GA.jar:动态代理的开发包。Hibernate中也有用。

三、Struts2的执行过程及架构图(☆)

1、根据请求资源的后缀名判断:直接放行or进入Struts框架

当用户请求/strutsdemo/hello.action时,会进入Struts2的框架执行,大致如下:

01. Struts2入门:配置文件、动作类3155

注:

Struts2过滤器映射到/*,表明所有请求都要经过Struts2控制器。该控制器:对非action请求会直接放行,而用户的action请求会进入Struts2框架内执行。

struts2 框架默认处理后缀为.action或无后缀的请求,这是因为在default.properties中预先配置了“struts.action.extension=action,,”。

2)在Struts2框架中的执行流程

当进入Struts框架后,执行过程可以参考Struts文档中的Struts架构图(big picture),如下:

01. Struts2入门:配置文件、动作类3426

架构图中相关类说明:

① ActionMapper接口(☆)

The ActionMapper interface provides a mapping between HTTP requests and action invocation requests and vice-versa.
When given an HttpServletRequest, the ActionMapper may return null if no action invocation request matches, or it may return an link ActionMapping that describes an action invocation for the framework to try.

ActionMapper接口提供用于在Http请求和Action调用请求(即动作方法)之间映射的方法。当收到一个HttpServletRequest时,ActionMapper会去找匹配的Action调用请求,找不到返回null,找到返回一个ActionMapping对象。

② ActionMapping类action元素

Simple class that holds the action mapping information used to invoke a Struts action.

一个简单类,有namespace、name、method、extention、result等属性。该类的实例对应struts.xml中的一个action元素。

③ PrepareOperations和 ExecuteOperations类

StrutsPrepareAndExecuteFilter类中保持了PrepareOperations和ExecuteOperations类的实例(prepare和execute),在doFilter()方法中,首先调用prepare.findActionMapping()查找对应的action元素,没找到直接放行,找到执行execute.executeAction()方法进入Struts框架(步骤②③)。

④ ActionProxy 和 ActionInvocation接口

ActionProxy是动作类(Action)的一个代理,也就是说action调用请求是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,在该方法中又调用了ActionInvocation.invoke()方法。通过代理的方式在执行动作方法时加入了拦截器的功能(步骤⑥、⑦)。

(关于代理的知识请参考《动态代理技术》一文)


留下一个回复

你的email不会被公开。