Struts2

    xiaoxiao2022-07-06  215

    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类;/** *以控制用户登录的拦截器为例 */ //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中获取值栈 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;

    文件上传和下载

    文件上传

    文件下载

    最新回复(0)