浅谈Struts2(三)
一、Struts2收集client的参数
核心思路:
<form method="post" action="XXXX">
<input type="text" name="username"/>
<input type="text" name="password"/> <input type="text" name="user.age"/> <input type="checkbox" name="hobby"/>
<input type="submit" value="ok"/>
</form>
html/jsp通过form表单提交数据。
//代码仅为示例
public class FirstServlet implements Action{
private User user;
private String username;
private String password; private String[] hobby;
public void setUsername(String username){
this.username = username;
}
public String getUsername(){
return this.username;
}
...
}
在Action中声明成员变量同时声明get、set方法,成员变量的名字跟html/jsp要传递的数据名保持一致。
在这种情况下,struts2会自动将client传递的数据写入到所跳转Action中对应的成员变量中,既可以自动写简单数据,也可以写入复杂数据(对象、数组、集合)。
好处:
a、简单,方便。
b、自动把提交的数据进行类型转换。
c、自动对post中提交的中文进行转码处理(只针对UTF-8格式)。
二、Struts2的动态方法调用
1、Action的第二种开发形式
之前是通过implements Action接口来开发我们自己的Action的,其实更好的方法是extends ActionSupport类来开发我们的Action。
ActionSupport类实现了Action接口,并且提供了execute()方法的空实现,并返回了"success"。
用这种方法的好处是为了动态方法的调用。
2、DMI(Dynamic Method Invoke)动态方法调用
作用:可以在一个Action中提供多个方法,减少系统中Action的数量,便于管理与维护。
java代码:
public class UserAction extends ActionSupport{
public String addUser(){
System.out.println("----this is addUser method----");
return "addUser";
}
public String delUser(){
System.out.println("----this is delUser method----");
return "delUser";
}
public String modifyUser(){
System.out.println("----this is modifyUser method----");
return "modifyUser";
}
}
struts.xml配置:
<action name="user_*" class="com.liquidxu.struts2.UserAction" method="{1}">
<result name="addUser">/result.jsp</result>
<result name="delUser">/result.jsp</result>
<result name="modifyUser">/result.jsp</result>
</action>
访问http://localhost:8080/struts_app/user_addUser,其中的addUser为所访问的Action中的方法名(必须保持一致),并且填充了配置文件中的{1}和*。
二、Struts2的数据处理机制
1、OGNL表达式
OGNL表达式是一种获取数据的技术。是一个独立的技术组件,不属于struts2框架,只是被struts2借用。
2、ValueStack(值栈)
作用:管理(储存)一次请求中,所涉及的数据(client提交的数据+作用域中的数据request、session、application)。
好处:与视图层解耦和。
a、ValueStack的获取方式
ActionContext ctx = ActionContext.getContext();
ps、ValueStack的生命周期为一个请求有效(等同于request作用域),换请求,值栈也会随之改变。
b、ValueStack的内存结构

ValueStack分为两个区域,root区和contextMap区。root区主要存当前访问的Action和标签处理的临时结果,contextMap区默认存有四部分内容,分别存有request、session、application作用域和parameters(client请求数据)。可以通过上图右侧的代码示例来从contextMap区中取值。
3、值栈的灵活应用
a、使用Action的成员变量替换request作用域(间接用值栈的root区)。
因为值栈root区储存有当前访问的Action,所以如果需要用request作用域储存的数据,直接储存在当前Action的成员变量,然后在view层利用OGNL表达式从root区取出即可。
b、值栈操作的封装
值栈的操作时颇为麻烦的,每次都需要做许多重复的操作,所以应该做如下封装:
public class BaseAction extends ActionSupport{
private ValueStack vs;
public BaseAction(){
ActionContext ctx = ActionContext.getContext();
vs = ctx.getValueStack();
}
public void setSessionAttribute(String name,Object value){
vs.setValue("#session."+name,value);
}
public Object getSessionAttribute(String name){
return vs.findValue("#session."+name);
}
public void setApplicationAttribute(Stirng name,Object value){
vs.setValue("#application."+name,value);
}
public Object getApplicationAttribute(String name){
return vs.findValue("#application."+name);
}
}
再编写我们自己的Action的时候,就不再extends ActionSupport了,而是继承我们所封装的BaseAction。这样的话,在Action中进行值栈操作的时候就会方便很多。
4、Struts2的标签
<%@taglib uri="/struts-tags" prefix="s">
作用:在jsp页面中,负责显示数据。使用标签替换java脚本。
a、单个数据显示
<s:property value="OGNL表达式"/>
b、有条件显示数据
<s:if test="OGNL表达式">
XXX
</s:if>
<s:elseif test="OGNL表达式">
XXX
</s:elseif>
c、显示多个数据
(1)遍历集合、数组
<s:iterator value="OGNL表达式">
<s:property />
</s:iterator>
(2)遍历map
<s:iterator value="OGNL表达式">
<s:property value="key"/><s:property value="value">
</s:iterator>
(3)遍历状态
<s:iterator value="OGNL表达式" status="sta">
#sta.count //当前遍历次数
#sta.index //获得当前遍历下标
#sta.even //当前是否为偶次遍历
#sta.odd //当前是否为奇次遍历
</s:iterator>
<s:iterator value="OGNL表达式" begin="起始遍历下标" end="结束遍历下标" step="步长">
<s/iterator>
d、<s:date name="ONGL表达式" format="yyyy-MM-dd"/> 处理日期类型
e、<s:url context="${pageContext.request.request.contextPah}(动态获取项目名称)"/>处理url链接
(1)访问Action的处理
<s:url namespace="" action="" />
(2)访问其他资源(css、jsp)
<s:url value="资源的路径"/>
f、<s:action />把多个Action的处理结果,进行汇总。
浅谈Struts2(三)的更多相关文章
- 浅谈struts2之chain
转自:http://blog.csdn.net/randomnet/article/details/8656759 前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说, ...
- 浅谈C++三种传参方式
浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...
- 浅谈 Struts2 面试题收藏
Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ...
- 浅谈Struts2拦截器的原理与实现
拦截器与过滤器 拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...
- [SSH 2] 以网站主页面浅谈Struts2配置
导读:前面总体的介绍了一下SSH框架,那么作为Struts这一支,具体是怎么配置的呢?本篇博客则主要是以自己做过的实例中的登录一条线,简单介绍一下struts2的配置,如有不妥之处,还请大家多提点提点 ...
- 浅谈Struts2(一)
一.Struts2引言 1.Struts2框架的概念 解决的MVC开发过程中,控制器(Controller)的通用问题. a.什么是MVC开发 MVC开发是一种编程思想,由设计者人为的把一个项目,划分 ...
- 浅谈struts2的国际化----i18n
可能大家在使用struts框架的时候,偶尔会看到这个词: i18n.也就是 Internationalization i 开头,n 结尾. 总共18个字母,今天的主要内容就是环绕这 四个字母. ...
- 浅谈Struts2
学过SSH框架很长一段时间了,一直没有很系统的总结一下,这里先简单谈谈Struts2. 为什么要用Struts2? 这里列举一些Servlet的缺点: 1.每写一个servlet在web.xml中都要 ...
- 小学生之浅谈Struts2与struts1的运行机制
Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...
随机推荐
- HDU 4308 BFS Saving Princess claire_
原题直通车:HDU 4308 Saving Princess claire_ 分析: 两次BFS分别找出‘Y’.‘C’到达最近的‘P’的最小消耗.再算出‘Y’到‘C’的最小消耗,比较出最小值 代码: ...
- Hotel(线段树合并)
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 14958 Accepted: 6450 Descriptio ...
- 兔子--Android中的五大布局
LinearLayout:被称为线性布局,分为水平和垂直,设置的垂直或水平的属性值,来排列全部的子元素.全部的子元素都被堆放在其他元素之后,因此一个垂直列表的每一行仅仅会有一个元素,而无论他们有多宽, ...
- 前端模块与CMS结合
前端模块与CMS结合 在<FIS官方技术群>经常看到一些讨论,这次是 前端组件化与CMS的相关讨论,主要观点来自群里 漂流瓶(张云龙前辈). CMS是运营人员直接操作,我们往往需求各种各样 ...
- ORACLE恢复误删除的对象(表、存储过程等)
1.恢复存储过程 原理就是利用了oracle里所有的存储过程的源代码都是存在dba_source里,而drop某个存储过程的时候,oracle这里肯定要去dba_source里把相关的源代码给dele ...
- WCF遇到Oracle问题
解决 选中下图中对网站和项目使用IIS….64位版
- TinyFox 部署在CentOS7 中测试使用
一:TinyFox介绍 TinyFox 是一款支持OWIN标准的WEB应用的高性能的HTTP服务器,是Jexus Web Server的"姊妹篇".TinyFox本身的功能是htm ...
- 一篇入门的php Class 文章
刚在大略浏览了一下首页更新的那篇有关Class的文章(指PHPE的那篇 http://www.phpe.net/articles/389.shtml ),很不错,建议看看. 对类的摸索--俺用了半年 ...
- Mac 10.7.*安装XCode3.2.6的方法
1.首先,在Xcode 3.2.6的磁盘映像(dmg文件)上点击右键,选择“磁盘工具”打开,如图1所示,转换成一个可读写的dmg文件,如图2所示. 图1 图2 转换好后双击它,让它在Finder里面显 ...
- 网络技术教程笔记(18)常见广域网技术——X.25与郑中基技术(←_←搜狗输入法你够了)
广域网与接入网技术 广域网与接入网技术 常见广域网技术--X.25 产生背景 尽管在当时,苹果二代计算机已经取得了很大的成功,但是PC和工作站却没有流行,也没有获得很多的网络支持,大多数人还是使用便宜 ...