欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析Struts2.xml:核心配置文件入门指南

时间:11-16 名人轶事 提交错误

这篇文章给大家聊聊关于深入解析Struts2.xml:核心配置文件入门指南,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

如果要配置标签,首先要配置标签,它代表了包的概念。

包含的属性

名称包的名称要求唯一,管理动作配置。

extends继承,可以继承其他包。只要继承了,那么该包就包含了其他包的功能。一般情况下,struts-default是继承的。

命名空间namespace一般与标签中的name属性一起决定访问路径。常见配置如下:

* namespace="" -- 默认命名空间(访问方式与namespace="/"相同)

* namespace="/" -- 根命名空间

* namespace="/aaa" -- 带有名称的命名空间

* 摘要——摘要。该属性很少使用。如果值为true,则继承写入的包。

标签

代表配置动作类,包含属性

标签的名称和命名空间属性一起用来确定访问路径。

class 配置Action类的完整路径(默认值为ActionSupport类)

在methodAction 类中执行的方法。如果未指定,则默认值是执行。

标签

执行action类中的方法,返回的结果就是要跳转到的页面。

名称结果页逻辑视图名称

type 结果类型(默认值为转发,也可以设置其他值)

Default Action和Action默认处理类

默认操作

如果在地址栏中输入不存在的操作请求,程序将报告404异常。

但请求是在标签中通过的。

Action默认处理类

在地址栏输入正确的Action请求,但是标签中的class属性没有写入具体的Action类。

传入标签

Struts2配置常用常量

Struts2框架中哪些配置文件可以配置常量?

struts.xml

网络.xml

在StrutsPrepareAndExecuteFilter配置文件中配置初始化参数

struts.i18n.encoding=UTF-8 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法

struts.action.extension=action,该属性指定需要Struts 2处理的请求后缀,该属性默认值为action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,多个后缀之间用逗号(,)分隔

struts.serve.static.browserCache=true 设置浏览器是否缓存静态内容。默认值为true(生产环境使用)。最好在开发阶段将其关闭。

struts.configuration.xml.reload=false 当struts配置文件修改时,系统是否自动重新加载该文件。默认值为false(生产环境使用)。最好在开发阶段就将其打开。

struts.devMode=false 用于开发模式,这样可以打印出更详细的错误信息

struts.enable.DynamicMethodInitation=true 启用对Action的动态方法访问

指定多个struts配置文件

在大多数应用中,随着应用规模的增大,系统中Action的数量也会大幅增加,导致struts.xml配置文件变得非常臃肿。

为了避免struts.xml文件太大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解为多个配置文件,然后在struts.xml中包含其他配置文件文件。

可以使用标签在标签中引入其他struts_xx.xml配置文件。例如:

实施Action的三种方式

Action类是一个POJO类

POJO类:

POJO(Plain Ordinary Java Object)简单的Java对象。简单来说,如果它没有继承某个类或者实现某个接口,那么它就是一个POJO类。

Action类可以实现Action接口

Action接口定义了5个常量。 5个常量的值对应了5个逻辑视图跳转页面(跳转页面还是需要自己配置)。它还定义了一个方法,即execute方法。

每个人都需要掌握逻辑视图的5个常量

成功——成功。

INPUT——用于数据形式验证。如果验证失败,跳转到INPUT视图。

登录——登录。

错误——错误。

无——页面不会重定向。

Action类可以继承ActionSupport类

验证请求参数

设置错误信息

阅读国际化信息

Action中获取Servlet相关API的三种方式

Servlet的一些常用的API也可以在Action类中获取。获得它们的方法有以下三种:

* 完全解耦的方法

* 使用接口注入

* 使用ServletActionContext中的静态方法直接访问Servlet API

完全解耦的方法

如果使用这种方式,Struts2框架提供了一个类,即ActionContext类,它提供了一些获取Servlet的API的方法。

一些常用的方法如下:

static ActionContext getContext() 获取ActionContext 对象实例

java.util.Map getParameters() 获取请求参数,相当于request.getParameterMap();

java.util.Map getSession()获取到的表示session域的Map集合,相当于操作sessio域

java.util.Map getApplication() 获取代表应用程序域的Map集合

void put(java.lang.String key, java.lang.Object value) 注意:将值存储在请求字段中。

使用接口注入

Struts2框架提供了一些接口。你编写的Action类可以实现这些接口,然后实现这些接口中的方法。这些方法通过参数传入一些常用的Servlet对象。

常用的接口如下:

* ServletRequestAware -- 注入请求

* ServletContextAware -- 注入ServletContext

* ServletResponseAware——注入响应。

使用ServletActionContext中的静态方法直接访问Servlet API

Struts2框架提供了一个类ServletActionContext,它提供了一些静态方法。

具体方法如下

* getPageContext();

*获取请求()

* 获取响应();

* getServletContext();

访问Action 的三种方式

通过标签中的method属性访问Action中的具体方法

传统配置方法

具体例子如下:

页面代码

添加图书删除图书

配置文件代码

动作代码

publicStringadd(){System.out.println("添加图书");returnNONE;}publicStringdelete(){System.out.println("删除图书");returnNONE;}

通配符访问方法

使用通配符可以简化配置文件的代码编写,并且更容易扩展和维护。

具体例子如下:

页面代码

添加订单删除订单

配置文件代码

动作代码

publicStringadd(){System.out.println("添加订单");returnNONE;}publicStringdelete(){System.out.println("删除订单");returnNONE;}

更抽象的通配符书写方式

具体例子如下:

页面代码

添加订单

配置文件代码

动作代码

publicclassOrderActionextendsActionSupport{publicStringadd(){System.out.println("添加订单");returnNONE;}}

动态方法访问方法

如果要完成动态方法访问,需要启用一个常量,struts.enable.DynamicMethodInitation=false,并将值设置为true。

注意:根据Struts2 框架的版本,该常量的值可能不是true 或false。你需要自己检查一下。如果是假的,需要你自己去开启。

在struts.xml 中启用此常量。

具体代码如下

页面代码

添加产品删除产品

配置文件代码

动作类代码

publicclassProductActionextendsActionSupport{publicStringadd(){System.out.println("添加订单");returnNONE;}publicStringdelete(){System.out.println("删除订单");returnNONE;}}

跳转到结果页面

结果页有两种方法

全球结果页面

健康)状况:

如果包中的某些操作返回成功,并且返回的页面都是相同的JSP页面,则可以配置全局结果页面。

全局结果页针对当前包中的所有Action,但如果有本地结果页,则优先考虑本地结果页。

使用的标签是

/demo/suc.jsp

本地结果页面

/demo/suc.jsp

结果页面类型

结果页面使用标签进行配置并包含两个属性

name 逻辑视图的名称

type——跳转的类型,有一些值,需要掌握一些常用的类型。常见的结果类型可以在struts-default.xml 中找到。

*dispatcher--forwarding.type.Action的默认值---JSP

* 重定向——重定向。动作---JSP

* chain——在多个动作之间跳转。从一个操作转发到另一个操作。行动---行动

*redirectAction——在多个动作之间跳转。从一个操作重定向到另一操作。行动---行动

* 流——下载文件时使用。

注意:当使用一个Action标签完成多个Action配置时,Input结果视图中会出现冲突。也就是说,不同逻辑中跳转到的输入逻辑视图是相同的。这时候我们就可以在自己的Action方法中使用它了。添加@InputConfig(resultName="逻辑视图名称") 注解,然后在Result中进行配置。

为什么会这样呢?可以看源码:

Struts2 Action封装数据的两种方式

属性驱动

为对应的属性提供set方法来封装数据

* 表单的哪些属性需要封装数据,则在对应的Action类中提供该属性的set方法。

* 表单中的数据提交后,最终找到Action类中的setXxx方法,最后赋值给全局变量。

*注:Struts2框架使用拦截器来完成数据封装。

* 注意:这个方法不是特别好:因为属性太多,提供了很多set方法,并且需要手动将数据存入对象中。

* 注意:在这种情况下,Action类就相当于一个JavaBean,并不能体现MVC的思想。 Action类还封装数据并接收请求处理,所以耦合性很高。

页面上,使用OGNL表达式进行数据封装

* 使用OGNL表达式封装页面中的数据,可以直接将属性封装成JavaBean对象。

* 在页面中定义一个JavaBean,并提供set方法:例如:private User user;

* 页面上的文字已更改。您需要使用OGNL。形式的书写方法:

* 注意:仅提供一套方法是不够的。如果没有用户实例化,则还必须提供用户属性的get 和set 方法。首先调用get方法判断是否存在用户对象的实例对象。如果没有,则调用set方法。注入拦截器创建的对象。

模型驱动

采用模型驱动的方式,还可以直接将表单中的数据封装成JavaBean对象,表单的写法和以前的写法没有什么区别!

您编写的页面不需要任何更改。正常写入name属性的值。

模型驱动的创作步骤

* 手动实例化JavaBean,即:private User user=new User();

* 必须实现ModelDriven接口,实现getModel()方法,并在getModel()方法中返回user!

Struts2 Action封装集合对象的两种方式

封装复杂类型参数(集合类型Collection、Map接口等)

需求:你可能想在页面中批量添加一些数据,那么现在就可以使用上面的技术了。将数据封装到集合中。

将数据封装成Collection

* 因为Collection接口会有下标值,所以各个页面的写法会有些差异。笔记:

* 在Action中编写,需要提供产品的集合,并提供get和set方法。

将数据封装到Map中

* Map集合是键值对的形式,页面怎么写

*Action提供了地图集合,并提供了get和set方法。

不建议在Action中使用模型驱动的方式将数据封装到集合中。

Struts2数据类型转换

Struts2自带类型转换拦截器

Struts2内部提供了大量的转换器来完成数据类型转换问题,包括以下几种

* 布尔值和布尔值

* 字符和字符

* int 和整数

*长又长

* 浮动和浮动

* 双倍和双倍

* 日期可以接收yyyy-MM-dd格式的字符串

* Array可以将多个同名参数转为一个数组

* Collection支持将数据保存到List或Map集合中

当发生类型转换错误时,根据错误信息跳转到输入类型的结果视图。

* 注意,如果程序发生异常,会跳转到输入结果视图。您可以在标签中配置输入结果视图。

可以通过跳转页面中的固定标签来显示错误信息:

* 可以先引入Struts2标签库,然后使用标签来显示错误!

%@ taglib prefix="s" uri="/struts-tags" %

*,这是Struts2提供的一个标签,用它来显示错误信息。

如果类型转换拦截器发生错误,错误信息会被放在Struts2错误区中(Struts2错误区分为两部分,一是字段错误,二是Actionc错误)

* 当最后一个拦截器(工作流)执行时,工作流拦截器会去Struts2的错误区查找是否有错误。

* 如果出现错误,跳转到输入视图。

* 如果没有错误,则执行目标Action类中的具体方法。

自定义类型转换器

如果某些特殊数据类型无法转换,则需要自定义数据类型转换器。

开发自定义类型转换的开发步骤

编写一个类型转换器

实现TypeConverter接口并实现一个方法

ObjectconvertValue(Mapcontext,Objecttarget,Membermember,StringpropertyName,Objectvalue,ClasstoType);

继承DefaultTypeConverter类并重写一个方法

对象转换值(地图上下文,对象值,类到类型)

继承StrutsTypeConverter类并重写两个方法

ObjectconvertFromString(Mapcontext,String[]values,ClasstoClass)

从字符串转换为具体类型

Values数组,存储的值为用户输入的值

toClass 要转换的数据类型Date.class

* String ConvertToString(Map context,Object o)

将特定类型转换为字符串

o 代表要转换的数据

注意:类型转换本身是一个双向过程:

* JSP ---Action String ---某种类型

* Action ---JSP某种类型---String

* 类型转换代码,以1990/10/10为例,自定义日期转换器完成转换。下面的代码是第二种方法,它继承了DefaultTypeConverter类。

publicObjectconvertValue(Mapcontext,Objectvalue,ClasstoType){//根据toTypeDateFormat判断是请求封装还是数据回显dateFormat=newSimpleDateFormat("yyyy/MM/dd");if(toType==Date.class){//请求参数封装( value 为字符串) String[]params=(String[])value;StringstrVal=params[0];//转换为日期类型try{returndateFormat.parse(strVal);}catch(ParseExceptione){e.printStackTrace( ) ;}}else{//echo (值为Date)Datedate=(Date)value;returndateFormat.format(date);}returnnull;}

寄存器类型转换器

部分注册:对表单中的某个字段有效!

* 属性驱动方式:使用set方法接收数据

注意:在Action所在包下创建一个文件。文件格式为:Action类名-conversion.properties文件。该文件中配置了需要转换的字段以及对应的转换器完整路径。

* 例如:生日=cn.zlq.demo3.MyDateConverter

* 模型驱动方式:实现ModelDriven接口的方式

注意:在实体类所在包下创建一个文件。文件的格式为:实体类名-conversion.properties文件。该文件中配置了需要转换的字段以及对应的转换器完整路径。

* 例如:生日=cn.zlq.demo3.MyDateConverter

全局注册:所有日期类型将对整个项目生效!

* 在src目录下,创建一个xwork-conversion.properties(名称固定)

例如:java.util.Date=cn.zlq.demo3.MyDateConverter

Struts2中验证数据的两种方法

数据验证包括两种方法。第一种是手动编码完成数据验证,第二种是通过配置文件完成数据验证。

手动编码验证方法

开发步骤

步骤一:封装数据

第二步:要实现验证Action,必须继承ActionSupport类

第三步:重写validate方法,完成Action的业务方法this.addFieldError的数据验证(由ActionSupport提供)

步骤4:在jsp中显示错误消息

旨在验证Action 中的所有方法

让Action继承ActionSupport类,重写ActionSupport类中的validate()方法,在该方法中完成数据验证。

旨在完成Action中某个方法的验证。

在Action中手动编写一个方法。方法名称为validate方法名称()。例如: public void validateAdd(){ }

* Action中有save方法,只验证save方法。

* validateSave() -- 使用该方法验证保存方法

通过XML配置文件完成数据验证

XML配置验证原理:已经写了很多验证规则代码,只需要在xml中定义数据所使用的验证规则即可。

开发步骤

第一步:编写jsp

第二步:编写Action继承ActionSupport或者实现Validateable接口

第三步:封装请求参数

* 使用xml验证时,必须提供get方法

第四步:编写验证规则xml文件

* 具体配置文件相关标签和属性的详细解释

密码不能为空。 38 密码必须介于3-8 个字符之间。

旨在验证Action 中的所有方法

在Action所在的包中创建一个XML文件。命名规则为:Action类名-validation.xml。并且需要引入指定DTD的约束:xwork-core-2.3.15.3.jar/xwork-validator-1.0.3.dtd

具体数值:

"-//ApacheStruts//XWorkValidator1.0.3//EN"

"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"

验证是针对Action中的某个方法进行的

在Action所在的包中创建一个XML文件。命名规则为:Action类名-方法对应的访问路径-validation.xml。引入DTD文件等

* 例如:Reg6Action-reg6-validation.xml

Struts2框架提供的XML验证规则

* 必填(必填验证器,要验证的属性值不能为空),空格都可以。

*requiredstring(必需的字符串验证器,要求被验证的属性值不能为空且长度大于0。默认情况下,字符串会去除前导和尾随空格)

* stringlength(字符串长度验证器,要求验证的属性值必须在指定范围内,否则验证失败。minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定是否删除验证前的字段前后的空格)

*regex(正则表达式验证器,检查正在验证的属性值是否与正则表达式匹配,expression参数指定正则表达式,caseSensitive参数指定正则表达式匹配,

是否区分大小写,默认值为true) * int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值) * double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值) * fieldexpression (字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过) *email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址) * url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址) * date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值) Struts2的拦截器 原理 * 拦截器就是AOP(Aspect-Oriented Programming)的一种实现。 * 过滤器:过滤从客服端发送到服务器端请求的. * 拦截器:拦截对目标Action中的某些方法进行拦截. * 拦截器不能拦截JSP. * 拦截到Action中某些方法. 拦截器和过滤器的区别 1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的。 2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器 3)拦截器只能对Action请求起作用,而过滤器可以对几乎所有的请求起作用。 4)在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

* 拦截器 采用 责任链 模式 >在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。 >责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行 * 在struts2 中可以定义很多个拦截器,将多个拦截器按照特定顺序 组成拦截器栈 (顺序调用 栈中的每一个拦截器 ) Struts2的自定义拦截器 编写拦截器 需要实现Interceptor接口,实现接口中的三个方法。 * interceptor接口有很多的实现类,编写最简单的方式就是继承AbstractInterceptor实现类。 * 代码例如: publicString intercept(ActionInvocation invocation) throws Exception {        User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");if(user ==null){                ActionSupportas= (ActionSupport) invocation.getAction();as.addActionError("您没有登陆!");returnas.LOGIN;            }else{// 放行returninvocation.invoke();            }        } 需要在struts.xml中进行拦截器的配置 配置一共有两种方式 第一种方式 在包中定义拦截器,出现在包的上方 在某个action中引入拦截器 注意:如果引入了自己定义的拦截器,那么Struts2框架默认的拦截器就不会再执行了,所以需要引入Struts2默认的拦截器。 第二种方式 在包中定义拦截器的时候,自己直接定义一个拦截器栈 在Action包中引入自己定义的拦截器栈 Struts2的文件上传 Struts2框架的使用拦截器完成了文件上传 底层使用也是FileUpload开源的组件。 * 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 * fileUpload拦截器 默认在 defaultStack 栈中, 默认会执行的 * 在Action中编写文件上传,需要定义三个属性 文件类型File ,属性名与表单中file的name属性名一致. 字符串类型String , 属性名:前段是name属性名一致 +ContentType; 字符串类型String , 属性名:前段是name属性名一致+FileName; 最后需要为上述的三个属性提供set方法。 可以通过FileUtils提供 copyFile 进行文件复制,将上传文件 保存到服务器端 文件上传中存在的问题 * 先配置input逻辑视图 * 在页面中显示错误信息 * 文件上传的总大小默认值是2M,如果超过了2M,程序会报出异常。可以使用来查看具体信息! >解决总大小的设置,找到常量: * struts.multipart.parser=jakarta       -- 默认文件上传解析器,就是FileUpload组件 * struts.multipart.saveDir=             -- 文件上传的临时文件存储目录 * struts.multipart.maxSize=2097152      -- 文件上传的最大值(总大小),默认是2M >可以在struts.xml中设置常量,修改文件上传的默认总大小!!! 通过拦截器来设置文件上传的一些属性 先在标签中引入文件上传的拦截器 2097152.txt 多文件上传 * 在Action中还是编写三个属性 >属性需要是数组或者List集合,这样就可以完成多文件上传了。 >注意:是数组或者List集合 private File [] upload;             // 代表上传的文件 private String [] uploadContentType;    // 代表文件的类型 private String [] uploadFileName;       // 上传文件的名称 提供属性的set方法 Struts2的文件下载 Action类必须要有返回结果,并且返回结果中必须要依赖stream结果类型。 * 在标签中配置stream的结果类型。 * 可以通过源码发现有一些需要设置的属性。 ${contentType}attachment;filename=${downFileName} 上面的代码的${contentType}这种写法需要Action类提供对应的方法,对应的方法如下 // 获取文件的MIME类型publicStringgetContentType(){returnServletActionContext.getServletContext().getMimeType(filename);        }// 设置文件的输入流publicInputStreamgetInputStream(){returnServletActionContext.getServletContext().getResourceAsStream("/download/"+filename);        }// 设置Content-Disposition属性publicStringgetDownFilename()throwsIOException{            String agent = ServletActionContext.getRequest().getHeader("User-Agent");returnthis.encodeDownloadFilename(filename, agent);        } 解决下载文件中文乱码的问题 publicStringencodeDownloadFilename(Stringfilename,Stringagent) throws IOException{if(agent.contains("Firefox")){// 火狐浏览器filename ="=?UTF-8?B?"+newBASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";}else{// IE及其他浏览器filename = URLEncoder.encode(filename,"utf-8");}returnfilename;    } OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。 * 通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。 Struts2框架使用OGNL作为默认的表达式语言 * OGNL是一种比EL强大很多倍的语言 * xwork 提供 OGNL表达式 OGNL 提供五大类功能 * 支持对象方法调用,如xxx.doSomeSpecial(); * 支持类静态的方法调用和值访问 * 访问OGNL上下文(OGNL context)和ActionContext; (重点 操作ValueStack值栈 ) * 支持赋值操作和表达式串联 * 操作集合对象。 值栈 * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据。从值栈中获取到数据。 * ValueStack 是 struts2 提供一个接口,实现类 OgnlValueStack ---- 值栈对象 (OGNL是从值栈中获取数据的 ) * Action是多例的,有一起请求,创建Action实例,创建一个ActionContext对象,代表的是Action的上下文对象,还会创建一个ValueStack对象。线程安全的 * 每个Action实例都有一个ValueStack对象 (一个请求 对应 一个ValueStack对象 ) * 在其中保存当前Action 对象和其他相关对象 (值栈中 是有Action 引用的 ) * Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中,request中 (值栈对象 是 request一个属性) * ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack"); 值栈的内部结构 * 值栈由两部分组成 >root      -- Struts把动作和相关对象压入 ObjectStack 中--List >context   -- Struts把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中 * Struts 会把下面这些映射压入ContextMap中 >parameters: 该 Map 中包含当前请求的请求参数  ?name=xxx&password=123 >request: 该 Map 中包含当前 request 对象中的所有属性 >session: 该 Map 中包含当前 session 对象中的所有属性 >application:该 Map 中包含当前 application  对象中的所有属性 >attr: 该 Map 按如下顺序来检索某个属性: request, session, application * ValueStack中 存在root属性 (CompoundRoot) 、 context 属性 (OgnlContext ) >CompoundRoot 就是ArrayList >OgnlContext 就是 Map * context 对应Map 引入 root对象 >context中还存在 request、 session、application、 attr、 parameters 对象引用 >OGNL表达式访问值栈中的数据 * 访问root中数据时 不需要 # * 访问 request、 session、application、 attr、 parameters 对象数据 必须写 # >操作值栈 默认指 操作 root 元素 值栈对象的创建 * 值栈对象是请求时创建的 * ActionContext是绑定到当前的线程上,那么在每个拦截器或者Action中获取到的ActionContext是同一个。 * ActionContext中存在一个Map集合,该Map集合和ValueStack的contextMap是同一个地址。 * ActionContext中可以获取到ValueStack的引用。 Action中获取值栈对象的三种方法 * ValueStack vs1 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack"); * ValueStack vs2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); * ValueStack vs3 = ActionContext.getContext().getValueStack(); 向值栈保存数据 向值栈保存数据,主要针对 root * 两种方式 valueStack.push(Object obj); * push方法的底层调用root对象的push方法(把元素添加到0位置) valueStack.set(String key, Object obj); * 源码获取map集合(map有可能是已经存在的,有可能是新创建的),把map集合push到栈中,再把数据存入到map集合中。 在jsp中 通过 查看值栈的内容 *属性驱动方式: 当ActionContext中提供了一个JavaBean的get方法,就能不将这个JavaBean放到值栈中而取到这个值 这是因为值栈的中有ActionContext对象,可以通过这个对象取到JavaBean *模型驱动方式: 当Action中通过模型驱动获取到对象的时候,会将模型驱动中的对象压入值栈的root栈顶,所以此时可以获取到通过Action模型驱动封装的对象 EL 表达式获取值栈中的数据 * StrutsPreparedAndExecuteFilter的doFilter代码中 request = prepare.wrapRequest(request); 对Request对象进行了包装 ,StrutsRequestWrapper 增强了request的 getAttribute Object attribute = super.getAttribute(s); if (attribute == null) { attribute = stack.findValue(s); } 访问request范围的数据时,如果数据找不到,去值栈中找 request对象 具备访问值栈数据的能力 (查找root的数据) 在JSP页面中获取值栈中的值 具体在Struts2中怎么使用呢?如下步骤: * 需要先引入Struts2的标签库 <%@ taglib prefix="s" uri="/struts-tags" %> * 使用Struts2提供的标签中的标签 在JSP页面使用OGNL表达式 * 访问对象方法: * 访问对象的静态方法: >struts2中静态方法访问被禁止的.开启一个常量. >在页面中: 使用OGNL表达式获取值栈中的数据 # 符号 %号 强制字符串解析成OGNL表达式。 例如:在request域中存入值,然后在文本框()中取值,现在到value上。 { }中值用""引起来,此时不再是ognl表达式,而是普通的字符串 例如:

深入解析Struts2.xml:核心配置文件入门指南的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、深入解析Struts2.xml:核心配置文件入门指南的信息别忘了在本站进行查找哦。

用户评论

君临臣

我一直想学习一下Strut2,这个文档看起来很有帮助!

    有5位网友表示赞同!

蝶恋花╮

配置XML文件确实容易让人头疼,希望这篇文章能讲清楚。

    有5位网友表示赞同!

可儿

我经常遇到Struts2配置文件的问题,希望能解答我的疑惑!

    有18位网友表示赞同!

﹏櫻之舞﹏

刚开始学web开发,现在就开始学习Strut2的配置文件,好基础!

    有17位网友表示赞同!

久爱不厌

感觉学习Struts2配置文件需要一点时间和耐心,但值得一试!

    有18位网友表示赞同!

丢了爱情i

我有一个问题关于Struts2.xml文件,想看看讨论区有没有解答。

    有11位网友表示赞同!

初阳

分享一下你的经验吧!Strut2的XML配置真的很复杂有时。

    有20位网友表示赞同!

别伤我i

期待看到详细的示例代码!理解配置文件需要实际操作。

    有16位网友表示赞同!

万象皆为过客

我最近在使用Struts2开发一个项目,这篇文章太timely了!

    有9位网友表示赞同!

几妆痕

终于找到了关于Struts2.xml的入門指南!

    有7位网友表示赞同!

雪花ミ飞舞

看来配置Struts2可以分为很多部分,这篇文章很系统。

    有5位网友表示赞同!

浅巷°

好文章啊!我以前一直用网上查找资料,这种专著式的讲解更清晰。

    有20位网友表示赞同!

咆哮

期待更多有关Struts2的教程!这个框架真的很强大。

    有20位网友表示赞同!

汐颜兮梦ヘ

希望这篇文章能介绍一些常用的配置项,方便参考使用。

    有14位网友表示赞同!

(り。薆情海

现在看一些教程都是面向开发经验丰富的同学,像这种入门指南非常棒!

    有14位网友表示赞同!

_心抽搐到严重畸形っ°

学习Struts2配置文件是为了更好地理解web应用的架构设计吧?

    有11位网友表示赞同!

抓不住i

分享一下你使用的 Struts2 版本和环境配置!

    有13位网友表示赞同!

墨染天下

感谢作者分享文章!这份手册一定能帮到很多初学者!

    有5位网友表示赞同!

半梦半醒半疯癫

这篇文章很适合我!我的Struts框架学习刚开始。

    有12位网友表示赞同!

々爱被冰凝固ゝ

我一直在寻找一个简单易懂的Struts2.xml教程,谢谢分享!

    有17位网友表示赞同!

【深入解析Struts2.xml:核心配置文件入门指南】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活