struts2相关提纲
Struts2的核心配置Action的创建与配置Action的创建Action的配置
Action接收请求参数Result结果类型
Struts2的类型转换内置的类型转换器自定义类型转换器
Struts2的拦截器拦截器的配置内置拦截器自定义拦截器
Struts标签控制标签数据标签表单标签非表单标签Struts2的模板和主题
OGNL表达式和值栈OGNL表达式OGNL访问对象方法和静态方法值栈值栈的内部结构值栈的应用
文件上传和下载文件上传文件下载
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
>
拦截器栈
<interceptors
>
<interceptor
-stack name
="interceptorStackName">
<interceptor
-ref name
="defaultStack"/>
<interceptor
-ref name
="interceptorName"/>
</interceptor
-stack
>
</interceptors
>
拦截器栈中必须引入内置拦截器栈DefaultStack!默认拦截器 默认拦截器可以对其指定的包中所有的Action起到拦截作用! 但Action显式的指定某个拦截器后,默认拦截器将被覆盖!! 默认拦截器可以是拦截器也可以是拦截器栈
<package name
="......" namespace
="...." extends=".......">
<default-interceptor
-ref name
="defaultInterceptorName'
/>
</package>
内置拦截器
懵,这是个啥,要用吗,天呐怎么这么多
自定义拦截器
实现Intercepor接口;继承AbstractIntercept类;
public String
myIntercept(ActionInvocation invocation
) throw Exception
{
ActionContext actionContext
= invocation
.getInvocationContext();
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中获取值栈 ValueStack stack
=(ValueStack
)ServletActionContext
.getRequest()
.getAttribute(ServletActionContext
.STRUTS_VALUESTACK_KEY);
②在ActionContext中获取值栈ValueStack valueStack
= ActionContext
.getContext().getValueStack();
值栈的内部结构
valueStack对像的内部有一下两个逻辑部分:
ObjectStack(对象栈):是CompoundRoot类型,用ArrayList定义,Struts2将动作和相关对象压入;ConextMap(Map栈):是OgnlContext类型,是Map集合,压入映射关系;
值栈的应用
Struts2引入值栈的目的是 解决Action和页面之间的数据交换 两种交换方式:
属性驱动:Action对象的属性对象会被直接压入ValueStack中;模型驱动:实现ModelDriver接口,ModelDriverIntercept拦截器生效,将model对象压入ValueStack;
文件上传和下载
文件上传
文件下载