struts2相关提纲
Struts2的核心配置
Action的创建与配置
action是Struts2的核心
Action的创建
- 使用一个普通的类;
- 实现Action接口;
- 继承ActionSupport类;
Action的配置
- 基础方式(易产生大量冗余);
- DMI(多个action产生一个结果,过于死板);
- 通配符(较为灵活,需要提前设计好相关参数名);
Action接收请求参数
- 使用action属性直接接收(不利于model和control的分离);
- 使用DomainModel(实体)接收(借助Bean,但form中input的name必须指明action中bean类的对象);
- 使用ModelDriver接口(借助Bean,必须实现getModel()方法注意返回值);
Result结果类型
<result type="?">
- dispatcher类型(转发 jsp页面 相当于forword());
- redirect类型(重定向 jsp页面和action都可以 相当于SendRedirect());
Struts2的类型转换
内置的类型转换器
借助Model类,使用ModelDriver接口,在Model获取参数时,隐式地转换数据类型;
自定义类型转换器
此部分尚未学习,改天补上!!!
Struts2的拦截器
拦截器的配置
- 拦截器
以<interceptor>
开头,以</interceptor>
结束<interceptor name="interceptorName" class="interceptorClass"> <param name="paraName>paraValue</param> </interceptor>
- 拦截器栈
拦截器栈中必须引入内置拦截器栈DefaultStack!<interceptors> <interceptor-stack name="interceptorStackName"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="interceptorName"/> </interceptor-stack> </interceptors>
- 默认拦截器
默认拦截器可以对其指定的包中所有的Action起到拦截作用!
但Action显式的指定某个拦截器后,默认拦截器将被覆盖!!
默认拦截器可以是拦截器也可以是拦截器栈<package name="......" namespace="...." extends="......."> <default-interceptor-ref name="defaultInterceptorName'/> </package>
内置拦截器
懵,这是个啥,要用吗,天呐怎么这么多
自定义拦截器
- 实现Intercepor接口;
- 继承AbstractIntercept类;
/** *以控制用户登录的拦截器为例 */ //ActionInvocation为被拦截的Action的引用,通过该参数的invoke()的方法将控制权向下传递 public String myIntercept(ActionInvocation invocation) throw Exception{ // 得到ActionContext ActionContext actionContext = invocation.getInvocationContext(); // 获取Model(Bean)对象 Object user =actionContext.getSession().get("user"); if(user!=null) return invocation.invoke(); else { actionContext.put("message","please login first!"); return Action.LOGIN; }
Struts标签
两大类:普通标签和UI标签
普通标签:控制标签、数据标签
UI标签:表单标签、非表单标签、Ajax标签
控制标签
<s:if><s:elseif><s:else>
类似if、else if、else
<s:iterator>
用于对集合数组进行迭代
数据标签
<s:property>
输出指定的值
<s:a>
构造超链接,用法类似<a>
标签
<s:debug>
用于调试时输出更多信息
<s:include>
用于在当前页面包含另一个页面
<s:param>
通常和其他标签联合使用,主要为其他标签提供参数
表单标签
<s:form>
action属性指定提交地action时,不用.action后缀
<s:submit>
类似submit
<s:textfield>和<s:textarea>
一般仅指定其 label和name属性
<s:password>
maxlength属性指定最大输入字符个数
<s:radio>
创建单选按钮 list属性:生成集合;
<s:checkbox>
创建复选框 value值为“假值”表示选择状态;fieldValue为“真值”
<s:checkboxlist>
创建一组复选框(0个/多个)
<s:select>
创建一个下拉列表
<s:optgroup>
与select连用使下拉列表包含多个选项组
<s:file>
创建一个文件选择框
<s:hidden>
创建隐藏表单元素
<s:reset>
创建一个重置按钮
非表单标签
<s:actionerror>
返回action实例的getActionError()返回的错误
<s:actionmessage>
返回action实例的getActionMessage()返回的系列消息
<s:fielderror>
返回action实例存在表单域的类型转换错误、校验错误
Struts2的模板和主题
- simple主题
最简单的主题,每个UI只产生最基本的HTML元素,没有任何附加功能 - xhtml主题
默认主题对simple主题进行了扩展 - css_xhtml主题
对xhtml主题的扩展,添加了对css的支持和扩展 - Ajax主题
继承自xhtml,提供Ajax支持
OGNL表达式和值栈
OGNL表达式
OGNL全称为对象图导航语言(Object-Graph Navigation Language),是一种功能强大的开源表达式语言。可以用于存取java对象的属性、调用java对象的方法、自动实现类型转换。
三要素:表达式(Expression)、根对象(Root Object)、上下文环境(Context)
- 表达式
OGNL的getValue()方法中有两个参数,第一个是表达式(表达做什么),第二个是有语法含义的字符串(操作的类型和操作的内容) - 根对象
即上文第二个参数,表达了对谁做 - Context对象
表达了在哪里进行
OGNL访问对象方法和静态方法
- 访问对象方法
Ognl.getValue(“方法名”,对象名);(PS:将方法名替换为属性名即可实现访问对象属性!) - 访问静态方法
静态方法的访问支持默认是关闭的,在struts.xml文件中输入一下代码开启@类的全路径名@方法名(参数列表) @类的全路径名@属性名称
<constant name="struts.ognl.allowStaticMethodAccess" value="true"> </constant>
值栈
值栈就是OGNL表达式存取数据的地方,值栈和请求一一对应,保证线程安全地为每个请求提供公共数据的存取服务- 作用
作为数据中转站,用于前台和后台之间的传递数据 - 生命周期
与Action的生命周期一致 - 值栈的获取方式
①在request中获取值栈
②在ActionContext中获取值栈ValueStack stack =(ValueStack)ServletActionContext.getRequest() .getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
ValueStack valueStack = ActionContext.getContext().getValueStack();
值栈的内部结构
valueStack对像的内部有一下两个逻辑部分:- ObjectStack(对象栈):是CompoundRoot类型,用ArrayList定义,Struts2将动作和相关对象压入;
- ConextMap(Map栈):是OgnlContext类型,是Map集合,压入映射关系;
值栈的应用
Struts2引入值栈的目的是 解决Action和页面之间的数据交换
两种交换方式:- 属性驱动:Action对象的属性对象会被直接压入ValueStack中;
- 模型驱动:实现ModelDriver接口,ModelDriverIntercept拦截器生效,将model对象压入ValueStack;
- 作用