拦截器的作用介绍:
拦截器本质上和servlet的过滤器是一样的,在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦截器
拦截器执行顺序学习:
在struts.xml文件中,<intercepto-ref/>
中先引用的先执行,后引用的后执行,如果某个拦截器出错或不允许通过,那么下一个拦截器是不允许执行的,需要拦截哪个Action,就在哪个Action对应的<action>
标签中配置即可
在部署web应用时,拦截器的空参构造方法和init()方法各执行一次,每次请求时intercept()方法都会执行一次
声明一个拦截器:
<pacakge > <interceptors> <interceptor name="LoginInterceptor" class="interceptor.LoginInterceptor"></interceptor> </interceptors> <action ></action></package>注意:这里interceptors与action标签同级,其中class对应拦截器的全路径,name对应拦截器的名称,这个可以自己随便定义,建议与类名相同,此名称要唯一
引用一个拦截器:
<action> <!-- 引用自定义的拦截器 --> <interceptor-ref name="LoginInterceptor"></interceptor-ref> <action>声明一个拦截器栈:
<interceptors> <interceptor name="LoginInterceptor" class="interceptor.LoginInterceptor"></interceptor> <interceptor-stack name="amosStack"> <interceptor-ref name="LoginInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack></interceptors>引用一个拦截器栈:
<!-- 引用自定义的拦截器栈 --><interceptor-ref name="amosStack"></interceptor-ref>自定义一个拦截器的学习:
方法一(实现Interceptor接口):
void init():初始化拦截器所需要的资源void destory():释放init()中分配额资源String intercept(ActionInvocation ai) throws Exception:实现拦截器功能(利用ActionInvocation参数获取Action状态,返回result字符串作为逻辑视图)方法二(继承AbstractInterceptor类):
提供了inti()和destory()方法的空实现只需要实现intercept()方法即可推荐的参考博客学习:
使用struts2中默认的拦截器以及自定义拦截器: http://www.cnblogs.com/Ant-soldier/p/5490035.html
首先参考一下这个博客:
Struts2处理结果类型: http://blog.csdn.net/u014033756/article/details/50225981
Struts2中input类型学习:
struts2中“input”
代表输入页面,什么意思呢?就是当表单进行提交的时候或者是页面录入的时候,对表单进行验证,出现错误或者是类型转换(比如在年龄的文本框中填写除数字外的其他字符)错误就返回到输入页,所以用input做代表!!!!
输入验证错误,显示错误信息有两种方式:
public String login(){ if(user.getUsername()==null||"".equals(user.getUsername())){ this.addFieldError("username", "can not null"); //(1) return INPUT; } return SUCCESS;}//在jsp中使用:<s:fielderror name="username"></s:fielderror>可以获得(1)的内容@Overridepublic void validate() { if(user.getUsername()==null||"".equals(user.getUsername())){ this.addFieldError("username", "can not null"); //return INPUT;重写validate方法,不用写返回值INPUT! } super.validate();}国际化信息作用域包括:全局范围,包范围和Action范围
全局范围的国际化信息:
新建web项目,在src目录目录下添加PRoperties文件, 如:book_zh_CN.properties
和book_en_US.properties
,这两个文件分别表示实现中国大陆和美国英语语言的国际化
资源文件的命名格式如下:
baseName_language_country.propertiesbaseName_language.propertiesbaseName.properties其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家,如:中国大陆:baseName_zh_CN.properties 美国:baseName_en_US.properties现在为应用添加两个资源文件添加内容,(在properties文件中,信息以key-value的方式编写):
第一个存放中文:tzb_zh_CN.properties,内容为:title = 这是一个中文的配置文件第二个存放英语:tzb_en_US.properties,内容为:title = English properties对于中文的属性文件,我们编写后,应该使用jdk提供的native2ascii命令把文件转换成unicode编码的文件,命令的使用方式如下:native2ascii 源文件.properties 目标文件.properties
配置国际化文件,在struts.xml文件中配置全局变量,代码如下:
<constant name="struts.custom.i18n.resources" value="tzb">在jsp页面中使用<s:text name="title"></s:text>
输出tzb_zn_CN.properties
文件中的内容,需要导入struts2标签包:<%@ taglib uri="/struts-tags" prefix="s"%>
在Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用户指定资源文件中的key:
ActionContext.getContext().put("message",this.getText("title"));JSP页面EL表单式输出:${message}输出含占位符国际化信息:
占位符输出:将tzb_zh_CN.properties
的title节点的值改成:{0},中文页面,{1} 定义两个占位符
,然后在jsp页面给占位符赋值:
在action类中设置占位符的值以及输出输出国际化资源文件信息:
ActionContext.getContext().put("message",this.getText("title",new String[]{"小唐","欢迎您"}));包范围的国际化资源文件:
在java的包下放置package_language_country.properties
资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源
例如:package_zh_CN.properties
,注意这个包值的是java类包,不是struts.xml定义的那个包, 把这个package_zh_CN.properties
放在cn.tzb.action下,即包范围的国际化资源文件
当查找指定key的消息时,系统会先从package资源文件(例:cn.tzb.action)层次查找,当找不到对于的key时,才会从常量struts.custom.i18n.resources(全局资源文件)指定的资源文件中寻找
Action范围国际化资源文件:
我们可以为某个action单独指定资源文件,方法如下:
在action类所在的路径,放置actionClassName_language_country.properties
资源文件,actionClassName为action类的简单名称
当查找指定key时,系统会先从actionClassName_language_country.properties
资源文件查找,如果没有找到对应的key,然后沿着当前包往上找,一直找到顶层包,如果仍未找到,才会从常量struts.custom.i18n.resources(全局资源文件)指定的资源文件中寻找
Jsp中直接访问某个资源文件:
Strut2为我们提供了< s:i18n>
标签,使用这个标签我们可以再类路径下直接从某个资源文件中获取国际化数据,而无需任何配置
新闻热点
疑难解答