Struts结构
一个请求在Struts2框架中的处理大概分为以下几个步骤:
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求。
2、这个请求经过一系列的过滤器(Filter),这些过滤器中有一个ActionContextCleanUp的可选过滤器,对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin。
3.FilterDispatcher被调用来询ActionMapper(Action映射器)这个请求是否需要调用某个Action;
-
如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy(Action代理);
-
ActionProxy通过Configuration Manager(配置管理器)询问框架的配置文件struts.xml,找到需要调用的Action类; 6. ActionProxy创建一个ActionInvocation(Action容器)的实例。
-
ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器的调用。
7.当action处理请求后,返回相应的结果视图(jsp、FreeMarker)。在这些结果视图中可以使用struts标签显示数据及对数据逻辑方面的控制。
8.HTTP请求回应给浏览器,在回应的过滤中同样经过过滤器链。
环境搭建
第一步:从官网上下载struts2包,下载后解压到本地。
apps 示例程序,以war格式给出,war可以解压
docs 帮助文档
Lib 支持类库,包括struts2的jar包及依赖jar包文件
src 源码
lib文件包含了上百个库文件,但大多数是可选的,有些库是插件,用于和其他框架的整合。我们开发时不必全部用到这些库文件,我们可根据apps文件下的模板工程查看需要哪些jar包。进入apps文件看到struts2自带了5个工程模板。
第二步 用解压缩工具解压的struts2-blank-2.war压缩包,展开后是一个非常简单的项目,从WEB-INF/lib目录中可以看到多个个库文件,将这些jar包放到项目的WEB-INF/lib目录下。
第三步 web.xml文件配置
将Struts2所带的过滤器配置到工程的web.xml文件中。打开刚才解压的struts2-blank.war下WEB-INF/web.xml文件,将如下内容复制到项目的web.xml文件中。
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
<!-- 自从Struts 2.1.3以后,下面的FilterDispatcher已经标注为过时
<filterclass>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
-->
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>//设置所有请求都要经过这个过滤器
</filter-mapping>
第四步 配置action
Action类是最基本的逻辑处理单元,MVC模型中分发器将不同的请求分发给不同的action进行处理,action担任控制器的角色。一个Action类需要继承ActionSupport类。该类放在src目录下。
package com.zx.action;
public class LoginAction extends actionSupport{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute() { //默认执行的方法
this.message = "我的第一个struts2应用";
return "success";
}
}
第五步 struts.xml文件配置
将struts2-blank/WEB-INF/src/java下的struts.xml复制到新建项目工程的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>
<package name="first" namespace="/test" extends="struts-default">
<action name="LoginA" class=”com.zx.action.LoginAction”>
<result name=”success”>/welcome.jsp</result>
<result name=”login”>/index.jsp</result>
</action>
</package>
</struts>
<package name="first" namespace="/" extends="struts-default">
package:用于管理一组业务功能相关的action。
name:配置包时必须指定name属性,该name属性值可以任意取名,但必须唯一,他不对应java的类包,如果其他包要继承该包,必须通过该属性进行引用。
namespace:该属性用于定义该包的命名空间。命名空间作为访问该包下Action的路径的一部分,如访问上面例子的Action,访问路径为:/test/loginA.action。namespace属性可以不配置,如果不指定该属性,默认的命名空间为“”(空字符串)。
extends: 通常每个包都应该继承struts-default包,这样才能使用
struts2提供的核心功能。Struts2很多核心的功能都是拦截器来实现。如从请求中把请求参数封装到action、文件上传和数据验证等。
struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。 struts-default.xml也是Struts2默认配置文件。Struts2每次都会自动加载struts-default.xml文件。
<action name="LoginA" class=”com.zx.action.LoginAction”>
name:配置该action的名称。自定义,不需要与action类名相同。
class:指定action的完整类名
该action未指定method,默认执行的是execute方法,如在浏览器中输入”http://localhost:8080//LoginA.action”,执行的是该action的execute方法。
<result name=”success”>/welcome.jsp</result>
如果LoginAction的execute()方法返回“success”,则访问welcome.jsp;如果返回”login”,则访问index.jsp
第六步 前台jsp页面
特别注意的是,当需要把表单数据提交给action时,指定表单的action属性值为struts.xml文件中action标签下name属性值即可。
<body>
<s:form action="loginA">
<s:label value="登录信息"></s:label>
<s:textfield name="username" label="用户名"></s:textfield>
<s:password name="userpass" label="密码"></s:password>
<s:submit value="登录"></s:submit>
</s:form>
</body>
action的应用
action中默认执行的是execute()方法,除此之外还可以执行其他方法,这些方法没有参数,并且返回类型是String,可以有throws声明。
package com.zx.action;
public class LoginAction extends actionSupport{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute() { //默认执行的方法
this.message = "我的第一个struts2应用";
return "success";
}
public String login(){ //action中其他方法
return execute();
}
}
在struts.xml中配置action:
<?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>
<package name="first" namespace="/test" extends="struts-default">
<action name="LoginA" class=”com.zx.action.LoginAction”>
<result name=”success”>/welcome.jsp</result>
<result name=”login”>/index.jsp</result>
</action>
<action name="LoginB" class=”com.zx.action.LoginAction” method=”login”>
<result name=”success”>/welcome.jsp</result>
<result name=”login”>/first.jsp</result>
</action>
</package>
</struts>
在LoginA中,当通过“//LoginA.action”访问action,默认执行的是execute()方法;如果需要访问login()方法,有两种途径:
(1)//LoginA!login.action
(2)//LoginB.action,前提是LoginB中指定了method属性值。