<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>zhangbowu</title>
    <description></description>
    <link>http://zhangbowu.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>深入Struts2的配置文件</title>
        <author>zhangbowu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangbowu.javaeye.com">zhangbowu</a>&nbsp;
          链接：<a href="http://zhangbowu.javaeye.com/blog/155405" style="color:red;">http://zhangbowu.javaeye.com/blog/155405</a>&nbsp;
          发表时间: 2008年01月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>本部分主要介绍struts.xml的常用配置。<br />1.1.&nbsp;&nbsp;&nbsp; 包配置：<br />Struts2框架中核心组件就是Action、拦截器等，Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。<br />在struts.xml文件中package元素用于定义包配置，每个package元素定义了一个包配置。它的常用属性有：<br />l name：必填属性，用来指定包的名字。<br />l extends：可选属性，用来指定该包继承其他包。继承其它包，可以继承其它包中的Action定义、拦截器定义等。<br />l namespace：可选属性，用来指定该包的命名空间。</p><p><table border="0"><tbody><tr><td>&lt;!DOCTYPE struts PUBLIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;<a href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a>&quot;&gt;<br />&lt;struts&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!-- struts2的action必须放在一个指定的包空间下定义 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;package name=&quot;default&quot; extends=&quot;struts-default&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!-- 定义处理请求URL为login.action的Action --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=&quot;login&quot; class=&quot;org.qiujy.web.struts.action.LoginAction&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 定义处理结果字符串和资源之间的映射关系 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot;&gt;/success.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;error&quot;&gt;/error.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; </td></tr></tbody></table></p><p>如上示例的配置，配置了一个名为default的包，该包下定义了一个Action。</p><p>1.2.&nbsp;&nbsp;&nbsp; 命名空间配置：<br />考虑到同一个Web应用中需要同名的Action，Struts2以命名空间的方式来管理Action，同一个命名空间不能有同名的Action。<br />Struts2通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。<br />把上示例的配置改为如下形式：<br />&lt;!DOCTYPE struts PUBLIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;<a href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a>&quot;&gt;<br />&lt;struts&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!-- struts2的action必须放在一个指定的包空间下定义 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;package name=&quot;qiujy&quot; extends=&quot;struts-default&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!-- 定义处理请求URL为login.action的Action --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=&quot;login&quot; class=&quot;org.qiujy.web.struts2.action.LoginAction&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 定义处理结果字符串和资源之间的映射关系 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot;&gt;/success.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;error&quot;&gt;/error.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/package&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;package name=&quot;my&quot; extends=&quot;struts-default&quot; namespace=&quot;/manage&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!-- 定义处理请求URL为login.action的Action --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=&quot;backLogin&quot; class=&quot;org.qiujy.web.struts2.action.LoginAction&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 定义处理结果字符串和资源之间的映射关系 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot;&gt;/success.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;error&quot;&gt;/error.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/package&gt;&lt;/struts&gt; </p><p>如上配置了两个包：default和my，配置my包时指定了该包的命名空间为/manage。<br />对于包default：没有指定namespace属性。如果某个包没有指定namespace属性，即该包使用默认的命名空间，默认的命名空间总是&quot;&quot;。<br />对于包my：指定了命名空间/manage，则该包下所有的Action处理的URL应该是&ldquo;命名空间/Action名&rdquo;。如上名为backLogin的Action，它处理的URL为：<br /><a href="http://localhost:8080/userlogin_struts2/manage/backLogin.action">http://localhost:8080/userlogin_struts2/manage/backLogin.action</a><br />Struts2的命名空间的作用等同于struts1里模块的作用。<br />1.3.&nbsp;&nbsp;&nbsp; 包含配置：<br />在Struts2中可以将一个配置文件分解成多个配置文件，那么我们必须在struts.xml中包含其他配置文件。<br />&lt;struts&gt;<br />&nbsp;&nbsp;&nbsp; &lt;include file=&quot;struts-default.xml&quot;/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;include file=&quot;struts-user.xml&quot;/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;include file=&quot;struts-book.xml&quot;/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;include file=&quot;struts-shoppingCart.xml&quot;/&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; ......<br />&nbsp;&nbsp; &lt;/struts&gt; </p><p>1.4.&nbsp;&nbsp;&nbsp; 拦截器配置：<br />见后面章节介绍。<br />1.5.&nbsp;&nbsp;&nbsp; 常量配置：<br />Struts2框架有两个核心配置文件，其中struts.xml文件主要负责管理应用中的Action映射， 及Action处理结果和物理资源之间的映射关系。除此之外，Struts2框架还包含了一个struts.properties文件，该文件主义了Struts2框架的大量常量属性。但通常推荐也是在struts.xml文件中来配置这些常量属性。<br />如：后面会讲到Struts2的国际化，它的资源文件位置就用常量属性来指定：<br />&lt;struts&gt;<br />&nbsp;&nbsp;&nbsp; ......<br />&nbsp;&nbsp;&nbsp; &lt;constant name=&quot;struts.custom.i18n.resources&quot; value=&quot;messages&quot;/&gt;<br />&lt;/struts&gt; </p><p>表示指定了资源文件的放置在classes目录下，基本名是messages，则在classes目录下您就应该放置类似messages_zh_CN.properties，message_en.properties名的文件。<br />2.&nbsp;&nbsp;&nbsp; Struts2的Action<br />2.1.&nbsp;&nbsp;&nbsp; 实现Action类：<br />Struts2中Action是核心内容，它包含了对用户请求的处理逻辑，我们也称Action为业务控制器。<br />Struts2中的Action采用了低侵入式的设计，Struts2不要求Action类继承任何的Struts2的基类或实现Struts2接口。(但是，我们为了方便实现Action，大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类，并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用接口，提供了很多默认方法，这些默认方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等，这样可以大大的简化Action的开发。)<br />Struts2中通常直接使用Action来封装HTTP请求参数，因此，Action类里还应该包含与请求参数对应的属性，并且为属性提供对应的getter和setter方法。(当然，Action类中还可以封装处理结果，把处理结果信息当作一属性，提供对应的getter和setter方法)<br />修改第一部分的用户登录示例：把Action改成如下：<br />package org.qiujy.web.struts2.action;<br />&nbsp;<br />import com.opensymphony.xwork2.ActionSupport;<br />&nbsp;<br />/**<br />&nbsp;<a href="mailto:*@authorqiujy">*@authorqiujy</a><br />&nbsp;<a href="mailto:*@version1.0">*@version1.0</a><br />&nbsp;*/<br />publicclass LoginAction extends ActionSupport{<br />&nbsp;&nbsp;&nbsp; private String userName;<br />&nbsp;&nbsp;&nbsp; private String password;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private String msg; //结果信息属性<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returnthemsg">*@returnthemsg</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getMsg() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnmsg;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@parammsgthemsgtoset">*@parammsgthemsgtoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setMsg(String msg) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.msg = msg;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returntheuserName">*@returntheuserName</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getUserName() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnuserName;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@paramuserNametheuserNametoset">*@paramuserNametheuserNametoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setUserName(String userName) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.userName = userName;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returnthepassword">*@returnthepassword</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getPassword() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnpassword;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@parampasswordthepasswordtoset">*@parampasswordthepasswordtoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setPassword(String password) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.password = password;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; *处理用户请求的excute()方法<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@return">*@return</a>结果导航字符串<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@throwsException">*@throwsException</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String execute() throws Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&quot;test&quot;.equals(this.userName) &amp;&amp; <br />&quot;test&quot;.equals(this.password)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;登录成功，欢迎&quot; + this.userName;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.SUCCESS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;登录失败，用户名或密码错&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.ERROR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />} </p><p>往success.jsp和error.jsp页面中添加&nbsp; EL表达式来显示结果信息。则最终效果跟以前一样。<br />2.2.&nbsp;&nbsp;&nbsp; Action访问Servlet API：<br />Struts2中的Action并没有和任何Servlet API耦合，这样框架更具灵活性，更易测试。<br />但是，对于web应用的控制器而言，不访问Servlet API几乎是不可能的，例如跟踪HTTP Session状态等。Struts2框架提供了一种更轻松的方式来访问Servlet API。Struts2中提供了一个ActionContext类(当前Action的上下文对象)，通过这个类可以访问Servlet API。下面是该类中提供的几个常用方法：<br />l public static ActionContext getContext() ：获得当前Action的ActionContext实例。<br />l public Object get(Object key) ：此方法类似于调用HttpServletRequest的getAttribute(String name)方法。<br />l public void put(Object key, Object value) ：此方法类似于调用HttpServletRequest 的setAttribute(String name, Object o)。<br />l public Map getParameters() ：获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap() 方法。<br />l public Map getSession() ：返回一个Map对象，该Map对象模拟了HttpSession实例。<br />l public void setSession(Map session) ： 直接传入一个Map实例，将该Map实例里的key-value对转换成session的属性名－属性值对。<br />l public Map getApplication() ：返回一个Map对象，该对象模拟了该应用的ServletContext实例。<br />l public void setApplication(Map application) ：直接传入一个Map实例，将该Map实例里的key-value对转换成application的属性名－属性值对。<br />修改以上用户登录验证示例的Action类中的execute方法：<br />public String execute() throws Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&quot;test&quot;.equals(this.userName) &amp;&amp; &quot;test&quot;.equals(this.password)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;登录成功，欢迎&quot; + this.userName;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取ActionContext实例，通过它来访问Servlet API<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionContext context = ActionContext.getContext();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //看session中是否已经存放了用户名，如果存放了：说明已经登录了；<br />//否则说明是第一次登录成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(null != context.getSession().get(&quot;uName&quot;)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = this.userName + &quot;：你已经登录过了!!!&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.getSession().put(&quot;uName&quot;, this.userName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.SUCCESS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;登录失败，用户名或密码错&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.ERROR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; } </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Struts2中通过ActionContext来访问Servlet API，让Action彻底从Servlet API 中分离出来，最大的好处就是可以脱离Web容器测试Action。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，Struts2中还提供了一个ServletActionContext类，Action只要继承自该类，就可以直接访问Servlet API。具体方法参看struts2的API文档。<br />3.&nbsp;&nbsp;&nbsp; 一个Action内包含多个请求处理方法的处理<br />Struts1提供了DispatchAction，从而允许一个Action内包含多个请求处理方法。Struts2也提供了类似的功能。处理方式主要有以下三种方式：<br />3.1.&nbsp;&nbsp;&nbsp; 动态方法调用：<br />DMI：Dynamic Method Invocation 动态方法调用。<br />动态方法调用是指：表单元素的action不直接等于某个Action的名字，而是以如下形式来指定对应的动作名：<br />&lt;form method=&quot;post&quot; action=&quot;userOpt!login.action&quot;&gt; </p><p>则用户的请求将提交到名为&rdquo;userOpt&rdquo;的Action实例，Action实例将调用名为&rdquo;login&rdquo;方法来处理请求。同时login方法的签名也是跟execute()一样，即为public String login() throws Exception。<br />注意：要使用动态方法调用，必须设置Struts2允许动态方法调用，通过设置struts.enable.DynamicMethodInvocation常量来完成，该常量属性的默认值是true。<br />3.1.1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例：<br />修改用户登录验证示例，多增加一个注册用户功能。<br />1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改Action类：<br />package org.qiujy.web.struts2.action;<br />&nbsp;<br />import com.opensymphony.xwork2.ActionContext;<br />import com.opensymphony.xwork2.ActionSupport;<br />&nbsp;<br />/**<br />&nbsp;<a href="mailto:*@authorqiujy">*@authorqiujy</a><br />&nbsp;<a href="mailto:*@version1.0">*@version1.0</a><br />&nbsp;*/<br />publicclass LoginAction extends ActionSupport{<br />&nbsp;&nbsp;&nbsp; private String userName;<br />&nbsp;&nbsp;&nbsp; private String password;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private String msg; //结果信息属性<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returnthemsg">*@returnthemsg</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getMsg() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnmsg;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@parammsgthemsgtoset">*@parammsgthemsgtoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setMsg(String msg) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.msg = msg;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returntheuserName">*@returntheuserName</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getUserName() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnuserName;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@paramuserNametheuserNametoset">*@paramuserNametheuserNametoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setUserName(String userName) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.userName = userName;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returnthepassword">*@returnthepassword</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getPassword() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnpassword;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@parampasswordthepasswordtoset">*@parampasswordthepasswordtoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setPassword(String password) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.password = password;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; *处理用户请求的login()方法<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@return">*@return</a>结果导航字符串<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@throwsException">*@throwsException</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String login() throws Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&quot;test&quot;.equals(this.userName) &amp;&amp; &quot;test&quot;.equals(this.password)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;登录成功，欢迎&quot; + this.userName;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取ActionContext实例，通过它来访问Servlet API<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionContext context = ActionContext.getContext();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //看session中是否已经存放了用户名，如果存放了：说明已经登录了；<br />//否则说明是第一次登录成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(null != context.getSession().get(&quot;uName&quot;)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = this.userName + &quot;：你已经登录过了!!!&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.getSession().put(&quot;uName&quot;, this.userName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.SUCCESS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;登录失败，用户名或密码错&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.ERROR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public String regist() throws Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将用户名，密码添加到数据库中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;注册成功。&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.SUCCESS;<br />&nbsp;&nbsp;&nbsp; }<br />}<br />&nbsp; </p><p>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts.xml文件：没有什么变化，跟以前一样配置<br />&lt;!DOCTYPE struts PUBLIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;<a href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a>&quot;&gt;<br />&lt;struts&gt;<br />&nbsp;&nbsp;&nbsp; &lt;package name=&quot;my&quot; extends=&quot;struts-default&quot; namespace=&quot;/manage&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!-- 定义处理请求URL为login.action的Action --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=&quot;userOpt&quot; class=&quot;org.qiujy.web.struts2.action.LoginAction&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 定义处理结果字符串和资源之间的映射关系 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot;&gt;/success.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;error&quot;&gt;/error.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>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 页面：<br />index.jsp<br />&lt;%@ page language=&quot;java&quot; pageEncoding=&quot;UTF-8&quot;%&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;用户登录页面&lt;/title&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;<br />&nbsp;&lt;body&gt;<br />&nbsp; &lt;h2&gt;用户入口&lt;/h2&gt;<br />&nbsp; &lt;hr&gt;<br />&nbsp;&nbsp;&nbsp; &lt;form action=&quot;manage/userOpt!login.action&quot; method=&quot;post&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;table border=&quot;1&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;用户名：&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;userName&quot;/&gt;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;密码：&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type=&quot;password&quot; name=&quot;password&quot;/&gt;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td colspan=&quot;2&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;submit&quot; value=&quot; 确定 &quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/html&gt; </p><p>regist.jsp<br />&lt;%@ page language=&quot;java&quot; pageEncoding=&quot;UTF-8&quot;%&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;用户注册页面&lt;/title&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;<br />&nbsp;&lt;body&gt;<br />&nbsp; &lt;h2&gt;用户注册&lt;/h2&gt;<br />&nbsp; &lt;hr&gt;<br />&nbsp;&nbsp;&nbsp; &lt;form action=&quot;manage/userOpt!regist.action&quot; method=&quot;post&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;table border=&quot;1&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;用户名：&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;userName&quot;/&gt;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;密码：&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type=&quot;password&quot; name=&quot;password&quot;/&gt;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td colspan=&quot;2&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;submit&quot; value=&quot; 注册 &quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/html&gt; </p><p>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行结果：</p><p>&nbsp;</p><p><br />3.2.&nbsp;&nbsp;&nbsp; 为Action配置method属性：<br />将Action类中的每一个处理方法都定义成一个逻辑Action方法。<br />&lt;!DOCTYPE struts PUBLIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;<a href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a>&quot;&gt;<br />&lt;struts&gt;<br />&nbsp;&nbsp;&nbsp; &lt;package name=&quot;my&quot; extends=&quot;struts-default&quot; namespace=&quot;/manage&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=&quot;userLogin&quot; class=&quot;org.qiujy.web.struts2.action.LoginAction&quot; method=&quot;login&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot;&gt;/success.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;error&quot;&gt;/error.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=&quot;userRegist&quot; class=&quot;org.qiujy.web.struts2.action.LoginAction&quot; method=&quot;regist&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot;&gt;/success.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;error&quot;&gt;/error.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>如上，把LoginAction中的login和regist方法都配置成逻辑Action。要调用login方法，则相应的把index.jsp中表单元素的action设置为&quot;manage/userLogin.action&quot;；要调用regist方法，把regist.jsp中表单元素的action设置为&quot;manage/userRegist.action&quot;。<br />3.3.&nbsp;&nbsp;&nbsp; 使用通配符映射(wildcard mappings)方式：<br />在struts.xml文件中配置&lt;action&hellip;&gt;元素时，它的name、class、method属性都可支持通配符，这种通配符的方式是另一种形式的动态方法调用。<br />当我们使用通配符定义Action的name属性时，相当于用一个元素action定义了多个逻辑Action：<br />&lt;action name=&quot;user_*&quot; <br />class=&quot;org.qiujy.web.struts2.action.UserAction&quot; method=&quot;{1}&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot;&gt;/success.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;error&quot;&gt;/error.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt; </p><p>如上，&lt;action name=&rdquo;user_*&rdquo;&gt;定义一系列请求URL是user_*.action模式的逻辑Action。同时method属性值为一个表达式{1}，表示它的值是name属性值中第一个*的值。例如：用户请求URL为user_login.action时，将调用到UserAction类的login方法；用户请求URL为user_regist.action时，将调用到UserAction类的regist方法。<br />4.&nbsp;&nbsp;&nbsp; 处理结果<br />Struts2的Action处理完用户请求后，将返回一个普通字符串，整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图资源之间的映射关系，一旦系统收到Action返回的某个逻辑视图名，系统就会把对应的物理视图资源呈现给浏览者。<br />4.1.&nbsp;&nbsp;&nbsp; 配置处理结果：<br />Struts2的Action处理用户请求结束后，返回一个普通字符串－逻辑视图名，必须在struts.xml文件中完成逻辑视图和物理视图资源的映射，才可让系统转到实际的视图资源。<br />Struts2通过在struts.xml文件中使用&lt;result &hellip;/&gt;元素来配置结果。Struts2提供了两种结果。<br />l 局部结果：将&lt;result &hellip;/&gt;作为&lt;action &hellip;&gt;元素的子元素配置。<br />l 全局结果：将&lt;result &hellip;/&gt;作为&lt;global-results &hellip;&gt;元素的子元素配置。<br />在package元素中配置&lt;global-results&gt;子元素：<br />&lt;global-results&gt;<br />&nbsp;&lt;result name=&quot;error&quot;&gt;/Error.jsp&lt;/result&gt;<br />&nbsp;&lt;result name=&quot;invalid.token&quot;&gt;/Error.jsp&lt;/result&gt;<br />&nbsp;&lt;result name=&quot;login&quot; type=&quot;redirect-action&quot;&gt;Logon!input&lt;/result&gt;<br />&lt;/global-results&gt; </p><p>4.2.&nbsp;&nbsp;&nbsp; 处理结果类型：<br />Struts2提供了对不同种类返回结果的支持，常见的有JSP，FreeMarker，Velocity等。<br />Struts2支持的不同类型的返回结果为：<br />名字 说明 <br />chain 用来处理Action链 <br />dispatcher 用来转向页面，通常处理JSP，这是默认的结果类型 <br />freeMarker 处理FreeMarker模板 <br />httpHeader 用来控制特殊的Http行为 <br />redirect 重定向到一个URL <br />redirect-action 重定向到一个Action <br />stream 向浏览器发送InputSream对象，通常用来处理文件下载 <br />velocity 处理Velocity模板 <br />xslt 处理XML/XLST模板 <br />plaintext 显示原始文件内容，例如文件源代码 <br />tiles 结合Tile使用 </p><p>另外第三方的Result类型还包括JasperReports Plugin，专门用来处理JasperReport类型的报表输出；Jfreechart Plugin；JSF Plugin。<br />4.3.&nbsp;&nbsp;&nbsp; 动态返回结果<br />有些时候，只有当Action执行完毕的时候我们才知道要返回哪个结果，这个时候我们可以在Action内部定义一个属性，这个属性用来存储Action执行完毕之后的result值，例如：<br />private String nextAction;<br />&nbsp;<br />public String getNextAction() {<br />&nbsp;&nbsp;&nbsp; return nextAction;<br />} </p><p>在strutx.xml配置文件中，我们可以使用来引用到Action中的属性，通过表示的内容来动态的返回结果，例如：<br />&lt;action name=&quot;fragment&quot; class=&quot;FragmentAction&quot;&gt;<br />&nbsp;&lt;result name=&quot;next&quot; type=&quot;redirect-action&quot;&gt;&lt;/result&gt;<br />&lt;/action&gt;<br />&nbsp; </p><p>上述Action的execute方法返回next的时候，还需要根据nextAction的属性来判断具体定位到哪个Action。<br />5.&nbsp;&nbsp;&nbsp; 属性驱动和模型驱动<br />不管属性驱动还是模型驱动，Struts2框架都是通过拦截器负责提取请求参数，并将请求数据封装到相应的Action实例的属性或专门的模型的属性。<br />5.1.&nbsp;&nbsp;&nbsp; 属性驱动：<br />属性驱动就是属性(property)作为贯穿MVC流程的信息携带者。简单的说，就是使用Action实例来封装请求参数和处理结果信息。前面我们做的示例都属于属性驱动模式。<br />5.2.&nbsp;&nbsp;&nbsp; 模型驱动：<br />模型驱动就是使用单独的javaBean作为贯穿整个MVC流程的信息携带者。也就是说，使用单独的VO(值对象)来封装请求参数和处理结果信息。<br />示例：继续修改用户登录验证：<br />1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 新增一用户域模型对象：User.java<br />package org.qiujy.domain;<br />&nbsp;<br />publicclass User {<br />&nbsp;&nbsp;&nbsp; private String userName;<br />&nbsp;&nbsp;&nbsp; private String password;<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returntheuserName">*@returntheuserName</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getUserName() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnuserName;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@paramuserNametheuserNametoset">*@paramuserNametheuserNametoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setUserName(String userName) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.userName = userName;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returnthepassword">*@returnthepassword</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getPassword() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnpassword;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@parampasswordthepasswordtoset">*@parampasswordthepasswordtoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setPassword(String password) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.password = password;<br />&nbsp;&nbsp;&nbsp; }<br />} </p><p><br />2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 业务控制器：UserAction.java<br />package org.qiujy.web.struts2.action;<br />&nbsp;<br />import org.qiujy.domain.User;<br />import com.opensymphony.xwork2.ActionContext;<br />import com.opensymphony.xwork2.ActionSupport;<br />&nbsp;<br />publicclass UserAction extends ActionSupport{<br />&nbsp;&nbsp;&nbsp; //定义用于封装请求参数的模型对象<br />&nbsp;&nbsp;&nbsp; private User user = new User();<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private String msg; //结果信息属性<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returntheuser">*@returntheuser</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public User getUser() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnuser;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@paramusertheusertoset">*@paramusertheusertoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setUser(User user) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.user = user;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@returnthemsg">*@returnthemsg</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getMsg() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnmsg;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@parammsgthemsgtoset">*@parammsgthemsgtoset</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; publicvoid setMsg(String msg) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.msg = msg;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; *处理用户请求的login()方法<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@return">*@return</a>结果导航字符串<br />&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:*@throwsException">*@throwsException</a><br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String login() throws Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String userName = user.getUserName();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String password = user.getPassword();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&quot;test&quot;.equals(userName) &amp;&amp; &quot;test&quot;.equals(password)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;登录成功，欢迎&quot; + userName;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取ActionContext实例，通过它来访问Servlet API<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionContext context = ActionContext.getContext();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //看session中是否已经存放了用户名，如果存放了：说明已经登录了；否则说明是第一次登录成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(null != context.getSession().get(&quot;uName&quot;)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = userName + &quot;：你已经登录过了!!!&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.getSession().put(&quot;uName&quot;, userName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.SUCCESS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;登录失败，用户名或密码错&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.ERROR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public String regist() throws Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将用户名，密码添加到数据库中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = &quot;注册成功。&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnthis.SUCCESS;<br />&nbsp;&nbsp;&nbsp; }<br />} </p><p><br />3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置文件：struts.xml<br />&lt;!DOCTYPE struts PUBLIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;<a href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a>&quot;&gt;<br />&lt;struts&gt;<br />&nbsp;&nbsp;&nbsp; &lt;package name=&quot;my&quot; extends=&quot;struts-default&quot; namespace=&quot;/manage&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=&quot;userOpt&quot; class=&quot;org.qiujy.web.struts2.action.UserAction&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot;&gt;/success.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;error&quot;&gt;/error.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><br />4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 页面：<br />index.jsp<br />&lt;%@ page language=&quot;java&quot; pageEncoding=&quot;UTF-8&quot;%&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;用户登录页面&lt;/title&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;<br />&nbsp;&lt;body&gt;<br />&nbsp; &lt;h2&gt;用户入口&lt;/h2&gt;<br />&nbsp; &lt;hr&gt;<br />&nbsp;&nbsp;&nbsp; &lt;form action=&quot;manage/userOpt!login.action&quot; method=&quot;post&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;table border=&quot;1&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;用户名：&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;user.userName&quot;/&gt;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;密码：&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type=&quot;password&quot; name=&quot;user.password&quot;/&gt;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td colspan=&quot;2&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;submit&quot; value=&quot; 确定 &quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/html&gt; </p><p>其它页面略。<br />5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行效果：同以前一样。<br />6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 源代码：<br />6.&nbsp;&nbsp;&nbsp; Struts2的异常处理机制：<br />任何成熟的MVC框架都应该提供成就的异常处理机制。Strut2也不例外。Struts2提供了一种声明式的异常处理方式。Struts2也是通过配置的拦截器来实现异常处理机制的。<br />Struts2的异常处理机制通过在struts.xml文件中配置&lt;exception-mapping &hellip;&gt;元素完成的，配置该元素时，需要指定两个属性：<br />exception：此属性指定该异常映射所设置的异常类型。<br />result：此属性指定Action出现该异常时，系统转入result属性所指向的结果。<br />6.1.&nbsp;&nbsp;&nbsp; 异常映射也分为两种：<br />l 局部异常映射：&lt;exception-mapping&hellip;&gt;元素作为&lt;action&hellip;&gt;元素的子元素配置。<br />l 全局异常映射：&lt;exception-mapping&hellip;&gt;元素作为&lt;global-exception-mappings&gt;元素的子元素配置。<br />6.2.&nbsp;&nbsp;&nbsp; 输出异常信息：<br />使用Struts2的标签来输出异常信息：<br />l &lt;s:property value=&quot;exception.message&quot;/&gt; ： 输出异常对象本身。<br />l &lt;s:property value=&quot;exceptionStack&quot;/&gt; ： 输出异常堆栈信息。<br />6.3.&nbsp;&nbsp;&nbsp; 示例：<br />还是修改用户登录示例：<br />1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把UserAciton.java中的regist方法改成：<br />public String regist() throws Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将用户名，密码添加到数据库中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //msg = &quot;注册成功。&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(true){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new java.sql.SQLException(&quot;没有数据库驱动程序&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.SUCCESS;<br />&nbsp;&nbsp;&nbsp; } </p><p><br />2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改struts.xml文件：<br />&lt;!DOCTYPE struts PUBLIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;<a href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a>&quot;&gt;<br />&lt;struts&gt;<br />&nbsp;&nbsp;&nbsp; &lt;package name=&quot;my&quot; extends=&quot;struts-default&quot; namespace=&quot;/manage&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 定义全局处理结果 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;global-results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 逻辑名为sql的结果，映射到/exception.jsp页面 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;sql&quot;&gt;/exception.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/global-results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;global-exception-mappings&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 当Action抛出SQLException异常时，转入名为sql的结果 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exception-mapping exception=&quot;java.sql.SQLException&quot; result=&quot;sql&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/global-exception-mappings&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=&quot;userOpt&quot; class=&quot;org.qiujy.web.struts2.action.UserAction&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot;&gt;/success.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;error&quot;&gt;/error.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><br />3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 新增一页面：exception.jsp<br />&lt;%@ page language=&quot;java&quot; pageEncoding=&quot;utf-8&quot;%&gt;<br />&lt;%@ taglib uri=&quot;/struts-tags&quot; prefix=&quot;s&quot; %&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;异常信息&lt;/title&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;<br />&nbsp;&lt;body&gt;<br />&nbsp;&lt;h2&gt;<br />&nbsp;出现异常啦<br />&nbsp;&lt;/h2&gt;<br />&nbsp;&lt;hr/&gt;<br />&nbsp;&nbsp; &lt;h3 style=&quot;color:red&quot;&gt;<br />&nbsp;&nbsp; &lt;!-- 获得异常对象 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;s:property value=&quot;exception.message&quot;/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/h3&gt;<br />&nbsp;&nbsp;&nbsp; &lt;br/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!-- 异常堆栈信息 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;s:property value=&quot;exceptionStack&quot;/&gt;<br />&lt;/html&gt; </p><p><br />4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行regist.jsp进行调试：</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>本文来源：<a href="http://www.java3z.com/">http://www.java3z.com/</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://zhangbowu.javaeye.com/blog/155405#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Jan 2008 15:10:19 +0800</pubDate>
        <link>http://zhangbowu.javaeye.com/blog/155405</link>
        <guid>http://zhangbowu.javaeye.com/blog/155405</guid>
      </item>
      <item>
        <title>struts2.0中struts.xml配置文件</title>
        <author>zhangbowu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangbowu.javaeye.com">zhangbowu</a>&nbsp;
          链接：<a href="http://zhangbowu.javaeye.com/blog/155404" style="color:red;">http://zhangbowu.javaeye.com/blog/155404</a>&nbsp;
          发表时间: 2008年01月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&lt;!DOCTYPE struts PUBLIC &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot; &quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot; &gt;<br />&lt;struts&gt;</p><p>&nbsp; &lt;!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;include file=&quot;struts-default.xml&quot;&gt;&lt;/include&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;!-- package提供了将多个Action组织为一个模块的方式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; package的名字必须是唯一的 package可以扩展 当一个package扩展自<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另一个package时该package会在本身配置的基础上加入扩展的package<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的配置 父package必须在子package前配置 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name：package名称<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extends:继承的父package名称<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace:定义package命名空间 该命名空间影响到url的地址，例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action<br />&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;package name=&quot;com.kay.struts2&quot; extends=&quot;struts-default&quot; namespace=&quot;/test&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptors&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 定义拦截器 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name:拦截器名称<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class:拦截器类路径<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name=&quot;timer&quot; class=&quot;com.kay.timer&quot;&gt;&lt;/interceptor&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name=&quot;logger&quot; class=&quot;com.kay.logger&quot;&gt;&lt;/interceptor&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 定义拦截器栈 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name=&quot;mystack&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name=&quot;timer&quot;&gt;&lt;/interceptor-ref&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name=&quot;logger&quot;&gt;&lt;/interceptor-ref&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptors&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 定义默认的拦截器 每个Action都会自动引用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果Action中引用了其它的拦截器 默认的拦截器将无效 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;default-interceptor-ref name=&quot;mystack&quot;&gt;&lt;/default-interceptor-ref&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 全局results配置 --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;global-results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;input&quot;&gt;/error.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/global-results&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name：action名称<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class: 对应的类的路径<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method: 调用Action中的方法名<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name=&quot;hello&quot; class=&quot;com.kay.struts2.Action.LoginAction&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 引用拦截器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name:拦截器名称或拦截器栈名称<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name=&quot;timer&quot;&gt;&lt;/interceptor-ref&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 节点配置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name : result名称 和Action中返回的值相同<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt;/talk.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 参数设置 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name：对应Action中的get/set方法 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name=&quot;url&quot;&gt;http://www.sina.com&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/package&gt;<br />&lt;/struts&gt;</p>
          <br/>
          <span style="color:red;">
            <a href="http://zhangbowu.javaeye.com/blog/155404#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Jan 2008 14:49:59 +0800</pubDate>
        <link>http://zhangbowu.javaeye.com/blog/155404</link>
        <guid>http://zhangbowu.javaeye.com/blog/155404</guid>
      </item>
      <item>
        <title>struts20入门实例</title>
        <author>zhangbowu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangbowu.javaeye.com">zhangbowu</a>&nbsp;
          链接：<a href="http://zhangbowu.javaeye.com/blog/155388" style="color:red;">http://zhangbowu.javaeye.com/blog/155388</a>&nbsp;
          发表时间: 2008年01月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天无事，对STRUTS20学习，顺便做了个例子，做的不好，请见谅。</p><p>1、用户登录</p><p>2、文件上传</p><p>（使用struts的拦截器对上传的文件类型、大小进行限制。有个问题是，拦截器在文件上传完成后才起作用。）</p>
          <br/>
          <span style="color:red;">
            <a href="http://zhangbowu.javaeye.com/blog/155388#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Jan 2008 12:20:08 +0800</pubDate>
        <link>http://zhangbowu.javaeye.com/blog/155388</link>
        <guid>http://zhangbowu.javaeye.com/blog/155388</guid>
      </item>
      <item>
        <title>JS的正则表达式</title>
        <author>zhangbowu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangbowu.javaeye.com">zhangbowu</a>&nbsp;
          链接：<a href="http://zhangbowu.javaeye.com/blog/44246" style="color:red;">http://zhangbowu.javaeye.com/blog/44246</a>&nbsp;
          发表时间: 2007年01月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
    <li>//校验是否全由数字组成 </li>
</ul>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;isDigit(s) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>var&nbsp;patrn=/^[</span><span class="number">0</span><span>-</span><span class="number">9</span><span>]{</span><span class="number">1</span><span>,</span><span class="number">20</span><span>}$/; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
<p class=""><span>//校验登录名：只能输入5-20个以字母开头、可带数字、&ldquo;_&rdquo;、&ldquo;.&rdquo;的字串 </span></p>
<span>
<ol>
    <li class="alt"><span><span>function&nbsp;isRegisterUserName(s) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>var&nbsp;patrn=/^[a-zA-Z]{</span><span class="number">1</span><span>}([a-zA-Z0-</span><span class="number">9</span><span>]|[._]){</span><span class="number">4</span><span>,</span><span class="number">19</span><span>}$/; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
<p class=""><span>//校验用户姓名：只能输入1-30个以字母开头的字串</span></p>
<span>
<ol>
    <li class="alt"><span><span>function&nbsp;isTrueName(s) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>var&nbsp;patrn=/^[a-zA-Z]{</span><span class="number">1</span><span>,</span><span class="number">30</span><span>}$/; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}} &nbsp;&nbsp;</span> </li>
</ol>
<p class="">&nbsp;</p>
<li class="alt"><span></span><span class="comment">//校验密码：只能输入6-20个字母、数字、下划线 </span><span>&nbsp;&nbsp;</span>
<p class=""><span>&nbsp;&nbsp;&nbsp; function&nbsp;isPasswd(s) &nbsp;&nbsp;</span></p>
<ol>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>var&nbsp;patrn=/^(\w){</span><span class="number">6</span><span>,</span><span class="number">20</span><span>}$/; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>}</span> </li>
</ol>
<p class=""><span>//校验普通电话、传真号码：可以&ldquo;+&rdquo;开头，除数字外，可含有&ldquo;-&rdquo;</span></p>
<span>
<ol>
    <li class="alt"><span><span>function&nbsp;isTel(s) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//var&nbsp;patrn=/^[+]{0,1}(\d){1,3}[&nbsp;]?([-]?(\d){1,12})+$/; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>var&nbsp;patrn=/^[+]{</span><span class="number">0</span><span>,</span><span class="number">1</span><span>}(\d){</span><span class="number">1</span><span>,</span><span class="number">3</span><span>}[&nbsp;]?([-]?((\d)|[&nbsp;]){</span><span class="number">1</span><span>,</span><span class="number">12</span><span>})+$/; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
<p class="alt"><span><font face="Arial">//确认删除用法:</font></span></p>
<p class="alt"><span><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BtnDel.Attributes.Add(&quot;onclick&quot;,&quot;return confirm('&quot;+&quot;确认删除?&quot;+&quot;')&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linktempDelete.Attributes[&quot;onclick&quot;]=&quot;javascript:return&nbsp; confirm('&quot;+&quot;确认删除?&quot;+&quot;');&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void grdProject_ItemDataBound(object sender, DataGridItemEventArgs e)<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if ((e.Item.ItemType == ListItemType.Item) | (e.Item.ItemType == ListItemType.AlternatingItem))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp; // 刪除按鈕上的提示部分<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; e.Item.Cells[10].Attributes.Add(&quot;onclick&quot;, &quot;return confirm('确定删除吗？');&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;</font></span></p>
</span><span><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;<br />
//控制输入，非法字符不能输入到TextBox.</font></span><span><font face="Arial"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<asp:textbox class="Text"></asp:textbox>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onkeypress=&quot;if (event.keyCode &lt; 48 || event.keyCode &gt;57) event.returnValue = false;&quot;&nbsp;&nbsp;&nbsp;&nbsp;id=&quot;txtY_Revenue&quot; style=&quot;TEXT-ALIGN: right&quot; runat=&quot;server&quot; Width=&quot;90%&quot; MaxLength=&quot;12&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
说明： 此方法控制TextBox只收数字：0~9 , 也自可以定义其它可输入字符,如改成: 65~123,只允许输入: a~z和A~Z 等.</font></span> </li>
</span></span>
          <br/>
          <span style="color:red;">
            <a href="http://zhangbowu.javaeye.com/blog/44246#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Jan 2007 17:17:11 +0800</pubDate>
        <link>http://zhangbowu.javaeye.com/blog/44246</link>
        <guid>http://zhangbowu.javaeye.com/blog/44246</guid>
      </item>
  </channel>
</rss>