Struts2

Struts2的核心配置

Action的创建与配置

action是Struts2的核心

Action的创建

  1. 使用一个普通的类;
  2. 实现Action接口;
  3. 继承ActionSupport类;

Action的配置

  1. 基础方式(易产生大量冗余);
  2. DMI(多个action产生一个结果,过于死板);
  3. 通配符(较为灵活,需要提前设计好相关参数名);

Action接收请求参数

  1. 使用action属性直接接收(不利于model和control的分离);
  2. 使用DomainModel(实体)接收(借助Bean,但form中input的name必须指明action中bean类的对象);
  3. 使用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表达式存取数据的地方,值栈和请求一一对应,保证线程安全地为每个请求提供公共数据的存取服务
    1. 作用
      作为数据中转站,用于前台和后台之间的传递数据
    2. 生命周期
      与Action的生命周期一致
    3. 值栈的获取方式
      ①在request中获取值栈
    ValueStack stack =(ValueStack)ServletActionContext.getRequest()
        .getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
    
    ②在ActionContext中获取值栈
    ValueStack valueStack = ActionContext.getContext().getValueStack();
    

    值栈的内部结构

    valueStack对像的内部有一下两个逻辑部分:
    1. ObjectStack(对象栈):是CompoundRoot类型,用ArrayList定义,Struts2将动作和相关对象压入;
    2. ConextMap(Map栈):是OgnlContext类型,是Map集合,压入映射关系;

    值栈的应用

    Struts2引入值栈的目的是 解决Action和页面之间的数据交换
    两种交换方式:
    1. 属性驱动:Action对象的属性对象会被直接压入ValueStack中;
    2. 模型驱动:实现ModelDriver接口,ModelDriverIntercept拦截器生效,将model对象压入ValueStack;

文件上传和下载

文件上传

文件下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值