搭建Struts2开发环境的步骤
搭建Struts2环境时,我们一般需要做以下几个步骤的工作:
1》 创建javaweb工程
2》 找到开发Struts2应用需要使用到的jar文件.
官方的zip中的示例项目struts2-blank.war,进行解压。
将解压之后的lib目录里面的所有jar文件拷贝我们的项目中的lib文件夹中。
3》在web.xml中加入Struts2 MVC框架启动配置
在struts2中,struts框架是通过Filter启动的。在web.xml中的配置如下:
在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。
注意:struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件.
拷贝struts2的核心配置文件到src目录下面,并且删除多余的配置:
删除之后配置文件中保留内容如下:
4》创建jsp文件.
5》创建action文件
1、 继承ActionSupport类
2、 覆盖execute方法
6》编写Struts2的配置文件(stuts.xml)
因为我们在项目中加入了LoginAction,如果希望客户端能够访问该类的处理的话,必须将该Action配置到struts2的核心配置文件struts.xml文件中。
注意:如果要从客户端访问LoginAction的execute方法的,那么url地址写法了ActionName.action,也就是说action访问的默认扩展名为.action。
在jsp中表单提交的地方的写法如下:
Struts2工作流程
Action类介绍
• Action是什么
Ø Action就是用来处理一次用户请求的对象。
• Action能干什么
Ø Action通过属性接受用户的请求数据。
Ø 调用业务逻辑代码。
Ø 实现控制层的视图选择。
• Action的实现:
Ø 简单的POJO,但要有空参构造函数和execute方法。
如果没有提供excute方法的话,会出现以下类似的错误报告:
如果没有提供默认的构造方法,会出现什么错误呢?
项目启动的时候就会发生错误。导致整个项目都无法访问。
Ø 实现Action接口
Ø 继承ActionSupport类
• Action的数据对应方式
Ø 属性驱动(FieldDriven)
Ø 模型驱动(ModelDriven):Action要实现ModelDriven接口
Struts2配置详解
Action的配置
Struts2默认的配置文件为struts.xml ,该文件需要存放在WEB-INF/classes下,也就是当前工程的src目录下。
package
===============================================================================
• <package>的配置
– name
– extends
– namespace
– abstract
在struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
配置包时必须指定name属性,如果其他包要继承该包,必须通过该属性进行引用,注意:name名称是唯一 。包的namespace属性用于定义该包的命名空间。该属性可以不配置,对本例而言,如果不指定该属性,默认的命名空间为“/”
通常每个包都应该继承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文件。
action
===============================================================================
• <action>的配置
– name :给action定义的名称
– class :指定action的类名 : packageName + className
– method :指定执行的方法:该属性默认值为execute
result
===============================================================================
• <result>配置:Result是Action执行完后返回的一个字符串,它指示了Action执行完成后,下一个页面在哪里。具体页面在哪里,是在struts.xml里面配置的。就是每个<action>元素里面配置的<result>子元素。
– name:与Action中返回的字符串匹配
– type:视图类型,如:jsp,freemarker,velocity
预定义的ResultType(参看struts-default.xml)
Struts2默认的ResultType就是“dispatcher”。相当于在Servlet里面的“RequestDispatcher”的技术。
Struts2访问JSP内建对象
Ø 通过ServletActionContext获得HttpServletRequest类型的request对象。
request = ServletActionContext.getRequest();
Ø 通过ServletRequestAware接口来获得HttpServletRequest类型的request对象。
① 实现ServletRequestAware接口
② private HttpServletRequest request;
③ public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
Ø 通过ActionContext获得Map类型的request对象。
request =(Map)ActionContext.getContext().get("request");
Ø 通过RequestAware接口来获得Map类型的request对象。
① 实现RequestAware接口
② private Map<String,Object> request;
③ public void setRequest(Map<String, Object> request) {
this.request=request;
}
通配符映射
一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系
* 可以匹配零个或多个字符
通配符映射规则
若找到多个匹配, 没有通配符的那个将胜出
若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名进行匹配
被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…
动态方法调用
动态方法调用: 通过 url 动态调用 Action 中的方法
url地址写法: actionName!methodName.action
比如说要访问action名为User,访问的方法为add
URL: User!add.action
默认情况下, Struts 的动态方法调用处于禁用状态
OGNL表达式语言
• Struts 2中的OGNL Context实现者为ActionContext,它结构示意图如下
当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action 。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。
访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application、#session
另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。
在struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象
|--request
|--application
context ------|--OgnlValueStack root变量[action, OgnlUtil, ... ]
|--session
|--attr
|--parameters
在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。
• 大家注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:<s:propertyvalue="name"/>
Struts2标签
• 按功能级别分为一下四类标签
– 数据标签:用来从值栈上取值或者向值栈赋值
– 控制标签:控制程序的运行流程,比如分支和循环控制
– UI标签:用来显示UI页面的标签,多会生成HTML
– 杂项标签:用于完成其他功能的标签,比如生成URL和输出国际化文本
–
Struts2标签之property标签
property标签用于输出指定值:
<s:set name="name"value="'kk'" />
<s:property value="#name"/>
default:可选属性,如果需要输出的属性值为null,则显示该属性指定的值
escape:可选属性,指定是否格式化HTML代码。
value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值。
id:可选属性,指定该元素的标识
Struts2标签之iterator标签
iterator标签用于对集合进行迭代,这里的集合包含List、Set和数组。
<s:set name="list"value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list"status="st">
<fontcolor=<s:iftest="#st.odd">red</s:if><s:else>blue</s:else>>
<s:property/></font><br>
</s:iterator>
value:用来指明到底循环的是谁,这个属性的值是OGNL表达式,用来访问ActionContext和值栈中需要被循环的对象。
var:变量名称,用来引用存放到值栈的被循环的对象。
status:这个属性在ActionContext中保存一个对象,用来返回当前循环的各种信息,可以返回的信息有:
intgetCount(),返回当前迭代了几个元素。
intgetIndex(),返回当前迭代元素的索引。
booleanisEven(),返回当前被迭代元素的索引是否是偶数
booleanisOdd(),返回当前被迭代元素的索引是否是奇数
booleanisFirst(),返回当前被迭代元素是否是第一个元素。
booleanisLast(),返回当前被迭代元素是否是最后一个元素。
Struts2标签之if/elseif/else标签
<s:set name="age"value="21" />
<s:if test="#age==23">
23
</s:if>
<s:elseif test="#age==21">
21
</s:elseif>
<s:else>
都不等
</s:else>