struts2接触不是一天两天了,但是一直没有用它做什么项目,但老师确一直说它有很大的学习价值,所以还是把我学习到的东西给记录一下,记录的东西没有规律,只是给自己留个备份,

  struts2中最关键的是action,action可以用来传值,用起来很方便,它可以用el表达式在jsp页面上展示出来,也可以用ognl,el只能表达作用域里面的值,而struts2里面还有个放数据的地方叫做ActionContext,这个类里面可以放不在作用域里的键值对,但是el表达式还是可以获取到,但是效率很低,所以尽量不要用。

  关于el表达式和ognl表达式的区别,网上已经有很多的资料了,想了解的可以去查查看,我今天想说的是struts的拦截器和i18n,先说拦截器吧!

  之前说过过滤器,我觉得,拦截器和过滤器的没理没有什么不同,都是截获请求,然后对其进行处理,struts的拦截器拦截的是访问action的请求,即使我们没有配置struts的拦截器,它也要经过很多拦截器才能到达想要访问的action,这个配置是struts的默认配置,我们引入struts的jar包关联源码后,在struts2-core-2.3.16.jar下面的org.apache.struts2.default.properties这个文件,里面有我们要配置的所有struts.xml的选项和默认值,当然过滤器的配置从struts-default.xml这里边参考写法,struts的过滤器有依赖注入的作用,也有和Servlet,httpServletRequest,httpServletResponse解藕的作用,这些都是过滤器来起作用的,所以我们自己配置自己的过滤器时也要把默认的过滤器加上,否则会出现很多问题,比如action里可能会得不到值等等,接下来就是写代码的工作了,写一个自己的struts的过滤器要实现Interceptor接口,下面的代码是一个登录页面的例子,

package com.bjsxt.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; public class LoginInterceptor implements Interceptor{ /**
*
*/
private static final long serialVersionUID = -3153545565744347773L; @Override
public void destroy() {
System.out.println("end");
} @Override
public void init() {
System.out.println("start");
} @Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println(invocation.getProxy().getActionName());
System.out.println(invocation.getProxy().getMethod());
System.out.println(invocation.getProxy().getNamespace());
System.out.println(invocation.getProxy().getAction());
@SuppressWarnings("unchecked")
Map<String,Object> request = (Map<String, Object>) ActionContext.getContext().get("request");
if(invocation.getInvocationContext().getSession().get("user")!=null){
return invocation.invoke();
}else{
if("login".equals(invocation.getProxy().getMethod())&&"UserAction".equals(invocation.getProxy().getActionName())){
return invocation.invoke();
}else{
request.put("msg", "login the system first!!!");
return "login";
}
}
} }

  接下来是配置struts.xml

代码如下:

<package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="com.bjsxt.interceptor.MyInterceptor"></interceptor>
<interceptor name="loginInterceptor" class="com.bjsxt.interceptor.LoginInterceptor"></interceptor>
<interceptor-stack name="myInter">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors> <default-interceptor-ref name="myInter"></default-interceptor-ref> <global-results>
<result name="login">/login.jsp</result>
</global-results> <action name="user" class="com.bjsxt.action.UserAction" >
<result name="SUCCESS">/result.jsp</result>
<result name="FAIL">/fail.jsp</result>
<result name="search">/list.jsp</result>
<result name="change">/change.jsp</result>
</action>

    <action name="test" class="com.bjsxt.action.TestAction" >
      <result name="SUCCESS">/list.jsp</result>
    </action>

    <action name="UserAction" class="com.bjsxt.action.UserAction" method="login">
      <result name="login" >/login.jsp</result>
      <result name="SUCCESS" >/loginseccess.jsp</result>
    </action>

 </package>
</struts>

  从配置文件里可以看出来,把默认的配置给加上了,这里主要是讲过滤器,所以action和jsp的代码略,接下来是测试截图,其它页面直接跳转到登录页面,而登录页面可以登录。

接下来是国际化,如果一个系统想要被多个国家的人所用就不得不考虑国际化的问题,如果为每一个国家都开发一套系统维护起来会很麻烦,所以就有了个思想,那就是把动态的,用不同语言展示的部分,放到配置文件中,动态的从文件里读取想要展示的内容,不同国家的人就得到了不同的展示,这是一个很好的思想,所以我把它记录一下了,嘻嘻。。。

  首先要把它的配置文件写好,以中文和美式英语为例,配置文件如下:

配置文件是以键值对的形式存在的,且以properties结尾,命名也有一定的格式,如test_zh_CN.properties这个是中文的文件名字,_zh_CN.properties这些都是不能变的,且大小写也要一致,而test是它的命名,是在配置文件中出现的代表这个文件的名字,而英文的是test_en_US.properties,截图如下:

接下来是struts.xml,要在配置文件中加上这句配置<constant name="struts.custom.i18n.resources" value="test"></constant>,test就是上面两个配置文件的名字,所以上面两个配置文件的名字一定要一样哦,接下来是测试的代码

package com.bjsxt.test;

import java.util.Locale;
import java.util.ResourceBundle; public class test {
public static void main(String[] args) { ResourceBundle rb = ResourceBundle.getBundle("test", Locale.US);
String value = rb.getString("welcome");
System.out.println(value);
}
} 结果为welcome to my house

把上面的代码中的

 ResourceBundle rb = ResourceBundle.getBundle("test", Locale.US);改为
 ResourceBundle rb = ResourceBundle.getBundle("test", Locale.CHINA);结果变为欢迎来到我的小屋

测试页面如下所示,先说中文的,

打开浏览器,发布项目,输入地址,页面如下所示:

接下来要将浏览器设置为英文的,以firefox为例,在菜单栏的右上角点击打开菜单,然后点击选项,不过可能浏览器的版本不同,位置也会不同,找不到的可以百度,界面如下所示

然后点击选择,将英语/美国上移到最上面,点确定

然后再访问之前的地址,就会显示如下所示的内容。

也可以在页面中放置动态的内容哦,不过要设置点位符,在这里就不再详细的写了,网上应该会有很多的资料,感兴趣的可以去找找看哦!!!!,今天就先总结到这里了吧


struts2 学习记录 过滤器 国际化的更多相关文章

  1. Struts2学习记录-Value Stack(值栈)和OGNL表达式

    仅仅是学习记录.把我知道的都说出来 一.值栈的作用 记录处理当前请求的action的数据. 二,小样例 有两个action:Action1和Action2 Action1有两个属性:name和pass ...

  2. Struts2学习笔记(八)——国际化

    1.Struts2国际化介绍 国际化即internationalization简称i18n. 为了实现程序的国际化,必须先提供程序所需要的资源文件.资源文件的内容是key-value键值对. 资源文件 ...

  3. Struts2 学习记录-1--Struts2中的配置文件

    目录 1. web.xml 2. struts.xml 3. struts.properties文件 4.注解式开发 5.与Spring框架集成的配置 主要涉及3个配置文件:web.xml.strut ...

  4. Struts2 学习记录-第一天

    Struts2 -01 struts2框架认识 struts2框架是web层框架.struts2框架=webwork+strut1框架发展过来的.struts2框架设计主要用到技术:通过过滤器进行请求 ...

  5. struts2学习记录

    1.对于使用Struts2框架的应用而言,尽量不要让超级链接直接接到某个视图资源,因为这种方式增加了额外的风险.推荐将所有请求都发送给Struts框架,让该框架来处理用户请求,即使只是简单的超级链接. ...

  6. Struts2学习(一)————Struts2入门

    首先推荐一本书,虽然我还没看过,但是我以后肯定会看的,<Struts+技术内幕>提取密码:kg6w .现在只是停留在会使用struts2的层次,自己也想继续深入研究,但是感觉自己的知识面还 ...

  7. [Django]模型学习记录篇--基础

    模型学习记录篇,仅仅自己学习时做的记录!!! 实现模型变更的三个步骤: 修改你的模型(在models.py文件中). 运行python manage.py makemigrations ,为这些修改创 ...

  8. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. Struts2学习笔记⑧

    今天是Struts2学习笔记的最后一篇文章了.用什么做结尾呢,这两天其实还学了很多东西,没有记录下,今天就查漏补缺一下. 文件上传与下载.FreeMarker以及昨天没做完的例子 文件上传与下载 文件 ...

随机推荐

  1. ThinkPHP 3.2.3集成uploadify上传控件

    uploadify控件有一个坑爹的问题,就是文件上传时会session丢失,官方解释http://www.uploadify.com/documentation/uploadify/using-ses ...

  2. C#字符操作

    //字符串转ASCII码 // str1:字符串 str2:ASCII码 ] })[] == )//判断输入是否为字母 { str2= Encoding.GetEncoding(].ToString( ...

  3. cocos2dx3.0 removeFromParent和removeAllChildren含义

    顾名思义,removeFromParent就是把自己从父亲那里移除,removeAllChildren就是移除自己所有的孩子,这些方法的具体实现都在基类Node里面,通过查看代码也很容易看到怎么实现的 ...

  4. C# 正则表达式及返回匹配的所有结果

    C# 正则表达式是在  System.Text.RegularExpressions 空间定义的,其中的 IsMatch() 方法用于返回 bool 类型,表示要搜索的字符串与传入的正则表达式是否匹配 ...

  5. Hadoop MapReduce编程 API入门系列之薪水统计(三十一)

    不多说,直接上代码. 代码 package zhouls.bigdata.myMapReduce.SalaryCount; import java.io.IOException; import jav ...

  6. (转)javascript中的对象查找

    本文转自:http://otakustay.com/object-lookup-in-javascript/  ---很棒的一篇文章,作者的其他文章还暂时没读,但相信作者是一个谦虚 谨慎的好工程师 近 ...

  7. python生成中文验证码,带旋转,带干扰噪音线段

    # -*- coding: utf-8 -*- """ Created on Sun Oct 4 15:57:46 2015 @author: keithguofan & ...

  8. C语言基础_2

    scanf函数可以从键盘上读取数据并记录到变量中.为了使用这个函数也需要在文件开头使用如下的预处理指令#include <stdio.h>scanf函数使用的时候所需要的初始数据和prin ...

  9. MFC 实现字符串的移动

    在视类添加一个WM_KeyDown,然后实现函数写上 switch(nChar) {.. CRect rc; GetClientRect(&rc);   int nWidth = rc.Wid ...

  10. 如何在A用户下建立视图,这个视图是A的表与B的表进行关联的?

    这个前提条件是,同一个数据库,不同用户!!!如果是不同数据库,就要用dblink了 一开始,我直接创建视图,但是提示“权限不足”: 于是我是用A登陆,直接用select * from B.sa_tas ...