一、interceptor拦截器
1、自定义拦截器
public class Cus_Emp_Interceptor implements Interceptor {
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
Customer customer = (Customer) ServletActionContext.getRequest().getSession().getAttribute("customer");
Employee employee = (Employee) ServletActionContext.getRequest().getSession().getAttribute("employee");
if(customer==null){
return "login";//对应配置文件的<result name="login" 
}
return invocation.invoke();
}
}
2、声明拦截器
<package name="autoInterceptor" namespace="/" extends="struts-default">
<interceptors>
<!-- 1、声明拦截器 (可以多个)-->
<interceptor name="myInterceptor" class="struts2.interceptor.MyInterceptor">
<!-- 传递参数给action -->
<param name="aa">aaaa</param>
</interceptor>
<!-- 2、配置拦截器栈-->
<interceptor-stack name="mystack">
<!-- 先继承默认的拦截器栈,再实现自己的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 3、配置默认的拦截器栈为自定义的-->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<action name="interceptorAction_*" method="{1}" class="struts2.interceptor.InterceptorAction">
<result name="login" type="redirectAction">customerAction_login.action</result>
</action>
</package>

struts2中的拦截器
*拦截器:继承Interceptor接口的一个类
*拦截器栈:多个拦截器的组合
*拦截器可以栈中有栈
*struts2容器中默认加载的就是整个栈
<default-interceptor-ref name="defaultStack"/>
*先执行拦截器后执行action,要执行action,拦截器必须返回:return invocation.invoke();
*在配置文件中,将声明中的参数传递到拦截器类中
*声明拦截器中有<param name="">...</param>
*则拦截器类中必须要对应属性,并且有set和get方法
*各拦截器按照声明顺序执行

*继承MethodFilterInterceptor

这个类叫做方法过滤拦截器,这个类继承自AbstractInterceptor,并且提供了一种机制,

即可以指定对Action中某些方法进行拦截或者是不拦截,所谓拦截不拦截,指的就是拦

截器中的intercept()方法是否被执行了,若没有执行,就是没有拦截,若执行了,就是拦截了。

  1. 拦截器类:
  2. package com.suo.interceptor;
  3. import com.opensymphony.xwork2.ActionInvocation;
  4. import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
  5. import com.suo.listeners.BeforeResultListener;
  6. public class MyInterceptor3 extends MethodFilterInterceptor {
  7. @Override
  8. protected String doIntercept(ActionInvocation invocation) throws Exception {
  9. System.out.println("before MyInterceptor3 invoke !");
  10. String result=invocation.invoke();
  11. System.out.println("after MyInterceptor3 invoke !");
  12. return result;
  13. }
  14. }

配置文件

    1. <action name="action1" class="com.suo.actions.Action1" method="myExecute">
    2. <result name="success" type="chain">
    3. <param name="actionName">action2</param>
    4. </result>
    5. <interceptor-ref name="myInterceptor3">
    6. <param name="includeMethods">myExecute</param>
    7. <param name="excludeMethods">execute</param><!--对myExecute进行拦截,对execute不拦截-->
    8. </interceptor-ref>
    9. </action>

二、struts2获取表单数据,有三种方法
1、较原始,也是较实用的方法
*action中声明属性对象(可以多个),并覆盖setter和getter
*前台不变,如果多个对象时,对象引用名.属性名
2、属性驱动ParamDriver
*在action中设置属性,属性的名称和页面表单中的name属性的名称保持一致
*在action中的属性,必须有set和get方法
*好处:这样设计可以保证action与servlet容器松耦合
 
原理:*action中的属性,运行的时候存在于对象栈中
  *ParamInterceptor拦截器拦截到参数,通过ValueStack的setValue(key,value)方法
将值设置到对象栈中

3、模型驱动ModelDriver
*如果页面表单内容很多,action中就需要很多属性和set/get放,这样比较繁琐
*解决方法:采用javabean
*让action实现ModelDriver
*ModelDriverInterceptor拦截到该action,调用其getModel方法,将model属性的值放到栈顶
*利用ParameterInterceptor完成从页面到model的赋值
其中是利用valueStack.setValue方法给model对象中的属性赋值(还没找到该源代码)

三、token:struts2已经实现了token,防止表单重复提交的功能
 而defaultStack拦截器栈中没有实现拦截器,所以要加入
1、struts文件中配置<!-- 防止表单重复提交-->
<package name="token" extends="struts-default">
<interceptors>
<interceptor-stack name="tokenStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token">
 <!--<param name="includeMethods">save,update</param>-->
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="tokenStack"></default-interceptor-ref>
</package>
2、对应action中结果集配置<result name="invalid.token">WEB-INF/common/error.jsp</result>
3、编写error.jsp页面
4、在jsp表单中,写上<s:token></s:token>

四、validate表单验证
步骤:
1、在页面中用<s:fielderror></s:fielderror>,该标签必须写在form中
2、在action中写上validate方法
public void validate(){
}
3、在配置文件中
<result name="input"></reuslt>
input是固定写法,且必须要写
在第二步中,可以这样写
public void validateXxx(){ //Xxx为当前请求action的方法
//写验证
}

五、文件上传
步骤:
1、在页面中需要加
<s:form enctype="multipart/form-data">
multipart/form-data表示页面以二进制流的形式上传文件
2、在UplodateAction中
有个属性为file,该属性的名称和页面上的相应的name属性名称要一致
3、该File属性必须有set和get方法
4、把上传的文件传到指定的目录中
文件下载
1、在页面中需要加
<s:form enctype="multipart/form-data">
multipart/form-data表示页面以二进制流的形式下载文件
2、配置结果集
<!-- 下载结果集 -->
<result name="download" type="stream">
               <!--设置栈顶User对象中保存输入流的名称  -->
  <param name="inputName">InputStreamxxx</param>
  <!-- 配置响应头信息 -->
   <param name="contentType">application/x-msdownload</param>
  <param name="contentDisposition">attachment;filename="${filename}"</param>
  <!--  设置下载是缓存区的大小-->
 <param name="bufferSize">1024</param>
       </result>
六、类型转换:
原因:如果不做类型转换,action中的属性只能接受表单中一班数据(基本类型的数据)
 如果有日期类型、例如:页面上有数据,在后台要用list来接受,
 struts2默认就不支持,这时候需要类型转换
步骤:
1、在src下有一个配置文件xwork-convertion.properties
java.util.Date=cn.itcast.struts2.aciton.converter.DateCOnverter
key值代表转换后的类型,该类型在action中的属性中出现
value代表一个类,该类实现了转换的逻辑
2、写转化类 必须继承StrutsTypeConverter
public Object convertFromString(Map context.String[] values,Class toClass)
从表单转到action中
public String convertToString(Map context,

1、登陆用struts2的验证机制来做
2、添加防止表单重交
3、页面用struts2的ognl标签和UI标签

开发模式:走DebugInterceptor
token:谁用谁继承该配置

七、struts2统一错误处理
配置:需要写一个ErrorProcessor(将Exception放入栈顶)和error.jsp
<package name="struts-global-exception" extends="struts-default">
<global-results>
<result name="errHandler" type="chain">
<!--需要修改之处一-->
<param name="actionName">ErrorProcessor</param>
</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="errHandler" exception="java.lang.Exception">
</exception-mapping>
</global-exception-mappings>
<!--需要修改之处二->
<action name="ErrorProcessor" class="struts2.exception.ErrorProcessor">
<!--需要修改之处三-->
<result>WEB-INF/login/error.jsp</result>
</action>
</package>

第二种配置方法
1、struts.xml里面配置,并在对应的action中引用
<package name="error" extends="struts-default">
<global-results>
<result name="error">/WEB-INF/pages/process/commons/message.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
</package>
2、页面配置

<s:property value="exception.message"/>
   
附:上下文Context
1、ServletActionContext
建立Struts2与Servlet通信的借口
2、ActionContext
1、Action的上下文
2、可以根据AcgtionContext获取session,Appliction,ActionInvocation,ValueStack等跟action相关的内容
3、ActionInvocation
1、Struts2容器的上下文
2、必须通过其他方式产生,ActionContext.getActionInvocation

ObjectFactory与静态注入
1、ObjectFactory:对象工厂
struts2的action是需要产生对象
struts2中拦截器是需要创建的
struts2的各种结果集也需要创建对象
2、ObjectFactory中的各种方法
buildAction是用来创建interceptor
buildResult是用来创建结果集

静态注入:
静态:凡是在struts的xml文件中配置的bean,列如:
<bean type="com.opensmphony.xwork2.ObjectFactory" name="struts"
class="org.apache.struts2.impl.StrutsObjectFactory"/>
在服务器启动的时候就会加载,而且只加载一次,所以为静态
注入:StrutsObjectFactory就给纳入到struts2容器中,这样的现象为注入
应用:值栈的实现类也是通过静态注入改变的
<bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="struts"
class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory"/>

struts2的一些功能的更多相关文章

  1. Struts2的注解功能

    我们知道通常情况下,Struts2是通过struts.xml配置的.但是随着系统规模的加大我们需要配置的文件会比较大,虽然我们可以根据不同的系统功能将不同模块的配置文件单独书写,然后通过<inc ...

  2. 使用struts2进行登录功能的开发

    使用struts2进行登录功能的开发 一. 设计需求 使用idea和maven开发具有登录功能的web应用,java语言,使用struts2框架. 二. 设计步骤 1.使用idea创建maven应用, ...

  3. hibernate和struts2实现分页功能

    1.DAO层接口的设计,定义一个PersonDAO接口,里面声明了两个方法: public interface PersonDAO { public List<Person> queryB ...

  4. 学习Struts--Chap02:Struts2框架各个功能模块和程序执行流程的介绍

    1.Struts2的系统架构: 2.架构中不同Key的作用介绍: servlet Filters:过滤器链,client的全部请求都要经过Filter链的处理. Struts Core:Struts2 ...

  5. 从零打造在线网盘系统之Struts2框架核心功能全解析

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

  6. struts2,登录功能模块实现

    功能: ·UserLogin作为控制登录的Action,校验密码成功后记录session,可以选择记住登陆状态,登陆成功后自动跳转到登陆前的URL: ·UserLogout作为控制登录推出的Actio ...

  7. 2、使用Struts2实现登录功能(没有连接数据)

    1.创建如下的目录结构 2.在com.entity包下创建 package com.entity; /** * 用户类 * @author Holly老师 * */ public class User ...

  8. 使用反射模拟struts2属性注入功能

    1.在项目开发中,如果没有使用框架进行数据绑定与封装,则可能会写大量的类似下面的代码: String value=request.getParameter("v"); if(nul ...

  9. 深入struts2(二) ---stuts2长处和主要包、类功能

    1.1     Struts2 上节已讲.struts2在webwork基础发展起来的mvc框架.MVC框架相信一般码农都比較了解,这里不再重说. 在这里只对于一下struts1,struts2做了哪 ...

随机推荐

  1. Vmware 安装CentOS7时连不上网问题的解决

    在VmWare 上安装Centos7时,装好vmware后还是连不上网,通过查找资料原来是因为有线网卡没有激活,默认centos和redhat7都是不启用有线网卡的,要么手动开启,要么安装时直接启用! ...

  2. java基础——接口与抽象类的区别

    (1)首先接口和抽象类的设计目的就是不一样的.接口是对动作的抽象,而抽象类是对根源的抽象. (2)对于抽象类,一个类只能继承一个抽象类.但是一个类可以同时实现多个接口. (3)接口是公开的,里面不能有 ...

  3. Nuget使用备忘

    菜单:工具-库程序包管理器-管理解决方案的NuGet程序包,搜索,下载,安装 或者 工具-库程序包管理器-程序包管理器控制台,输入PM命令,如: install-package log4net 如果不 ...

  4. fei33423 工作 职场 格言

    对老板: 1.  老板不知道你做的事情(目标设定) 2.  老板要的是规划(对上报告), 自己给自己设定 金字塔四位下的目标,各种维度.如何细化. 2.1 明确老板期望 2.2 与老板达成共识 2.3 ...

  5. CentOS7 中使用 firewall-cmd 控制端口和端口转发

    0X00 firewalld 守护进程 firewall-cmd命令需要firewalld进程处于运行状态.我们可以使用systemctl status/start/stop/restart fire ...

  6. 【转】PCA for opencv

    对于PCA,一直都是有个概念,没有实际使用过,今天终于实际使用了一把,发现PCA还是挺神奇的. 在OPENCV中使用PCA非常简单,只要几条语句就可以了. 1.初始化数据 //每一行表示一个样本 Cv ...

  7. 每天一个linux命令(13):less命令

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  8. python入门:简单模拟登陆时UTF-8转换成GBK编码

    #!/usr/bin/env python # -*- coding:utf-8 -*- """ 给变量x赋值为字符串‘请输入用户名:’ 变量x_unicode的赋值等于 ...

  9. 如何用 CSS 和 D3 创作火焰动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xJdVxx 可交互视频 ...

  10. destoon 多表联合查询时出现解析错误,parse_str函数解析错误

    数据库前缀  wb_ 标签 ,调用文章时获取评论数量 <!--{php $tags=tag("table=article_24 a left join wb_comment_stat ...