这篇文章给大家聊聊关于深入解析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:核心配置文件入门指南的信息别忘了在本站进行查找哦。
【深入解析Struts2.xml:核心配置文件入门指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直想学习一下Strut2,这个文档看起来很有帮助!
有5位网友表示赞同!
配置XML文件确实容易让人头疼,希望这篇文章能讲清楚。
有5位网友表示赞同!
我经常遇到Struts2配置文件的问题,希望能解答我的疑惑!
有18位网友表示赞同!
刚开始学web开发,现在就开始学习Strut2的配置文件,好基础!
有17位网友表示赞同!
感觉学习Struts2配置文件需要一点时间和耐心,但值得一试!
有18位网友表示赞同!
我有一个问题关于Struts2.xml文件,想看看讨论区有没有解答。
有11位网友表示赞同!
分享一下你的经验吧!Strut2的XML配置真的很复杂有时。
有20位网友表示赞同!
期待看到详细的示例代码!理解配置文件需要实际操作。
有16位网友表示赞同!
我最近在使用Struts2开发一个项目,这篇文章太timely了!
有9位网友表示赞同!
终于找到了关于Struts2.xml的入門指南!
有7位网友表示赞同!
看来配置Struts2可以分为很多部分,这篇文章很系统。
有5位网友表示赞同!
好文章啊!我以前一直用网上查找资料,这种专著式的讲解更清晰。
有20位网友表示赞同!
期待更多有关Struts2的教程!这个框架真的很强大。
有20位网友表示赞同!
希望这篇文章能介绍一些常用的配置项,方便参考使用。
有14位网友表示赞同!
现在看一些教程都是面向开发经验丰富的同学,像这种入门指南非常棒!
有14位网友表示赞同!
学习Struts2配置文件是为了更好地理解web应用的架构设计吧?
有11位网友表示赞同!
分享一下你使用的 Struts2 版本和环境配置!
有13位网友表示赞同!
感谢作者分享文章!这份手册一定能帮到很多初学者!
有5位网友表示赞同!
这篇文章很适合我!我的Struts框架学习刚开始。
有12位网友表示赞同!
我一直在寻找一个简单易懂的Struts2.xml教程,谢谢分享!
有17位网友表示赞同!