Struts2.1
官方文档:
1. set标签处value的String改为object
2. struts2标签的type为String表示字符串,为Object表示Ognl表达式
一:Myeclipse的简单操作
1. 将类进行源码展示:
右击Jar包->Properties->Java Source Attachment->
F:/JAR_Total/Struts/struts2.x/struts-2.1.8.1/src/core/src/main/java
2. 文档的展示:
右击Jar包->Properties->JavaDoc Loction->
file:/F:/JAR_Total/Struts/struts2.x/struts-2.1.8.1/docs/struts2-core/apidocs/
之后出现新类的时候直接按F1就可以在Myeclipse中查看文档
3. Struts.xml不自动提示
a) window – preferences – 搜索 catalog
b) 选择key type为URI
c) key: http://struts.apache.org/dtds/struts-2.0.dtd
d) location: 对应的dtd文件,位于struts-core包中,解压开,指定相应位置,如:D:\share\0750_Struts2.1.6\soft\struts-2.1.6\lib\struts2-core-2.1.6\struts-2.0.dtd
4. 右击项目->java->compliance->compiler compliance level->1.6
5. 常量的配置保存在struts2-core-2.1.8.1.jar->org.apache.struts2->default.properties
6. :此时表示正处于开发模式,可以不用重新启动服务器而直接访问修改后的内容
一.1:Struts2流程
Struts2多实例,多线程
Servlet单实例,多线程
二:NameSpace
a) namespace决定了action 的访问路径,默认为“”,可以接收所有路径的action,例如
http://localhost:8080/Test/asdfasdfas/sdgsdg/sdfsdfsd/index.action
b) 当将现有的项目拷贝出来一份以后,一定要记得,右击项目->Properties->Myeclipse->Web,将Web Context-root修改掉。
三:Action
a) 具体视图的返回可以由用户自己定义的Action来决定
b) 具体的手段是根据返回的字符串找到对应的配置项,来决定试图的内容
c) 具体Action的实现可以是一个普通的Java类,里面有public String execute()方法即可
d) 修改默认编码:windows->preference->JSP
e) Struts2的Action在每次访问时必定会new一个,而Struts1的Action在每次访问的时候可能只有new了一个
f) 实现Action的三种方法:
1. 直接写类名称+execute()方法
2. 继承自ActionSupport类+execute()方法
3. 实现自Action接口+execute()方法
四:Path_路径问题
a) Struts2中的路径问题是根据Action的路径而不是Jsp的路径来确定,所以尽量不要使用相对路径
虽然可以用Redirect方式解决,但是Redirect方式并非必要的。
解决方法非常简单,统一使用绝对路径(在Jsp中使用request.getContextRoot方式来拿到webapp的路径,或者使用Myeclipse自己写的)
五:ActionMethod
1. Action执行的时候不一定要执行execute方法,可以在配置文件中配置Action的时候用method=来制定执行哪个方法 ,也可以在在url地址中动态制定(动态方法调用DMI),还可以使用通配符来进行操作
(user是命名空间,userAdd是Actino的名称)
http://localhost:8080/Struts2_0400_Path_ActionMethod/user/userAdd
(action!method.action,user是Action的名称,userAdd是方法名)
http://localhost:8080/Struts2_0400_Path_ActionMethod/user!userAdd
六:ActionWildcard(通配符)
使用通配符,将配置降到最低,不过,一定要遵循“约定优于配置”原则
/{1}_{2}_success.jsp
七:接收参数的方式
用Action的属性接收参数
用Action的参数接收属性
private String nameString;
private int age;
public void setName(String name){(name的名称与参数名称一致就行了)
this.nameString = name;
}
用DomainModel接收参数(SSI框架中可以省去user.name中的user)
private User user;(加入setter()和getter()方法)
public String show(){
//User user = getUser();
System.out.println("取得名称:"+ user.getName());
System.out.println("取得年龄:"+ user.getAge());
return "show";
}
添加用户
用ModelDriven接收参数(SSI中继承自BaseActionSupport使用此种方法)
添加用户
//实现ModelDriven接口(记住使用泛型,否则需要类型强制转换)
public class UserAction extends ActionSupport implements ModelDriven{
//此处必须实例化对象,而不是使用setter和getter方法
private User user = new User();
@Override
public User getModel() {
return user;
}
public String show(){
User model = getModel();
System.out.println("取得名称:"+model.getName());
System.out.println("取得年龄:"+model.getAge());
return "show";
}
八:简单数据验证
简单数据验证1
Action
if(name == null || !name.equals("admin")){
this.addFieldError("name", "name is error");
return ERROR;
}
JSP,
专门取得valueStack和Stack中的Context中的值
Value Stack Contents
Object Property Name Property Value
com.model.Test name 刘鹏
age 20
com.demo.TestAction texts null
model com.model.Test@59c8b5
actionErrors []
errors {name=[name is error!]}
fieldErrors {name=[name is error!]}
errorMessages []
locale zh_CN
actionMessages []
com.opensymphony.xwork2.DefaultTextProvider texts null
九:访问web元素(详见另外一份文档)
十:模块包含(IncludeModlus)
Struts.xml:
Login.xml:
/user_login_success.jsp
十一:默认Action
/user_login_success.jsp
十二:默认Result_Type
1. Dispatcher //显示action地址
2. Redirect //显示jsp地址
3. Chain
4. redirectAction
5. freemarker
6. httpheader
7. stream
8. velocity
9. xslt
10. plaintext
11. tils
/user_login_success.jsp
/user_login_success.jsp
a
/a
r2
十三: Global_Results(全局结果集)
可以用于全局错误页的配置等等需要统一使用的模块
Struts.XML代码:
/main.jsp
/ success.jsp
/error.jsp
/admin.jsp
UserAction代码:
public String execute(){
if(type==1){
return SUCCESS;
}else if(type==2){
return ERROR;
}else {
return "mainpage";
}
}
AdminAction代码:
public String admin(){
return "mainpage";
}
十四: Dynamic_Results(动态结果集)
Action代码:
private int type;(setter()和getter())
private String r; (setter()和getter())
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
XML代码:
${r}
十五:带参数的结果集(客户端跳转时候才用到)
XML代码:
/success.jsp?t=${type}
Action代码:
private int type;(setter()和getter())
public String test(){
return SUCCESS;
}
JSP代码:
from valueStack:
取不出来
from actionContext: 取得出来
访问地址:
http://localhost:8080/.../...?type=1
十六:OGNL(Object Graph Navigation Language对象图导航语言)
OGNL1(访问普通属性)(value stack直接取值,stack Context使用#取值)
Xml代码:
/ognl.jsp
Model代码:
private String age = "";(setter()/getter())
Action代码:
private Test test;
private String username = "";
private String password = ""; (setter()/getter())
public String execute(){
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("name", "liupeng");
return SUCCESS;
}
JSP代码:
访问值栈中action的普通属性:username=
访问值栈中model的普通属性(getter/setter):
访问属性范围中的普通属性:
访问:
http://localhost:8080/OGNL/ognl!execute?username=liupeng&password=1111&test.age=10
OGNL2(访问普通属性)
Action代码:
private Cat cat;(setter/getter)
Model代码:
Cat.java:
private Dog friend;(setter/getter)
Dog.java:
public Dog(){
}
private String name = "";(setter/getter)
JSP代码:
访问值栈中model的普通属性:
访问:
http://localhost:8080/OGNL/ognl!execute?username=liupeng&password=1111&test.age=10&cat.friend.name=wanghan
OGNL3(访问普通方法)
Action代码:
private String password = "";(set/get)
public String m(){
return "hello";
}
JSP代码:
访问值栈中action属性的普通方法:
访问值栈中model的普通方法:
访问值栈中action的普通方法:
访问:
http://localhost:8080/OGNL/ognl!execute?password=1111
OGNL4(访问静态属性和方法)
Struts2.x访问静态属性和方法需要在XML文件中加上
Action代码:
public static String STR = "static string";
public static String s(){
return "static method";
}
JSP代码:
访问静态方法:
访问静态属性:
访问Math类的静态方法:
OGNL4(访问普通类的构造方法)
JSP代码:
访问普通类的构造方法:
OGNL4(访问集合)
Action代码:
注意集合作为了Action的属性存在
private List tests = new ArrayList();
private Set dogs = new HashSet();
private Map dogMap = new HashMap();
加入setter和getter方法
public OgnlAction(){
tests.add(new Test(1));
tests.add(new Test(2));
tests.add(new Test(3));
dogs.add(new Dog("dog1"));
dogs.add(new Dog("dog2"));
dogs.add(new Dog("dog3"));
dogMap.put("dog100", new Dog("dog100"));
dogMap.put("dog101", new Dog("dog101"));
dogMap.put("dog102", new Dog("dog102"));
}
JSP代码:
访问List:
访问List中某个元素:
访问List中元素某个属性的集合
访问List中元素某个属性的集合中的特定值:
访问Set:
访问Set中某个元素:
访问Map:
访问Map中某个元素:
访问Map中所有的key:
访问Map中所有的value:
访问容器的大小:
OGNL4(投影)
投影或者说过滤的是集合中的属性
Action代码:
注意集合作为了Action的属性存在
private List tests = new ArrayList();
加入setter和getter方法
public OgnlAction(){
tests.add(new Test(1));
tests.add(new Test(2));
tests.add(new Test(3));
}
JSP代码:
投影(过滤):
投影:
投影:
投影:
OGNL5( 用[]访问元素)
[]:
十七:Struts标签
1. 通用标签
a) property
Action代码:
private String username ;
private String password;(set/get)
public String execute(){
this.addFieldError("fielderror.test", "wrong");
return SUCCESS;
}
JSP代码:
property:
property取值为字符串:
property设定默认值:
property设定HTML:
b) set
I. 默认为action scope,会将值放入request和ActionConrtext中
II. page、request、session、application
JSP代码:
set设定adminName值(默认为request和ActionContext):
set从request取值:
set从ActionContext取值:
set设定范围:
set从相应范围值:<%=pageContext.getAttribute("adminPassword") %>
set设定var,范围为ActionContext:
set使用#取值:
访问:
http://localhost:8080/Struts-tags/tags/tags?username=liupeng&password=1111
c) bean
bean:
读取:
d) include
e) param
在bean标签处体现
f) debug
2. 控制标签
a) if elseif else
JSP代码:
if elseif else:
age:
wrong age!
tooyoung!
yeah!
访问:
http://localhost:8080/Struts-tags/tags/tags? age=20
b) iterator
JSP代码:
遍历集合1:
|
遍历集合2:
自定义变量:
带有status的遍历:
|
遍历过的元素总数:|
遍历过的元素索引:|
当前访问的个数是偶数:|
当前访问的个数是奇数:|
是first?|
是last?
遍历Map集合:
|
|
c) subset
3. UI标签
a) theme(simple/xhtml(默认)/css_xhtml/ajax)
Xml代码:
/theme.jsp
JSP代码:
在struts.xml中控制theme,默认为xhtml,可以设置为:simple/css_html/ajax
4.AJAX标签
5.$#%的区别
$用于i18n和struts配置文件
#取得ActionContext值
%{}将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用
十七:常用常量
十八:自定义类型转换器
HelloWordAction.Java
public class HelloWordAction {
private Date createtime;
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String execute(){
System.out.println(createtime);
return "success";
}
}
MyDateCVT.Java
public class MyDateCVT extends DefaultTypeConverter{
@Override public Object convertValue(Map context, Object value, Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy|MM|dd");
try {
if(toType == Date.class){//当字符串向Date类型转换时
String[] params = (String[]) value;// Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//当Date转换成字符串时
Date date = (Date) value;
return dateFormat.format(date);
}
} catch (ParseException e) {} catch (java.text.ParseException e) {
e.printStackTrace();
}
return null;
}
}
访问
http://localhost:8080/servlet/hello?createtime=2013|11|11
十八:自定义全局类型转换器
将上面的类型转换器注册为全局类型转换器:
在WEB-INF/classes下放置xwork-conversion.properties文件 。在properties文件中的内容为:
待转换的类型=类型转换器的全类名
对于本例而言, xwork-conversion.properties文件中的内容为:
java.util.Date= cn.itcast.conversion.DateConverter
十九:自定义拦截器
Action:
package com.filter;
import java.sql.Timestamp;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class LogIC implements Interceptor{
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
String actionName = invocation.getAction().getClass().getName();
//入口
System.out.println("Action execute start at"+new Timestamp(System.currentTimeMillis()));
String result = invocation.invoke(); //保证拦截器往下执行
//出口
return result;
}
}
XML:
/hello.jsp
因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
如果希望包下的所有action都使用自定义的拦截器,可以通过把拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用
或者使用如下方式:
/hello.jsp
二十:文件或图片上传
1. 前台:
2.
3.
4.
5.
6.
7.
8. 后台:
9. /**
10. * 作者:刘鹏
11. * 时间:2013-07-07
12. * 描述:微博列表中的图片和文件上传显示
13. * @return
14. */
15.
16. /*****************以下为上传部分*******************************/
17. private File image; //得到上传的文件
18. private String imageFileName; //得到文件的名称,写法是固定的
19. private String imageContentType; //得到文件的类型
20.
21. public String getImageContentType() {
22. return imageContentType;
23. }
24. public void setImageContentType(String imageContentType) {
25. this.imageContentType = imageContentType;
26. }
27. public String getImageFileName() {
28. return imageFileName;
29. }
30. public void setImageFileName(String imageFileName) {
31. this.imageFileName = imageFileName;
32. }
33. public File getImage() {
34. return image;
35. }
36. public void setImage(File image) {
37. this.image = image;
38. }
39. public String addUI(){
40. return SUCCESS;
41. }
42. public String uploadPicture(){
43. HttpServletRequest request = ServletActionContext.getRequest();
44. //保存到根目录下的Images文件夹下
45. String realPath = ServletActionContext.getServletContext().getRealPath("/uploadOImages"); //取得真实路径
46. System.out.println(realPath);
47. System.out.println(imageFileName);
48. System.out.println(imageContentType);
49.
50. //自动命名
51. Random random = new Random(99999);
52. int tempInt = random.nextInt();
53. Date date = new Date();
54. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddhhmmss");
55. int last = imageFileName.lastIndexOf(".");
56. String head = imageFileName.substring(0,last);
57. String type = imageFileName.substring(last);
58. imageFileName = simpleDateFormat.format(date) + tempInt + type;
59. System.out.println("新的文件名称是:"+imageFileName);
60.
61. //创建父文件夹
62. if(image!=null){
63. File saveFile = new File(new File(realPath), imageFileName);
64. if(!saveFile.getParentFile().exists()){ //如果Images文件夹不存在
65. saveFile.getParentFile().mkdirs(); //则创建新的多级文件夹
66.
67. }
68. try {
69. FileUtils.copyFile(image, saveFile); //保存文件
70. ActionContext.getContext().put("message", "上传成功!");
71. request.setAttribute("uploadsuccess", imageFileName);
72. } catch (IOException e) {
73.
74. e.printStackTrace();
75. }
76. }
77. return "upload";
78. }
79.
80.
81. /*****************以上为上传部分*******************************/
82.
83. 后台将图片的地址保存到数据库中
84. //先从数据库中将所有数据读出来,放入到request中
85. request.setAttribute("weibotest", list);
86.
87. 前台使用OGNL语言读取出图片地址,并且显示图片
88.
89.
90. //显示图片
91.
二十一:多文件上传
第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这两个文件可以从http://commons.apache.org/下载。
第二步:把form表的enctype设置为:“multipart/form-data“,如下:
第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称:
public class HelloWorldAction{
private File[] uploadImages;//得到上传的文件
private String[] uploadImagesContentType;//得到文件的类型
private String[] uploadImagesFileName;//得到文件的名称
//这里略省了属性的getter/setter方法
public String upload() throws Exception{
String realpath = ServletActionContext.getServletContext().getRealPath("/images");
File file = new File(realpath);
if(!file.exists()) file.mkdirs();
for(int i=0 ;i显示失败信息。
action:
public class Validate extends ActionSupport{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute(){
return "success";
}
public void validate() {
if(name==null||"".equals(name)){
this.addFieldError("name", "用户名为空!");
}else{
if(name.length()<2||name.length()>10){
this.addFieldError("name", "用户名长度有误!");
}
}
}
}
xml:
/index.jsp
/hello.jsp
jsp:
二十三:手工编写代码方式实现对Action中指定方法输入校验
通过validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过显示失败信息。
action:
public String add(){
return "success";
}
public void validateAdd(){
if(name==null||"".equals(name.trim()))
this.addFieldError("name", "用户名不能为空");
}
xml:
/index.jsp
/hello.jsp
jsp:
访问:
http://localhost:8080/struts/validate!add
二十四:输入校验流程
1。类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。
3。系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
4。再调用action中的validate()方法。
5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
二十五:基于XML配置方式实现对action的所有方法进行输入校验
使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml,其中ActionClassName为action的简单类名,-validation为固定写法。如果Action类为cn.itcast.UserAction,那么该文件的取名应为:UserAction-validation.xml。
action:
public class Validate extends ActionSupport{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute(){
return "success";
}
xml:
Validate-validation.xml:
true
用户名不能为空!
struts.xml:同上
jsp:
访问:
http://localhost:8080/struts/validate!add
二十六:基于XML配置方式实现对action的制定方法进行输入校验
当校验文件的取名为ActionClassName-validation.xml时,会对 action中的所有处理方法实施输入验证。如果你只需要对action中的某个action方法实施校验,那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为struts.xml中action的名称。
action:
public class Validate extends ActionSupport{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute(){
return "success";
}
public String add(){
return "success";
}
}
xml:
Validate-validate-validation.xml:
true
用户名不能为空!
struts.xml:
/index.jsp
/hello.jsp
jsp:
访问:
http://localhost:8080/struts/validate!add
二十七:struts2提供的校验器列表
系统提供的校验器如下:
required (必填校验器,要求field的值不能为null)
requiredstring (必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)
stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)
int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
email(邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址)
url(网址校验器,要求如果field的值非空,则必须是合法的url地址)
date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)
conversion(转换校验器,指定在类型转换失败时,提示的错误信息)
visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)
expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)
二十八:校验器的使用例子
required 必填校验器
性别不能为空!
requiredstring 必填字符串校验器
true
用户名不能为空!
stringlength:字符串长度校验器
10
2
true
email:邮件地址校验器
电子邮件地址无效
regex:正则表达式校验器
手机号格式不正确!
int:整数校验器
1
150
年龄必须在1-150之间
字段OGNL表达式校验器
文件不能为空
二十九:基于XML校验的一些特点
当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下面顺序寻找校验文件:
1。AconClassName-validation.xml
2。ActionClassName-ActionName-validation.xml
系统寻找到第一个校验文件时还会继续搜索后面的校验文件,当搜索到所有校验文件时,会把校验文件里的所有校验规则汇总,然后全部应用于action方法的校验。如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则。
当action继承了另一个action,父类action的校验文件会先被搜索到。
假设UserAction继承BaseAction:
访问上面action,系统先搜索父类的校验文件:BaseAction-validation.xml, BaseAction-user-validation.xml,接着搜索子类的校验文件: UserAction-validation.xml, UserAction-user-validation.xml。应用于上面action的校验规则为这四个文件的总和。
三十:国际化
准备资源文件,资源文件的命名格式如下:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如:
中国大陆: baseName_zh_CN.properties
美国: baseName_en_US.properties
现在为应用添加两个资源文件:
第一个存放中文:itcast_zh_CN.properties
内容为:welcome=欢迎来到传智播客
第二个存放英语(美国): itcast_en_US.properties
内容为: welcome=welcome to itcast
对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。命令的使用方式如下:
native2ascii 源文件.properties 目标文件.properties
配置全局资源与输出国际化信息
当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:
itcast为资源文件的基本名。
后面我们就可以在页面或在action中访问国际化信息:
在JSP页面中使用标签输出国际化信息:
,name为资源文件中的key
在Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key。
在表单标签中,通过key属性指定资源文件中的key,如:
国际化—输出带占位符的国际化信息
资源文件中的内容如下:
welcome= {0},欢迎来到传智播客{1}
在jsp页面中输出带占位符的国际化信息
学习
在Action类中获取带占位符的国际化信息,可以使用getText(String key, String[] args)或getText(String aTextName, List args)方法。
国际化—JSP中直接访问某个资源文件
struts2为我们提供了标签,使用标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:
Itcast为类路径下资源文件的基本名。
如果要访问的资源文件在类路径的某个包下,可以这样访问:
小张
上面访问cn.itcast.action包下基本名为package的资源文件。
实例:
properties:
csst.properties
main.company:CSST
main.addr:haidian,Beijing,china
csst_zh_CN.properties
main.company:中软培训
main.addr:海淀南路,北京,中国
csst_en_US.properties
main.company:&&qq
main.addr:**ss
XML:
/IL8N.jsp
action:
success
jsp:
名称:
地址:
访问:
http://localhost:8080/struts/il8n?request_locale=en_US