Posted on 2008-08-25 01:45
∪∩BUG 阅读(1046)
评论(3) 编辑 收藏 所属分类:
Struts2学习笔记
项目树形图

WebRoot/WEB-INF/web.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<web-app id="WebApp_ID" version="2.4"
3
xmlns="http://java.sun.com/xml/ns/j2ee"
4
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
6
<display-name>Struts2Hello</display-name>
7
<filter>
8
<filter-name>struts2</filter-name>
9
<filter-class>
10
org.apache.struts2.dispatcher.FilterDispatcher
11
</filter-class><!-- 以过虑器的形式出现 -->
12
</filter>
13
<filter-mapping>
14
<filter-name>struts2</filter-name>
15
<url-pattern>/*</url-pattern><!-- 过虑所有内容 -->
16
</filter-mapping>
17
<welcome-file-list>
18
<welcome-file>index.html</welcome-file>
19
<welcome-file>index.htm</welcome-file>
20
<welcome-file>index.jsp</welcome-file>
21
<welcome-file>default.html</welcome-file>
22
<welcome-file>default.htm</welcome-file>
23
<welcome-file>default.jsp</welcome-file>
24
</welcome-file-list>
25
</web-app>
26
WebRoot/index.jsp
1
<%
@page contentType="text/html; charset=GBK"%>
2
<%
@taglib prefix="s" uri="/struts-tags"%>
3
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4
<html>
5
<head>
6
<title>Converter</title>
7
</head>
8
9
<body>
10
<s:form action="HelloWorld" theme="simple">
11
<%
12
// name="loc" 是LoginAction.java中的private Locale loc = Locale.CHINA;
13
%>
14
Locale:<s:textfield name="loc" />
15
<br>
16
<s:submit />
17
</s:form>
18
<br>
19
<h2>
20
<s:property value="msg" />
21
</h2>
22
</body>
23
</html>
24
WebRoot/submit.jsp
1
<%
@page contentType="text/html; charset=GBK"%>
2
<%
@taglib prefix="s" uri="/struts-tags"%>
3
4
<html>
5
<head>
6
<title>submit</title>
7
</head>
8
<!-- 提交页面,页面信息为Action中的集合属性 -->
9
<body>
10
<!-- 错误提示层(错误显示信息), s:fielderror会自动检测页面中所有域(输入框等)中的错误信息-->
11
<div style="color: red">
12
<s:fielderror></s:fielderror>
13
</div>
14
<s:form action="ProductConfirm" theme="simple">
15
<table>
16
<tr style="background-color: powderblue; font-weight: bold;">
17
<td>
18
Product Name
19
</td>
20
<td>
21
Price
22
</td>
23
<td>
24
Date of Production
25
</td>
26
</tr>
27
<%
28
//1.s:iterator:使用迭代器
29
//2.value="new int[3]" status="stat":整形数组集合对应action中的List集合;每次取出一个值存入stat中
30
//3. products['+#stat.index+'].name:OGNL表达式,相当于<%= "products[" + stat.index + "].name" %>
31
// (1)products对应action(ProductConfirm.java)中的 products属性,
32
// (2)整个句子的作用是从action中找到products并取出products的name属性
33
// (3)规范表达式:%{Action 中的属性集合[整数数组的迭代取值].具体pojo类的属性}
34
%>
35
36
<s:iterator value="new int[3]" status="stat">
37
<tr>
38
<td>
39
<s:textfield name="%{'products['+#stat.index+'].pname'}" />
40
</td>
41
<td>
42
<s:textfield name="%{'products['+#stat.index+'].price'}" />
43
</td>
44
<td>
45
<s:textfield name="%{'products['+#stat.index+'].pdate'}" />
46
</td>
47
</tr>
48
</s:iterator>
49
<tr>
50
<td colspan="3">
51
<s:submit />
52
</td>
53
</tr>
54
</table>
55
</s:form>
56
</body>
57
</html>
58
WebRoot/show.jsp
1
<%
@ page contentType="text/html; charset=GBK"%>
2
<%
@taglib prefix="s" uri="/struts-tags"%>
3
<html>
4
<head>
5
<title>show</title>
6
</head>
7
<!-- 显示页面,显示Action中的集合属性 -->
8
<body>
9
<table>
10
<tr style="background-color: powderblue; font-weight: bold;">
11
<td>
12
Product Name
13
</td>
14
<td>
15
Price
16
</td>
17
<td>
18
Date of Production
19
</td>
20
</tr>
21
<!-- s:iterator value="products" status="stat":与提交页面submit.jsp相同 -->
22
<s:iterator value="products" status="stat">
23
<tr>
24
<td>
25
<s:property value="pname" />
26
</td>
27
<td>
28
$
29
<s:property value="price" />
30
</td>
31
<td>
32
<s:property value="pdate" />
33
</td>
34
</tr>
35
</s:iterator>
36
</table>
37
</body>
38
</html>
39
src/com.action.LocaleConverter.java
1
package com.action;
2
3
import java.lang.reflect.Member;
4
import java.util.Locale;
5
import java.util.Map;
6
7
/** *//**
8
* @author ∪∩BUG E-mail: tidelgl@163.com
9
* @version Aug 24, 2008 4:29:04 PM
10
* @转换器类
11
*/
12
13
// 继承ognl默认的格式转换类
14
public class LocaleConverter extends ognl.DefaultTypeConverter
{
15
16
@Override
17
// Map context:上下上下文对象; Object value:待转换对象; Class toType:目标类型
18
public Object convertValue(Map context, Object value, Class toType)
{
19
20
// 如果要转换的是本地化类型Locale.class(如整形:Integer.class)
21
if (toType == Locale.class)
{
22
23
// 把待转换类型强制转换成字符串类型,并取第一个元素
24
String locale = ((String[]) value)[0];
25
26
// 截取字符串去掉"_";如果zh_CN截取得(zh,CN)
27
return new Locale(locale.substring(0, 2), locale.substring(3));
28
}
29
// 转换成字符串类型
30
else if (toType == String.class)
{
31
32
Locale locale = (Locale) value;
33
return locale.toString();
34
}
35
36
return null;
37
}
38
}
src/com.action.LoginAction.java
1
package com.action;
2
3
import java.util.Locale;
4
5
import com.opensymphony.xwork2.ActionSupport;
6
import com.opensymphony.xwork2.util.LocalizedTextUtil;
7
8
/** *//**
9
* @author ∪∩BUG E-mail: tidelgl@163.com
10
* @version Aug 24, 2008 4:11:04 PM
11
* @Action 类
12
*/
13
@SuppressWarnings("serial")
14
public class LoginAction extends ActionSupport
{
15
16
private String msg;
17
private Locale loc = Locale.CHINA; //默认语言版本的中文
18
19
public LoginAction()
{
20
super();
21
// TODO Auto-generated constructor stub
22
}
23
24
public LoginAction(String msg, Locale loc)
{
25
super();
26
this.msg = msg;
27
this.loc = loc;
28
}
29
30
@Override
31
public String execute() throws Exception
{
32
33
//LocalizedTextUtil是struts2.0中的国际化初始化工具,
34
//获取当前资源文件中的名为HelloWorld的key,然后使用loc语言版本
35
msg = LocalizedTextUtil.findDefaultText("HelloWorld", loc);
36
return SUCCESS;
37
}
38
39
public String getMsg()
{
40
return msg;
41
}
42
43
public void setMsg(String msg)
{
44
this.msg = msg;
45
}
46
47
public Locale getLoc()
{
48
return loc;
49
}
50
51
public void setLoc(Locale loc)
{
52
this.loc = loc;
53
}
54
}
55
src/com.action.ProductConfirm.java
1
package com.action;
2
3
import java.util.List;
4
5
import com.opensymphony.xwork2.ActionSupport;
6
import com.pojo.Product;
7
8
/** *//**
9
* @author ∪∩BUG E-mail: tidelgl@163.com
10
* @version Aug 24, 2008 9:58:06 PM
11
* @Action类 测试页面的提交功能
12
*/
13
@SuppressWarnings("serial")
14
public class ProductConfirm extends ActionSupport
{
15
16
// 标准list集合
17
private List<Product> products;
18
19
public List<Product> getProducts()
{
20
return products;
21
}
22
23
public void setProducts(List<Product> products)
{
24
this.products = products;
25
}
26
27
@Override
28
public String execute() throws Exception
{
29
//遍历products列表
30
for (Product p : products)
{
31
System.out.println(p.getPname() + "|" + p.getPrice() + "|"
32
+ p.getPdate());
33
}
34
return SUCCESS;
35
}
36
}
37
src/com.pojo.Product.java
1
package com.pojo;
2
3
4
import java.io.Serializable;
5
import java.util.Date;
6
7
/** *//**
8
* @author ∪∩BUG E-mail: tidelgl@163.com
9
* @version Aug 24, 2008 9:51:03 PM
10
* @自定义数据类型
11
*/
12
@SuppressWarnings("serial")
13
public class Product implements Serializable
{
14
15
//String,double,Date数据类型系统都内置有他们的转换器,无需另写转换器
16
private String pname;
17
private double price;
18
private Date pdate;
19
20
public Product()
{
21
22
}
23
24
public String getPname()
{
25
return pname;
26
}
27
28
public void setPname(String pname)
{
29
this.pname = pname;
30
}
31
32
public double getPrice()
{
33
return price;
34
}
35
36
public void setPrice(double price)
{
37
this.price = price;
38
}
39
40
public Date getPdate()
{
41
return pdate;
42
}
43
44
public void setPdate(Date pdate)
{
45
this.pdate = pdate;
46
}
47
48
public Product(String pname, double price, Date pdate)
{
49
super();
50
this.pname = pname;
51
this.price = price;
52
this.pdate = pdate;
53
}
54
55
}
56
src/com.action.ProductConfirm-conversion.properties
ProductConfirm-conversion.properties //固定格式Action名-conversion.properties
Element_products=com.pojo.Product //表明products的转换类型是Product,固定格式添加:Element_集合属性名=集合对象的实现类
Element_products=com.pojo.Product
src/xwork-conversion.properties
xwork-conversion.properties //全局转换配置文件,必须放在SRC目录下,文件名固定!
java.util.Locale = com.action.LocaleConverter //自动调用com.action.LocaleConverter来转换
java.util.Locale =com.action.LocaleConverter
src/struts.properties
struts.custom.i18n.resources=globalMessages
src/globalMessages_en_US.properties
HelloWorld=HelloWorld

failtip=
{0}Login failed\!
language=Select language

smg=Now is
{0}

succtip=
{0}Welcome,Login success.
usen=Americal English
zhcn=Simplified Chinese

src/globalMessages_zh_CN.properties
HelloWorld=\u4F60\u597D

failtip=
{0}\u767B\u5F55\u5931\u8D25
language=\u9009\u62E9\u8BED\u8A00

smg=
{0}\u73B0\u5728\u7684\u4E8B\u4EF6\u662F
{1}

succtip=
{0}\u6B22\u8FCE,\u767B\u5F55\u6210\u529F
usen=\u82F1\u8BED
zhcn=\u4E2D\u6587

src/struts.xml
1
<?xml version="1.0" encoding="GBK"?>
2
<!DOCTYPE struts PUBLIC
3
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4
"http://struts.apache.org/dtds/struts-2.0.dtd">
5
<struts>
6
<include file="struts-default.xml" /><!-- 使用缺省的struts的配置文件 -->
7
8
<!-- 包空间 ConverterDemo 继承 struts-default -->
9
<package name="ConverterDemo" extends="struts-default">
10
11
<!-- 映射名name="HelloWorld" 与 index.jsp 中的 action="HelloWorld" 对应,使用com.action.LoginAction来实现 -->
12
<action name="HelloWorld" class="com.action.LoginAction">
13
<result>/index.jsp</result>
14
</action>
15
<!--
16
1.映射名name="ProductConfirm" 与 submit.jsp 中的 action="ProductConfirm" 对应,使用com.action.ProductConfirm来实现
17
2.成功转到show.jsp页面
18
3.失败转入submit.jsp页面
19
-->
20
<action name="ProductConfirm"
21
class="com.action.ProductConfirm">
22
<result>/show.jsp</result>
23
<result name="input">/submit.jsp</result>
24
</action>
25
</package>
26
</struts>
27
28