- 浏览: 377009 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lgh1992314:
scugxl 写道这个java.ext.dirs属于加载的JR ...
classpath 和 java.ext.dirs 的区别 -
Oneforher:
java -Djava.ext.dirs 加载Lib后,%JA ...
classpath 和 java.ext.dirs 的区别 -
cxw1128:
java -Djava.ext.dirs=/home/ice/ ...
classpath 和 java.ext.dirs 的区别 -
suosuo230:
同感,纠结了一天了,才发现,比你们晚发现2-4年
com.ibm.icu.text.SimpleDateFormat 的陷阱 -
scugxl:
这个java.ext.dirs属于加载的JRE/LIB/EXT ...
classpath 和 java.ext.dirs 的区别
在Struts2.0里面有一个非常牛*的功能就是支持更高级的POJO访问,这句话是什么意思呢?下面来通过例子实际操作一把就能体会到这个功能的强大与好使了。
要实现的功能:如果用户输入用户名xiaozu,密码111111,则显示welcome,xiaozhu!否则提示用户名或密码错误。
下面是我们所需的文件:
登陆页面login.jsp:
请求处理LoginAction.java:
响应页面HelloWorld.jsp:
如上所示,对于login.jsp表单中的每个值域我们都会在相应的action中声明一个对应的属性并产生相应的get和set方法,如果这个表单中的值很多(例如注册用户信息的表单),就会导致action十分庞大和容易混乱,并且也不利于我们的软件分层,违背了OO的原则,下面看一下改进后的方案。
登陆页面login.jsp:
新增实体类User.java:
请求处理LoginAction.java:
响应页面HelloWorld.jsp:
前后两种处理方式有何不同呢?后者新建了一个User实体类,用于封装从表单中接收的数据,而在action中就不用设置相应的属性和方法了,并且这样做能够让我们的软件层次感更加明显,系统结构也更加清晰。以User为例,描述一下采用这种方式的关键步骤:
1. 在action中定义一个User类型的对象:User user;
2. 表单中各个控件的name属性要采取如下命名规则:对象名.属性名,注意对象名必须与action中定义的一样,属性名也必须和该对象的属性一一对应。如上例中的user.userName和user.password。
注意:
Action中的这个get方法必须,否则会出现丢值的现象;set方法就更不用说了,必须的。
上述原理解释:
1. 前面讲的自定义类型转换器是基于 OGNL 的 DefaultTypeConverter 类并实现 convertValue() 方法,两个转换方向的逻辑都写在这一个方法中。而 Struts 2 为我们提供了一个 DefaultTypeConverter 的抽象子类 StrutsTypeConverter 来继承,并实现其中两个抽象方法 convertFromString() 和 convertToString(),这要简单易懂。对比 Struts 1 的转换器是要实现 org.apache.commons.beanutils.Converter 接口,以及它的 convert() 方法的。
2. 注意,上面的 convertFromString() 的第二个参数是一个字符串数组,所以可为请求的数组(如请求串为 ?u=1&u=2&u=3)定义转换器,Action 中相应的属性就应为数组或 List,这一方法的返回值也该为相应的类型(数组或List,要通过第三个参数 toClass 来判断是返回数组还是 List 了)。
3. 字符串(如 "user,pass") 转换成 Action 中的复合属性(如 User user) 前面是自定了类型转换器。除此之外,还可以 Struts 2 内置的 OGNL 表达式,更简单的转换,不用写转换器。例如,你的 Action 有属性 User user,只要在 jsp 页面的输入框命名为 user.name 和 user.pass 即可:
<input type="text" name="user.name"/> 或用标签:<s:textfield name="user.name" label="用户名"/>
<input type="text" name="user.pass"/> 或用标签:<s:textfield name="user.pass" label="密 码"/>
提交后,Struts 2 即会帮你构造 User 对象(user = new User()),并赋上属性值(user.setName(),user.setPass()),最后 user 对象赋给 Action (xxxAction.setUser(user))。所以要明白有三个必备的东西:
1) User 要用一个默认构造方法 2) User 要有对应 name 和 pass 的设置方法 setName() 和 setPass() 3) Action 要有 user 属性的设置方法 setUser(),getUser() 也是要的,至于功用后面能看到。
其实在 Struts 1 中也有这种用法,不过那是在 BeanUtils 中实现的。
4. 如果 Action 中的属性是 Map<String, User> users; 那么与此对应的表单写法就是:(用标签来写)
<s:textfield name="users['one'].name" label="第一个用户名"/>
<s:textfield name="users['one'].name" label="第一个密码"/>
<s:textfield name="users['two'].name" label="第二个用户名"/>
<s:textfield name="users['two'].name" label="第二个密码"/>
应该不难想像,这个表单提交后,users 中存储的是什么吧!
如果是对于 Action 中的 List 属性,List<User> users; 那么与此对应的表单写法就是:
<s:textfield name="users[0].name" label="第一个用户名"/>
<s:textfield name="users[0].name" label="第一个密码"/>
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].name" label="第二个密码"/>
5. 归纳前面3、4、5 几点,Struts2 的 Action 在设置每一个属性时都会 get 一下相应的元素 getUser() 或 getUsers()。
对于 3,在设置 user.name 和 user.pass 之前都会 getUser() 来获取 user 属性,如果 user 为 null 就构造 User 对象,然后设置相应的值。假如声明的时候就已构造好 User 对象,如有其他属性如 age=18,并不会被覆盖。
对于 4 和 5,也是在设置每一个属性前都会调用 getUsers() 判断声明的 Map 或 List 是否为 null,是则构造对应的 HashMap 或 ArrayList() 对象;接着根据 Key 或下标去获取相应位置的元素,如果不存在或为 null 则构造之,然后设置相应属性值。由此可见,若某元素的某个属性未重设值则保留原值,若原来Map或List 已有多个元素,也只会改变到 Key 或索引所对应元素的某个属性。对于 List 有可能出现跳空的情况,如页面只有索引不从 0 开始
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].name" label="第二个密码"/>
提交后就会发现,List 属性 users 的第一个元素为 null 了。同时如果尝试一下,你就会发现这里的 List 不能替代为数组 User[] users。
这种样法,可在 Struts 1 中实现,但要略施些小节,见我的另一篇日志:提交多行数据到Struts的ActionForm的List属性中 ,行为表现完全一致,只是换到 Struts 2 中一切都不用自己操心。
6. 看第四点,Action 之所以知道该构造什么类型的元素完全是由泛型告诉它的。如果不用泛型(比如用的是 JDK1.4),Action 中仅仅声明的是 Map users; 或 List users; Action 该如何处理呢?它也不知道,只能够帮你构造出无类型的 HashMap 和 ArrayList(),填充不了元素。这就必须在局部类型转换的配置文件中来指定集合元素的类型。例如 Action 为 LoginAction,就要在 LoginAction-conversion.properties 中声明了,格式如下:
#Element_xxx=复合类型,基中 Element 是固定的,xxx 为属性名
#下面表示为 List 属性 users 的元素为 com.unmi.vo.User 类型
Element_users=com.unmi.vo.User
对于 Map,须分别指定 Key 的类型和 Value 的类型
#Key_xxx=复合类型,基中 Key 是固定的,xxx 为 map 属性名,下面写成 String 都不行的
Key_users=java.lang.String
指定 Map 的 Value 的类型与指定 List 元素类型是一样的
Element_users=com.unmi.vo.User
难怪 Struts 2 要与 1.5 以上 JDK 使用,泛型比配置来得方便。如果硬要用 1.4 JDK,就只有配置类型了,会多很多 conversion 文件的。在 提交多行数据到Struts的ActionForm的List属性中 中类型的确定由 AutoArrayList() 的构造参数完成。
7. Set 是无序集合,所以无法像 List 那样用数字下标来访问,幸好 Struts 2 可为其指定索引属性。例如,LoginAction 声明为 Set users; (这里好像用泛型只能省得了 Element_users 说明,KeyProperty_users 少不了)。则需在 LoginAction-conversion.properties 中写下:
#指定 Set 的元素类型
Element_users=com.unmi.vo.User
#KeyProperty_集合属性名=集合元素的索引属性名,这里为 User 的 name 属性
KeyProperty_users=name
此时提交页面这么写,最好提交前能根据输入的用户名自动修动输入框的 name。
用户名: <input name="users('scott').name"/>
密 码: <input name="users('scott').pass"/>
显示的时候页面可用标签
用户名: <s:property value="users('scott').name"/>
密 码: <s:property value="users('scott').pass"/>
注意前面,访问 Set 元素是用的圆括号,而不同于 Map、List、数组是用中括号。我想一般也犯不着非要用 Set 而不用 List,Struts 2 中用 Set 比在 Struts 1 中似乎还麻烦。
8. Struts 2 内建了一批转换器:boolean、char、int、long、float、double 和它们的包装类型;Date,日期格式使用请求所在 Locale 的 SHORT 格式;数组,默认元素为字符串,其他类型则要转换每一个元素?(好像是一次性转换完成的);集合,默认元素为字符串 XWorkList(String.class, Object[]),其他如 List<Integer> ids,类型为 XWorkList(Integer.class, Object[]),XWorkList 继承自 ArrayList。
9. 类型转换出错由 Struts 来帮你处理,在默认拦截器栈中提供了 conversionError 拦截器,不用你写一点代码逻辑。conversionError 在出错时将错误封装成 fieldError,并放在 ActionContext 中。你所要做的就是遵循它的规则,1) 你的 Action 要继承自 ActionSupport,2)在 struts.xml 中声明名为 "input" 的 result,出错时会在 input 逻辑视图显示信息。3)尽量用标签来写输入域(如<s:textfield name="number" label="数量"/>),这样转换出错后,就会像校验失败一样把错误信息显示在每个输入框上面(视模板而定),否则要手工用 <s:fielderror/> 输出在某处。
默认时输出错误信息为(比如是属性 number,输入的是字符串时):Invalid field value for field "number".你可以改变默认显示,在全局国际化资源文件中加上 xwork.default.invalid.fieldvalue={0}字段类型转换失败!。在某些时候,可能还需要对特定字段指定特别的提示信息,那么在名为 ActionName.properties 的局部资源文件中加上 invalid.fieldvalue.属性名=提示信息 (如 invalid.fieldvalue.number=数量格式错误)
10. 最后是集合属性转换错误时的显示,对于页面中的同名输入框,有多个出错误,如果手工用 <s:fieldError/> 只会显示一条错误,但要是输入页是用标签(如<s:textfield name="number" label="数量"/>),仍会在每一个出错的输入框上都提示。至此类型转换的内容也就完结了。
11. struts2中
<input type="user.name" value="jack">
<input type="user.name" value="lucy">
action中取得name的值是"jack,lucy".
注意:此处name是字符串类型,不是数组类型
我用了你说的那样来提交LIST,但是Action里接收到的List<User> users;为空
我也发现有这样的问题,正在解决中……
要实现的功能:如果用户输入用户名xiaozu,密码111111,则显示welcome,xiaozhu!否则提示用户名或密码错误。
下面是我们所需的文件:
登陆页面login.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>登陆页面</title> </head> <body> <s:form action="/test/loginAction.action" method="post"> <s:textfield name="userName" label="用户名"/> <s:password name="password" label="密码"/> <s:submit/> </s:form> </body> </html>
请求处理LoginAction.java:
package tutorial; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String msg="显示默认消息"; private String userName; private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getMsg() { return msg; } public String execute(){ if ("xiaozhu".equals(userName)&&"111111".equals(password)) { msg="welcome,"+userName; } else { msg="用户名或密码错误"; } return this.SUCCESS; } }
响应页面HelloWorld.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Hello</title> </head> <body> <h3><s:property value="msg"/></h3> </body> </html>
如上所示,对于login.jsp表单中的每个值域我们都会在相应的action中声明一个对应的属性并产生相应的get和set方法,如果这个表单中的值很多(例如注册用户信息的表单),就会导致action十分庞大和容易混乱,并且也不利于我们的软件分层,违背了OO的原则,下面看一下改进后的方案。
登陆页面login.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Insert title here</title> </head> <body> <s:form action="/test/loginAction.action" method="post"> <s:textfield name="user.userName" label="用户名"/> <s:password name="user.password" label="密码"/> <s:submit/> </s:form> </body> </html>
新增实体类User.java:
package tutorial; public class User { private String userName; private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
请求处理LoginAction.java:
package tutorial; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String msg="显示默认消息"; private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getMsg() { return msg; } public String execute(){ if("xiaozhu".equals(user.getUserName())&&"111111".equals(user.getPassword())) msg="welcome,"+user.getUserName(); else msg="用户名或密码错误"; return this.SUCCESS;// } }
响应页面HelloWorld.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Hello</title> </head> <body> <h3><s:property value="msg"/></h3> </body> </html>
前后两种处理方式有何不同呢?后者新建了一个User实体类,用于封装从表单中接收的数据,而在action中就不用设置相应的属性和方法了,并且这样做能够让我们的软件层次感更加明显,系统结构也更加清晰。以User为例,描述一下采用这种方式的关键步骤:
1. 在action中定义一个User类型的对象:User user;
2. 表单中各个控件的name属性要采取如下命名规则:对象名.属性名,注意对象名必须与action中定义的一样,属性名也必须和该对象的属性一一对应。如上例中的user.userName和user.password。
注意:
public User getUser() { return user; }
Action中的这个get方法必须,否则会出现丢值的现象;set方法就更不用说了,必须的。
上述原理解释:
1. 前面讲的自定义类型转换器是基于 OGNL 的 DefaultTypeConverter 类并实现 convertValue() 方法,两个转换方向的逻辑都写在这一个方法中。而 Struts 2 为我们提供了一个 DefaultTypeConverter 的抽象子类 StrutsTypeConverter 来继承,并实现其中两个抽象方法 convertFromString() 和 convertToString(),这要简单易懂。对比 Struts 1 的转换器是要实现 org.apache.commons.beanutils.Converter 接口,以及它的 convert() 方法的。
2. 注意,上面的 convertFromString() 的第二个参数是一个字符串数组,所以可为请求的数组(如请求串为 ?u=1&u=2&u=3)定义转换器,Action 中相应的属性就应为数组或 List,这一方法的返回值也该为相应的类型(数组或List,要通过第三个参数 toClass 来判断是返回数组还是 List 了)。
3. 字符串(如 "user,pass") 转换成 Action 中的复合属性(如 User user) 前面是自定了类型转换器。除此之外,还可以 Struts 2 内置的 OGNL 表达式,更简单的转换,不用写转换器。例如,你的 Action 有属性 User user,只要在 jsp 页面的输入框命名为 user.name 和 user.pass 即可:
<input type="text" name="user.name"/> 或用标签:<s:textfield name="user.name" label="用户名"/>
<input type="text" name="user.pass"/> 或用标签:<s:textfield name="user.pass" label="密 码"/>
提交后,Struts 2 即会帮你构造 User 对象(user = new User()),并赋上属性值(user.setName(),user.setPass()),最后 user 对象赋给 Action (xxxAction.setUser(user))。所以要明白有三个必备的东西:
1) User 要用一个默认构造方法 2) User 要有对应 name 和 pass 的设置方法 setName() 和 setPass() 3) Action 要有 user 属性的设置方法 setUser(),getUser() 也是要的,至于功用后面能看到。
其实在 Struts 1 中也有这种用法,不过那是在 BeanUtils 中实现的。
4. 如果 Action 中的属性是 Map<String, User> users; 那么与此对应的表单写法就是:(用标签来写)
<s:textfield name="users['one'].name" label="第一个用户名"/>
<s:textfield name="users['one'].name" label="第一个密码"/>
<s:textfield name="users['two'].name" label="第二个用户名"/>
<s:textfield name="users['two'].name" label="第二个密码"/>
应该不难想像,这个表单提交后,users 中存储的是什么吧!
如果是对于 Action 中的 List 属性,List<User> users; 那么与此对应的表单写法就是:
<s:textfield name="users[0].name" label="第一个用户名"/>
<s:textfield name="users[0].name" label="第一个密码"/>
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].name" label="第二个密码"/>
5. 归纳前面3、4、5 几点,Struts2 的 Action 在设置每一个属性时都会 get 一下相应的元素 getUser() 或 getUsers()。
对于 3,在设置 user.name 和 user.pass 之前都会 getUser() 来获取 user 属性,如果 user 为 null 就构造 User 对象,然后设置相应的值。假如声明的时候就已构造好 User 对象,如有其他属性如 age=18,并不会被覆盖。
对于 4 和 5,也是在设置每一个属性前都会调用 getUsers() 判断声明的 Map 或 List 是否为 null,是则构造对应的 HashMap 或 ArrayList() 对象;接着根据 Key 或下标去获取相应位置的元素,如果不存在或为 null 则构造之,然后设置相应属性值。由此可见,若某元素的某个属性未重设值则保留原值,若原来Map或List 已有多个元素,也只会改变到 Key 或索引所对应元素的某个属性。对于 List 有可能出现跳空的情况,如页面只有索引不从 0 开始
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].name" label="第二个密码"/>
提交后就会发现,List 属性 users 的第一个元素为 null 了。同时如果尝试一下,你就会发现这里的 List 不能替代为数组 User[] users。
这种样法,可在 Struts 1 中实现,但要略施些小节,见我的另一篇日志:提交多行数据到Struts的ActionForm的List属性中 ,行为表现完全一致,只是换到 Struts 2 中一切都不用自己操心。
6. 看第四点,Action 之所以知道该构造什么类型的元素完全是由泛型告诉它的。如果不用泛型(比如用的是 JDK1.4),Action 中仅仅声明的是 Map users; 或 List users; Action 该如何处理呢?它也不知道,只能够帮你构造出无类型的 HashMap 和 ArrayList(),填充不了元素。这就必须在局部类型转换的配置文件中来指定集合元素的类型。例如 Action 为 LoginAction,就要在 LoginAction-conversion.properties 中声明了,格式如下:
#Element_xxx=复合类型,基中 Element 是固定的,xxx 为属性名
#下面表示为 List 属性 users 的元素为 com.unmi.vo.User 类型
Element_users=com.unmi.vo.User
对于 Map,须分别指定 Key 的类型和 Value 的类型
#Key_xxx=复合类型,基中 Key 是固定的,xxx 为 map 属性名,下面写成 String 都不行的
Key_users=java.lang.String
指定 Map 的 Value 的类型与指定 List 元素类型是一样的
Element_users=com.unmi.vo.User
难怪 Struts 2 要与 1.5 以上 JDK 使用,泛型比配置来得方便。如果硬要用 1.4 JDK,就只有配置类型了,会多很多 conversion 文件的。在 提交多行数据到Struts的ActionForm的List属性中 中类型的确定由 AutoArrayList() 的构造参数完成。
7. Set 是无序集合,所以无法像 List 那样用数字下标来访问,幸好 Struts 2 可为其指定索引属性。例如,LoginAction 声明为 Set users; (这里好像用泛型只能省得了 Element_users 说明,KeyProperty_users 少不了)。则需在 LoginAction-conversion.properties 中写下:
#指定 Set 的元素类型
Element_users=com.unmi.vo.User
#KeyProperty_集合属性名=集合元素的索引属性名,这里为 User 的 name 属性
KeyProperty_users=name
此时提交页面这么写,最好提交前能根据输入的用户名自动修动输入框的 name。
用户名: <input name="users('scott').name"/>
密 码: <input name="users('scott').pass"/>
显示的时候页面可用标签
用户名: <s:property value="users('scott').name"/>
密 码: <s:property value="users('scott').pass"/>
注意前面,访问 Set 元素是用的圆括号,而不同于 Map、List、数组是用中括号。我想一般也犯不着非要用 Set 而不用 List,Struts 2 中用 Set 比在 Struts 1 中似乎还麻烦。
8. Struts 2 内建了一批转换器:boolean、char、int、long、float、double 和它们的包装类型;Date,日期格式使用请求所在 Locale 的 SHORT 格式;数组,默认元素为字符串,其他类型则要转换每一个元素?(好像是一次性转换完成的);集合,默认元素为字符串 XWorkList(String.class, Object[]),其他如 List<Integer> ids,类型为 XWorkList(Integer.class, Object[]),XWorkList 继承自 ArrayList。
9. 类型转换出错由 Struts 来帮你处理,在默认拦截器栈中提供了 conversionError 拦截器,不用你写一点代码逻辑。conversionError 在出错时将错误封装成 fieldError,并放在 ActionContext 中。你所要做的就是遵循它的规则,1) 你的 Action 要继承自 ActionSupport,2)在 struts.xml 中声明名为 "input" 的 result,出错时会在 input 逻辑视图显示信息。3)尽量用标签来写输入域(如<s:textfield name="number" label="数量"/>),这样转换出错后,就会像校验失败一样把错误信息显示在每个输入框上面(视模板而定),否则要手工用 <s:fielderror/> 输出在某处。
默认时输出错误信息为(比如是属性 number,输入的是字符串时):Invalid field value for field "number".你可以改变默认显示,在全局国际化资源文件中加上 xwork.default.invalid.fieldvalue={0}字段类型转换失败!。在某些时候,可能还需要对特定字段指定特别的提示信息,那么在名为 ActionName.properties 的局部资源文件中加上 invalid.fieldvalue.属性名=提示信息 (如 invalid.fieldvalue.number=数量格式错误)
10. 最后是集合属性转换错误时的显示,对于页面中的同名输入框,有多个出错误,如果手工用 <s:fieldError/> 只会显示一条错误,但要是输入页是用标签(如<s:textfield name="number" label="数量"/>),仍会在每一个出错的输入框上都提示。至此类型转换的内容也就完结了。
11. struts2中
<input type="user.name" value="jack">
<input type="user.name" value="lucy">
action中取得name的值是"jack,lucy".
注意:此处name是字符串类型,不是数组类型
评论
3 楼
hdxiong
2009-06-12
fei521sha 写道
我用了你说的那样来提交LIST,但是Action里接收到的List<User> users;为空
我也发现有这样的问题,正在解决中……
2 楼
fei521sha
2009-06-05
我用了你说的那样来提交LIST,但是Action里接收到的List<User> users;为空
1 楼
fei521sha
2009-06-05
<s:textfield name="users[0].name" label="第一个用户名"/>
<s:textfield name="users[0].name" label="第一个密码"/>
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].name" label="第二个密码"/>
<s:textfield name="users[0].name" label="第一个密码"/>
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].name" label="第二个密码"/>
发表评论
-
JSP中 contentType 和 pageEncoding 的差异
2009-09-07 08:11 1360<%@ page language="ja ... -
Struts2 国际化
2009-06-10 10:11 2464Struts2中允许用户自行选择程序语言 最近在学习st ... -
Struts2中struts.xml的Action配置详解
2009-06-02 16:38 1768Struts2中struts.xml的Action配置详解 使 ... -
Spring事务详解
2009-05-05 09:44 1535转载地址:http://www.iteye.com/topic ... -
Spring中常用的hql查询方法(getHibernateTemplate())
2009-04-27 13:40 1167转载地址:http://www.blogjava.net/ju ... -
关于Hibernate的lazy机制
2009-04-27 10:48 1120关于lazy机制,转载地址:http://lz726.itey ... -
Struts2域名解析中碰到的问题
2009-04-20 11:37 3420一、 警告: [SetPropertiesRule]{Se ... -
Struts2中jsp:forward失效的问题
2009-03-24 11:38 3163近来做项目发现在Struts2中<jsp:forw ... -
Strut2中JavaBean规范
2009-03-24 11:18 2693困惑了两个多小时的问 ... -
struts.xml 模块化管理
2009-03-09 10:57 3795先贴两段代码,在慢慢解释 (1)struts-user.xm ... -
struts2 的国际化支持
2009-03-02 14:00 2135struts2 的国际化支持 关 ... -
Spring 整合Struts2
2009-03-02 13:49 2186Spring 整合Struts2 Struts 2框 ... -
Spring AOP IOC MVC 简单的例子
2009-03-01 20:04 1579好久没用Spring了,今天没事花了些时间做了三个例子,一是复 ... -
Struts2实现的多文件上传例子
2009-02-24 16:07 2126文件上传的原理: 表单元素的enctype属性指定的是表单数据 ...
相关推荐
在实际项目中,Struts2 Pojo的应用不仅限于上述几点,还包括错误处理、国际化、表单验证等多个方面。通过充分利用Pojo的特性,开发者可以创建出结构清晰、易于维护的Struts2应用。对于初学者来说,理解并掌握这些...
### Struts2 OGNL 表单提交问题详解 #### 一、背景介绍 Struts2框架作为一款流行的企业级应用开发框架,在处理MVC架构方面有着独特的优势。其中,OGNL (Object-Graph Navigation Language) 作为一种强大的表达式...
- **Struts2**: 直接使用Action来处理表单数据,不再需要专门的ActionForm。Action可以是一个普通的Java对象,并且可以通过标签库直接访问其属性。此外,Struts2还支持ModelDriven模式,允许使用模型对象来代替...
13. **表单提交与Action的关联**:在使用Struts2进行表单处理时,必须确保表单的`action`属性正确指向目标Action,且Action的`namespace`和`name`属性与配置一致,否则会导致请求无法正常路由到指定的Action。...
此外,Struts2支持POJO风格的Action,即普通的Java对象也可以作为Action使用。 #### 二、依赖于Servlet API的程度不同 - **Struts1**: 在Struts1中,Action直接依赖于Servlet API,如`HttpServletRequest`和`...
- **POJO Action**:具有公共无参构造函数和`execute()`方法的POJO类,返回类型为`String`,可以被Struts2识别并处理。 - **实现Action接口**:实现`Action`接口或继承`ActionSupport`类,提供更多内置功能。 #####...
Struts2 中, HTML 表单将被直接映射到一个 POJO. 3、Struts1 的验证逻辑编写在 ActionForm 中; Struts2 中的验证逻辑编写在 Action 中. 4、Struts1 中, Action 类必须继承 org.apache.struts.action.Action 类; ...
- **Action的灵活性增强**:Struts2.x中的Action可以是任何实现了特定接口或注解的POJO,无需继承特定的基类。 - **IoC的支持**:Struts2.x内置了对IoC容器(如Spring)的支持,方便进行依赖注入,提高了代码的可...
- **STRUTS2 的 Action 设计更灵活:**与 STRUTS1 中 Action 必须继承自 `Action` 类不同,STRUTS2 允许 Action 作为 POJO(Plain Old Java Object)存在,这意味着开发者可以更加自由地设计业务逻辑类。...
值得注意的是,在Struts2中,Action接口并不是强制性的,任何包含`execute`标记的方法所在的POJO都可以用作Action对象。 #### 二、线程安全模型 - **Struts1** 中的Action采用的是单例模式,这意味着对于所有的...
2. **ActionForm**:用于封装用户提交的数据,即表单数据。它实现了`ActionForm`接口,因此在设计上并不被视为一个纯粹的POJO(Plain Old Java Object)。 3. **Action**:代表了具体的业务逻辑操作。当Action...
- Struts2提供了强大的表单验证功能,可以在Action类中定义校验规则,也可以使用XML配置文件。 10. **Ajax支持** - Struts2通过JSON结果类型和dojo插件支持Ajax请求,实现局部刷新。 通过这个压缩包中的代码示例...
Struts2还提供了一个`ActionSupport`基类,包含了常用功能的实现,如国际化和验证,但Action接口并非强制要求,任何包含`execute`方法的Plain Old Java Object (POJO)都可以作为Action使用。 在线程模型方面,...
相比于Struts1中的控制器类,Struts2中的控制器类更像是一个简单的POJO(Plain Old Java Object),即普通的Java对象。这意味着在Struts2中,控制器类不再依赖于任何特定的Web容器API(如`HttpServletRequest`或`...
- Struts2中的Action类更加灵活,可以是任意的Java对象(即POJO),只需实现`execute`方法即可。 - Struts2提供了`ActionSupport`基类,但不是强制性的,开发者可以选择是否继承它。 - Action类与Servlet API解耦,...
**Struts2**中的Action可以是任意的Java对象(POJO),不需要继承特定的类或实现特定的方法。Struts2通过拦截器(Interceptor)机制来处理请求,这种方式更加灵活,易于维护和扩展。 ##### 2. **框架架构** **...
更重要的是,Struts2支持POJO作为Action,这意味着任何实现了`execute`方法的对象都可以用作Action,极大地提高了灵活性。 #### 二、执行流程的差异 **Struts1**采用的是一个单一的执行流程模式,所有的请求都会被...