﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;font size="5"&gt;Web2.0学习园地&lt;/font&gt;-文章分类-开源框架</title><link>http://www.blogjava.net/CrazyJava/category/27315.html</link><description>&lt;marquee behavior="alternate" scrolldelay=3 scrollamount=3&gt;
&lt;font face="楷体_GB2312" color="#FFFF00" size="4"&gt;网络无所不在,信息无所不在,应用无所不在!&lt;/font&gt;
&lt;/marquee&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 26 Mar 2008 11:14:28 GMT</lastBuildDate><pubDate>Wed, 26 Mar 2008 11:14:28 GMT</pubDate><ttl>60</ttl><item><title>MyEclipse开发SSH（Struts+Spring+Hibernate）范例</title><link>http://www.blogjava.net/CrazyJava/articles/188447.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 25 Mar 2008 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/188447.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/188447.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/188447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/188447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/188447.html</trackback:ping><description><![CDATA[<h3>1. 准备<br />
</h3>
<p>　　工具：<a id="z7iy" title="MyEclipse 6.0.1 GA" href="http://www.myeclipseide.com/" target="_blank"><font color="#0066aa">MyEclipse 6.0.1 GA</font></a>、<a id="i:oc" title="Tomcat5.5" href="http://tomcat.apache.org/" target="_blank"><font color="#0066aa">Tomcat 5.5</font></a>、<a id="vh5u" title="MySql 5.0" href="http://dev.mysql.com/downloads/mysql/5.0.html" target="_blank"><font color="#0066aa">MySql 5.0</font></a> 、<a id="teuw" title="mysql-gui-tools" href="http://dev.mysql.com/downloads/gui-tools/5.0.html" target="_blank"><font color="#0066aa">MySql GUI Tools 5.0</font></a>（便于管理MySql数据库，不是必须）</p>
<p><br />
</p>
　　环境：Struts1.2、Spring1.2、Hibernate3.1、<a id="s2.:" title="mysql-connector-java-5.0.4-bin.jar" href="http://drc-dev.ohiolink.edu/browser/fedora-core/tags/upstream/lib/mysql-connector-java-5.0.4-bin.jar?rev=636" target="_blank"><font color="#0066aa">mysql-connector-java-5.0.4-bin.jar</font></a><br />
<br />
<strong>1.1. 新建工程<br />
<br />
</strong>　　操作：[Menu] File/New/Web Project<br />
<br />
　　工程名：login<br />
<div id="tf2p" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 525px; height: 500px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_319f9jgqjdg"  alt="" /><br />
</div>
<h3>2. Struts 部分</h3>
<strong><br />
2.1. 添加 Struts 功能支持<br />
</strong><br />
　　操作：[Menu] MyEclipse/Project Capabilities/Add Struts Capabilities<br />
<div id="nngm" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left">
<div id="f3pw" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 557px; height: 468px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_335gprx9cdh"  alt="" /><br />
</div>
</div>
<br />
<strong>2.2. 创建 ActionForm 类<br />
<br />
</strong>　　操作：[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Form<br />
<br />
　　类名：LoginForm
<div id="vj.:" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 557px; height: 595px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_336dkdnvz5n"  alt="" /><br />
</div>
　　在 "Form Properties" 选项卡为 loginForm 新增两个属性：username、password；<br />
<br />
　　在 "JSP" 选项卡钩选 "Create JSP form" 选项，将新建路径改为 "/login.jsp"（login.jsp文件将被自动创建）。<br />
<br />
<strong>2.3. 创建 Action 类<br />
<br />
</strong>　　操作：[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Action<br />
<br />
　　类名：LoginAction<br />
<div id="bya_" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 557px; height: 606px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_334hq8m4jg6"  alt="" /><br />
</div>
　　在 "Form" 选项卡的 "Name" 项选择 "loginForm"，"Input Source" 项输入 "/login.jsp"。<br />
<br />
<strong>2.4. 创建 index.jsp 文件<br />
<br />
</strong>　　如果没有，创建 index.jsp 文件，并添加一个指向 login.jsp 的链接：<span style="color: rgb(51,51,255)">&lt;a href="login.jsp"&gt;Login&lt;/a&gt;</span>。<br />
<br />
<strong>2.5. 创建Forword类<br />
<br />
</strong>　　操作：[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Forword<br />
<br />
　　类名：indexForword<br />
<div id="x0.w" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 558px; height: 500px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_3374rnpstc6"  alt="" /><br />
</div>
<br />
　　"Name" 项输入 "indexForword" ，"Path" 项输入 "/index.jsp" 。<br />
<br />
<strong>2.6. 修改 LoginAction.java 文件<br />
<br />
</strong>　　修改 LoginAction 类的 execute 方法：<br />
<br />
<font color="#3333ff">public class LoginAction extends Action {<br />
<br />
public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
HttpServletRequest request, HttpServletResponse response) {<br />
LoginForm loginForm = (LoginForm) form;<br />
<font color="#009900">String username=loginForm.getUsername();<br />
String password=loginForm.getPassword();<br />
if(username.equals("test")||password.equals("test")){<br />
return mapping.findForward("indexForword");<br />
}else{<br />
return mapping.getInputForward();<br />
}<br />
</font>}<br />
}</font><br />
<br />
<strong>2.7. 修改 login.jsp 文件<br />
<br />
</strong>　　修改 &lt;html:form&gt; 标签：<font color="#3333ff">&lt;html:form action="/login"&gt;</font>。<br />
<br />
<strong>2.8. 测试<br />
<br />
</strong>　　操作：[Menu] Run/Run（用 MyEclipse Server Application 方式运行）<br />
<br />
　　点击 index.jsp 页面的 "Login" 链接，跳转到 login.jsp 页面。在 login.jsp 页面输入 "test/test"，应该会登录成功，然后跳转到 index.jsp 页面；输入 "test/123" ，应该保持在 login.jsp 页面。<br />
<br />
　　如果测试成功，证明 Structs 运行正常。<br />
<br />
<h3>3. Spring 部分</h3>
<strong><br />
3.1. 添加 Spring 功能支持<br />
<br />
</strong>　　操作：[Menu] MyEclipse/Project Capabilities/Add Spring Capabilities<br />
<div id="fezm" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 531px; height: 561px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_323d5wz3kcg"  alt="" /><br />
</div>
　　Spring 版本（ Spring version ）选择 "Spring 1"；<br />
<br />
　　开发包（libraries）选择 "Spring 1.2 AOP Libraries、Spring 1.2 Core Libraries、Spring 1.2 Persistence Core Libraries、Spring 1.2 Persistence JDBC Libraries" 四项；<br />
<br />
　　JAR Library Installation 选择 "copy checked..." ，"Library Folder" 项选择 "/WebRoot/WEB-INF/lib"（这样的话所需的类库都将拷贝到项目目录，方便以后的布署）。<br />
<br />
　　点击 "下一步(Next)" 创建配置文件，修改文件路径（Folder）到 "WebRoot/WEB-INF" 目录（以便和Struts配置文件一起管理），文件名称为默认的"applicationContext.xml"。
<div id="ly45" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 471px; height: 308px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_324dxwmk8c7"  alt="" /><br />
</div>
　　点击 "完成(Finish)" 。<br />
<br />
<strong>3.2. 配置 struts-config.xml 文件</strong><br />
<br />
　　添加 Spring 插件（在 &lt;message-resources&gt; 标签后面添加）：<br />
<br />
<font color="#3333ff">&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />
&lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /&gt;<br />
&lt;/plug-in&gt;</font><br />
<br />
　　修改 LoginAction 的配置（只需修改 type 属性）：<br />
<br />
<font color="#3333ff">&lt;action-mappings &gt;<br />
&lt;action<br />
attribute="loginForm"<br />
input="/login.jsp"<br />
name="loginForm"<br />
path="/login"<br />
scope="request"<br />
type="<font color="#009900">org.springframework.web.struts.DelegatingActionProxy</font>" /&gt;<br />
<br />
&lt;/action-mappings&gt;<br />
</font><br />
　　绿色字体部份为被修改过的内容，这里将使用 spring 的代理器 DelegatingActionProxy 来对 Action 进行控制。<br />
<br />
<strong>3.3. 修改 Spring 配置文件 applicationContext.xml</strong><br />
<br />
<font color="#3333ff">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
<br />
&lt;beans&gt;<br />
<font color="#009900">&lt;bean name="/login" class="com.login.struts.action.LoginAction" singleton="false"&gt;&lt;/bean&gt;</font><br />
&lt;/beans&gt;<br />
</font><br />
　　绿色字体是关于接受和处理 Action 控制权的配置内容，"com.login.struts.action.LoginAction" 即为原 struts 里的配置。<br />
<br />
<strong>3.4. 测试</strong><br />
<br />
　　同上一次测试。测试成功证明 Spring 运行正常。<br />
<br />
<h3>4. Hibernate 部分</h3>
　　下面开始 Hibernate 部分，将原例修改为使用数据库进行用户名/密码验证。<br />
<br />
<strong>4.1. 创建 mysql 数据库和表</strong><br />
<br />
　　添加表的代码如下：<br />
<br />
<font color="#3333ff">CREATE TABLE user_table(<br />
ID int NOT NULL auto_increment,<br />
USERNAME varchar(45) NOT NULL default '',<br />
PASSWORD varchar(45) NOT NULL default '',<br />
PRIMARY KEY (ID)<br />
)<br />
</font><br />
　　再添加一条记录：<br />
<br />
<font color="#3333ff">insert into user_table (USERNAME,PASSWORD) values ('test','test')</font><br />
<br />
<strong>4.2. 创建 MyEclipse 数据库驱动（DB Driver）</strong><br />
<br />
　　操作：[Menu] MyEclipse/Prefrences/MyEclipse/Database Explorer/Database Driver/DB Brower
<div id="qj0v" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 475px; height: 570px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_325tpqzkkg5"  alt="" /><br />
</div>
<br />
　　在 DB Brower 的菜单中选择 "New" ，"Driver Name" 项输入 "login-conn" ，"Connection URL" 项输入 "jdbc:mysql://localhost:3306/test" ，然后输入正确的用户名（User Name）和密码（Password）按实际情况输入；<br />
<br />
　　在 "Driver JARs" 项添加 "mysql-connector-java-5.0.4-bin.jar" (可从网上下载)，在 "Driver classname" 里选择 "com.mysql.jdbc.Driver" ，其它自选。<br />
<br />
　　点击 "完成(Finish)"。<br />
<br />
<strong>4.3. 添加 Hibernate 功能支持</strong><br />
<br />
　　操作：[Menu] MyEclipse/Project Capabilities/Add Hibernate Capabilities<br />
<div id="pje4" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 516px; height: 519px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_326dg4b4pgq"  alt="" /></div>
<br />
　　Hibernate 版本（Hibernate Specification）选择 "Hibernate 3.1" ，开发包（libraries）选择 Hibernate 3.1 Core Libraries 一项；<br />
<br />
　　JAR Library Installation 选择 "copy checked..." ，"Library Folder" 选择 "/WebRoot/WEB-INF/lib" 。<br />
<br />
　　点击 "下一步(Next)" 设置配置文件，选择 "Spring configuration file (applicationContext.xml)" 。<br />
<div id="rrh9" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 516px; height: 519px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_327v5387zfg"  alt="" /><br />
</div>
　　"下一步(Next)" 设置 Spring-Hibernate，选择 "Existing Spring configuration file" ，"SessionFactory ID" 项输入 "sessionFactory" 。<br />
<div id="d7.s" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left">
<div id="c5rq" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 516px; height: 519px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_329gj9xz8g4"  alt="" /><br />
</div>
</div>
　　"下一步(Next)" 创建数据源对象，在 Bean Id 中输入 dataSource，"DataSource" 项选择 "Use JDBC Dirver" ，DB Driver 项选择 "login-conn" ，其余项会自动填充；
<div id="gmtq" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 516px; height: 519px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_330tqtsbr8x"  alt="" /></div>
<br />
　　记得选中 "Copy DB driver jar(s) to project and add to buidpath" 项，以便将数据连接的库文件复制到项目，方便以后的布署。<br />
<br />
　　"下一步(Next)" 创建 SessionFactory 类，"Java package" 项设置为 "com.login.Hibernate" (没有则点击"New"按钮添加)，"Class name" 项修改为"SessionFactory" ，Java Compliance Level选择和创建项目时选择的Java版本。（本例中并没有用到SessionFactory类，留作今后扩展）<br />
<div id="jt.1" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 516px; height: 519px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_331cpv7g6gx"  alt="" /><br />
</div>
　　点击 "完成(Finish)"。<br />
<br />
<strong>4.4. 创建对象关系映射(ORM)的相关文件</strong><br />
<br />
　　操作：[Menu] Window/Open Perspective/MyEclipse Database Explorer<br />
<div id="uh95" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 574px; height: 660px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_332gxx7rhzt"  alt="" /></div>
<br />
　　选中 user_table 表，点击右键，在出现的菜单中选择 "Hibernate Reverse Engnieering" 。<br />
<div id="i0nj" style="padding-right: 0pt; padding-left: 0pt; padding-bottom: 1em; padding-top: 1em; text-align: left"><img style="width: 549px; height: 588px" src="http://docs.google.com/File?id=ajjn4tkm8t6q_333vwh5xphf"  alt="" /><br />
</div>
　　在弹出的窗口中保持 "Java package" 项为 "com.login" ；<br />
<br />
　　选中 "Hibernate mapping file (*.hbm.xml) for each databases table" ，并保持 "Update hibernate..." 项选中；<br />
<br />
　　选中 "Java Data Object" 项，并保持 "Create abstract class" 选中；<br />
<br />
　　"Base persistent class" 项留空；<br />
<br />
　　取消 "Java Data Access Object..." 项和 "Use custom templates" 项。<br />
<br />
　　点击 "下一步(Next)" ，再点击 "下一步(Next)" ，在 "Configure reverse engineering details" 页选中 "user_table" 表，在右边出现的 "Class Name" 项中输入 "com.login.User"，其它不变。<br />
<br />
　　点击 "完成(Finish)"。<br />
<br />
　　完成此操作，会在 "com.login" 包下创建三个文件：AbstractUser.java、User.java、User.hbm.xml。<br />
<br />
<strong>4.5. 创建 UserDAO.java 接口和 UserDAOImpl.java 类</strong><br />
<br />
　　UserDAO 和 UserDAOImpl 通过 Hibernate 访问数据库。<br />
<br />
　　UseDAO.java 内容如下：<br />
<br />
<font color="#3333ff">package com.login;<br />
<br />
public interface UserDAO {<br />
public abstract boolean isValidUser(String username, String password);<br />
}<br />
</font><br />
　　UserDAOImpl.java 内容如下：<br />
<br />
<font color="#3333ff">package com.login;<br />
<br />
import java.util.List;<br />
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;<br />
<br />
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {<br />
private static String hql = "from User u where u.username=? ";<br />
<br />
public boolean isValidUser(String username, String password) {<br />
// 验证用户<br />
List userList = this.getHibernateTemplate().find(hql, username);<br />
if (userList.size() &gt; 0) {<br />
return true;<br />
}<br />
return false;<br />
}<br />
}<br />
<br />
</font><strong>4.6. 修改 LoginAction.java 文件</strong><br />
<br />
　　使用 UseDAO 对象来验证：<br />
<br />
<font color="#3333ff">package com.login.struts.action;<br />
<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
import org.apache.struts.action.Action;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionForward;<br />
import org.apache.struts.action.ActionMapping;<br />
import com.login.struts.form.LoginForm;<br />
import com.login.UserDAO;<br />
<br />
public class LoginAction extends Action {<br />
<font color="#009900">private UserDAO userDAO;<br />
<br />
public UserDAO getUserDAO() {<br />
return userDAO;<br />
}<br />
<br />
public void setUserDAO(UserDAO userDAO) {<br />
this.userDAO = userDAO;<br />
}</font><br />
<br />
public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
HttpServletRequest request, HttpServletResponse response) {<br />
<br />
LoginForm loginForm = (LoginForm) form;<br />
String username=loginForm.getUsername();<br />
String password=loginForm.getPassword();<br />
<br />
if(<font color="#009900"> userDAO.isValidUser( username, password ) </font>){<br />
return mapping.findForward( "indexForword" );<br />
}else{<br />
return mapping.getInputForward();<br />
}<br />
}<br />
}<br />
<br />
</font>　　绿色字体为修改部分。<font color="#3333ff"><br />
<br />
</font><strong>4.7. Spring 的</strong><strong>最终</strong><strong>配制文件 applicationContext.xml</strong><br />
<br />
<font color="#3333ff">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
<br />
&lt;beans&gt; <br />
<br />
&lt;bean id="dataSource"<br />
class="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
&lt;property name="driverClassName" value="com.mysql.jdbc.Driver"&gt;&lt;/property&gt;<br />
&lt;property name="url" value="jdbc:mysql://localhost:3306/test"&gt;&lt;/property&gt;<br />
&lt;property name="username" value="root"&gt;&lt;/property&gt;<br />
&lt;property name="password" value="root"&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;!-- 配置sessionFactory, 注意这里引入的包的不同 --&gt;<br />
&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
&lt;property name="dataSource"&gt;<br />
&lt;ref local="dataSource" /&gt;<br />
&lt;/property&gt;<br />
&lt;property name="mappingResources"&gt;<br />
&lt;list&gt;<br />
&lt;value&gt;com/login/User.hbm.xml&lt;/value&gt;<br />
&lt;/list&gt;<br />
&lt;/property&gt;<br />
&lt;property name="hibernateProperties"&gt;<br />
&lt;props&gt;<br />
&lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;<br />
&lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;<br />
&lt;/props&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />
&lt;property name="sessionFactory"&gt;<br />
&lt;ref local="sessionFactory" /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;bean id="userDAO" class="com.login.UserDAOImpl"&gt;<br />
&lt;property name="sessionFactory"&gt;<br />
&lt;ref local="sessionFactory" /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />
&lt;property name="transactionManager"&gt;<br />
&lt;ref bean="transactionManager" /&gt;<br />
&lt;/property&gt;<br />
&lt;property name="target"&gt;<br />
&lt;ref local="userDAO" /&gt;<br />
&lt;/property&gt;<br />
&lt;property name="transactionAttributes"&gt;<br />
&lt;props&gt;<br />
&lt;prop key="insert*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
&lt;prop key="is*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
&lt;/props&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;bean name="/login" class="com.login.struts.action.LoginAction" singleton="false"&gt;<br />
&lt;property name="userDAO"&gt;<br />
&lt;ref bean="userDAOProxy" /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt; <br />
<br />
&lt;/beans&gt; <br />
<br />
</font><strong>4.8. 测试</strong><br />
<br />
　　同第一次测试。
<img src ="http://www.blogjava.net/CrazyJava/aggbug/188447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-03-25 11:45 <a href="http://www.blogjava.net/CrazyJava/articles/188447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2学习：Overview之Nutshell</title><link>http://www.blogjava.net/CrazyJava/articles/162529.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Fri, 23 Nov 2007 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162529.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162529.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162529.html</trackback:ping><description><![CDATA[写在前面的话：<span style="font-family: 宋体">对</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">的理解一直处于似懂非懂的状态让我很是苦闷，在使用的过程中</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">的强大已经让我叹为观止，不知道这个用词是否准确。为了更好的理解</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">，决定拜读下官方的</span><font face="Times New Roman">guide</font><span style="font-family: 宋体">，顺便做下翻译，希望自己能够坚持下来，阅读的过程中肯定有很多地方理解不了，但是还是打算直接译出来，也许一段时间以后再毒一遍的话就能够理解的更深刻了。</span>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">1</font><span style="font-family: 宋体">．坚果壳中的</span><font face="Times New Roman">apache struts2 </font><span style="font-family: 宋体">体系</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">不知道为什么</span><font face="Times New Roman">struts2</font><span style="font-family: 宋体">的官方文档中为什么要使用</span><font face="Times New Roman">nutshell</font><span style="font-family: 宋体">这个词语来表述，我只好直译了，也许是要表达一个框架的意思吧，整个</span><font face="Times New Roman">struts2</font><span style="font-family: 宋体">框架体系如下图所示：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt" align="center"><font size="3"><span style="font-family: 宋体"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/CMTobby/struts2-arch.png" /></span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><span style="font-family: 宋体"><font size="3">它的具体流程如下：</font></span></p>
<p style="margin: 0cm 0cm 0pt 39.75pt; text-indent: -18pt; tab-stops: list 39.75pt"><font face="Times New Roman"><font size="3">a．</font>&nbsp;</font><font size="3"><span style="font-family: 宋体">首先浏览器发出请求，请求一个服务器端资源，这也许是一个</span><font face="Times New Roman">action</font><span style="font-family: 宋体">，也许是别的</span><font face="Times New Roman">&nbsp;&nbsp; </font><span style="font-family: 宋体">什么东西</span></font></p>
<p style="margin: 0cm 0cm 0pt 39.75pt; text-indent: -18pt; tab-stops: list 39.75pt"><font face="Times New Roman"><font size="3">b．</font>&nbsp;<font size="3">FilterDispatcher</font></font><font size="3"><span style="font-family: 宋体">会对每个请求进行检查，然后选择合适的</span><font face="Times New Roman">action</font></font></p>
<p style="margin: 0cm 0cm 0pt 39.75pt; text-indent: -18pt; tab-stops: list 39.75pt"><font face="Times New Roman"><font size="3">c．</font>&nbsp;</font><font size="3"><span style="font-family: 宋体">拦截器会自动对客户端的亲求进行一些一般化的操作，例如工作流</span><font face="Times New Roman">(workflow)</font><span style="font-family: 宋体">、确认</span><font face="Times New Roman">(validation)</font><span style="font-family: 宋体">以及文件上传的处理</span></font></p>
<p style="margin: 0cm 0cm 0pt 39.75pt; text-indent: -18pt; tab-stops: list 39.75pt"><font face="Times New Roman"><font size="3">d．</font>&nbsp;<font size="3">Action</font></font><span style="font-family: 宋体"><font size="3">中的方法被执行，它通常都是向数据库中存储数据或者检索数据</font></span></p>
<p style="margin: 0cm 0cm 0pt 39.75pt; text-indent: -18pt; tab-stops: list 39.75pt"><font face="Times New Roman"><font size="3">e．</font>&nbsp;<font size="3">Result</font></font><font size="3"><span style="font-family: 宋体">会将输出返回到浏览器，这通常是一个</span><font face="Times New Roman">html</font><span style="font-family: 宋体">文件或者图片等等</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">2</font><span style="font-family: 宋体">．坚果壳中的</span><font face="Times New Roman">struts</font><span style="font-family: 宋体">标签</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">Struts</font><span style="font-family: 宋体">中的标签库确实为我们程序的编写提供了很大的方便，使用</span><font face="Times New Roman">struts</font><span style="font-family: 宋体">标签之后，程序代码的数量确实减少了很多。除了减少代码量之外，</span><font face="Times New Roman">struts</font><span style="font-family: 宋体">标签相对于普通的</span><font face="Times New Roman">html</font><span style="font-family: 宋体">标签而言功能更加强大，例如有的标签还支持国际化、本地化等等，总之呢，</span><font face="Times New Roman">struts</font><span style="font-family: 宋体">标签就是好，</span><font face="Times New Roman">^_^</font><span style="font-family: 宋体">，而且容易理解。不过说实话，我在项目中还是很不习惯又这个</span><font face="Times New Roman">struts</font><span style="font-family: 宋体">标签，我一般都是采用的普通</span><font face="Times New Roman">html</font><span style="font-family: 宋体">标签再加上</span><font face="Times New Roman">jstl</font><span style="font-family: 宋体">标签。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">3</font><span style="font-family: 宋体">．坚果壳中的</span><font face="Times New Roman">struts</font><span style="font-family: 宋体">配置</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">一个</span><font face="Times New Roman">web</font><span style="font-family: 宋体">应用程序通常使用一个部署描述符来初始化诸如过滤器、监听器之类的支援，这个部署描述符通常都是以</span><font face="Times New Roman">xml</font><span style="font-family: 宋体">文件的形式存在，并且命名为</span><font face="Times New Roman">web.xml</font><span style="font-family: 宋体">。在</span><font face="Times New Roman">struts2</font><span style="font-family: 宋体">中你可以通过生命在</span><font face="Times New Roman">web.xml</font><span style="font-family: 宋体">中的</span><font face="Times New Roman">java</font><span style="font-family: 宋体">类来初始化资源，你还可以通过一个叫</span><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">的文件来完全控制这些配置。下面展示了一个典型的</span><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">配置文件：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font face="Times New Roman" size="3">&nbsp;</font></p>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><span style="font-size: 10.5pt; color: black"><font face="宋体">&nbsp;&lt;struts&gt;</font></span></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><font face="宋体"><span style="font-size: 10.5pt; color: black">&nbsp;&nbsp;&nbsp; &lt;</span><span style="font-size: 10.5pt"><font color="#000091">package</font></span><span style="font-size: 10.5pt; color: black"> name=</span><span style="font-size: 10.5pt"><font color="#009100">"</font></span><span style="font-size: 10.5pt"><font color="#000091">default</font></span><span style="font-size: 10.5pt"><font color="#009100">"</font></span><span style="font-size: 10.5pt"><font color="#000091">extends</font></span><span style="font-size: 10.5pt; color: black">=</span><span style="font-size: 10.5pt"><font color="#009100">"struts-</font></span><span style="font-size: 10.5pt"><font color="#000091">default</font></span><span style="font-size: 10.5pt"><font color="#009100">"</font></span><span style="font-size: 10.5pt; color: black">&gt;</span></font></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><font face="宋体"><span style="font-size: 10.5pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=</span><span style="font-size: 10.5pt"><font color="#009100">"Logon"</font></span><span style="font-size: 10.5pt; color: black"> class=</span><span style="font-size: 10.5pt"><font color="#009100">"mailreader2.Logon"</font></span><span style="font-size: 10.5pt; color: black">&gt;</span></font></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><font face="宋体"><span style="font-size: 10.5pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=</span><span style="font-size: 10.5pt"><font color="#009100">"input"</font></span><span style="font-size: 10.5pt; color: black">&gt;/pages/Logon.jsp&lt;/result&gt;</span></font></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><font face="宋体"><span style="font-size: 10.5pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=</span><span style="font-size: 10.5pt"><font color="#009100">"cancel"</font></span><span style="font-size: 10.5pt; color: black"> type=</span><span style="font-size: 10.5pt"><font color="#009100">"redirect-action"</font></span><span style="font-size: 10.5pt; color: black">&gt;Welcome&lt;/result&gt;</span></font></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><font face="宋体"><span style="font-size: 10.5pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result type=</span><span style="font-size: 10.5pt"><font color="#009100">"redirect-action"</font></span><span style="font-size: 10.5pt; color: black">&gt;MainMenu&lt;/result&gt;</span></font></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><font face="宋体"><span style="font-size: 10.5pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=</span><span style="font-size: 10.5pt"><font color="#009100">"expired"</font></span><span style="font-size: 10.5pt; color: black"> type=</span><span style="font-size: 10.5pt"><font color="#009100">"chain"</font></span><span style="font-size: 10.5pt; color: black">&gt;ChangePassword&lt;/result&gt;</span></font></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><span style="font-size: 10.5pt; color: black"><font face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;</font></span></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><font face="宋体"><span style="font-size: 10.5pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=</span><span style="font-size: 10.5pt"><font color="#009100">"Logoff"</font></span><span style="font-size: 10.5pt; color: black"> class=</span><span style="font-size: 10.5pt"><font color="#009100">"mailreader2.Logoff"</font></span><span style="font-size: 10.5pt; color: black">&gt;</span></font></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><font face="宋体"><span style="font-size: 10.5pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result type=</span><span style="font-size: 10.5pt"><font color="#009100">"redirect-action"</font></span><span style="font-size: 10.5pt; color: black">&gt;Welcome&lt;/result&gt;</span></font></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><span style="font-size: 10.5pt; color: black"><font face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;</font></span></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><font face="宋体"><span style="font-size: 10.5pt; color: black">&nbsp;&nbsp;&nbsp; &lt;/</span><span style="font-size: 10.5pt"><font color="#000091">package</font></span><span style="font-size: 10.5pt; color: black">&gt;</span></font></pre>
<pre style="background: #f0f0f0; margin: 3.75pt 3.7pt 3.75pt 11.35pt"><span style="font-size: 10.5pt; color: black"><font face="宋体">&nbsp;&lt;/struts&gt;</font></span></pre>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">3</font><span style="font-family: 宋体">．坚果壳中的</span><font face="Times New Roman">Struts MVC</font></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">是一个</span><font face="Times New Roman">MVC</font><span style="font-family: 宋体">框架，它提供了控制器</span><font face="Times New Roman">(controller)</font><span style="font-family: 宋体">和视图</span><font face="Times New Roman">(viewer)</font><span style="font-family: 宋体">组件，并且和其它技术相结合来提供</span><font face="Times New Roman">Model</font><span style="font-family: 宋体">组件。框架的控制器可以看作是应用程序的</span><font face="Times New Roman">Model</font><span style="font-family: 宋体">和</span><font face="Times New Roman">Web</font><span style="font-family: 宋体">的</span><font face="Times New Roman">view</font><span style="font-family: 宋体">之间的一个桥梁。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">为了使动态显示数据更加方便，</span><font face="Times New Roman">struts</font><span style="font-family: 宋体">框架还提供了一个标记库。这些标签能够同框架的验证</span><font face="Times New Roman">(validation)</font><span style="font-family: 宋体">、国际化</span><font face="Times New Roman">(internationalization)</font><span style="font-family: 宋体">特征相互作用，确保输入的正确性和输出的本土化。标签库能同</span><font face="Times New Roman">JSP</font><span style="font-family: 宋体">、</span><span style="color: black; font-family: 宋体">FreeMarker</span><span style="color: black; font-family: 宋体">等一起使用，而且不影响其它的标签库如JSTL等的使用，它还支持JSF组件。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><span style="color: black; font-family: 宋体"><font size="3">当一个请求达到的时候，控制器(Controller)会调用一个Action类。这个Action类会在&#8220;咨询&#8221;Model组件(代表业务逻辑)后检查或者更新应用程序的状态，为了在Model层和View层之间传输数据，我们可以在Action类中放置属性，或者在一个POJO中放置。</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><span style="color: black; font-family: 宋体"><font size="3">绝大多数时候，Model看起来就像一个JavaBean对象。Model承担了大多数的工作，而Action就像一个交通警察或者适配器一样，只是负责一下监管。框架还提供了非常成熟且自动化的类型转换器，藉此来简化丰富的域对象与纯文本的http请求之间的数据传输工作。</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="color: black; font-family: 宋体">Struts</span><span style="color: black; font-family: 宋体">的扩展性非常好，它部署的每一个类都是面向借口的，它提供了一个应用程序可能用到的所有基础类，如果应用还需要别的类，你可以自己去主动的添加，这就是面向接口的好处。尽管struts提供了很多了功能，但是开发人员还是可以以他们自己的方式来开发。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">4</font><span style="font-family: 宋体">．总结</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font><span style="font-family: 宋体">基于已有的行业标准和设计模式，</span><font face="Times New Roman">struts2</font><span style="font-family: 宋体">可以帮助我们为企业级开发创建一个可扩展的开发环境，如果我们只是要开发一个小的系统的话，我们完全可以采用</span><font face="Times New Roman">JSP Model1</font><span style="font-family: 宋体">开发模式；如果我们要开发的是一个更加复杂的系统，包含很多的页面，并且可能要运行很久的话，使用</span><font face="Times New Roman">Struts</font><span style="font-family: 宋体">是一个不错的选择，</span><font face="Times New Roman">^_^</font><span style="font-family: 宋体">。</span></font></p>
&nbsp;<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1768562</p>
<br />
<img src ="http://www.blogjava.net/CrazyJava/aggbug/162529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-23 09:29 <a href="http://www.blogjava.net/CrazyJava/articles/162529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts学习(七)：说说相对路径</title><link>http://www.blogjava.net/CrazyJava/articles/162446.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 22 Nov 2007 11:05:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162446.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162446.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162446.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">从刚开始接触</span><font face="Times New Roman">Tomcat</font><span style="font-family: 宋体">开始，就被繁杂的相对路径给弄晕了，尽管最后每次都能正确的匹配上，但是总觉得不是很顺畅，一直试图找出一条匹配的规则出来，但是每每总结出一条来的时候，总是又被新的&#8220;事实&#8221;给颠覆，让人不胜烦恼，因此决定有一点写一点。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">通常相对路径的写法有两种，一种就是以&#8220;</span><font face="Times New Roman">/</font><span style="font-family: 宋体">&#8221;开头，一种就是不以&#8220;</span><font face="Times New Roman">/</font><span style="font-family: 宋体">&#8221;开头，这两种写法有什么区别呢，下面举例阐述一下。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">现在的</span><font face="Times New Roman">Web</font><span style="font-family: 宋体">环境是一个</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">的应用，我的应用名是</span><font face="Times New Roman">Struts</font><span style="font-family: 宋体">，应用程序所在的目录名也是</span><font face="Times New Roman">Struts</font><span style="font-family: 宋体">。这样我的</span><font face="Times New Roman">url</font><span style="font-family: 宋体">基本是以</span><a href="http://localhost/Struts"><font face="Times New Roman">http://localhost/Struts</font></a><span style="font-family: 宋体">开头的啦。现在做如下测试：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">1</font><span style="font-family: 宋体">．在</span><font face="Times New Roman">Struts</font><span style="font-family: 宋体">目录下面有一个文件叫</span><font face="Times New Roman">sayHello.jsp</font><span style="font-family: 宋体">，它里面的</span><font face="Times New Roman">form</font><span style="font-family: 宋体">的</span><font face="Times New Roman">action</font><span style="font-family: 宋体">的值是</span><font face="Times New Roman">HelloWorld.action</font><span style="font-family: 宋体">，那么提交之后匹配的路径是</span><a href="http://localhost/Struts/HelloWorld.action"><font face="Times New Roman">http://localhost/Struts/HelloWorld.action</font></a><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">2</font><span style="font-family: 宋体">．如果</span><font face="Times New Roman">action</font><span style="font-family: 宋体">的值是</span><font face="Times New Roman">test/HelloWorld.action</font><span style="font-family: 宋体">，那么提交之后匹配的路径是</span><a href="http://localhost/Struts/HelloWorld.action"><font face="Times New Roman">http://localhost/Struts/test/HelloWorld.action</font></a><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">3</font><span style="font-family: 宋体">．假设在</span><font face="Times New Roman">Struts</font><span style="font-family: 宋体">目录下面有一个子目录</span><font face="Times New Roman">add</font><span style="font-family: 宋体">，它里面有一个文件叫</span><font face="Times New Roman">sayHello.jsp</font><span style="font-family: 宋体">，它里面的</span><font face="Times New Roman">form</font><span style="font-family: 宋体">的</span><font face="Times New Roman">action</font><span style="font-family: 宋体">的值是</span><font face="Times New Roman">HelloWorld.action</font><span style="font-family: 宋体">，那么提交之后匹配的路径是</span><a href="http://localhost/Struts/HelloWorld.action"><font face="Times New Roman">http://localhost/Struts/add/HelloWorld.action</font></a><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">4</font><span style="font-family: 宋体">．在测试</span><font face="Times New Roman">3</font><span style="font-family: 宋体">下将</span><font face="Times New Roman">action</font><span style="font-family: 宋体">的值改为</span><font face="Times New Roman">test/HelloWorld.action</font><span style="font-family: 宋体">，那么提交之后匹配的路径是</span><a href="http://localhost/Struts/add/test/HelloWorld.action"><font face="Times New Roman">http://localhost/Struts/add/test/HelloWorld.action</font></a><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">5</font><span style="font-family: 宋体">．在测试</span><font face="Times New Roman">3</font><span style="font-family: 宋体">下将</span><font face="Times New Roman">action</font><span style="font-family: 宋体">的值改为</span><font face="Times New Roman">/HelloWorld.action</font><span style="font-family: 宋体">，那么提交之后匹配的路径是</span><a href="http://localhost/Struts/add/test/HelloWorld.action"><font face="Times New Roman">http://localhost/Struts/ HelloWorld.action</font></a><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">6</font><span style="font-family: 宋体">．在测试</span><font face="Times New Roman">3</font><span style="font-family: 宋体">下将</span><font face="Times New Roman">action</font><span style="font-family: 宋体">的值改为</span><font face="Times New Roman">/test/HelloWorld.action</font><span style="font-family: 宋体">，那么提交之后匹配的路径是</span><a href="http://localhost/Struts/%20test/HelloWorld.action"><font face="Times New Roman">http://localhost/Struts/ test/HelloWorld.action</font></a><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">总结：在页面文件中，所请求的相对路径为</span><font face="Times New Roman">path</font><span style="font-family: 宋体">，那么它的路径匹配是从文件当前所在的目录开始的，假设页面文件当前所在目录为</span><font face="Times New Roman">curr</font><span style="font-family: 宋体">，那么匹配后的完整路径就是</span><a href="http://localhost/Sturts/curr/aa/bb/cc"><font face="Times New Roman">http://localhost/Sturts/curr/path</font></a><span style="font-family: 宋体">；如果相对路径为</span><font face="Times New Roman">/aa/bb/cc</font><span style="font-family: 宋体">，那么匹配后的路径就是</span><a href="http://localhost/Sturts/aa/bb/cc"><font face="Times New Roman">http://localhost/Sturts/path</font></a><span style="font-family: 宋体">。也就是说，</span><em><span style="font-size: 12pt; background: blue; color: white; font-family: 宋体">如果以&#8220;</span></em><em><span style="font-size: 12pt; background: blue; color: white"><font face="Times New Roman">/</font></span></em><em><span style="font-size: 12pt; background: blue; color: white; font-family: 宋体">&#8221;开头，就从当前应用的根目录开始匹配，如果不以&#8220;</span></em><em><span style="font-size: 12pt; background: blue; color: white"><font face="Times New Roman">/</font></span></em><em><span style="font-size: 12pt; background: blue; color: white; font-family: 宋体">&#8221;开头就从当前文件所在的目录开始匹配</span></em><span style="font-family: 宋体">。这样的话，如果文件本来就在根目录下面，那么加&#8220;</span><font face="Times New Roman">/</font><span style="font-family: 宋体">&#8221;和不加&#8220;</span><font face="Times New Roman">/</font><span style="font-family: 宋体">&#8221;就没啥区别了。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">在</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">还一个要匹配路径的地方就是在处理完请求之后对页面进行分发的时候，也就是</span><font face="Times New Roman">result</font><span style="font-family: 宋体">元素里面的内容。测试记录如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">1</font><span style="font-family: 宋体">．</span><font face="Times New Roman">&lt;result&gt;/HelloWorld.jsp&lt;/result&gt;</font><span style="font-family: 宋体">。匹配的路径是</span><a href="http://localhost/Struts/HelloWorld.jsp"><font face="Times New Roman">http://localhost/Struts/HelloWorld.jsp</font></a><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">2</font><span style="font-family: 宋体">．</span><font face="Times New Roman">&lt;result&gt;HelloWorld.jsp&lt;/result&gt;</font><span style="font-family: 宋体">。这个时候就和调用这个</span><font face="Times New Roman">action</font><span style="font-family: 宋体">的路径相关了。可以这样进行匹配，首先得到请求这个</span><font face="Times New Roman">action</font><span style="font-family: 宋体">的</span><font face="Times New Roman">url</font><span style="font-family: 宋体">，然后去掉最后一个&#8220;</span><font face="Times New Roman">/</font><span style="font-family: 宋体">&#8221;后面的内容，再把</span><font face="Times New Roman">HelloWorld.jsp</font><span style="font-family: 宋体">接上去即可。例如，我们是通过</span><a href="http://localhost/Struts/aa/bb/cc/HelloWorld.action"><font face="Times New Roman">http://localhost/Struts/aa//bb/cc/HelloWorld.action</font></a><span style="font-family: 宋体">调用的</span><font face="Times New Roman">action</font><span style="font-family: 宋体">，那么匹配出来的</span><font face="Times New Roman">url</font><span style="font-family: 宋体">就是</span><a href="http://localhost/Struts/aa/bb/cc/HelloWorld.jsp"><font face="Times New Roman">http://localhost/Struts/aa//bb/cc/HelloWorld.jsp</font></a><span style="font-family: 宋体">。</span></font></p>
<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1728547</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/162446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-22 19:05 <a href="http://www.blogjava.net/CrazyJava/articles/162446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2学习(六)：访问隐藏的request和session </title><link>http://www.blogjava.net/CrazyJava/articles/162426.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 22 Nov 2007 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162426.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162426.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162426.html</trackback:ping><description><![CDATA[<div style="text-indent: 21.75pt">在Struts1.*中，要想访问request、response以及session等Servlet对象是很方便的，因为它们一直是作为形参在各个方法之间进行传递的，而在Struts2中我们就很难看到它们的芳踪了，因为我们获得表单中的值都是通过预先设置好了的get方法来得到的，那么如果有些参数我们必须通过request.getParametre或者session.getAttribute来得到，那么应该怎么做呢？按照Max的教程上的说法，可以分为两种：IoC方式和非IoC方式，如何理解这两种方式的区别呢？IoC是Spring里面的特征之一，字面意思是反转控制，说白了就是依赖注入，比方说类A依赖类B，那么就主动的给A注入一个类B的对象，下面看一下这两种方法的具体实现。</div>
<div style="text-indent: 21.75pt">1．非Ioc方式</div>
<div style="text-indent: 21.75pt">这种方式主要是利用了<span style="background: red; color: black">com.opensymphony.xwork2.ActionContext</span>类以及<span style="background: red">org.apache.struts2.ServletActionContext</span>类，具体的方法如下所示。</div>
<div style="text-indent: 21.75pt">获得request对象：</div>
<div style="text-indent: 21.75pt"><span style="color: black">A</span><span style="color: black">．</span><span style="color: black">HttpServletRequest request = ServletActionContext.getRequest ();</span></div>
<div style="text-indent: 21.75pt">B．ActionContext ct=<span style="color: black"> ActionContext.<em>getContext</em>()</span></div>
<div style="text-indent: 21.75pt"><span style="color: black">&nbsp;&nbsp; </span><span style="color: black">HttpServletRequest&nbsp;request=</span></div>
<div style="text-indent: 30.7pt"><span style="font-size: 10pt; color: black">(HttpServletRequest)ct.get(ServletActionContext.</span><em><span style="font-size: 10pt; color: #0000c0">HTTP_REQUEST</span></em><span style="font-size: 10pt; color: black">);</span></div>
<div style="text-indent: 21.75pt">获得session对象：</div>
<div style="text-indent: 21.75pt">在Struts2中底层的session都被封装成了Map类型，我们称之为SessionMap，而平常我们所说的session则是指HttpSession对象，具体的获得方法如下所示。</div>
<div style="text-indent: 21.75pt">A．Map session=ActionContext.getSession();</div>
<div style="text-indent: 21.75pt">B．Map session=(Map)ActionContext.getContext().get(ActionContext.SESSION);</div>
<div style="text-indent: 21.75pt">得到这个SessionMap之后我们就可以对session进行读写了，<span style="background: blue; color: white">如果我们想得到原始的</span><span style="background: blue; color: white">HttpSession</span><span style="background: blue; color: white">可以首先得到</span><span style="background: blue; color: white">HttpServletRequest</span><span style="background: blue; color: white">对象，然后通过</span><span style="background: blue; color: white">request.getSession()</span><span style="background: blue; color: white">来取得原始的</span><span style="background: blue; color: white">HttpSession</span><span style="background: blue; color: white">对象</span>。一般情况下SessionMap已经可以完成所有的工作，我们不必再去碰底层的session了。</div>
<div style="text-indent: 21.75pt">2．IoC方式</div>
<div style="text-indent: 21.75pt">这种方式相对来说变化就比较少了，具体流程如下所示。</div>
<div style="text-indent: 21.75pt">获得request对象：</div>
<div style="text-indent: 21.75pt">第一步：让action实现<span style="background: red; color: black">ServletRequestAware</span><span style="color: black">接口</span></div>
<div style="text-indent: 21.75pt"><span style="color: black">第二步：在</span><span style="color: black">action</span><span style="color: black">中声明一个</span><span style="color: black">HttpServletRequest</span><span style="color: black">类型的实例变量</span></div>
<div style="margin-left: 63.75pt; text-indent: -42pt"><span style="color: black">第三步：在</span><span style="color: black">action</span><span style="color: black">中实现</span><span style="background: red; color: black">ServletRequestAware</span><span style="color: black">接口的</span><span style="font-size: 10pt; color: black">setServletRequest</span><span style="font-size: 10pt; color: black">方法，实现方式很简单，如下所示。</span></div>
<div align="left"><span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055">private</span></strong><span style="font-size: 10pt; color: black"> HttpServletRequest </span><span style="font-size: 10pt; color: #0000c0">request</span><span style="font-size: 10pt; color: black">;</span></div>
<div style="text-indent: 44.25pt" align="left"><strong><span style="font-size: 10pt; color: #7f0055">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055">void</span></strong><span style="font-size: 10pt; color: black"> <span style="background: silver">setServletRequest</span>(HttpServletRequest request) {</span></div>
<div align="left"><span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055">this</span></strong><span style="font-size: 10pt; color: black">.</span><span style="font-size: 10pt; color: #0000c0">request</span><span style="font-size: 10pt; color: black"> = request;</span></div>
<div style="margin-left: 61.75pt; text-indent: -40pt"><span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 61.75pt; text-indent: -40pt"><span style="font-size: 10pt; color: black">获得</span><span style="font-size: 10pt; color: black">Session</span><span style="font-size: 10pt; color: black">对象</span><span style="font-size: 10pt; color: black">(</span><span style="font-size: 10pt; color: black">注意，此时的</span><span style="font-size: 10pt; color: black">session</span><span style="font-size: 10pt; color: black">是</span><span style="font-size: 10pt; color: black">SessionMap</span><span style="font-size: 10pt; color: black">类型</span><span style="font-size: 10pt; color: black">)</span><span style="font-size: 10pt; color: black">：</span></div>
<div style="text-indent: 21.75pt">第一步：让action实现<span style="font-size: 10pt; background: red; color: black">SessionAware</span><span style="color: black">接口</span></div>
<div style="text-indent: 21.75pt"><span style="color: black">第二步：在</span><span style="color: black">action</span><span style="color: black">中声明一个</span><span style="color: black">HttpServletRequest</span><span style="color: black">类型的实例变量</span></div>
<div style="margin-left: 63.75pt; text-indent: -42pt"><span style="color: black">第三步：在</span><span style="color: black">action</span><span style="color: black">中实现</span><span style="font-size: 10pt; background: red; color: black">SessionAware</span><span style="color: black">接口的</span><span style="font-size: 10pt; background: silver; color: black">setSession</span><span style="font-size: 10pt; color: black">方法，实现方式很简单，如下所示。</span></div>
<div align="left"><span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055">private</span></strong><span style="font-size: 10pt; color: black"> Map </span><span style="font-size: 10pt; color: #0000c0">session</span><span style="font-size: 10pt; color: black">;</span></div>
<div style="text-indent: 44.25pt" align="left"><strong><span style="font-size: 10pt; color: #7f0055">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055">void</span></strong><span style="font-size: 10pt; color: black"> setSession(Map session) {</span></div>
<div align="left"><span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055">this</span></strong><span style="font-size: 10pt; color: black">.</span><span style="font-size: 10pt; color: #0000c0"> session</span><span style="font-size: 10pt; color: black"> = session;</span></div>
<div style="margin-left: 61.75pt; text-indent: -40pt"><span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 63.75pt; text-indent: -42pt">&nbsp;</div>
&nbsp;<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1721226</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/162426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-22 17:54 <a href="http://www.blogjava.net/CrazyJava/articles/162426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts学习(五)：对POJO对象访问的支持</title><link>http://www.blogjava.net/CrazyJava/articles/162424.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 22 Nov 2007 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162424.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162424.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162424.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162424.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在Struts2.0里面有一个非常牛*的功能就是支持更高级的POJO访问，这句话是什么意思呢？下面来通过例子实际操作一把就能体会到这个功能的强大与好使了。要实现的功能：如果用户输入用户名xiaozu，密码111111，则显示welcome，xiaozhu!否则提示用户名或密码错误。下面是我们所需的文件：登陆页面login.jsp：&lt;%@ page language="java...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/162424.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/162424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-22 17:50 <a href="http://www.blogjava.net/CrazyJava/articles/162424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2学习(四)：Action执行的时候发生了什么</title><link>http://www.blogjava.net/CrazyJava/articles/162422.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 22 Nov 2007 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162422.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162422.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162422.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162422.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">通过前面的学习，对</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">的工作流程大致有了一个了解，</span></font><font size="3"><span style="font-family: 宋体">在</span><font face="Times New Roman">Struts1</font><span style="font-family: 宋体">中我们经常要把一个</span><font face="Times New Roman">ActionForm</font><span style="font-family: 宋体">和一个</span><font face="Times New Roman">Action</font><span style="font-family: 宋体">相关联，</span><font face="Times New Roman">ActionForm</font><span style="font-family: 宋体">中封装了表单的所有值，并且这些都是在</span><font face="Times New Roman">ActionServlet</font><span style="font-family: 宋体">中完成的，因此我们在</span><font face="Times New Roman">action</font><span style="font-family: 宋体">中可以直接通过</span><font face="Times New Roman">ActionForm</font><span style="font-family: 宋体">得到表当中的值，那么</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">中又是怎么做的呢？我们怎么取得那些值呢？我发现可以这么做：对表单中每一个要获取的值，在</span><font face="Times New Roman">action</font><span style="font-family: 宋体">中相应添加这样的一个域，然后再设置相应的</span><font face="Times New Roman">set</font><span style="font-family: 宋体">和</span><font face="Times New Roman">get</font><span style="font-family: 宋体">方法，即采用</span><font face="Times New Roman">javabean</font><span style="font-family: 宋体">风格，貌似这个现在比较流行。比方说在前面的例子中，在</span><font face="Times New Roman">sayHello.jsp</font><span style="font-family: 宋体">的表单中有一个文本域，它的</span><font face="Times New Roman">name=&#8221;name&#8221;</font><span style="font-family: 宋体">，在我的</span><font face="Times New Roman">action</font><span style="font-family: 宋体">文件</span><font face="Times New Roman">HelloWorld.java</font><span style="font-family: 宋体">中有一个域</span><strong><span style="color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="color: black; font-family: 'Courier New'"> String </span><span style="color: #0000c0; font-family: 'Courier New'">name</span><span style="color: black; font-family: 'Courier New'">;</span><span style="color: black; font-family: 宋体">同时还分别设置了相应的</span><span style="color: black; font-family: 'Courier New'">setName</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: 'Courier New'">getName</span><span style="color: black; font-family: 宋体">方法，现在我把</span><span style="color: black; font-family: 'Courier New'">setName</span><span style="color: black; font-family: 宋体">方法改为如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 19.7pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setName(String <span style="background: silver">name</span>) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">out</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.println(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"name:"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+<span style="background: silver">name</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 40.15pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> = <span style="background: silver">name</span>;</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 19.6pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20.6pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">OK</span><span style="color: black; font-family: 宋体">，在浏览器中输入</span><span style="color: black; font-family: 'Courier New'"><a href="http://localhost:8888/Struts/sayHello.jsp">http://localhost:8888/Struts/sayHello.jsp</a></span><span style="color: black; font-family: 宋体">，这时我们发现后台打印出了</span><span style="background: red; color: black; font-family: 'Courier New'">name:CMTobby</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: 'Courier New'">CMTobby</span><span style="color: black; font-family: 宋体">是我输入的</span><span style="color: black; font-family: 'Courier New'">name</span><span style="color: black; font-family: 宋体">的值，这说明</span><span style="color: black; font-family: 'Courier New'">setName</span><span style="color: black; font-family: 宋体">方法被执行了，奇怪啊，我们根本没有显式的调用这个方法啊，它是什么时候调用的呢？现在我们在</span><span style="color: black; font-family: 'Courier New'">setName</span><span style="color: black; font-family: 宋体">方法里面设置一个断点，然后再在</span><span style="color: black; font-family: 'Courier New'">execute</span><span style="color: black; font-family: 宋体">方法里面设置一个断点，再次运行我们的程序，结果显示</span><span style="color: black; font-family: 'Courier New'">setName</span><span style="color: black; font-family: 宋体">方法在</span><span style="color: black; font-family: 'Courier New'">execute</span><span style="color: black; font-family: 宋体">方法前面执行。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20.6pt; text-align: left" align="left"><font size="3"><span style="font-family: 宋体">接着，无聊的我又做了一些测试：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20.6pt; text-align: left" align="left"><font size="3"><span style="font-family: 宋体">1</span><span style="font-family: 宋体">．把setName改为setName1，结果页面输出：</span><span style="font-family: 宋体">Hello null</span><span style="font-family: 宋体">，并且</span><span style="font-family: 宋体">setName1</span><span style="font-family: 宋体">为执行</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20.6pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">2</span><span style="color: black; font-family: 宋体">．在sayHello.jsp的form之外加了一个文本框，取名address，在HelloWorld中增加相应的域address、setAddress方法和getAddress方法，通过断点测试发现，setAddress方法不会执行。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体"><font size="3">基于以上测试，我认为<span style="background: red">在执行action的操作之前，首先会根据请求页面的form表当中所包含的参数来调用action中相应的set****方法</span>，比如说，本例中，form中有name属性，因此会在执行execute之情调用setName方法，而address因为不在form中所以不会调用setAddress方法.</font></span></p>
<span style="color: black; font-family: 宋体">
<p style="margin: 0cm 0cm 0pt; text-indent: 20.6pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">在处理完请求之后如何把用户所请求的值回传到结果页面当中呢？在HelloWorld.jsp中我们用了</span><span style="background: red; font-family: 宋体">&lt;s:property value="name" /&gt;</span><span style="font-family: 宋体">，嘿嘿，难道又是隐式的调用了getName方法吗？于是我在HelloWorld.java的getName方法处设置了一个断点，再次运行我们的程序，果然getName被隐式的调用了。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20.6pt; text-align: left" align="left"><span style="font-family: 宋体"><font size="3">此外如果我把<span style="background: red">&lt;s:property value="name" /&gt;</span>中value的值改为别的如name1，这时页面出错，一片空白。我接着又把getName方法改为getName1，这时页面仍然一片空白，因为取不到name属性的值。如果我把<span style="background: red">&lt;s:property value="name" /&gt;</span>改为</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="background: red; font-family: 宋体">&lt;s:property value="name1" /&gt;</span><span style="font-family: 宋体">，同时也把getName改为getName1，那么显示就正常了，这个表明框架会根据属性的名字去调用相应的get方法。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><span style="color: black; font-family: 宋体"><font size="3">上述机制是不是和我们前面所讨论的BeanUtils的copyProperties方法一样，实际上很多ORM框架都采用的这个机制，都是首先得到属性名再调用相应的set或者get方法，而不是直接访问的域。</font></span></p>
</span><br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1710368</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/162422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-22 17:45 <a href="http://www.blogjava.net/CrazyJava/articles/162422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2学习(三)：namespace属性的使用</title><link>http://www.blogjava.net/CrazyJava/articles/162419.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 22 Nov 2007 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162419.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162419.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162419.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">文件中的</span><font face="Times New Roman">package</font><span style="font-family: 宋体">元素有一个</span><font face="Times New Roman">namespace</font><span style="font-family: 宋体">属性，这个属性有什么用呢，加了这个属性之后我们的</span><font face="Times New Roman">url</font><span style="font-family: 宋体">又该怎么写了，还是亲自实践一把吧，</span><font face="Times New Roman">^_^</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">我现在把</span><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">文件修改如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;!</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">DOCTYPE </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">struts </span><span style="font-size: 10pt; color: gray; font-family: 'Courier New'">PUBLIC&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: gray; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">struts</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">package </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"tutorial" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">extends</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"struts-default"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> <span style="background: red">namespace="/test"</span></span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">action </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"HelloWorld" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">class</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"tutorial.HelloWorld"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">result</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">HelloWorld.jsp</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">result</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">action</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">package</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">struts</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="color: black; font-family: 宋体">其它文件的内容都不变，和上一篇文章中一样，这是我在</span><span style="color: black; font-family: 'Courier New'">sayHello.jsp</span><span style="color: black; font-family: 宋体">文件中点击提交，页面报错：</span><font face="Times New Roman">The requested resource (/Struts/HelloWorld) is not available</font><span style="font-family: 宋体">。下面做如下一些尝试：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">1</font><span style="font-family: 宋体">．将</span><font face="Times New Roman">sayHello.jsp</font><span style="font-family: 宋体">中</span><font face="Times New Roman">form</font><span style="font-family: 宋体">的</span><font face="Times New Roman">action</font><span style="font-family: 宋体">改为</span><font face="Times New Roman">test/HelloWorld</font></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp; </font><span style="font-family: 宋体">报错：</span><font face="Times New Roman">The requested resource (/Struts/test/HelloWorld) is not available</font></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">2</font><span style="font-family: 宋体">．将</span><font face="Times New Roman">sayHello.jsp</font><span style="font-family: 宋体">中</span><font face="Times New Roman">form</font><span style="font-family: 宋体">的</span><font face="Times New Roman">action</font><span style="font-family: 宋体">改为</span><font face="Times New Roman">test/HelloWorld.action</font></font></p>
<p style="margin: 0cm 0cm 0pt 36.75pt; text-indent: -15.75pt"><font size="3"><font face="Times New Roman">&nbsp;&nbsp; </font><span style="font-family: 宋体">报错：</span><font face="Times New Roman">The requested resource (/Struts/test/<span style="background: red">HelloWorld.jsp) is not available</font></span><span style="font-family: 宋体">，这表明</span><font face="Times New Roman">action</font><span style="font-family: 宋体">已经找到，只是执行</span><font face="Times New Roman">action</font><span style="font-family: 宋体">之后找不到所转向的页面</span><span style="background: red"><font face="Times New Roman">HelloWorld.jsp</font></span></font></p>
<p style="margin: 0cm 0cm 0pt 36.75pt; text-indent: -15.75pt"><font size="3"><font face="Times New Roman">3</font><span style="font-family: 宋体">．将</span><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">中</span><font face="Times New Roman">result</font><span style="font-family: 宋体">标签改为</span><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">result</span><span style="color: teal; font-family: 'Courier New'">&gt;</span><span style="color: black; font-family: 'Courier New'">/HelloWorld.jsp</span><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">result</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt 36pt; text-indent: -15pt"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&nbsp;&nbsp; </span><font size="3"><span style="color: black; font-family: 'Courier New'">OK,</span><span style="color: black; font-family: 宋体">测试通过！</span></font></p>
<p style="margin: 0cm 0cm 0pt 36.75pt; text-indent: -15.75pt"><font size="3"><span style="color: black; font-family: 宋体">因此，在设置了</span><span style="color: black; font-family: 'Courier New'">package</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: 'Courier New'">namespace</span><span style="color: black; font-family: 宋体">属性之后，标准的访问</span><span style="color: black; font-family: 'Courier New'">url</span><span style="color: black; font-family: 宋体">应该是：</span></font></p>
<p style="margin: 0cm 0cm 0pt 36.75pt; text-indent: -15.75pt"><span style="color: black; font-family: 'Courier New'"><a href="http://webserver/webPrefix/namespace/actionname.action"><font size="3">http://webserver/webPrefix/namespace/actionname.action</font></a></span><font size="3"><span style="color: black; font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt 36.75pt; text-indent: -15.75pt"><font size="3"><span style="color: black; font-family: 宋体">实际上</span><span style="color: black"><font face="Times New Roman">FilterDispatcher</font></span><span style="color: black; font-family: 宋体">对</span><span style="color: black"><font face="Times New Roman">url</font></span><span style="color: black; font-family: 宋体">进行映射的方式非常复杂，我在上篇文章里面所做的推测</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="color: black; font-family: 宋体">针对的只是一种最简单的情况而已，因为我做了很多</span><span style="color: black"><font face="Times New Roman">BT</font></span><span style="color: black; font-family: 宋体">的测试，得到了一些让我吃惊的结果。比如说我再加一个</span><span style="color: black"><font face="Times New Roman">package</font></span><span style="color: black; font-family: 宋体">：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font></span><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">package </span><span style="color: #7f007f; font-family: 'Courier New'">name</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"tutorial1" </span><span style="color: #7f007f; font-family: 'Courier New'">extends</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"struts-default"</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">action </span><span style="color: #7f007f; font-family: 'Courier New'">name</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"HelloWorld" </span><span style="color: #7f007f; font-family: 'Courier New'">class</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"tutorial.HelloWorld"</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">result</span><span style="color: teal; font-family: 'Courier New'">&gt;</span><span style="color: black; font-family: 'Courier New'">/HelloWorld.jsp</span><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">result</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">action</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">package</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="color: black; font-family: 宋体">这个包和之前那个唯一的差别就是没有</span><span style="color: black; font-family: 'Courier New'">namespace</span><span style="color: black; font-family: 宋体">属性，当然包名肯定是不同的咯，现在我将</span><span style="color: black; font-family: 'Courier New'">sayHello.jsp</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: 'Courier New'">action</span><span style="color: black; font-family: 宋体">进行修改，我发现无论怎么改，只要它是以</span><span style="color: black; font-family: 'Courier New'">HelloWorld.action</span><span style="color: black; font-family: 宋体">结尾，测试都是通过的，例如</span><span style="color: black; font-family: 'Courier New'">111/222/HelloWorld.action</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: 'Courier New'">aaa/bbb/HelloWorld.action</span><span style="color: black; font-family: 宋体">，这些都能得到正确的答案。看来</span><span style="color: black"><font face="Times New Roman">FilterDispatcher</font></span><span style="color: black; font-family: 宋体">到底是怎么映射</span><span style="color: black"><font face="Times New Roman">url</font></span><span style="color: black; font-family: 宋体">的只能到源码里面去找答案了。但是在具体的开发中，我们只要严格按照</span><span style="color: black; font-family: 'Courier New'"><a href="http://webserver/webPrefix/namespace/actionname.action">http://webserver/webPrefix/namespace/actionname.action</a></span><span style="color: black; font-family: 宋体">这个规则来配置</span><span style="color: black; font-family: 'Courier New'">url</span><span style="color: black; font-family: 宋体">肯定是不是错的咯。</span></font></p>
&nbsp;<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1708634</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/162419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-22 17:35 <a href="http://www.blogjava.net/CrazyJava/articles/162419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2学习(二)：第一个Action </title><link>http://www.blogjava.net/CrazyJava/articles/162416.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 22 Nov 2007 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162416.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162416.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162416.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">前面我们已经把</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">的运行环境搭建起来了，下面我们开始创建我们的第一个</span><font face="Times New Roman">Action</font><span style="font-family: 宋体">，还是按照</span><font face="Times New Roman">Max</font><span style="font-family: 宋体">的教程来，我新创建了如下几个文件：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">sayHello.jsp</font><span style="font-family: 宋体">：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: #bf5f3f; font-family: 'Courier New'">&lt;%@ </span><span style="color: #3f7f7f; font-family: 'Courier New'">page </span><span style="color: #7f007f; font-family: 'Courier New'">language</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"java" </span><span style="color: #7f007f; font-family: 'Courier New'">contentType</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"text/html; charset=utf-8"</span><span style="color: #bf5f3f; font-family: 'Courier New'">%&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: #bf5f3f; font-family: 'Courier New'">&lt;%@ </span><span style="color: #3f7f7f; font-family: 'Courier New'">taglib </span><span style="color: #7f007f; font-family: 'Courier New'">prefix</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"s" </span><span style="color: #7f007f; font-family: 'Courier New'">uri</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"/struts-tags" </span><span style="color: #bf5f3f; font-family: 'Courier New'">%&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;!</span><span style="color: #3f7f7f; font-family: 'Courier New'">DOCTYPE </span><span style="color: navy; font-family: 'Courier New'">html </span><span style="color: gray; font-family: 'Courier New'">PUBLIC </span><span style="color: navy; font-family: 'Courier New'">"-//W3C//DTD HTML 4.01 Transitional//EN" </span><span style="color: #3f7f5f; font-family: 'Courier New'">"http://www.w3.org/TR/html4/loose.dtd"</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">html</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">head</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">meta </span><span style="color: #7f007f; font-family: 'Courier New'">http-equiv</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"Content-Type" </span><span style="color: #7f007f; font-family: 'Courier New'">content</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"text/html; charset=utf-8"</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">title</span><span style="color: teal; font-family: 'Courier New'">&gt;</span><span style="color: black; font-family: 'Courier New'">Say Hello</span><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">title</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">head</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">body</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">h3</span><span style="color: teal; font-family: 'Courier New'">&gt;</span><span style="color: black; font-family: 'Courier New'">Say "Hello" to: </span><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">h3</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; Address:</span><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">input </span><span style="color: #7f007f; font-family: 'Courier New'">type</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"text" </span><span style="color: #7f007f; font-family: 'Courier New'">name</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"address"</span><span style="color: teal; font-family: 'Courier New'">/&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">s:form </span><span style="color: #7f007f; font-family: 'Courier New'">action</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"HelloWorld"</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name: </span><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">s:textfield </span><span style="color: #7f007f; font-family: 'Courier New'">name</span><span style="color: black; font-family: 'Courier New'">=</span><span style="color: #2a00ff; font-family: 'Courier New'">"name"</span><span style="color: teal; font-family: 'Courier New'">/&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal; font-family: 'Courier New'">&lt;</span><span style="color: #3f7f7f; font-family: 'Courier New'">s:submit</span><span style="color: teal; font-family: 'Courier New'">&gt;&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">s:submit</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">s:form</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">body</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="color: teal; font-family: 'Courier New'">&lt;/</span><span style="color: #3f7f7f; font-family: 'Courier New'">html</span><span style="color: teal; font-family: 'Courier New'">&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: black; font-family: 'Courier New'"><font size="3">HelloWorld.jsp:</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: #bf5f3f; font-family: 'Courier New'">&lt;%@ </span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">page </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">language</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"java" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">contentType</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"text/html; charset=utf-8"</span><span style="font-size: 10pt; color: #bf5f3f; font-family: 'Courier New'">%&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: #bf5f3f; font-family: 'Courier New'">&lt;%@ </span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">taglib </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">prefix</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"s" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">uri</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"/struts-tags" </span><span style="font-size: 10pt; color: #bf5f3f; font-family: 'Courier New'">%&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;!</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">DOCTYPE </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">html </span><span style="font-size: 10pt; color: gray; font-family: 'Courier New'">PUBLIC </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"-//W3C//DTD HTML 4.01 Transitional//EN" </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">"http://www.w3.org/TR/html4/loose.dtd"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">html</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">head</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">title</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Hello</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">title</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">head</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">body</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">h3</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:property </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">value</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"name" </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">/&gt;&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">h3</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">body</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">html</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">HelloWorld.java</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> tutorial;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> com.opensymphony.xwork2.ActionSupport;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> HelloWorld </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> ActionSupport {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String getName() {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setName(String name) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> = name;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String execute(){</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"Hello "</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"!"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//System.out.println(name);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">SUCCESS</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; color: black; font-family: 宋体">这几个文件之间的流程如下图所示：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;<span style="font-size: 10.5pt">&nbsp;<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/CMTobby/clip_image002.gif" /></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">首先</span><font face="Times New Roman">sayHello.jsp</font><span style="font-family: 宋体">向服务器发送请求，然后根据我们</span><font face="Times New Roman">web.xml</font><span style="font-family: 宋体">文件的配置，这个请求被交给了</span><font face="Times New Roman">FilterDispatcher</font><span style="font-family: 宋体">这个类来进行处理，</span><font face="Times New Roman">FilterDispatcher</font><span style="font-family: 宋体">会根据我们</span><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">文件的中的配置信息来对这个请求分流，让它进入某个指定的</span><font face="Times New Roman">action(</font><span style="font-family: 宋体">本例中是</span><font face="Times New Roman">HelloWorld.java)</font><span style="font-family: 宋体">，在处理完请求之后，再将页面转向</span><font face="Times New Roman">HelloWorld.jsp(</font><span style="font-family: 宋体">这个也是在</span><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">中指定的</span><font face="Times New Roman">)</font><span style="font-family: 宋体">。为了保证上述流程的顺利执行，现在</span><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">文件的内容修改如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;!</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">DOCTYPE </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">struts </span><span style="font-size: 10pt; color: gray; font-family: 'Courier New'">PUBLIC&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: gray; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">struts</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">&lt;!--&nbsp;this is a test</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;include file="struts-default.xml"&gt;&lt;/include&gt;--&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">package </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"tutorial" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">extends</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"struts-default"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">action </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"HelloWorld" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">class</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"tutorial.HelloWorld"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">result</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">HelloWorld.jsp</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">result</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">action</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">package</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">struts</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="color: black; font-family: 宋体">注意，这里</span><span style="color: black"><font face="Times New Roman">action</font></span><span style="color: black; font-family: 宋体">的</span><span style="color: black"><font face="Times New Roman">name</font></span><span style="color: black; font-family: 宋体">属性和</span><span style="color: black"><font face="Times New Roman">sayHello.jsp</font></span><span style="color: black; font-family: 宋体">中的</span><span style="color: black"><font face="Times New Roman">action</font></span><span style="color: black; font-family: 宋体">属性的值是一样的，实际上在</span><font face="Times New Roman">FilterDispatcher</font><span style="font-family: 宋体">中就是根据这两个值对</span><font face="Times New Roman">request</font><span style="font-family: 宋体">进行分流的，具体过程如下：</span></font></p>
<p style="margin: 0cm 0cm 0pt 39.75pt; text-indent: -18pt; tab-stops: list 39.75pt"><font face="Times New Roman"><font size="3">1．</font>&nbsp;</font><font size="3"><span style="font-family: 宋体">我们写出这个处理这个请求的</span><font face="Times New Roman">url</font><span style="font-family: 宋体">，本例是</span><a href="http://localhost:8888/Struts/HelloWorld"><font face="Times New Roman">http://localhost:8888/Struts/HelloWorld</font></a><span style="font-family: 宋体">，</span></font></p>
<p style="margin: 0cm 0cm 0pt 39.75pt; text-indent: -18pt; tab-stops: list 39.75pt"><font face="Times New Roman"><font size="3">2．</font>&nbsp;</font><font size="3"><span style="font-family: 宋体">取出</span><a href="http://localhost:8888/Struts/"><font face="Times New Roman">http://localhost:8888/Struts/</font></a><span style="font-family: 宋体">之后的字符串得到了</span><font face="Times New Roman">HelloWorld</font></font></p>
<p style="margin: 0cm 0cm 0pt 39.75pt; text-indent: -18pt; tab-stops: list 39.75pt"><font face="Times New Roman"><font size="3">3．</font>&nbsp;</font><font size="3"><span style="font-family: 宋体">在</span><font face="Times New Roman">struts.xml</font><span style="font-family: 宋体">文件中查找</span><font face="Times New Roman">name</font><span style="font-family: 宋体">属性为</span><font face="Times New Roman">HelloWorld</font><span style="font-family: 宋体">的</span><font face="Times New Roman">action</font><span style="font-family: 宋体">，把</span><font face="Times New Roman">request</font><span style="font-family: 宋体">交给它处理，默认情况下首先执行它里面的</span><font face="Times New Roman">execute()</font><span style="font-family: 宋体">方法</span></font></p>
<p style="margin: 0cm 0cm 0pt 39.75pt; text-indent: -18pt; tab-stops: list 39.75pt"><font face="Times New Roman"><font size="3">4．</font>&nbsp;</font><span style="font-family: 宋体"><font size="3">请求处理完毕之后进入</font></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">HelloWorld.jsp</span><span style="font-size: 10pt; color: black; font-family: 宋体">页面，配置在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&lt;result&gt;</span><span style="font-size: 10pt; color: black; font-family: 宋体">标签里面</span></p>
<p style="margin: 0cm 0cm 0pt 21.75pt"><span style="font-size: 10pt; color: black; font-family: 宋体">当然上述流程是最简单的一个过程，还没有涉及到命名空间、请求处理完毕之后要根据执</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: black; font-family: 宋体">行结果跳转到不同的页面等一些复杂的问题，后面我会把我的学习心得贴出来。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 宋体">注：上述</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 10pt; color: black; font-family: 宋体">的分流流程是我根据</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">struts1</span><span style="font-size: 10pt; color: black; font-family: 宋体">里面的机制推测的，在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">struts1</span><span style="font-size: 10pt; color: black; font-family: 宋体">里面这个过程由</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">ActionServlet</span><span style="font-size: 10pt; color: black; font-family: 宋体">负责，它会调用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">RequestProcessor</span><span style="font-size: 10pt; color: black; font-family: 宋体">里面的一个方法对访问路径进行处理，这个在我博客里面的《</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Struts</span><span style="font-size: 10pt; color: black; font-family: 宋体">工作流程》中可以找到，至于这个</span><font size="3"><font face="Times New Roman">FilterDispatcher</font><span style="font-family: 宋体">，因为看不到源码只能推测一下了，</span><font face="Times New Roman">^_^</font><span style="font-family: 宋体">。</span></font></p>
&nbsp;<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1707777</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/162416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-22 17:24 <a href="http://www.blogjava.net/CrazyJava/articles/162416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2学习(一)：创建一个Struts2应用</title><link>http://www.blogjava.net/CrazyJava/articles/162195.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Wed, 21 Nov 2007 11:52:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162195.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162195.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162195.html</trackback:ping><description><![CDATA[<div>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">Struts1.*</font><span style="font-family: 宋体">都还没有怎么玩，</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">的时代就已经来临了，在网上查了很多资料，结果显示</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">和</span><font face="Times New Roman">Struts1</font><span style="font-family: 宋体">相关性不高，即使没有用过</span><font face="Times New Roman">Struts1</font><span style="font-family: 宋体">，也可以直接使用</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">框架，实际上</span><font face="Times New Roman">Struts2</font><span style="font-family: 宋体">可以说是</span><span style="font-family: Arial">WebWor</span></font><span style="font-size: 9pt; font-family: Arial">k</span><font size="3"><span style="font-family: 宋体">的翻版。于是俺就在网上</span><span style="font-family: Arial">down</span><span style="font-family: 宋体">了一个</span><span style="font-family: Arial">Struts2</span><span style="font-family: 宋体">中文文档，是一个网友自己做的</span><span style="font-family: Arial">chm</span><span style="font-family: 宋体">文件，他的</span><span style="font-family: Arial">blog</span><span style="font-family: 宋体">地址是</span><span style="font-family: Arial"><a href="http://www.blogjava.net/max/">http://www.blogjava.net/max/</a></span><span style="font-family: 宋体">，</span><span style="font-family: Arial">^_^</span><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">下面简单说下我的实践经历吧，我用的开发工具是</span><span style="font-family: Arial">MyEclipse_5.5.1</span><span style="font-family: 宋体">。首先当然是去</span><font face="Times New Roman">Apache</font><span style="font-family: 宋体">上</span><span style="font-family: 宋体">下一个</span><span style="font-family: Arial">Struts</span><span style="font-family: 宋体">的发布包咯，然后创建一个</span><span style="font-family: Arial">Web</span><span style="font-family: 宋体">工程，我的工程名字叫</span><span style="font-family: Arial">Struts</span><span style="font-family: 宋体">，这个过程在</span><span style="font-family: Arial">Max</span><span style="font-family: 宋体">的教程上都有详细的描述，接下来的三个步骤就比较重要了：</span></font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: Arial"><font size="3">1．</font></span><font size="3"><span style="font-family: 宋体">配置</span><span style="font-family: Arial">web.xml</span><span style="font-family: 宋体">文件</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 15.75pt"><font size="3"><span style="font-family: 宋体">我的</span><span style="font-family: Arial">web.xml</span><span style="font-family: 宋体">文件内如如下，</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;?</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">xml </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">version</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"1.0" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">encoding</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"UTF-8"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">?&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;!</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">DOCTYPE </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">web-app </span><span style="font-size: 10pt; color: gray; font-family: 'Courier New'">PUBLIC </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">"web-app_2_3.dtd" </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">web-app</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">&lt;filter&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;Struts2&lt;/filter-name&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 45pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">org.apache.struts2.dispatcher.FilterDispatcher</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 45pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">&lt;/filter-class&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;/filter&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;Struts2&lt;/filter-name&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">welcome-file-list</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">welcome-file</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">index.html</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">welcome-file</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">welcome-file-list</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">web-app</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">红色突出显示的部分是使用</span><span style="color: black; font-family: 'Courier New'">Struts2</span><span style="color: black; font-family: 宋体">的关键，它表明所有的请求都将交给</span><span style="color: black; font-family: 'Courier New'">FilterDispatcher</span><span style="color: black; font-family: 宋体">这个控制器来进行&#8220;分流&#8221;，这个原理和</span><span style="color: black; font-family: 'Courier New'">Struts1</span><span style="color: black; font-family: 宋体">中的一样，只不过</span><span style="color: black; font-family: 'Courier New'">Struts1</span><span style="color: black; font-family: 宋体">中使用的</span><span style="color: black; font-family: 'Courier New'">servlet</span><span style="color: black; font-family: 宋体">映射而不是</span><span style="color: black; font-family: 'Courier New'">filter</span><span style="color: black; font-family: 宋体">映射，至于</span><span style="font-family: Verdana">servlet</span><span style="font-family: 宋体">和</span><font face="Times New Roman">filter</font><span style="font-family: 宋体">是如何对</span><font face="Times New Roman">url</font><span style="font-family: 宋体">进行映射的请参考这篇文章</span><a href="http://blog.csdn.net/delez/archive/2007/05/05/1596936.aspx"><font face="Times New Roman">http://blog.csdn.net/delez/archive/2007/05/05/1596936.aspx</font></a><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><font face="Times New Roman">2</font><span style="font-family: 宋体">．</span><font face="Times New Roman">Struts.xml</font></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">这个文件的作用就和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Struts1</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Struts-config.xml</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件的作用一样了，我们对所请求的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">url</span><span style="font-size: 10pt; color: black; font-family: 宋体">进行映射时都需要这个文件的帮助，它里面详细指定了一个路径经过映射后进入哪个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">action</span><span style="font-size: 10pt; color: black; font-family: 宋体">里面去。我的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Struts.xml</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件的内容如下：</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;!</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">DOCTYPE </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">struts </span><span style="font-size: 10pt; color: gray; font-family: 'Courier New'">PUBLIC&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: gray; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">struts</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">struts</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">因为我目前还没有配置任何</span><span style="color: black; font-family: 'Courier New'">action</span><span style="color: black; font-family: 宋体">，所以我的</span><span style="color: black; font-family: 'Courier New'">struts.xml</span><span style="color: black; font-family: 宋体">文件的内容是空的。</span></font></p>
<p style="margin: 0cm 0cm 0pt 15.75pt; text-indent: -15.75pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">3</span><span style="color: black; font-family: 宋体">．把</span><span style="color: black; font-family: 'Courier New'">Struts</span><span style="color: black; font-family: 宋体">发布包中</span><span style="color: black; font-family: 'Courier New'">lib</span><span style="color: black; font-family: 宋体">目录下的</span><span style="color: black; font-family: 'Courier New'">jar</span><span style="color: black; font-family: 宋体">文件全部都拷贝到</span><span style="color: black; font-family: 'Courier New'">web</span><span style="color: black; font-family: 宋体">工程的</span><span style="color: black; font-family: 'Courier New'">WEB-INF/lib</span><span style="color: black; font-family: 宋体">目录下面去</span><span style="color: black; font-family: 'Courier New'">;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">现在我们启动</span><span style="color: black; font-family: 'Courier New'">Tomcat</span><span style="color: black; font-family: 宋体">，，这个时候如果不出意外的话</span><span style="color: black; font-family: 'Courier New'">Tomcat</span><span style="color: black; font-family: 宋体">启动会报如下的错误：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="color: black; font-family: 'Courier New'"><font size="3">unable to load bean: type:com.opensymphony.xwork2.ObjectFactory </font></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 'Courier New'">class:org.apache.struts2.spring.StrutsSpringObjectFactory - bean - jar:file:/E:/workspace/Struts/WEB-INF/lib/struts2-spring-plugin-2.0.8.jar!/struts-plugin.xml:8:132</span><span style="color: black; font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">很莫名奇妙的一个错误，因为我根本没有使用</span><span style="color: black; font-family: 'Courier New'">Spring</span><span style="color: black; font-family: 宋体">啊！我后来尝试放了一个</span><span style="color: black; font-family: 'Courier New'">spring.jar</span><span style="color: black; font-family: 宋体">到</span><span style="color: black; font-family: 'Courier New'">WEB-INF/lib</span><span style="color: black; font-family: 宋体">下面去，上面的错误虽然没有了但是又出现了一个新的错误，并且还提示我在</span><span style="color: black; font-family: 'Courier New'">web.xml</span><span style="color: black; font-family: 宋体">中加上这句：</span></font></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; text-align: left" align="left"><span style="background: red; color: black; font-family: 'Courier New'"><font size="3">&lt;listener&gt; </font></span></p>
<p style="margin: 0cm 0cm 0pt 20.05pt; text-align: left" align="left"><span style="background: red; color: black; font-family: 'Courier New'"><font size="3">&lt;listener-class&gt;</font></span></p>
<p style="margin: 0cm 0cm 0pt 20.05pt; text-indent: 21pt; text-align: left" align="left"><span style="background: red; color: black; font-family: 'Courier New'"><font size="3">org.springframework.web.context.ContextLoaderListener</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="background: red; color: black; font-family: 'Courier New'">&lt;/listener-class&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="background: red; color: black; font-family: 'Courier New'">&lt;/listener&gt;</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">总之</span><span style="font-family: Arial">Struts</span><span style="font-family: 宋体">应用就是加载不了，</span><span style="font-family: Arial">Tomcat</span><span style="font-family: 宋体">显示如下的错误信息：</span></font><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Context [/Struts] startup failed due to previous errors</span><span style="font-size: 10pt; color: black; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">后来我根据错误提示在网上进行搜索，发现导致这些错误的原因可能是因为</span><span style="color: black; font-family: 'Courier New'">Struts</span><span style="color: black; font-family: 宋体">发布包中</span><span style="color: black; font-family: 'Courier New'">lib</span><span style="color: black; font-family: 宋体">目录下面的</span><span style="color: black; font-family: 'Courier New'">jar</span><span style="color: black; font-family: 宋体">文件中很多都是插件，并不是构建</span><span style="color: black; font-family: 'Courier New'">Struts</span><span style="color: black; font-family: 宋体">应用所必须的，于是我试着把所有名字中包含有</span><span style="color: black; font-family: 'Courier New'">plugin</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: 'Courier New'">jar</span><span style="color: black; font-family: 宋体">文件从</span><span style="color: black; font-family: 'Courier New'">WEB-INF/lib</span><span style="color: black; font-family: 宋体">中删掉，然后再次重新启动</span><span style="color: black; font-family: 'Courier New'">Tomcat</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: 'Courier New'">OK</span><span style="color: black; font-family: 宋体">，一切正常了，原来那些被删除的</span><span style="color: black; font-family: 'Courier New'">jar</span><span style="color: black; font-family: 宋体">文件才是真正的&#8220;元凶&#8220;啊！在搭建好</span><span style="color: black; font-family: 'Courier New'">Struts2</span><span style="color: black; font-family: 宋体">的运行环境之后就可以开始</span><span style="color: black; font-family: 'Courier New'">Struts</span><span style="color: black; font-family: 宋体">应用的开发了，</span><span style="color: black; font-family: 'Courier New'">^_^</span><span style="color: black; font-family: 宋体">。</span></font></p>
&nbsp;<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1707171</p>
</div>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/162195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-21 19:52 <a href="http://www.blogjava.net/CrazyJava/articles/162195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 校验（XML配置校验）</title><link>http://www.blogjava.net/CrazyJava/articles/162113.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Wed, 21 Nov 2007 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162113.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162113.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162113.html</trackback:ping><description><![CDATA[<div class="postText">
<p align="left">参考文档：<br goog_ds_charindex="4" />
&nbsp;&nbsp;&nbsp; http://struts.apache.org/2.0.9/docs/ajax-client-side-validation.html<br goog_ds_charindex="77" />
&nbsp;&nbsp;&nbsp; http://struts.apache.org/2.0.9/docs/pure-javascript-client-side-validation.html<br goog_ds_charindex="161" />
&nbsp;&nbsp;&nbsp; http://struts.apache.org/2.0.9/docs/client-validation.html<br goog_ds_charindex="224" />
<br goog_ds_charindex="225" />
参考示例：<br goog_ds_charindex="229" />
&nbsp;&nbsp;&nbsp; <a href="http://struts.apache.org/2.0.9/docs/ajax-validation.html"><font color="#551a8b">http://struts.apache.org/2.0.9/docs/ajax-validation.html</font></a><br goog_ds_charindex="290" />
</p>
<p>&nbsp;</p>
<p><strong>基本说明：</strong></p>
<p>&nbsp;</p>
<p>Struts校验可以分为两种类型：Annotation型，XML配置型</p>
<p>&nbsp;</p>
<p>Annotation型主要使用Annotation来配置Action中的属性，这里我们做过多的介绍，需要看的请参看我的其他相关文章。</p>
<p>&nbsp;</p>
<p>XML配置型主要是指，使用XML来描述配置信息，之后提供给Struts框架做校验。</p>
<p>&nbsp;</p>
<p>使用Struts2，XML配置型的校验可以使用三种方式：普通的服务器端校验方式，客户纯JavaScript方式端校验，和Ajax方式的校验。</p>
<p>&nbsp;</p>
<p>普通的服务器端校验方式：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;客户端提交信息到服务器，在服务器上使用XML配置信息，校验客户端提交的信息，错误的情况下，返回input页面，显示校验错误信息。</p>
<p>&nbsp;</p>
<p>客户端纯JavaScript校验方式：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在输入画面上，根据XML文件中的配置内容生成对应的JavaScript校验脚本，在提交数据的时候首先使用这些生成的JavaScript校验输入信息，错误情况下在画面上显示错误信息，不需要向服务器提交内容，只有输入数据校验正确的情况下才向服务器提交请求。这种方式的校验不支持所有Struts2内置的校验，只支持一部分校验：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;required validator&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;requiredstring validator&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;stringlength validator&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;regex validator&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;email validator&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;url validator&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;int validator&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;double validator <br />
</p>
<p>Ajax方式校验</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在提交请求的时候，首先使用AJAX的方式将数据提交到服务器，在校验出错的情况下在页面显示错误信息，但是不刷新页面，在校验成功的情况下，才向服务器提交请求。</p>
<p>&nbsp;</p>
<p>三种方式比较</p>
<div>
<table id="p-0u" cellspacing="0" cellpadding="3" width="100%" border="1">
    <tbody>
        <tr>
            <td width="25%">&nbsp;</td>
            <td width="25%">普通的服务端校验方式</td>
            <td width="25%">客户端纯JavaScript</td>
            <td width="25%">Ajax方式</td>
        </tr>
        <tr>
            <td width="25%">位置</td>
            <td width="25%">服务器</td>
            <td width="25%">客户端&nbsp;</td>
            <td width="25%">服务器</td>
        </tr>
        <tr>
            <td width="25%">是否刷新页面</td>
            <td width="25%">是</td>
            <td width="25%">否</td>
            <td width="25%">否</td>
        </tr>
        <tr>
            <td width="25%">校验代码</td>
            <td width="25%">Java</td>
            <td width="25%">JavaScript</td>
            <td width="25%">Java</td>
        </tr>
        <tr>
            <td width="25%">具体实现</td>
            <td width="25%">
            <p>1 定义Action类</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;Action.java</p>
            <p>2 定义配置文件</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;Action-validation.xml</p>
            <p>3 在struts.xml中定义action，注意由于使用了validation，所以必须定义input名字的result。</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;action name="" class=""&gt;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result&gt;&lt;/result&gt;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result name="input"&gt;&lt;/result&gt;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;</p>
            <p>4 定义JSP页面的Form，例如：</p>
            <p>&lt;s:form action="quizAction" &gt;</p>
            <p>&nbsp;&nbsp;&nbsp; &lt;s:textfield label="Name" name="name"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;s:textfield label="Age" name="age"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;s:textfield label="Favorite color" name="answer"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;s:submit/&gt;</p>
            <p>&lt;/s:form&gt;<br />
            </p>
            </td>
            <td width="25%">
            <p>与&#8220;普通的服务端校验方式&#8221;基本相同，但是需要在form定义的时候添加validate="true"，例如：</p>
            <p>&lt;s:form action="quizAction" <strong>validate="true"</strong>&gt;</p>
            <p>&nbsp;&nbsp;&nbsp; &lt;s:textfield label="Name" name="name"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;s:textfield label="Age" name="age"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;s:textfield label="Favorite color" name="answer"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;s:submit/&gt;</p>
            <p>&lt;/s:form&gt;<br />
            </p>
            </td>
            <td width="25%">
            <p>与&#8220;普通的服务端校验方式&#8221;基本相同，但是需要做如下修改：</p>
            <p>1 安装dojo plugin</p>
            <p>2 JSP中使用dojo plugin</p>
            <p><span class="code-tag">&lt;%@ taglib prefix=<span class="code-quote">"sx"</span> uri=<span class="code-quote">"/struts-dojo-tags"</span> %&gt;</span><br />
            3 在head内部追加head标签（引入dojo的js库）</p>
            <p>&nbsp;<span class="code-tag">&lt;sx:head /&gt;</span><br />
            4 修改form定义</p>
            <p><span class="code-tag">&lt;s:form method=<span class="code-quote">"post"</span> theme=<span class="code-quote">"ajax"</span>&nbsp; action=<span class="code-quote">"quizAjax"</span> id=<span class="code-quote">"form"</span>&gt;</span><br />
            &nbsp;&nbsp;&nbsp; <span class="code-tag">&lt;s:textfield label=<span class="code-quote">"Name"</span> name=<span class="code-quote">"name"</span> /&gt;</span><br />
            &nbsp;&nbsp;&nbsp; <span class="code-tag">&lt;s:textfield label=<span class="code-quote">"Age"</span> name=<span class="code-quote">"age"</span> /&gt;</span><br />
            &nbsp;&nbsp;&nbsp; <span class="code-tag">&lt;s:textfield label=<span class="code-quote">"Favorite color"</span> name=<span class="code-quote">"answer"</span>/&gt;</span><br />
            &nbsp;&nbsp;&nbsp; <strong><span class="code-tag">&lt;sx:submit validate=<span class="code-quote">"true"</span> /&gt;</span><br />
            </strong><span class="code-tag">&lt;/s:form&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>&nbsp;</p>
<p>说明：struts-dojo-plugin在2.1.0的时候可能会Release。现在使用需要从Subversion中去除2.1.0SNAPSHOT代码：</p>
<p>svn <a href="http://svn.apache.org/repos/asf/struts/struts2/trunk">http://svn.apache.org/repos/asf/struts/struts2/trunk</a></p>
<p>&nbsp;</p>
<p><strong>代码示例</strong></p>
<p>&nbsp;</p>
<p>// QuizAction 类</p>
<p>&nbsp;</p>
<p>package example;</p>
<p>import com.opensymphony.xwork2.ActionSupport;</p>
<p>/**<br />
&nbsp;* Created by IntelliJ IDEA.<br />
&nbsp;* User:&nbsp;<a href="mailto:ma.zhao@dl.cn">ma.zhao@dl.cn</a><br />
&nbsp;* Date: 2007-9-8<br />
&nbsp;* Time: 13:58:16<br />
&nbsp;* To change this template use File | Settings | File Templates.<br />
&nbsp;*/<br />
public class QuizAction extends ActionSupport {<br />
&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = -7505437345373234225L;</p>
<p>&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp;&nbsp; private int age;<br />
&nbsp;&nbsp;&nbsp; private String answer;</p>
<p>&nbsp;&nbsp;&nbsp; public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public int getAge() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return age;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void setAge(int age) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.age = age;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public String getAnswer() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return answer;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void setAnswer(String answer) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.answer = answer;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public String execute() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</p>
<p>// QuizValidation.xml 校验配置文件</p>
<p>&nbsp;</p>
<p>&lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"><font color="#551a8b">http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd</font></a>"&gt;<br />
&lt;validators&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;field name="name"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field-validator type="requiredstring"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message&gt;You must enter a name&lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field-validator&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/field&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;field name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field-validator type="int"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="min"&gt;13&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="max"&gt;19&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message&gt;Only people ages 13 to 19 may take this quiz&lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field-validator&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/field&gt;<br />
&lt;/validators&gt;<br />
</p>
<p>// struts.xml配置文件</p>
<p>&nbsp;</p>
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a>"&gt;</p>
<p>&lt;struts&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;package name="example" namespace="/example" extends="struts-default"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="quizAction" class="example.QuizAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="<strong>input</strong>"&gt;/example/quiz-ajax.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result&gt;/example/quiz-success.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/package&gt;<br />
&lt;/struts&gt;</p>
<p>&nbsp;</p>
<p>// JSP&nbsp;文件</p>
<p>&lt;%--<br />
&nbsp; Created by IntelliJ IDEA.<br />
&nbsp; User:&nbsp;<a href="mailto:ma.zhao@dl.cn">ma.zhao@dl.cn</a><br />
&nbsp; Date: 2007-9-8<br />
&nbsp; Time: 14:02:17<br />
&nbsp; To change this template use File | Settings | File Templates.<br />
--%&gt;<br />
&lt;%@ page contentType="text/html;charset=UTF-8" language="java" %&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;</p>
<p>&lt;html&gt;<br />
&lt;head&gt;&lt;title&gt;Quiz Action Validation&lt;/title&gt;&lt;/head&gt;<br />
&lt;body&gt;</p>
<p>&lt;s:form action="quizAction" namespace="/example" <strong>validate="true"</strong>&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;s:textfield label="Name" name="name"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:textfield label="Age" name="age"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:textfield label="Favorite color" name="answer"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:submit/&gt;</p>
<p>&lt;/s:form&gt;</p>
<p>&lt;/body&gt;<br />
&lt;/html&gt;<br />
&nbsp;</p>
<p><strong>特别说明（Ajax Validation）：</strong></p>
<p>为什么使用AJAX 校验？</p>
<p>纯的JavaScript校验不刷新页面，但是也不能使用所有的Struts2校验方法；服务端校验可以使用所有Struts2的校验方法，但是需要刷新页面。</p>
<p>Struts2 Ajax校验，既不需要刷新页面，又可以使用Struts2内置的所有的校验方法，所以我们比较倾向于使用Ajax校验。</p>
<p>&nbsp;</p>
<p>现在（2007/09/08）Struts2的最新版本为2.0.9，还不支持dojo-plugin，所以还没有办法使用Ajax校验。所以要想使用Ajax Validation必须使用Struts2.1.0 SNAPSHOT版本。</p>
<p>&nbsp;</p>
<p>下载：</p>
<p>使用Subversion可以从以下位置下载最新的Struts2的源代码：</p>
<p><a href="http://svn.apache.org/repos/asf/struts/struts2/trunk">http://svn.apache.org/repos/asf/struts/struts2/trunk</a>&nbsp;</p>
<p>&nbsp;</p>
<p>构造：</p>
<p>在下载的apps目录下blank子目录下可以使用如下命令</p>
<p>mvn compile jar：jar</p>
<p>可以在target目录中看到：struts2-blank.war</p>
<p>&nbsp;</p>
<p>在plugins目录dojo子目录下使用如下命令</p>
<p>mvn compile jar:jar</p>
<p>可以在target目录中看到dojo-plugin：struts2-dojo-plugin-2.1.0-SNAPSHOT.jar</p>
<p>&nbsp;</p>
<p>按照上述的说明构造AJAX校验</p>
<p>&nbsp;</p>
<p>一些变化：</p>
<p>Struts 配置文件：</p>
<p>&nbsp;</p>
<p>&lt;action name="quizAjax" class="example.QuizAction"&gt;<br />
&nbsp;&nbsp;&nbsp; <strong>&lt;interceptor-ref name="jsonValidationWorkflowStack"/&gt;<br />
</strong>&nbsp;&nbsp;&nbsp; &lt;result name="input"&gt;/example/quiz-ajax.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;result&gt;/example/quiz-success.jsp&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p>&nbsp;</p>
<p>这个interceptor是在Struts 2.1.0 才有的。</p>
<p>&nbsp;</p>
<p>JSP文件：</p>
<p>&lt;%--<br />
&nbsp; Created by IntelliJ IDEA.<br />
&nbsp; User:&nbsp;<a href="mailto:ma.zhao@dl.cn">ma.zhao@dl.cn</a> <br />
&nbsp; Date: 2007-9-8<br />
&nbsp; Time: 17:29:43<br />
&nbsp; To change this template use File | Settings | File Templates.<br />
--%&gt;<br />
&lt;%@ page contentType="text/html;charset=UTF-8" language="java" %&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;<br />
<strong>&lt;%@ taglib prefix="sx" uri="/struts-dojo-tags" %&gt;</strong></p>
<p>&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Validation - AJAX&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;sx:head /&gt;<br />
&lt;/head&gt;</p>
<p><strong>&lt;s:url id="url" namespace="/example" action="quizAjax"/&gt;</strong></p>
<p>&lt;body&gt;<br />
&lt;s:form method="post" theme="xhtml" namespace="/example" action="quizAjax" id="form"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:textfield label="Name" name="name" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:textfield label="Age" name="age" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;s:textfield label="Favorite color" name="answer"/&gt;<br />
&nbsp;&nbsp;&nbsp; <strong>&lt;sx:submit validate="true" /&gt;</strong><br />
&lt;/s:form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;&nbsp;</p>
<p>&nbsp;</p>
<p>需要注意</p>
<p><strong>&lt;s:url id="url" namespace="/example" action="quizAjax"/&gt;</strong></p>
<p>&nbsp;</p>
<p>提供了Dojo校验的URL，一定要注意。</p>
<p>&nbsp;<br />
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1777417</p>
</div>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/162113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-21 16:12 <a href="http://www.blogjava.net/CrazyJava/articles/162113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts应用中施展Ajax魔法</title><link>http://www.blogjava.net/CrazyJava/articles/161658.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Mon, 19 Nov 2007 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/161658.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/161658.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/161658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/161658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/161658.html</trackback:ping><description><![CDATA[<p>AJAX是&#8220;异步的JavaScript和XML&#8221;的缩写。这是一项技术，而不是一个如Struts一样的框架。为什么在AJAX周围会有这么多的关注呢?这是因为AJAX使web页面看起来并不像一个平面的文档，而更像用户所期望的如桌面应用的动态GUI应用程序。AJAX技术能在很多的浏览器上使用(包括IE和Netscape/Mozilla)。它已经为Microsoft(用于Outlook的web客户端)和Google(用户Google Maps和Gmail)所使用。 </p>
<p><font color="#000000">　　未使用AJAX之前</font></p>
<p><font color="#000000">　　目前大多数的Struts应用都是标准的&#8220;如同一个平面文档的web页面&#8221;的结构。如果你想模仿一些桌面应用程序(比如那些使用Java Swing，Visual Basic，或者Delphi建立的应用程序)，那么你有两个选择:你可以发送所有的可能作为页面的一部分被请求的信息，使用大量的JavaScript来操作其动态的显示(一个很慢并且非企业级Java的方法);或者你可以不改变形式地提交到后台服务器(一种有效的方法) 。AJAX提高给你了融合前面的最佳解决方案:动态的页面，但是大多数的应用是在你的web服务器的Java程序来处理的。</font></p>
<p><font color="#000000">　　AJAX 101</font></p>
<p><font color="#000000">　　AJAX和现有的动态HTML技术非常相似，并在其上增加了一个发送到&#8220;后台&#8221;服务器的请求来获取需要的新的或者更新的信息。AJAX的机制在其他地方已经有详细的说明――请查看本文后的Resources来获取更多。但是你至少需要知道:</font></p>
<ul>
    <li><font color="#000000">　　1. XMLHttpRequest (如果你使用的是IE浏览器的话，则是Microsoft.XMLHTTP的ActiveX的对象)。这些对象，你可以在web页面中使用JavaScript调用。他们允许你作为后台的调用方式来请求web服务器的内容(例如，在表单提交后，屏幕并不像平时一样显示&#8220;空白&#8221;)。 </font>
    <li><font color="#000000">　　2. XMLHttpRequest 和Microsoft.XMLHTTP 返回的内容可以作为XML或者文本来处理。JavaScript(在你页面上的)可以使用请求的新内容来更新页面。 </font>
    <li><font color="#000000">　　3. 整个处理过程可以由普通的JavaScript事件来触发:onclick，onchange，onblur，等。</font></li>
</ul>
<p><font color="#000000">　　在你的Struts应用中使用AJAX</font></p>
<p><font color="#000000">　　你阅读了本文，然后你会对使用AJAX来创建动态的web页面感兴趣，并且想知道如何将它加入到你的Struts应用中。这只是选择之一。那么你会如何选择呢?</font></p>
<ul>
    <li><font color="#000000">　　&#183; 等待，知道Struts的下一个版本融合了AJAX技术。如果Struts开发者准备开发一个新的应用，这或许会是一个好的选择。再后面，可能会是要求JSF也这样做――对其本身并不一件坏事，但是对于已经存在的系统这将会带来最根本的改变。 </font>
    <li><font color="#000000">　　&#183; 你也可以直接采用新的方法，比如Direct Web Remoting (DWR) 和Ruby on Rails，这些都是专为建立AJAX应用的。如果你考虑不使用Struts来开发web的话，那么这些都是很又用的框架，并且值得一试。但是，这也同时意味着你必须要重写你的应用。 </font>
    <li><font color="#000000">　　&#183; 在你已经存在的Struts应用中增加AJAX。既然AJAX只是一项技术而并非框架，那么它就很容易融入到Struts中。作为现有的系统，其稳定性(如，保持现有的库文件)是相当重要的。所以这个方法被推荐，并且我们将在后面详细介绍。</font></li>
</ul>
<p><font color="#000000">　　我们选择在Struts应用中增加AJAX的优势是:</font></p>
<ul>
    <li><font color="#000000">　　1. 它并不需要任何新的库文件或者服务器代码;只需要使用现有的Struts库文件和action。 </font>
    <li><font color="#000000">　　2. 解决方案中所有部分――JavaScript，XML，Java和Struts――早已为广泛所知。 </font>
    <li><font color="#000000">　　3. 此应用可以一块一块地移植到AJAX;我们可以确定哪些部分对用户有益，并首先将它们更新到动态AJAX显示。</font></li>
</ul>
<p><font color="#000000">　　实现方案</font></p>
<p><font color="#000000">　　我们如何真正的贯彻我们的选择呢?我们首先应该注意一个&#8220;标准的&#8221;(没有AJAX)Struts应用是如何工作的。在此应用中，一个一般的事件流程如下:</font></p>
<ul>
    <li><font color="#000000">　　1. 使用点击超链接或者表单的提交按钮，用户发送请求。 </font>
    <li><font color="#000000">　　2. web服务器运行处理请求的Struts Action来生成一个web页面。 </font>
    <li><font color="#000000">　　3. 浏览器显示web页面。 </font>
    <li><font color="#000000">　　4. 当用户点击保存的时候，信息由Struts框架中一个ActionForm类来转换并发送到服务器。 </font>
    <li><font color="#000000">　　5. 然后，Struts框架调用Struts Action来出来请求(如，保存数据到数据库中)。 </font>
    <li><font color="#000000">　　6. 页面再一次回传，处理流程继续。</font></li>
</ul>
<p><font color="#000000">　　现有的Struts应用</font></p>
<p><font color="#000000">　　一个演示事件流程的简单Struts应用可以在以下地址下载: </font><a href="http://sourceforge.net/project/showfiles.php?group_id=99476&amp;package_id=158438" target="_blank"><font color="#000000" size="2">struts-non-ajax.zip</font></a><font color="#000000">。此基于Struts的应用，是基于用户的输入显示或者隐藏蓝色和绿色的表格。图1显示了载入初始页面的画面。图2显示了用户输入值并点击了提交后的画面。虽然简单，但它已经足以表示一个Struts的工作流程。</font></p>
<p><font color="#000000"><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://ajax.cnrui.cn/article/UploadPic/2006-6/200661173151769.jpg" onload="return imgzoom(this,550)" border="0"  alt="" /></font></p>
<p><font color="#000000">　　图 1. 没有AJAX的例子:初始屏幕</font></p>
<p><font color="#000000"><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://ajax.cnrui.cn/article/UploadPic/2006-6/200661173151914.jpg" onload="return imgzoom(this,550)" border="0"  alt="" /></font></p>
<div>　　图 2. 没有AJAX的例子:输入值并点击了提交</font></div>
<div><font color="#000000"></font>&nbsp;</div>
<div><font color="#000000"></font></div>
<p><font color="#000000"></font></p>
<p><font color="#000000">　　服务器端的代码是:一个Struts Action使用struts-config.xml 中定义的值转发到(相同的)JSP。这个例子代码中一些需要注意的地方是:</font></p>
<ul>
    <li><font color="#000000">　　&#183;struts-config.xml文件将所有的请求重定向到<a href="http://localhost:8080/struts-non-ajax/" target="_blank">http://localhost:8080/struts-non-ajax/</a>(或者和你自己的服务器相同)的index.jsp。 </font>
    <li><font color="#000000">　　&#183; index.jsp 包含了一个两个文本框的Struts form(showBlue和showGreen)。该页面同样包含了标签，但是如同两个文本框被初始化为空，标签之间的内容并不显示。 </font>
    <li><font color="#000000">　　&#183; 用户输入值(true或者false)并点击提交按钮，处理控制(经过Struts框架，读取struts-config.xml)提交到SampleAction类中。 </font>
    <li><font color="#000000">　　&#183;SampleAction记录下值，然后转发到index.jsp。一个成熟的Struts应用可能会处理更多的事情，不如保存或者查询数据库等。 </font>
    <li><font color="#000000">　　&#183; index.jsp 现在重新处理请求;如果ShowBlue或者ShowGreen的值是true，这些表格就显示出来。</font></li>
</ul>
<p><font color="#000000">　　该应用并没有任何&#8220;错误&#8221;。类似的Struts项目好多年都是这样做的。但是，我们如何在不添加复杂的JavaScript或者频繁的表单提交的前提下，为此应用增加动态的元素呢?</font></p>
<p><font color="#000000">　　我们的第一个Struts AJAX应用</font></p>
<p><font color="#000000">　　观察下下面的图3和图4。第一眼看上去，它们和前面的例子没有说明区别。它们的不同之处在于，页面载入后(图3)然后文本框中的值改变了，窗体自动提交而不显示空白的，然后在图4中显示结果。普通的提交按钮仍然在，你也可以选择使用它。</font></p>
<p><font color="#000000"><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://ajax.cnrui.cn/article/UploadPic/2006-6/200661173152787.jpg" onload="return imgzoom(this,550)" border="0"  alt="" /></font></p>
<p><font color="#000000">　　图 3. 页面载入后的AJAX例子</font></p>
<p><font color="#000000"><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://ajax.cnrui.cn/article/UploadPic/2006-6/200661173152697.jpg" onload="return imgzoom(this,550)" border="0"  alt="" /></font></p>
<p><font color="#000000">　　图 4. AJAX调用后的AJAX例子</font></p>
<p><font color="#000000">　　添加AJAX是出奇的容易。服务器端的代码和前面的例子是一样的: 一个Struts的ActionForm来后去数据，一个Struts的Action来执行需要的任务(例如，存储数据库)然后转发到适当的JSP页面来显示结果。</font></p>
<p><font color="#000000">　　继续</font></p>
<p><font color="#000000">　　如果你希望就此停止阅读(跳过这个例子的工作说明)，但是这里的是和你需要转换你的Struts应用到一个Struts-AJAX应用同样的风格:</font></p>
<ul>
    <li><font color="#000000">　　1. 在你的web页面中引入一个Ajax.js (该文件是struts-ajax.zip 例文件中的一部分)。Ajax.js 包含了所有需要发送和接收AJAX调用的JavaScript方法。 </font>
    <li><font color="#000000">　　2. 确保你希望在AJAX调用中更新的web页面的部分包含在标签中，并且给每个标签一个id。 </font>
    <li><font color="#000000">　　3. 当一些事件触发的时候就更新页面(例如，文本框的the onchange()方法)，调用retrieveURL()方法，通过URL传递到需要执行服务器端处理的Struts Action。 </font>
    <li><font color="#000000">　　4. 为了页面的显示/更新，最简单的方法是Struts Action转发回同样的页面。在本例中，showGreen/showBlue 文本框中的onchange()方法来触发AJAX调用。</font></li>
</ul>
<p><font color="#000000">　　JavaScript方法retrieveURL()调用服务器的Struts(通过URL)，获取JSP响应，然后更新显示页面中的 标签中的部分。就是这么简单!</font></p>
<p><font color="#000000">　　AJAX解决方案的细节</font></p>
<p><font color="#000000">　　我们将例子变为AJAX-Struts应用的时候，需要三个变化:</font></p>
<ul>
    <li><font color="#000000">　　1. 增加一个JavaScript方法来完成到服务器的&#8220;背后的&#8221;AJAX调用。 </font>
    <li><font color="#000000">　　2. 增加JavaScript代码来接收服务器的响应并更新页面。 </font>
    <li><font color="#000000">　　3. 在JSP页面增加标签标签，这个标签中内容将在AJAX调用中更新。</font></li>
</ul>
<div>　　我们将详细的说明上面的每一步。</font></div>
<div>　发送AJAX请求到服务器</font></div>
<p><font color="#000000">　　有两个方法(在下面列出)用于发送请求到服务器。</font></p>
<p><font color="#000000">　　&#183; retrieveURL()方法获得服务器的URL和Struts form。URL用于使用AJAX，form的值用于传递到服务器。</font></p>
<p><font color="#000000">　　&#183; getFormAsString()方法用于将retrieveURL()中form命名的值组装成查询字符串，并发送到服务器。</font></p>
<p><font color="#000000">　　使用方法很简单，使用onclick()/onChange()事件来触发retrieveURL()更新显示。</font></p>
<p><font color="#000000">　　在这两个方法中有一些有趣的东西。</font></p>
<p><font color="#000000">　　在retrieveURL()方法中，req.onreadystatechange = processStateChange (注意，没有括号)这一行来告诉浏览器在服务器响应到达的时候调用processStateChange()方法(该方法将在后面介绍)。retrieveURL()方法中(现在已经是AJAX的标准了)同样决定是使用IE浏览器(ActiveX)还是使用Netscape/Mozilla (XmlHttpRequest) 来实现跨浏览器兼容。</font></p>
<p><font color="#000000">　　getFormAsString()方法将HTML form转换成字符串连接在URL后面(这样就允许我们发送HTTP GET请求)。这个字符串是经过转换的(比如，空格转换成%20等)，并且是一个Struts能将其组装成ActionForm的格式(并不需要Struts清楚的明白这个是来之AJAX的请求)。注意，在本例中我们使用HTTP GET，使用HTTP POST的方法也是类似的。</font></p>
<p><font color="#000000">function retrieveURL(url,nameOfFormToPost) {</font></p>
<p><font color="#000000">//将url转换成字符串<br />
url=url+getFormAsString(nameOfFormToPost);</font></p>
<p><font color="#000000">//调用AJAX<br />
if (window.XMLHttpRequest) { </font></p>
<p><font color="#000000">// 非IE浏览器<br />
req = new XMLHttpRequest();<br />
req.onreadystatechange = processStateChange;<br />
try {<br />
req.open("GET", url, true); <br />
} catch (e) {<br />
alert("Server Communication Problem\n"+e);<br />
}<br />
req.send(null);<br />
} else if (window.ActiveXObject) {<br />
// IE</font></p>
<p><font color="#000000">req = new ActiveXObject("Microsoft.XMLHTTP");<br />
if (req) {<br />
req.onreadystatechange=processStateChange;<br />
req.open("GET", url, true);<br />
req.send();<br />
}<br />
}<br />
}</font></p>
<p><font color="#000000">getFormAsString() 是一个&#8220;私有&#8221; 方法，在retrieveURL()中使用。</font></p>
<p><font color="#000000">function getFormAsString(formName){</font></p>
<p><font color="#000000">//设置返回字符串<br />
returnString ="";</font></p>
<p><font color="#000000">//取得表单的值<br />
formElements=document.forms[formName].elements;</font></p>
<p><font color="#000000">//循环数组，组装url<br />
//像'/strutsaction.do&amp;name=value'这样的格式</font></p>
<p><font color="#000000">for(var i=formElements.length-1;i&gt;=0; --i ){<br />
//转化每一个值<br />
returnString+="&amp;" <br />
+escape(formElements[i].name)+"=" <br />
+escape(formElements[i].value);<br />
}</font></p>
<div>//返回字符串<br />
return returnString; <br />
}</font></div>
<div>
<p><font color="#000000">　　根据AJAX的响应更新web页面</font></p>
<p><font color="#000000">　　到现在为止，我们学习过了使用JavaScript来完成AJAX调用(前面列出)，Struts Action，ActionForm以及JSP(基本没有变化，只是增加了标签)。为了完善我们对Struts-AJAX项目的了解，我们需要了解三个用于根据服务器返回的结果而更新页面的JavaScript方法。</font></p>
<ul>
    <li><font color="#000000">　　&#183; processStateChange(): 该方法在AJAX调用前设定。它在服务器响应到达后由XMLHttpRequest/Microsoft.XMLHTTP 对象调用。 </font>
    <li><font color="#000000">　　&#183;splitTextIntoSpan(): 根据响应，循环取出数组中的元素组装成NewContent。 </font>
    <li><font color="#000000">　　&#183;replaceExistingWithNewHtml(): 根据span元素数组，循环搜索，将里面的元素调换掉页面中和它的'someName'相同的中的内容。注意，我们使用的是req.responseText 方法来获得返回的内容(它允许我们操作任何文本的响应)。与此相对于的是req.responseXml (它的作用更大，但是要求服务器返回是XHTML或者XML)。</font></li>
</ul>
<p><font color="#000000">function processStateChange() {</font></p>
<p><font color="#000000">if (req.readyState == 4) { // 完成<br />
if (req.status == 200) { // 响应正常</font></p>
<p><font color="#000000">//将响应的文本分割成Span元素<br />
spanElements = <br />
splitTextIntoSpan(req.responseText);</font></p>
<p><font color="#000000">//使用这些Span元素更新页面<br />
replaceExistingWithNewHtml(spanElements);</font></p>
<p><font color="#000000">} else {<br />
alert("Problem with server response:\n " <br />
+ req.statusText);<br />
}<br />
}<br />
}<br />
replaceExistingWithNewHtml() 是为processStateChange()使用的&#8220;私有&#8221;方法。</font></p>
<p><font color="#000000">function replaceExistingWithNewHtml <br />
(newTextElements){</font></p>
<p><font color="#000000">//循环newTextElements<br />
for(var i=newTextElements.length-1;i&gt;=0;--i){</font></p>
<p><font color="#000000">//判断是否以 if(newTextElements[i]. <br />
indexOf("-1){</font></p>
<p><font color="#000000">//获得span的名字- 设置在第一和第二个引号之间<br />
//确认span元素是以下的格式<br />
//NewContent<br />
startNamePos=newTextElements[i]. <br />
indexOf('"')+1;<br />
endNamePos=newTextElements[i]. <br />
indexOf('"',startNamePos);<br />
name=newTextElements[i]. <br />
substring(startNamePos,endNamePos);</font></p>
<p><font color="#000000">//获得内容－在第一个&gt;标记后的所有内容<br />
startContentPos=newTextElements[i]. <br />
indexOf('&gt;')+1; <br />
content=newTextElements[i].<br />
substring(startContentPos);</font></p>
<p><font color="#000000">//现在更新现有的Document中的元素， <br />
// 确保文档存在该元素<br />
if(document.getElementById(name)){<br />
document.getElementById(name). <br />
innerHTML = content;<br />
}<br />
}<br />
}<br />
splitTextIntoSpan() 是为processStateChange() 使用的&#8220;私有&#8221;方法。<br />
function splitTextIntoSpan(textToSplit){</font></p>
<p><font color="#000000">//分割文档<br />
returnElements=textToSplit. <br />
split("")</font></p>
<p><font color="#000000">//处理每个元素 <br />
for(var i=returnElements.length-1;i&gt;=0;--i){</font></p>
<p><font color="#000000">//删除掉第一个span后面的元素<br />
spanPos = returnElements[i]. <br />
indexOf(" </font></p>
<p><font color="#000000">//如果找到匹配的，获得span前的内容<br />
if(spanPos&gt;0){<br />
subString=returnElements[i].<br />
substring(spanPos);<br />
returnElements[i]=subString;<br />
} <br />
}<br />
return returnElements;<br />
}</font></p>
<p><font color="#000000">　　新的控制流</font></p>
<p><font color="#000000">　　添加以下的JavaScript代码到我们的应用中，以下的步骤将在服务器和浏览器中执行。</font></p>
<ul>
    <li><font color="#000000">　　1. 如同一个普通Struts应用装载页面。 </font>
    <li><font color="#000000">　　2. 用户改变文本框的值，触发一个onChange() 事件，调用retrieveURL() 方法。 </font>
    <li><font color="#000000">　　3. 该JavaScript方法通过发送Struts明白的表单变量(后台)请求到服务器的Struts Action。 </font>
    <li><font color="#000000">　　4. 该JavaScript方法同样设定了第二个JavaScript方法的名字，此方法将到服务器响应完毕后调用。本例子中，设定为processStateChange() 方法。 </font>
    <li><font color="#000000">　　5. 如我们所预期的，服务器响应完毕，调用processStateChange() 方法。 </font>
    <li><font color="#000000">　　6. JavaScript在(新的)服务器响应中循环取出所有元素。将页面上存在与获得元素名字相同的 中的元素替换掉。</font></li>
</ul>
<p><font color="#000000">　　在你的应用中设计AJAX</font></p>
<p><font color="#000000">　　以上描述的JavaScript方法能在大多数的应用中使用，包括比我们的例子复杂得多的。但是，在使用之前，你需要注意以下几点:</font></p>
<p><font color="#000000">　　&#183; 避免复制代码，最好在初始化请求(如，显示完整的页面)和AJAX(更新部分页面)请求中使用相同的Struts Action和JSP。</font></p>
<p><font color="#000000">　　&#183;在公共的Action(控制器)中，决定JSP页面(所有的JSP页面或者其中的一部分)中的一个区域需要传送到浏览器。通过在web服务器的session或者ActionForm中设定标记来让JSP页面知道哪些部分需要提交。</font></p>
<p><font color="#000000">　　&#183; 在JSP中，使用Struts 或者JSTL标签来决定提交的HTML区域。</font></p>
<p><font color="#000000">　　使用AJAX的本例子，可以在以下下载: </font></a><a href="http://sourceforge.net/project/showfiles.php?group_id=99476&amp;package_id=158438" target="_blank"><font color="#000000" size="2">struts-Ajax.zip</font></a><a class="f1"></p>
<p><font color="#000000">　　结语</font></p>
<p><font color="#000000">　　AJAX技术允许我们在创建和使用web应用的时候完全的改变。本文介绍了一个简单的技术，在现有的Struts应用中增加Struts的处理。它允许我们利用我们已有的东西，不仅仅是代码，还包括了开发的技能。作为一个好的产品，它同样允许我们写出更清晰，更具移植性的Java Struts应用。</font></p>
</a></div>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/161658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-19 16:49 <a href="http://www.blogjava.net/CrazyJava/articles/161658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2与AJAX（第三部分） </title><link>http://www.blogjava.net/CrazyJava/articles/160331.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 12:05:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160331.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160331.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160331.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 很久没有更新BLOG了，前一段时间公司的项目比较忙，另外我还和一位出版社的朋友谈写书的事情，所以一直没有时间，完成《Struts 2与AJAX》。后来写书的事情吹了，趁今天有点空闲就把它完成。在大家看这部分文章之前，我想对于写书的事情说两句，或者应该叫发牢骚才对。通过这次写书失败的经历，我明白为什么国内的IT书籍多数是滥于充数、粗制滥造、缺乏经典。其实说白了就是一个&#8220;钱&#8221...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160331.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 20:05 <a href="http://www.blogjava.net/CrazyJava/articles/160331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2与AJAX（第二部分） </title><link>http://www.blogjava.net/CrazyJava/articles/160330.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160330.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160330.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160330.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上一篇文章《Struts 2与AJAX（第一部分）》，我已经简单地介绍了&lt;s:tree /&gt;的一些用法，接下来我将继续深入讲解&lt;s:tree /&gt;的使用和通过DWR实现AJAX校验。更多&lt;s:tree /&gt;在Struts 2的showcase中有两个&lt;s:tree /&gt;的例子，分别是静态树与动态树。所谓的静态树即是在编写JSP代码时通过&l...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160330.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 20:03 <a href="http://www.blogjava.net/CrazyJava/articles/160330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2与AJAX（第一部分） </title><link>http://www.blogjava.net/CrazyJava/articles/160328.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 12:02:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160328.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160328.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160328.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160328.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在当今——Web 2.0概念铺天盖地的Internet环境下，简易的AJAX集成对于一个成功的WEB框架来说是不可或缺的。因此，Struts 2其中的一个重要的功能（Feature）就是&#8220;First-class AJAX support - Add interactivity and flexibility with AJAX tags that look and feel just ...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160328.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 20:02 <a href="http://www.blogjava.net/CrazyJava/articles/160328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strus 2的新表单标志的使用 </title><link>http://www.blogjava.net/CrazyJava/articles/160327.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 12:01:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160327.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160327.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160327.html</trackback:ping><description><![CDATA[<p>&nbsp;Struts 2为大家提供了不少常用的很酷的表单标志，简化了我们程序员的工作。不过，由于这些都是新标志，大家可能在使用上还存在不少疑问。本文将就朋友们的回复、留言或Email上的问题，分别对这些酷标志进行讲述。</p>
<h2>表单标志使用小技巧</h2>
<p>Struts 2的表单标志在输出（render）HTML时，使用了模板的概念，增加了复杂性（因为它不像Struts 1.x的表单标志，它通常都是一个标志对应HTML的一个元素），因此大家在使用时，需要一些技巧：</p>
<ol>
    <li>Struts 2的UI标志的表单标志默认是以表格布局，按钮是右对齐的。如果你不喜欢此风格，你可以简单地将&lt;s:form /&gt;标志的&#8220;theme&#8221;属性设为&#8220;simple&#8221;，然后用以往的做法自已布局表单元素（注意：此法有利有弊，弊就是当你将&#8220;theme&#8221;属性设为&#8220;simple&#8221;时，表单标志以最简单方式输出HTML，所以你可能失去一些默认输出提供的便利，如：友好的错误信息的显示，或客户端的表单验证等）。当然更好的做法是通过CSS或自定义主题（theme）然后应用到整个应用程序，这样可以获得一致的页面风格，加强用户体验（我会在以后的文章对此进行讲解）；
    <li>当你在页面上加入某些标志（如：&lt;s:doubleselect /&gt;等）时，应该通过action来访问页面，而不是通过*.jsp的URL直接访问。 </li>
</ol>
<p>下面我将分别对这些标志进行讲述：</p>
<h2>1、&lt;s:checkboxlist /&gt;</h2>
<p>大家对&lt;s:checkboxlist /&gt;的最大的疑问可能是：&#8220;如何在默认情况下，选中某些checkbox？&#8221;</p>
<p>答案其实很简单，只需要将其&#8220;value&#8221;属性设为你的要选中的值，如以代码所示：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ page language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html; charset=utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - </span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:checkboxlist/ </span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:checkboxlist/</span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Store"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:checkboxlist </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="skills1"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="Skills 1"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="{ 'Java', '.Net', 'RoR', 'PHP' }"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="{ 'Java', '.Net' }"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:checkboxlist </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="skills2"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="Skills 2"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="#{ 1:'Java', 2: '.Net', 3: 'RoR', 4: 'PHP' }"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listKey</span><span style="color: #0000ff">="key"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listValue</span><span style="color: #0000ff">="value"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="{ 1, 2, 3 }"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单1 WebContent/checkboxlist.jsp</span>
<p>分布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/checkboxlist.jsp">http://localhost:8080/Struts2_CoolTags/checkboxlist.jsp</a>，出现如下图所示页面：</p>
<p><img alt="checkboxlist.jsp页面" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/r_checkboxlist[1].gif" /><br />
<span style="font-size: smaller; font-style: italic">清单2 checkboxlist.jsp页面</span></p>
<h2>2、&lt;s:doubleselect /&gt;</h2>
<p>大家看Struts 2的showcase的例子，&lt;s:doubleselect /&gt;的用法如下所示：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:doubleselect<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ff0000">tooltip</span><span style="color: #0000ff">="Choose Your State"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="State"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="region"</span><span style="color: #ff0000"> list</span><span style="color: #0000ff">="{'North', 'South'}"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="'South'"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleValue</span><span style="color: #0000ff">="'Florida'"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleList</span><span style="color: #0000ff">="top == 'North' ? {'Oregon', 'Washington'} : {'Texas', 'Florida'}"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleName</span><span style="color: #0000ff">="state"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerKey</span><span style="color: #0000ff">="-1"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerValue</span><span style="color: #0000ff">="---------- Please Select ----------"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单3 Showcase中&lt;s:doubleselect /&gt;</span>
<p>很多朋友问：&#8220;上面的&#8216;list&#8217;属性只有两个值，如果我有三个或更多的值，&#8216;doublelist&#8217;属性应该如何设定呢？&#8221;</p>
<p>我建议的做法是先定义一个Map类型的对象，键为&#8220;list&#8221;的集合，值则为&#8220;doubleList&#8221;的集合，然后&#8220;doubleList&#8221;的OGNL写成&#8220;#myMap[top]&#8221;，如以下代码所示：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ page language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html; charset=utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - </span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:doubeselect/ </span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:doubleselect/</span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Store"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:set </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="foobar"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;value</span><span style="color: #0000ff">="#{'Java': {'Spring', 'Hibernate', 'Struts 2'}, '.Net': {'Linq', ' ASP.NET 2.0'}, 'Database': {'Oracle', 'SQL Server', 'DB2', 'MySQL'}}"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:doubleselect </span><span style="color: #ff0000">list</span><span style="color: #0000ff">="#foobar.keySet()"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleName</span><span style="color: #0000ff">="technology"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleList</span><span style="color: #0000ff">="#foobar[top]"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="Technology"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单4 WebContent/doubleselect.jsp</span>
<p>分布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/doubleselect.action">http://localhost:8080/Struts2_CoolTags/doubleselect.action</a>，出现如下图所示页面：</p>
<p><img alt="doubleselect.jsp页面" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/r_doubleselect[1].gif" /><br />
<span style="font-size: smaller; font-style: italic">清单5 doubleselect.jsp页面</span></p>
<h2>3、&lt;s: token /&gt;</h2>
<p>这个标志可能大家不常用，不过本人认为它还是挺有用的。在使用Struts 1.x时，因为跳转通常是用Forward（而不是Redirect）实现的，所以当用户完成请求后，按&#8220;F5&#8221;刷新页面时，就会重新提交上次的请求，这样经常会出错。要解决这个问题，&lt;s:token /&gt;可以帮你忙。</p>
<h3>实现原理</h3>
<p>在页面加载时，&lt;s: token /&gt;产生一个GUID（Globally Unique Identifier，全局唯一标识符）值的隐藏输入框如：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="hidden"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="struts.token.name"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="struts.token"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="hidden"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="struts.token"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"</span><span style="color: #0000ff">/&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单6 &lt;s:token /&gt;的HTML输出</span>
<p>同时，将GUID放到会话（session）中；在执行action之前，&#8220;token&#8221;拦截器将会话token与请求token比较，如果两者相同，则将会话中的token删除并往下执行，否则向actionErrors加入错误信息。如此一来，如果用户通过某种手段提交了两次相同的请求，两个token就会不同。</p>
<h3>具体实现</h3>
<p>首先看一下Action的代码：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> tutorial;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> com.opensymphony.xwork2.ActionSupport;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_115_471_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/expandedblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_115_471_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedblock[1].gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> CoolTagAction </span><span style="color: #0000ff">extends</span><span style="color: #000000"> ActionSupport </span><span id="Codehighlighter1_115_471_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /></span><span id="Codehighlighter1_115_471_Open_Text"><span style="color: #000000">{ &nbsp; &nbsp;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">final</span><span style="color: #000000"> </span><span style="color: #0000ff">long</span><span style="color: #000000"> serialVersionUID </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">6820659617470261780L</span><span style="color: #000000">;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> String message;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;<br />
<img id="Codehighlighter1_244_265_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/expandedsubblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_244_265_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedsubblock[1].gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getMessage() </span><span id="Codehighlighter1_244_265_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /></span><span id="Codehighlighter1_244_265_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> message;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/expandedsubblockend[2].gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_308_337_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/expandedsubblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_308_337_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedsubblock[1].gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setMessage(String message) </span><span id="Codehighlighter1_308_337_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /></span><span id="Codehighlighter1_308_337_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.message </span><span style="color: #000000">=</span><span style="color: #000000"> message;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/expandedsubblockend[2].gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;@Override<br />
<img id="Codehighlighter1_377_468_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/expandedsubblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_377_468_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedsubblock[1].gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> String execute() </span><span id="Codehighlighter1_377_468_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /></span><span id="Codehighlighter1_377_468_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Executing action, your message is </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> message);<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> SUCCESS;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/expandedsubblockend[2].gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"> &nbsp; &nbsp;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/437_files/expandedblockend[1].gif" align="top"  alt="" />}</span></span></div>
<span style="font-size: smaller; font-style: italic">清单7 src/tutorial/CoolTagAction.java</span>
<p>以上代码一目了然，再看看JSP的写法：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %&gt;<br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - </span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:token/ </span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:token/</span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:actionerror </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Token"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="message"</span><span style="color: #ff0000"> label</span><span style="color: #0000ff">="Message"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:token </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单8 WebContent/token.jsp</span>
<p>JSP也很简单，就是加入&lt;s:token /&gt;标志。接下来是Actoin配置的XML片段：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE struts PUBLIC<br />
&nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Struts2_COOL_TAGS_DEMO"</span><span style="color: #ff0000"> extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Token"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="tutorial.CoolTagAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultStack"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="token"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="invalid.token"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/token.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/token.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/{1}.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单9 src/struts.xml</span>
<p>以上XML片段值注意的是加入了&#8220;token&#8221;拦截器和&#8220;invalid.token&#8221;结果，因为&#8220;token&#8221;拦截器在会话token与请求token不一致时，将会直接返回&#8220;invalid.token&#8221;结果。</p>
<p>发布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/token.jsp">http://localhost:8080/Struts2_CoolTags/token.jsp</a>，出现如下图所示页面：</p>
<p><img alt="正常显示的token.jsp页面" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/r_token1[1].gif" /><br />
<span style="font-size: smaller; font-style: italic">清单10 正常显示的token.jsp页面</span></p>
<p>随便填点东西并提交页面，一切正常返回以上页面，然后按&#8220;F5&#8221;刷新页面，在弹出的对话框中点击&#8220;Retry&#8221;，出现如下图所示页面：</p>
<p><img alt="重复提交出错显示" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/r_token2[1].gif" /><br />
<span style="font-size: smaller; font-style: italic">清单11 重复提交出错显示</span></p>
<h2>4、&lt;s:datetimepicker /&gt;、&lt;s:optiontransferselect /&gt;和&lt;s:updownselect /&gt;</h2>
<p>这几个标志的使用相对简单，所以我想小举一例即可，以下是JSP的代码：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - Others</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Others</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Store"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:datetimepicker </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="birthday"</span><span style="color: #ff0000"> label</span><span style="color: #0000ff">="Birthday"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:updownselect<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ff0000">label </span><span style="color: #0000ff">= "Favourite Countries"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="#{'england':'England', 'america':'America', 'germany':'Germany'}"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="prioritisedFavouriteCountries"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerKey</span><span style="color: #0000ff">="-1"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerValue</span><span style="color: #0000ff">="--- Please Order Them Accordingly ---"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:optiontransferselect &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ff0000">label</span><span style="color: #0000ff">="Favourite Cartoons Characters"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="leftSideCartoonCharacters"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; leftTitle</span><span style="color: #0000ff">="Left Title"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rightTitle</span><span style="color: #0000ff">="Right Title"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="{'Popeye', 'He-Man', 'Spiderman'}"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; multiple</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerKey</span><span style="color: #0000ff">="headerKey"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerValue</span><span style="color: #0000ff">="--- Please Select ---"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleList</span><span style="color: #0000ff">="{'Superman', 'Mickey Mouse', 'Donald Duck'}"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleName</span><span style="color: #0000ff">="rightSideCartoonCharacters"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleHeaderKey</span><span style="color: #0000ff">="doubleHeaderKey"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleHeaderValue</span><span style="color: #0000ff">="--- Please Select ---"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleEmptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleMultiple</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单12 WebContent\others.jsp页面</span>
<p>发布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/others.jsp">http://localhost:8080/Struts2_CoolTags/others.jsp</a>，出现如下图所示页面：</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/max/22548/o_others.gif"><img alt="点击查看大图" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/r_others[1].gif" /></a><br />
<span style="font-size: smaller; font-style: italic">清单13 其它表单标志页面</span></p>
<h2>总结</h2>
<p>Struts 2在标志上的确比Struts 1.x丰富了许多，同时模板机制也给程序员带来不少方便（如果你不太喜欢个性化的风格）。另外，Struts 2还有一些AJAX（如<a title="autocompleter" href="http://www.blogjava.net/max/admin/autocompleter.html">&lt;s: autocompleter /&gt;</a>等）的标志和非表单的UI标志（如<a href="http://cwiki.apache.org/WW/tree.html">&lt;s: tree /&gt;</a>等），我会在以后的文章中讲述其使用。</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/160327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 20:01 <a href="http://www.blogjava.net/CrazyJava/articles/160327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现CRUD </title><link>http://www.blogjava.net/CrazyJava/articles/160325.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160325.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160325.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160325.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: CRUD是Create（创建）、Read（读取）、Update（更新）和Delete（删除）的缩写，它是普通应用程序的缩影。如果您掌握了某框架的CRUD编写，那么意味可以使用该框架创建普通应用程序了，所以大家使用新框架开发OLTP（Online Transaction Processing）应用程序时，首先会研究一下如何编写CRUD。这类似于大家在学习新编程语言时喜欢编写&#8220;Hello ...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160325.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 20:00 <a href="http://www.blogjava.net/CrazyJava/articles/160325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2中的OGNL </title><link>http://www.blogjava.net/CrazyJava/articles/160326.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160326.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160326.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160326.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本人是一个EL（Expression Language，以下译为表达式语言）的支持者。因为我对&lt;% %&gt;写法极为反感，忘记了在那本书上看到的一句话——&#8220;使用标志（Tag）的一个目的就是避免在JSP页面中出现过多的&lt;%%&gt;的语句，使页面与后台代码分离。&#8221;表达式语言主要有以下几大好处：    避免(MyType) request.getAtt...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160326.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 20:00 <a href="http://www.blogjava.net/CrazyJava/articles/160326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现IoC </title><link>http://www.blogjava.net/CrazyJava/articles/160323.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 11:59:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160323.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160323.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160323.html</trackback:ping><description><![CDATA[<p>IoC(Inversion of Control，以下译为控制反转）随着Java社区中轻量级容器（Lightweight Contianer）的推广而越来越为大家耳熟能详。在此，我不想再多费唇舌来解释&#8220;什么是控制反转&#8221;和&#8220;为什么需要控制反转&#8221;。因为互联网上已经有非常多的文章对诸如此类的问题作了精彩而准确的回答。大家可以去读一下Rod Johnson和Juergen Hoeller合著的《<a href="http://www.wrox.com/books/0764558315.shtml">Expert one-on-one J2EE Development without EJB</a>》或Martin Fowler所写的《<a class="l" href="http://www.martinfowler.com/articles/injection.html" target="_blank"><span style="color: #0000cc">Inversion of Control Containers and the Dependency Injection pattern</span></a>》。</p>
<p>言归正传，本文的目的主要是介绍在Struts 2中实现控制反转。</p>
<h2>历史背景</h2>
<p>众所周知，Struts 2是以Webwork 2作为基础发展出来。而在Webwork 2.2之前的Webwork版本，其自身有一套控制反转的实现，Webwork 2.2在<a href="http://www.springframework.org/">Spring 框架</a>的如火如荼发展的背景下，决定放弃控制反转功能的开发，转由Spring实现。值得一提的是，Spring确实是一个值得学习的框架，因为有越来越多的开源组件（如<a href="http://ibatis.apache.org/">iBATIS</a>等）都放弃与Spring重叠的功能的开发。因此，Struts 2推荐大家通过Spring实现控制反转。</p>
<h2>具体实现</h2>
<p>首先，在开发环境中配置好Struts 2的工程。对这部分仍然有问题的朋友，请参考我的早前的文章。</p>
<p>然后，将所需的Spring的jar包加入到工程的构建环境（Build Path）中，如下图1所示：</p>
<p><img alt="图1 所依赖的Spring的jar包" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/r_pic1[1].gif" /> <br />
<span style="font-size: smaller; font-style: italic">图1 所依赖的Spring的jar包</span> </p>
<p>本文使用的是Spring 2.0，Spring强烈建议大家在使用其jar包时，只引用需要的包，原因是Spring是一个功能非常强大的框架，其中有些功能是您不需要的；而且Spring提倡的是&#8220;按需所取&#8221;，而不是EJB的&#8220;爱我就要爱我的一切&#8221;。当然，如果你怕麻烦或者是不清楚每个包的作用，引用一个Spring的总包也未尝不可。</p>
<p>接下来，就要修改WEB-INF\web.xml文件了，内容为：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span> <span style="color: #ff00ff">xml version="1.0" encoding="UTF-8"</span> <span style="color: #0000ff">?&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">web-app </span><span style="color: #ff0000">version</span> <span style="color: #0000ff">="2.4"</span> <span style="color: #ff0000">xmlns</span> <span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span> <span style="color: #ff0000"><br />
&nbsp; &nbsp; xmlns:xsi</span> <span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span> <span style="color: #ff0000"><br />
&nbsp; &nbsp; xsi:schemaLocation</span> <span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;<br />
&nbsp; &nbsp; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">display-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">Struts 2 IoC Demo</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">display-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">struts-cleanup</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-class</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.dispatcher.ActionContextCleanUp<br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-class</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">struts2</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-class</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-class</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-mapping</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">struts-cleanup</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">url-pattern</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">/*</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">url-pattern</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-mapping</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-mapping</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">struts2</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-name</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">url-pattern</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">/*</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">url-pattern</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">filter-mapping</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">listener</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">listener-class</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.springframework.web.context.ContextLoaderListener<br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">listener-class</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">listener</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">welcome-file-list</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">welcome-file</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">index.html</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">welcome-file</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">welcome-file-list</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">web-app</span> <span style="color: #0000ff">&gt;</span> </div>
<span style="font-size: smaller; font-style: italic">清单1 WEB-INF\web.xml</span>
<p>大家一看便知道，主要是加入Spring的ContextLoaderListener监听器，方便Spring与Web容器交互。</p>
<p>紧接着，修改Struts.properties文件，告知Struts 2运行时使用Spring来创建对象（如Action等），内容如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">struts.objectFactory</span> <span style="color: #000000">=</span> <span style="color: #000000">spring</span> </div>
<span style="font-size: smaller; font-style: italic">清单2 classes\struts.properties</span>
<p>再下来，遵循Spring的原则——面向接口编程，创建接口ChatService，代码如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /> <span style="color: #0000ff">package</span> <span style="color: #000000">tutorial;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /></span> <span style="color: #0000ff">import</span> <span style="color: #000000">java.util.Set;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_71_102_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/expandedblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_71_102_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedblock[1].gif" align="top"  alt="" /></span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">interface</span> <span style="color: #000000">ChatService </span><span id="Codehighlighter1_71_102_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /> </span><span id="Codehighlighter1_71_102_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">getUserNames();<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/437_files/expandedblockend[1].gif" align="top"  alt="" />}</span> </span></div>
<span style="font-size: smaller; font-style: italic">清单3 tutorial.ChatService.java</span>
<p>然后，再创建一个默认实现ChatServiceImpl，代码如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /> <span style="color: #0000ff">package</span> <span style="color: #000000">tutorial;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /></span> <span style="color: #0000ff">import</span> <span style="color: #000000">java.util.HashSet;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /></span> <span style="color: #0000ff">import</span> <span style="color: #000000">java.util.Set;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_120_287_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/expandedblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_120_287_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedblock[1].gif" align="top"  alt="" /></span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> <span style="color: #000000">ChatServiceImpl </span><span style="color: #0000ff">implements</span> <span style="color: #000000">ChatService </span><span id="Codehighlighter1_120_287_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /> </span><span id="Codehighlighter1_120_287_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_158_284_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/expandedsubblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_158_284_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedsubblock[1].gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #000000">Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">getUserNames() </span><span id="Codehighlighter1_158_284_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /> </span><span id="Codehighlighter1_158_284_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">users </span><span style="color: #000000">=</span> <span style="color: #0000ff">new</span> <span style="color: #000000">HashSet</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">();<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span> <span style="color: #000000">"</span> <span style="color: #000000">Max</span> <span style="color: #000000">"</span> <span style="color: #000000">);<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span> <span style="color: #000000">"</span> <span style="color: #000000">Scott</span> <span style="color: #000000">"</span> <span style="color: #000000">);<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span> <span style="color: #000000">"</span> <span style="color: #000000">Bob</span> <span style="color: #000000">"</span> <span style="color: #000000">);<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="color: #0000ff">return</span> <span style="color: #000000">users;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/expandedsubblockend[2].gif" align="top"  alt="" /> &nbsp; &nbsp;}</span> </span><span style="color: #000000"><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> <br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/437_files/expandedblockend[1].gif" align="top"  alt="" />}</span> </span></div>
<span style="font-size: smaller; font-style: italic">清单4 tutorial.ChatServiceImpl.java</span>
<p>接下来，就该新建Action了。tutorial.ChatAction.java的代码如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /> <span style="color: #0000ff">package</span> <span style="color: #000000">tutorial;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /></span> <span style="color: #0000ff">import</span> <span style="color: #000000">java.util.Set;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /></span> <span style="color: #0000ff">import</span> <span style="color: #000000">com.opensymphony.xwork2.ActionSupport;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_135_529_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/expandedblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_135_529_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedblock[1].gif" align="top"  alt="" /></span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> <span style="color: #000000">ChatAction </span><span style="color: #0000ff">extends</span> <span style="color: #000000">ActionSupport </span><span id="Codehighlighter1_135_529_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /> </span><span id="Codehighlighter1_135_529_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">final</span> <span style="color: #0000ff">long</span> <span style="color: #000000">serialVersionUID </span><span style="color: #000000">=</span> <span style="color: #000000">8445871212065L</span> <span style="color: #000000">;&nbsp;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">private</span> <span style="color: #000000">ChatService chatService;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">private</span> <span style="color: #000000">Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">userNames;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_323_360_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/expandedsubblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_323_360_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedsubblock[1].gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> <span style="color: #000000">setChatService(ChatService chatService) </span><span id="Codehighlighter1_323_360_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /> </span><span id="Codehighlighter1_323_360_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="color: #0000ff">this</span> <span style="color: #000000">.chatService </span><span style="color: #000000">=</span> <span style="color: #000000">chatService;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/expandedsubblockend[2].gif" align="top"  alt="" /> &nbsp; &nbsp;}</span> </span><span style="color: #000000"><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img id="Codehighlighter1_399_422_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/expandedsubblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_399_422_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedsubblock[1].gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #000000">Set</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">String</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">getUserNames() </span><span id="Codehighlighter1_399_422_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /> </span><span id="Codehighlighter1_399_422_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="color: #0000ff">return</span> <span style="color: #000000">userNames;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/expandedsubblockend[2].gif" align="top"  alt="" /> &nbsp; &nbsp;}</span> </span><span style="color: #000000"><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;@Override<br />
<img id="Codehighlighter1_462_525_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/expandedsubblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_462_525_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedsubblock[1].gif" align="top"  alt="" /> &nbsp; &nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #000000">String execute() </span><span id="Codehighlighter1_462_525_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /> </span><span id="Codehighlighter1_462_525_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;userNames </span><span style="color: #000000">=</span> <span style="color: #000000">chatService.getUserNames();<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="color: #0000ff">return</span> <span style="color: #000000">SUCCESS;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/expandedsubblockend[2].gif" align="top"  alt="" /> &nbsp; &nbsp;}</span> </span><span style="color: #000000"><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/437_files/expandedblockend[1].gif" align="top"  alt="" />}</span> </span></div>
<span style="font-size: smaller; font-style: italic">清单5 tutorial.ChatAction.java</span>
<p>ChatAction类使用属性（Getter/Setter）注入法取得ChatService对象。</p>
<p>然后，配置Spring的applicationContext.xml（位于WEB-INF下）文件，内容如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span> <span style="color: #ff00ff">xml version="1.0" encoding="UTF-8"</span> <span style="color: #0000ff">?&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">beans </span><span style="color: #ff0000">xmlns</span> <span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span> <span style="color: #ff0000"><br />
&nbsp; &nbsp; xmlns:xsi</span> <span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span> <span style="color: #ff0000"><br />
&nbsp; &nbsp; xsi:schemaLocation</span> <span style="color: #0000ff">="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">bean </span><span style="color: #ff0000">id</span> <span style="color: #0000ff">="chatService"</span> <span style="color: #ff0000">class</span> <span style="color: #0000ff">="tutorial.ChatServiceImpl"</span> <span style="color: #0000ff">/&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">bean </span><span style="color: #ff0000">id</span> <span style="color: #0000ff">="chatAction"</span> <span style="color: #ff0000">class</span> <span style="color: #0000ff">="tutorial.ChatAction"</span> <span style="color: #ff0000">scope</span> <span style="color: #0000ff">="prototype"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">property </span><span style="color: #ff0000">name</span> <span style="color: #0000ff">="chatService"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">ref </span><span style="color: #ff0000">local</span> <span style="color: #0000ff">="chatService"</span> <span style="color: #0000ff">/&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">property</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">bean</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">beans</span> <span style="color: #0000ff">&gt;</span> </div>
<span style="font-size: smaller; font-style: italic">清单6 WEB-INF\applicationContext.xml</span>
<p>上述代码有二点值得大家注意的：</p>
<ol>
    <li>Struts 2会为每一个请求创建一个Action对象，所以在定义chatAction时，使用scope="prototype"。这样Spring就会每次都返回一个新的ChatAction对象了；
    <li>因为ChatServiceImpl被配置为默认的scope（也即是singleton，唯一的），所以在实现时应保证其线程安全（关于编写线程安全的代码的讨论已经超出本文的范围，更超出了本人的能力范围，大家可以参考Addison Wesley Professional出版的《<a href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601">Java Concurrency in Practice</a>》）。 </li>
</ol>
<p>接下来，在classes/struts.xml中配置Action，内容如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;!</span> <span style="color: #ff00ff">DOCTYPE struts PUBLIC<br />
&nbsp; &nbsp; &nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp; &nbsp; &nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">struts</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">include </span><span style="color: #ff0000">file</span> <span style="color: #0000ff">="struts-default.xml"</span> <span style="color: #0000ff">/&gt;</span> <span style="color: #000000">&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">package </span><span style="color: #ff0000">name</span> <span style="color: #0000ff">="Struts2_IoC"</span> <span style="color: #ff0000">extends</span> <span style="color: #0000ff">="struts-default"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">action </span><span style="color: #ff0000">name</span> <span style="color: #0000ff">="Chat"</span> <span style="color: #ff0000">class</span> <span style="color: #0000ff">="chatAction"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">result</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">/UserList.jsp</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">result</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">action</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">package</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">&nbsp; &nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">struts</span> <span style="color: #0000ff">&gt;</span> </div>
<span style="font-size: smaller; font-style: italic">清单7 classes\struts.xml</span>
<p>这里的Action和平常不同的就是class属性，它对应于Spring所定义的bean的id，而不是它的类全名。</p>
<p>最后，让我们看看/UserList.jsp，内容如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000; background-color: #ffff00">&lt;%</span> <span style="color: #000000; background-color: #f5f5f5">@ page contentType</span> <span style="color: #000000; background-color: #f5f5f5">=</span> <span style="color: #000000; background-color: #f5f5f5">"</span> <span style="color: #000000; background-color: #f5f5f5">text/html; charset=UTF-8</span> <span style="color: #000000; background-color: #f5f5f5">"</span> <span style="color: #000000; background-color: #ffff00">%&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span> <span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span> <span style="color: #000000; background-color: #f5f5f5">=</span> <span style="color: #000000; background-color: #f5f5f5">"</span> <span style="color: #000000; background-color: #f5f5f5">s</span> <span style="color: #000000; background-color: #f5f5f5">"</span> <span style="color: #000000; background-color: #f5f5f5">uri</span> <span style="color: #000000; background-color: #f5f5f5">=</span> <span style="color: #000000; background-color: #f5f5f5">"</span> <span style="color: #000000; background-color: #f5f5f5">/struts-tags</span> <span style="color: #000000; background-color: #f5f5f5">"</span> <span style="color: #000000; background-color: #ffff00">%&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">html</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">head</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">title</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">User List</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">title</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">head</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">body</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">h2</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">User List</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">h2</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">ol</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">s:iterator </span><span style="color: #ff0000">value</span> <span style="color: #0000ff">="userNames"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">li</span> <span style="color: #0000ff">&gt;&lt;</span> <span style="color: #800000">s:property </span><span style="color: #0000ff">/&gt;&lt;/</span> <span style="color: #800000">li</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">s:iterator</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">ol</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">body</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">html</span> <span style="color: #0000ff">&gt;</span> </div>
<span style="font-size: smaller; font-style: italic">清单8 /UserList.jsp</span>
<p>大功告成，分布运行应用程序，在浏览器中键入<a href="http://localhost:8080/Struts2_IoC/Chat.action">http://localhost:8080/Struts2_IoC/Chat.action</a>，出现如图2所示页面：</p>
<p><img alt="图2 /ListUser.jsp" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/r_pic2[1].gif" /> <br />
<span style="font-size: smaller; font-style: italic">图2 /ListUser.jsp</span> </p>
<h2>总结</h2>
<p>通过Spring在Struts 2上实现控制反转是强烈推荐的做法，当然您也可以组合其它的实现（如Pico等）。</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/160323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 19:59 <a href="http://www.blogjava.net/CrazyJava/articles/160323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现文件上传 </title><link>http://www.blogjava.net/CrazyJava/articles/160324.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 11:59:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160324.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160324.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160324.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题， 所以今天我们就来讨论一下这个问题。实现原理Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹，然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160324.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 19:59 <a href="http://www.blogjava.net/CrazyJava/articles/160324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2的基石——拦截器（Interceptor） </title><link>http://www.blogjava.net/CrazyJava/articles/160322.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 11:58:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160322.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160322.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160322.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;首先，要跟大家道个歉，前一阵子为给客户个一个DEMO，忙得不可开交，所以很久没有更新Blog。提到这个DEMO我想顺便跟大家分享一下心得——如果大家希望快速开发，一个类似Struts 2这样的简单方便的WEB框架必不可少。我们在开发DEMO使用的还是Struts 1.2.8，而且没有不使用任何EL（表达式语言），导致页面出现无数类似&#8220;&lt;%= ((Integer) re...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160322.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 19:58 <a href="http://www.blogjava.net/CrazyJava/articles/160322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转换器（Converter）——Struts 2.0中的魔术师 </title><link>http://www.blogjava.net/CrazyJava/articles/160320.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 11:57:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160320.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160320.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160320.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在我已往的Struts 1.x项目经验中，有个问题不时的出现——在创建FormBean时，对于某个属性到底应该用String还是其它类型？开发Web应用程序与开发传统桌面应用程序不同，Web应用程序实际上是分布个不同的主机（当然也可以同一个主机，不过比较少见）上的两个进程之间互交。这种互交建立在HTTP之上，它们互相传递是都是字符串。换句话说， 服务器可以的接收到的来自用户的数据只能是字符串或...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160320.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 19:57 <a href="http://www.blogjava.net/CrazyJava/articles/160320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2.0中实现表单数据校验（Validation） </title><link>http://www.blogjava.net/CrazyJava/articles/160321.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 11:57:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160321.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160321.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160321.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在写前几篇文章的时候，有些朋友建议我的写一篇关于表单数据校验的文章。 正如文章的开头所引用的《Writing Secure Code》的名言：&#8220;所有的输入都是罪恶的&#8221;，所以我们应该对所有的外部输入进行校验。而表单是应用程序最简单的入口，对其传进来的数据，我们必须进行校验。转换与校验（Conversion &amp; Validation）其实上篇文章，我本来是打算写...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160321.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 19:57 <a href="http://www.blogjava.net/CrazyJava/articles/160321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2.0中国际化(i18n)您的应用程序 </title><link>http://www.blogjava.net/CrazyJava/articles/160319.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 11:56:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160319.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160319.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160319.html</trackback:ping><description><![CDATA[<p>国际化是商业系统中不可或缺的一部分，所以无论您学习的是什么Web框架，它都是必须掌握的技能。</p>
<p>其实，Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作，例如，如果您要输出一条国际化的信息，只需在代码包中加入FILE-NAME_xx_XX.properties（其中FILE-NAME为默认资源文件的文件名），然后在struts-config.xml中指明其路径，再在页面用&lt;bean:message&gt;标志输出即可。 </p>
<p>不过，所谓&#8220;没有最好，只有更好&#8221;。Struts 2.0并没有在这部分止步，而是在原有的简单易用的基础上，将其做得更灵活、更强大。</p>
<h2>国际化Hello World</h2>
<p>下面让我们看一个例子——HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。</p>
<ol>
    <li>在Eclipse创建工程配置开发和运行环境（如果对这个步骤有问题，可以参考我早前的文章《<a class="entrylistItemTitle" id="A1" href="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445.html">为Struts 2.0做好准备</a>》）。 <br />
    <li>在src文件夹中加入struts.properties文件，内容如下： <br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">struts.custom.i18n.resources</span><span style="color: #000000">=</span><span style="color: #000000">globalMessages</span></div>
    <center>
    <table style="border-right: #f0c000 1px solid; border-top: #f0c000 1px solid; margin-top: 8px; margin-bottom: 8px; border-left: #f0c000 1px solid; border-bottom: #f0c000 1px solid; background-color: #ffffce; text-align: left" cellspacing="0" cellpadding="0" border="0">
        <tbody>
            <tr>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/lightbulb_on[1].gif"  alt="" /></td>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px; font-family: 华文仿宋">Struts 2.0有两个配置文件，struts.xml和struts.properties都是放在WEB-INF/classes/下。
                <ul>
                    <li>struts.xml用于应用程序相关的配置
                    <li>struts.properties用于Struts 2.0的运行时（Runtime）的配置</li>
                </ul>
                </td>
            </tr>
        </tbody>
    </table>
    </center>
    <li>在src文件夹中加入globalMessages_en_US.properties文件，内容如下：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">HelloWorld</span><span style="color: #000000">=</span><span style="color: #000000">Hello World!</span></div>
    <li>在src文件夹中加入globalMessages_zh_CN.properties文件，内容如下：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">HelloWorld</span><span style="color: #000000">=你</span><span style="color: #000000">好，世界！</span></div>
    <table style="border-right: #f0c000 1px solid; border-top: #f0c000 1px solid; margin-top: 8px; margin-bottom: 8px; border-left: #f0c000 1px solid; border-bottom: #f0c000 1px solid; background-color: #ffffce; text-align: left" cellspacing="0" cellpadding="0" border="0">
        <tbody>
            <tr>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/lightbulb_on[1].gif"  alt="" /></td>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px; font-family: 华文仿宋">在此想和大家分享一个不错的编写properties文件的Eclipse插件（plugin），有了它我们在编辑一些简体中文、繁体中文等Unicode文本时，就不必再使用native2ascii编码了。您可以通过Eclipse中的软件升级（Software Update）安装此插件，步骤如下：<br />
                <div style="padding-right: 36px; padding-left: 36px">1、展开Eclipse的Help菜单，将鼠标移到Software Update子项，在出现的子菜单中点击Find and Install；<br />
                2、在Install/Update对话框中选择Search for new features to install，点击Next；<br />
                3、在Install对话框中点击New Remote Site；<br />
                4、在New Update Site对话框的Name填入&#8220;PropEdit&#8221;或其它任意非空字符串，在URL中填入http://propedit.sourceforge.jp/eclipse/updates/；<br />
                5、在Site to include to search列表中，除上一步加入的site外的其它选项去掉，点击Finsih；<br />
                6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为&#8220;3.1.x&#8221;的选项去掉（适用于Eclipse 3.2版本的朋友）；<br />
                7、点击Finish关闭对话框；<br />
                8、在下载后，同意安装，再按提示重启Eclipse，在工具条看到形似vi的按钮表示安装成功，插件可用。此时，Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。 </div>
                </td>
            </tr>
        </tbody>
    </table>
    <li>在WebContent文件夹下加入HelloWorl.jsp文件，内容如下：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ page &nbsp;contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html; charset=UTF-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
    &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Hello World</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
    &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:text </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="HelloWorld"</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
    &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:property </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="%{getText('HelloWorld')}"</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
    <li>发布运行应用程序，在浏览器地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.jsp">http://localhost:8080/Struts2_i18n/HelloWorld.jsp</a> ，出现图1所示页面。<br />
    <img alt="图1 中文输出" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/r_imag2[1].gif" /><br />
    <span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图1 中文输出</span>
    <li>将浏览器的默认语言改为&#8220;英语（美国）&#8221;，刷新页面，出现图2所示页面。<br />
    <img alt="图2 英文输出" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/r_imag1[1].gif" /><br />
    <span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图2 英文输出</span> </li>
</ol>
上面的例子的做法，与Struts 1.x的做法相似，似乎并不能体现Struts 2.0的优势。不过，我在上面的例子用了两种方法来显示国际化字符串，其输出是相同的。其实，这就是Struts 2.0的一个优势，因为它默认支持EL，所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况——在使用UI表单标志时，getText可以用来设置label属性，例如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #ff0000"> label</span><span style="color: #0000ff">="%{getText('UserName')}"</span><span style="color: #0000ff">/&gt;</span></div>
<h2>资源文件查找顺序</h2>
<p>之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源（properties）文件。在Struts 2.0中有下面几种方法：</p>
<ol>
    <li>使用全局的资源文件，方法如上例所示。这适用于遍布于整个应用程序的国际化字符串，它们在不同的包（package）中被引用，如一些比较共用的出错提示；
    <li>使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源；
    <li>使用Action范围的资源文件。做法为Action的包下新建文件名（除文件扩展名外）与Action类名同样的资源文件。它只能在该Action中访问。如此一来，我们就可以在不同的Action里使用相同的properties名表示不同的值。例如，在ActonOne中title为&#8220;动作一&#8221;，而同样用title在ActionTwo表示&#8220;动作二&#8221;，节省一些命名工夫；
    <li>使用&lt;s:i18n&gt;标志访问特定路径的properties文件。使用方法请参考我早前的文章《<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl" href="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/444.html">常用的Struts 2.0的标志（Tag）介绍</a>》。在您使用这一方法时，请注意&lt;s:i18n&gt;标志的范围。在&lt;s:i18n name="xxxxx"&gt;到&lt;/s:i18n&gt;之间，所有的国际化字符串都会在名为xxxxx资源文件查找，如果找不到，Struts 2.0就会输出默认值（国际化字符串的名字）。</li>
</ol>
<p>上面我列举了四种配置和访问资源的方法，它们的范围分别是从大到小，而Struts 2.0在查找国际化字符串所遵循的是特定的顺序，如图3所示：</p>
<img alt="图3 资源文件查找顺序图" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/o_search[1].jpg" /><br />
<span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图3 资源文件查找顺序图</span>
<p>假设我们在某个ChildAction中调用了getText("user.title")，Struts 2.0的将会执行以下的操作： </p>
<ol>
    <li>查找ChildAction_xx_XX.properties文件或ChildAction.properties；
    <li>查找ChildAction实现的接口，查找与接口同名的资源文件MyInterface.properties；
    <li>查找ChildAction的父类ParentAction的properties文件，文件名为ParentAction.properties；
    <li>判断当前ChildAction是否实现接口ModelDriven。如果是，调用getModel()获得对象，查找与其同名的资源文件；
    <li>查找当前包下的package.properties文件；
    <li>查找当前包的父包，直到最顶层包；
    <li>在值栈（Value Stack）中，查找名为user的属性，转到user类型同名的资源文件，查找键为title的资源;
    <li>查找在struts.properties配置的默认的资源文件，参考例1;
    <li>输出user.title。</li>
</ol>
<h2>参数化国际化字符串</h2>
<p>许多情况下，我们都需要在动行时（runtime）为国际化字符插入一些参数，例如在输入验证提示信息的时候。在Struts 2.0中，我们通过以下两种方法做到这点：</p>
<ol>
    <li>在资源文件的国际化字符串中使用OGNL，格式为${表达式}，例如：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">validation.require</span><span style="color: #000000">=</span><span style="margin-bottom: 8px; color: #000000">${getText(fileName)} is required</span></div>
    <li>使用<a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/text/MessageFormat.html">java.text.MessageFormat</a>中的字符串格式，格式为{ 参数序号（从0开始）, 格式类形（number | date | time | choice）, 格式样式}，例如：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">validation.between</span><span style="color: #000000">=</span><span style="color: #000000">Date must between {</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000"> date, short} and {</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000"> date, short}</span></div>
    </li>
</ol>
在显示这些国际化字符时，同样有两种方法设置参数的值：<br />
<ol>
    <li>使用标志的value0、value1...valueN的属性，如：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:text </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="validation.required"</span><span style="color: #ff0000"> value0</span><span style="color: #0000ff">="User Name"</span><span style="color: #0000ff">/&gt;</span></div>
    <li>使用param子元素，这些param将按先后顺序，代入到国际化字符串的参数中，例如：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:text </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="validation.required"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
    &nbsp; &nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:param </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="User Name"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:text</span><span style="color: #0000ff">&gt;</span></div>
    </li>
</ol>
<h2>让用户方便地选择语言</h2>
<p>开发国际化的应用程序时，有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中，通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过，由于这是一个比较普遍的应用场景（Scenario），所以Struts 2.0为您提供了一个名i18n的拦截器（Interceptor），并在默认情况下将其注册到拦截器链（Interceptor chain）中。它的原理为在执行Action方法前，i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在，拦截器就将其作为参数实例化Locale对象，并将其设为用户默认的区域（Locale），最后，将此Locale对象保存在session的名为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性中。</p>
<p>下面，我将提供一完整示例演示它的使用方法。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> tutorial;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Hashtable;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Locale;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Map;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/none[1].gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_116_345_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/expandedblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_116_345_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedblock[1].gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #0000ff">class</span><span style="color: #000000"> Locales </span><span id="Codehighlighter1_116_345_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /></span><span id="Codehighlighter1_116_345_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_159_343_Open_Image" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/expandedsubblockstart[1].gif" align="top"  alt="" /><img id="Codehighlighter1_159_343_Closed_Image" style="display: none" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/445_files/contractedsubblock[1].gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String, Locale</span><span style="color: #000000">&gt;</span><span style="color: #000000"> getLocales() </span><span id="Codehighlighter1_159_343_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/43_files/dot[1].gif"  alt="" /></span><span id="Codehighlighter1_159_343_Open_Text"><span style="color: #000000">{<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String, Locale</span><span style="color: #000000">&gt;</span><span style="color: #000000"> locales </span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> Hashtable</span><span style="color: #000000">&lt;</span><span style="color: #000000">String, Locale</span><span style="color: #000000">&gt;</span><span style="color: #000000">(</span><span style="color: #000000">2</span><span style="color: #000000">);<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="color: #000000">"</span><span style="color: #000000">American English</span><span style="color: #000000">"</span><span style="color: #000000">, Locale.US);<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="color: #000000">"</span><span style="color: #000000">Simplified Chinese</span><span style="color: #000000">"</span><span style="color: #000000">, Locale.CHINA);<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/inblock[2].gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> locales;<br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/439_files/expandedsubblockend[2].gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/437_files/expandedblockend[1].gif" align="top"  alt="" />}</span></span></div>
<span style="font-size: smaller; font-style: italic">tutorial/Locales.java</span><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text/javascript"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
</span><span style="color: #000000; background-color: #f5f5f5">&lt;!--</span><span style="color: #000000; background-color: #f5f5f5"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff; background-color: #f5f5f5">function</span><span style="color: #000000; background-color: #f5f5f5"> langSelecter_onChanged() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; document.langForm.submit();<br />
&nbsp; &nbsp; }<br />
</span><span style="color: #008000; background-color: #f5f5f5">//</span><span style="color: #008000; background-color: #f5f5f5">--&gt;</span><span style="color: #008000; background-color: #f5f5f5"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:set </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="SESSION_LOCALE"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="#session['WW_TRANS_I18N_LOCALE']"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="locales"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="tutorial.Locales"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="&lt;s:url includeParams="</span><span style="color: #ff0000">get" encode</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">" name="langForm"&nbsp;<br />
&nbsp; &nbsp; style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;"&gt;<br />
&nbsp; &nbsp; Language: </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:select </span><span style="color: #ff0000">label</span><span style="color: #0000ff">="Language"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="#locales.locales"</span><span style="color: #ff0000"> listKey</span><span style="color: #0000ff">="value"</span><span style="color: #ff0000"> &nbsp; &nbsp;listValue</span><span style="color: #0000ff">="key"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="request_locale"</span><span style="color: #ff0000"> id</span><span style="color: #0000ff">="langSelecter"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; onchange</span><span style="color: #0000ff">="langSelecter_onChanged()"</span><span style="color: #ff0000"> theme</span><span style="color: #0000ff">="simple"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">LangSelector.jsp</span>
<p>上述代码的原理为，LangSelector.jsp先实例化一个Locales对象，并把对象的Map类型的属性locales赋予下拉列表（select） 。如此一来，下拉列表就获得可用语言的列表。大家看到LangSelector有&lt;s:form&gt;标志和一段Javascript脚本，它们的作用就是在用户在下拉列表中选择了后，提交包含&#8220;reqeust_locale&#8221;变量的表单到Action。在打开页面时，为了下拉列表的选中的当前区域，我们需要到session取得当前区域（键为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性），而该属性在没有设置语言前是为空的，所以通过值栈中locale属性来取得当前区域（用户浏览器所设置的语言）。</p>
你可以把LangSelector.jsp作为一个控件使用，方法是在JSP页面中把它包含进来，代码如下所示：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:include </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="/LangSelector.jsp"</span><span style="color: #0000ff">/&gt;</span></div>
<br />
在例1中的HellloWorld.jsp中&lt;body&gt;后加入上述代码，并在struts.xml中新建Action，代码如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="HelloWorld"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/HelloWorld.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span></div>
<br />
或者，如果你多个JSP需要实现上述功能，你可以使用下面的通用配置，而不是为每一个JSP页面都新建一个Action。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/{1}.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span></div>
<br />
分布运行程序，在浏览器的地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.action">http://localhost:8080/Struts2_i18n/HelloWorld.action</a>，出现图4所示页面：<br />
<img alt="图3 HelloWorld.action" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/r_imag3[1].gif" /><br />
<span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图3 HelloWorld.action<br />
</span><br />
在下拉列表中，选择&#8220;American English&#8221;，出现图5所示页面：<br />
<img alt="图3 HelloWorld.action" src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/r_imag4[1].gif" /><br />
<span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图4 HelloWorld.action</span><br />
<table style="border-right: #f0c000 1px solid; border-top: #f0c000 1px solid; margin-top: 8px; margin-bottom: 8px; border-left: #f0c000 1px solid; border-bottom: #f0c000 1px solid; background-color: #ffffce; text-align: left" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px"><img src="mk:@MSITStore:E:\books\编程\struts2.0中文教程.chm::/24_files/lightbulb_on[1].gif"  alt="" /></td>
            <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px; font-family: 华文仿宋">可能大家会问为什么一定要通过Action来访问页面呢？<br />
            你可以试一下不用Action而直接用JSP的地址来访问页面，结果会是无论你在下拉列表中选择什么，语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面，Struts 2.0在web.xml的配置的过滤器（Filter）就不会工作，所以拦截器链也不会工作。</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/160319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 19:56 <a href="http://www.blogjava.net/CrazyJava/articles/160319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2.0的Action讲解 </title><link>http://www.blogjava.net/CrazyJava/articles/160318.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 11:55:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160318.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160318.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160318.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有Struts 1.x经验的朋友都知道Action是Struts的核心内容，当然Struts 2.0也不例外。不过，Struts 1.x与Struts 2.0的Action模型很大的区别。                        &nbsp;            Struts 1.x            Stuts 2.0               ...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160318.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 19:55 <a href="http://www.blogjava.net/CrazyJava/articles/160318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的Struts 2.0的标志（Tag）介绍 </title><link>http://www.blogjava.net/CrazyJava/articles/160316.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 11:54:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160316.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160316.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160316.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上一篇文章《为Struts 2.0做好准备》中，我过于详细地介绍了Struts 2.0开发环境和运行环境的配置，所以，本文很少涉及的以上两方面的细节。如果，您看完《为Struts 2.0做好准备》后，还有什么不明白，或者没法运行文中例子，请联系我。我的E-MAIL：Max.M.Yuan@gmail.com。在介绍常用标志前，我想先从总体上，对Struts 1.x与Struts 2.0的标...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160316.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 19:54 <a href="http://www.blogjava.net/CrazyJava/articles/160316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为Struts 2.0做好准备</title><link>http://www.blogjava.net/CrazyJava/articles/160315.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 13 Nov 2007 11:53:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/160315.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/160315.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/160315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/160315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/160315.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts作为MVC 2的Web框架，自推出以来不断受到开发者的追捧，得到用广泛的应用。作为最成功的Web框架，Struts自然拥有众多的优点：    MVC 2模型的使用    功能齐全的标志库（Tag Library）    开放源代码 但是，所谓&#8220;金无赤金，人无完人&#8221;，Struts自身也有不少的缺点：    需要编写的代码过多，容易引...&nbsp;&nbsp;<a href='http://www.blogjava.net/CrazyJava/articles/160315.html'>阅读全文</a><img src ="http://www.blogjava.net/CrazyJava/aggbug/160315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-13 19:53 <a href="http://www.blogjava.net/CrazyJava/articles/160315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>