struts2入门学习

来源:互联网 发布:淘宝企业店铺子账号 编辑:程序博客网 时间:2024/06/07 00:27

        <div class="markdown_views"><h1 id="如何搭建struts2项目"><a name="t0"></a>如何搭建Struts2项目</h1>



<h2 id="导入相关架包"><a name="t1"></a>导入相关架包</h2>



<h2 id="编写webxml配置strus2过滤器"><a name="t2"></a>编写web.xml,配置strus2过滤器</h2>



<pre class="prettyprint" name="code"><code class="hljs vbscript has-numbering">    &lt;<span class="hljs-built_in">filter</span>&gt;
        &lt;<span class="hljs-built_in">filter</span>-name&gt;struts2&lt;/<span class="hljs-built_in">filter</span>-name&gt;
        &lt;<span class="hljs-built_in">filter</span>-<span class="hljs-keyword">class</span>&gt;org.apache.struts2.dispatcher.ng.<span class="hljs-built_in">filter</span>.StrutsPrepareAndExecuteFilter&lt;/<span class="hljs-built_in">filter</span>-<span class="hljs-keyword">class</span>&gt;
    &lt;/<span class="hljs-built_in">filter</span>&gt;

    &lt;<span class="hljs-built_in">filter</span>-mapping&gt;
        &lt;<span class="hljs-built_in">filter</span>-name&gt;struts2&lt;/<span class="hljs-built_in">filter</span>-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/<span class="hljs-built_in">filter</span>-mapping&gt;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul></pre>



<h2 id="编写struts2配置文件strutsxml"><a name="t3"></a>编写Struts2配置文件struts.xml</h2>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering">    <span class="hljs-pi">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
    <span class="hljs-doctype">&lt;!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd"&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">struts</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">package</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"default"</span> <span class="hljs-attribute">namespace</span>=<span class="hljs-value">"/user"</span> <span class="hljs-attribute">extends</span>=<span class="hljs-value">"struts-default"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">action</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"regist"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"cn.itcast.action.RegistAction"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">result</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"input"</span>&gt;</span>/success.jsp<span class="hljs-tag">&lt;/<span class="hljs-title">result</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">action</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">package</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">struts</span>&gt;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul></pre>

<p>访问路径 /user/regist.action <br>
name 包名称,在struts2的配置文件文件中 包名不能重复 ,name并不是真正包名,只是为了管理Action  <br>
namespace 和 action的name属性,决定 Action的访问路径  (以/开始 ) <br>
extends 继承哪个包,通常开发中继承 struts-default 包 (struts-default包在 struts-default.xml定义 ) <br>
继承struts-default包后,可以使用 包中定义拦截器和结果类型  <br>
action元素配置默认值  <br>
package 的namespace 默认值‘’‘’  <br>
action 的class 默认值 ActionSupport 类  <br>
result 的 name 默认值 success</p>



<h1 id="默认action-和-action的默认处理类"><a name="t4"></a>默认Action 和 Action的默认处理类</h1>

<p>1) 默认Action , 解决客户端访问Action不存在的问题 ,客户端访问Action, Action找不到,默认Action 就会执行  <br>
    </p>

<p>2) 默认处理类 ,客户端访问Action,已经找到匹配元素,但是元素没有class属性,执行默认处理类  <br>
     <br>
    * 在struts-default.xml 配置默认处理类 ActionSupport</p>



<h1 id="struts2的常量配置"><a name="t5"></a>Struts2的常量配置</h1>

<p>1) struts2 默认常量 在 default.properties 中配置  <br>
2) 开发者自定义常量 </p>



<pre class="prettyprint" name="code"><code class="hljs livecodeserver has-numbering">    struts.xml
        格式 : &lt;<span class="hljs-built_in">constant</span> name=<span class="hljs-string">"struts.devMode"</span> <span class="hljs-built_in">value</span>=<span class="hljs-string">"true"</span> /&gt;
    struts.properties
        格式 : struts.devMode = <span class="hljs-constant">true</span>
    web.xml
        格式 :
        &lt;<span class="hljs-built_in">filter</span>&gt;
            &lt;<span class="hljs-built_in">filter</span>-name&gt;struts2&lt;/<span class="hljs-built_in">filter</span>-name&gt;
            &lt;<span class="hljs-built_in">filter</span>-class&gt;org.apache.struts2.dispatcher.ng.<span class="hljs-built_in">filter</span>.StrutsPrepareAndExecuteFilter&lt;/<span class="hljs-built_in">filter</span>-class&gt;
            &lt;init-<span class="hljs-built_in">param</span>&gt;
                &lt;<span class="hljs-built_in">param</span>-name&gt;struts.devMode&lt;/<span class="hljs-built_in">param</span>-name&gt;
                &lt;<span class="hljs-built_in">param</span>-<span class="hljs-built_in">value</span>&gt;<span class="hljs-constant">true</span>&lt;/<span class="hljs-built_in">param</span>-<span class="hljs-built_in">value</span>&gt;
            &lt;/init-<span class="hljs-built_in">param</span>&gt;
        &lt;/<span class="hljs-built_in">filter</span>&gt;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul></pre>

<p>3) 常用常量</p>

<pre><code>&lt;constant name="struts.i18n.encoding" value="UTF-8"/&gt;  ----- 相当于request.setCharacterEncoding("UTF-8"); 解决post请求乱码
&lt;constant name="struts.action.extension" value="action"/&gt;  --- 访问struts2框架Action访问路径 扩展名 (要求)
struts.action.extension=action, 默认以.action结尾扩展名 和 不写扩展名 都会分发给 Action
&lt;constant name="struts.serve.static.browserCache" value="false"/&gt; false不缓存,true浏览器会缓存静态内容,产品环境设置true、开发环境设置false
&lt;constant name="struts.devMode" value="true" /&gt;  提供详细报错页面,修改struts.xml后不需要重启服务器
</code></pre>



<h1 id="action"><a name="t6"></a>Action</h1>



<h2 id="action书写的的三种格式"><a name="t7"></a>Action书写的的三种格式</h2>



<h3 id="第一种"><a name="t8"></a>第一种</h3>

<p>Action可以是 POJO  ((PlainOldJavaObjects)简单的<a href="http://lib.csdn.net/base/javase" class="replace_word" title="Java SE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>对象) —- 不需要继承任何父类,实现任何接口 <br>
    * struts2框架 读取struts.xml 获得 完整Action类名  <br>
    * obj = Class.forName(“完整类名”).newInstance(); <br>
    * Method m = Class.forName(“完整类名”).getMethod(“execute”);  m.invoke(obj); 通过反射 执行 execute方法</p>



<h3 id="第二种"><a name="t9"></a>第二种</h3>

<p>编写Action 实现Action接口  <br>
    Action接口中,定义默认五种 逻辑视图名称  <br>
    public static final String SUCCESS = “success”;  // 数据处理成功 (成功页面) <br>
    public static final String NONE = “none”;  // 页面不跳转  return null; 效果一样 <br>
    public static final String ERROR = “error”;  // 数据处理发送错误 (错误页面) <br>
    public static final String INPUT = “input”; // 用户输入数据有误,通常用于表单数据校验 (输入页面) <br>
    public static final String LOGIN = “login”; // 主要权限认证 (登陆页面) <br>
     五种逻辑视图,解决Action处理数据后,跳转页面  </p>



<h3 id="第三种"><a name="t10"></a>第三种</h3>

<p>编写Action  继承ActionSupport  (推荐) <br>
   在Action中使用 表单校验、错误信息设置、读取国际化信息 三个功能</p>



<h2 id="action的配置method通配符"><a name="t11"></a>Action的配置method(通配符)</h2>

<p>1) 在配置  元素时,没有指定method属性, 默认执行 Action类中 execute方法 <br>
2)使用通配符* ,简化struts.xml配置</p>

<pre><code>&lt;a href="${pageContext.request.contextPath }/user/customer_add.action"&gt;添加客户&lt;/a&gt;
&lt;a href="${pageContext.request.contextPath }/user/customer_del.action"&gt;删除客户&lt;/a&gt;

struts.xml
&lt;action name="customer_*" class="cn.itcast.struts2.demo4.CustomerAction" method="{1}"&gt;&lt;/action&gt;   ---  {1}就是第一个* 匹配内容
</code></pre>



<h2 id="动态方法调用"><a name="t12"></a>动态方法调用</h2>

<p>访问Action中指定方法,不进行配置  <br>
   1) 在工程中使用 动态方法调用 ,必须保证 struts.enable.DynamicMethodInvocation = true 常量值 为true  <br>
   2) 在action的访问路径 中 使用 “!方法名” </p>

<pre><code>页面
&lt;a href="${pageContext.request.contextPath }/user/product!add.action"&gt;添加商品&lt;/a&gt;
配置
&lt;action name="product" class="cn.itcast.struts2.demo4.ProductAction"&gt;&lt;/action&gt;
执行 ProductAction 中的 add方法
</code></pre>



<h2 id="action访问servlet-api"><a name="t13"></a>Action访问Servlet API</h2>



<h3 id="1-在action-中解耦合方式-间接访问-servlet-api-使用-actioncontext-对象"><a name="t14"></a>1、 在Action 中解耦合方式 间接访问 Servlet API  ——— 使用 ActionContext 对象</h3>

<p>在struts2 中 Action API 已经与 Servlet API 解耦合 (没有依赖关系 ) <br>
* Servlet API 常见操作 : 表单提交请求参数获取,向request、session、application三个范围存取数据 </p>

<p>actionContext = ActionContext.getContext(); <br>
1) actionContext.getParameters(); 获得所有请求参数Map集合  <br>
2) actionContext.put(“company”, “传智播客”); / actionContext.get(“company”) 对request范围存取数据  <br>
3) actionContext.getSession(); 获得session数据Map,对Session范围存取数据 <br>
4) actionContext.getApplication(); 获得ServletContext数据Map,对应用访问存取数据 </p>



<h3 id="2-使用接口注入的方式操作servlet-api-耦合"><a name="t15"></a>2、 使用接口注入的方式,操作Servlet API (耦合)</h3>

<p>1.要求action类必须实现提定接口。 <br>
ServletContextAware : 注入ServletContext对象 <br>
ServletRequestAware :注入 request对象 <br>
ServletResponseAware : 注入response对象</p>

<p>2.重定接口中的方法。 <br>
private HttpServletRequest request; <br>
3.声明一个web对象,使用接口中的方法的参数对声明的web对象赋值. </p>

<pre><code>public void setServletRequest(HttpServletRequest request) {
    this.request = request;
}
</code></pre>



<h3 id="3-在action中直接通过-servletactioncontext-获得servlet-api"><a name="t16"></a>3、 在Action中直接通过 ServletActionContext 获得Servlet API</h3>

<p>ServletActionContext.getRequest() : 获得request对象 (session) <br>
ServletActionContext.getResponse() : 获得response 对象 <br>
ServletActionContext.getServletContext() : 获得ServletContext对象  <br>
ServletActionContext.getPageContext().getSession(); //获取session等对象</p>



<h2 id="action处理请求参数"><a name="t17"></a>Action处理请求参数</h2>



<h3 id="第一种-action-本身作为model对象通过成员setter封装-属性驱动"><a name="t18"></a>第一种 :Action 本身作为model对象,通过成员setter封装 (属性驱动 )</h3>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">    页面:
        用户名  &lt;input type=<span class="hljs-string">"text"</span> name=<span class="hljs-string">"username"</span> /&gt;
    Action :
        <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RegistAction1</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ActionSupport</span> {</span>
            <span class="hljs-keyword">private</span> String username;
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setUsername</span>(String username) {
                <span class="hljs-keyword">this</span>.username = username;
            }
        }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul></pre>



<h3 id="第二种-创建独立model对象页面通过ognl表达式封装-属性驱动"><a name="t19"></a>第二种 :创建独立model对象,页面通过ognl表达式封装 (属性驱动)</h3>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">    页面:
        用户名  &lt;input type=<span class="hljs-string">"text"</span> name=<span class="hljs-string">"user.username"</span> /&gt;----- 基于OGNL表达式的写法
    Action:
        <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RegistAction2</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ActionSupport</span> {</span>
            <span class="hljs-keyword">private</span> User user;
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setUser</span>(User user) {
                <span class="hljs-keyword">this</span>.user = user;
            }

            <span class="hljs-keyword">public</span> User <span class="hljs-title">getUser</span>() {
                <span class="hljs-keyword">return</span> user;
            }
        }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul></pre>



<h3 id="使用modeldriven接口对请求数据进行封装-模型驱动-主流"><a name="t20"></a>使用ModelDriven接口,对请求数据进行封装 (模型驱动 ) —– 主流</h3>



<pre class="prettyprint" name="code"><code class="hljs php has-numbering">    页面:
        用户名  &lt;input type=<span class="hljs-string">"text"</span> name=<span class="hljs-string">"username"</span> /&gt; &lt;br/&gt;  
    Action :
        <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RegistAction3</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ActionSupport</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">ModelDriven</span>&lt;<span class="hljs-title">User</span>&gt; {</span>
            <span class="hljs-keyword">private</span> User user = <span class="hljs-keyword">new</span> User(); <span class="hljs-comment">// 必须手动实例化</span>
            <span class="hljs-keyword">public</span> User getModel() {
                <span class="hljs-keyword">return</span> user;
            }
        }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul></pre>



<h3 id="封装数据到collection和map"><a name="t21"></a>封装数据到Collection和Map</h3>

<p>1) 封装数据到Collection 对象  <br>
    页面:</p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">    产品名称 &lt;input type=<span class="hljs-string">"text"</span> name=<span class="hljs-string">"products[0].name"</span> /&gt;&lt;br/&gt;
    Action :
        <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProductAction</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ActionSupport</span> {</span>
            <span class="hljs-keyword">private</span> List&lt;Product&gt; products;

            <span class="hljs-keyword">public</span> List&lt;Product&gt; <span class="hljs-title">getProducts</span>() {
                <span class="hljs-keyword">return</span> products;
            }

            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setProducts</span>(List&lt;Product&gt; products) {
                <span class="hljs-keyword">this</span>.products = products;
            }
        }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul></pre>

<p>2) 封装数据到Map 对象  <br>
    页面:</p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">        产品名称 &lt;input type=<span class="hljs-string">"text"</span> name=<span class="hljs-string">"map['one'].name"</span> /&gt;&lt;br/&gt;  =======  one是map的键值
    Action :
        <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProductAction2</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ActionSupport</span> {</span>
            <span class="hljs-keyword">private</span> Map&lt;String, Product&gt; map;

            <span class="hljs-keyword">public</span> Map&lt;String, Product&gt; <span class="hljs-title">getMap</span>() {
                <span class="hljs-keyword">return</span> map;
            }

            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setMap</span>(Map&lt;String, Product&gt; map) {
                <span class="hljs-keyword">this</span>.map = map;
            }
        }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul></pre>



<h2 id="请求参数校验"><a name="t22"></a>请求参数校验</h2>



<h3 id="手工代码校验请求参数"><a name="t23"></a>手工代码校验请求参数</h3>

<p>步骤一: 封装数据  <br>
步骤二: 实现校验Action ,必须继承ActionSupport 类  <br>
步骤三: 覆盖validate方法,完成对Action的业务方法 数据校验通过代码逻辑判断参数是否有效,如果参数非法 , this.addFieldError (ActionSupport提供)workflow拦截器 跳转回 input页面 <br>
步骤四: 在jsp中 通过 <strong>s:fieldError</strong> 显示错误信息 <br>
validate方法会对Action中所有业务方法进行校验,如果只想校验某一个方法   : validate方法名()</p>



<h3 id="xml配置方式数据校验"><a name="t24"></a>Xml配置方式数据校验</h3>

<p>位置:xml文件要与action类在同一个包下 <br>
名称:action类名-validation.xml(针对某个方法效验UserAction-regist-validation.xml)</p>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering">    <span class="hljs-pi">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
    <span class="hljs-doctype">&lt;!DOCTYPE validators PUBLIC
            "-//Apache Struts//XWork Validator 1.0.3//EN"
            "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-title">validators</span>&gt;</span>
        <span class="hljs-comment">&lt;!-- 对username属性进行校验 --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">field</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"username"</span>&gt;</span>
            <span class="hljs-comment">&lt;!-- 指定username不能为空 --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">field-validator</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"requiredstring"</span>&gt;</span>
                <span class="hljs-comment">&lt;!-- 错误信息 --&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">message</span>&gt;</span>用户名不能为空--------<span class="hljs-tag">&lt;/<span class="hljs-title">message</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">field-validator</span>&gt;</span>
            <span class="hljs-comment">&lt;!-- 长度校验,规定用户名必须在6-10位之间 --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">field-validator</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"stringlength"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">param</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"maxLength"</span>&gt;</span>10<span class="hljs-tag">&lt;/<span class="hljs-title">param</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">param</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"minLength"</span>&gt;</span>6<span class="hljs-tag">&lt;/<span class="hljs-title">param</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">message</span>&gt;</span>用户名必须在${minLength}-${maxLength}位之间<span class="hljs-tag">&lt;/<span class="hljs-title">message</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">field-validator</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">field</span>&gt;</span>

        <span class="hljs-comment">&lt;!-- 对age进行校验,规定年龄必须在10-40之间 --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">field</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"age"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">field-validator</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"int"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">param</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"min"</span>&gt;</span>10<span class="hljs-tag">&lt;/<span class="hljs-title">param</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">param</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"max"</span>&gt;</span>40<span class="hljs-tag">&lt;/<span class="hljs-title">param</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">message</span>&gt;</span>年龄必须在${min}--${max}之间<span class="hljs-tag">&lt;/<span class="hljs-title">message</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">field-validator</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">field</span>&gt;</span>

        <span class="hljs-comment">&lt;!-- 对birthday进行校验 --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">field</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"birthday"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">field-validator</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"date"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">param</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"min"</span>&gt;</span>1974-01-01<span class="hljs-tag">&lt;/<span class="hljs-title">param</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">param</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"max"</span>&gt;</span>2004-12-31<span class="hljs-tag">&lt;/<span class="hljs-title">param</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">message</span>&gt;</span>生日必须在${min}年到${max}年之间<span class="hljs-tag">&lt;/<span class="hljs-title">message</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">field-validator</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">field</span>&gt;</span>

        <span class="hljs-comment">&lt;!-- 校验邮箱 --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">field</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"email"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">field-validator</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"email"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">message</span>&gt;</span>邮箱格式不正确<span class="hljs-tag">&lt;/<span class="hljs-title">message</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">field-validator</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">field</span>&gt;</span>

        <span class="hljs-comment">&lt;!-- url校验 --&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-title">field</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"url"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">field-validator</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"url"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">message</span>&gt;</span>url不能这空,类似于http://www.baidu.com<span class="hljs-tag">&lt;/<span class="hljs-title">message</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">field-validator</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">field</span>&gt;</span>

        <span class="hljs-comment">&lt;!-- 使用正则 --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">field</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"telphone"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">field-validator</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"regex"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">param</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"regexExpression"</span>&gt;</span><span class="hljs-cdata">&lt;![CDATA[^135[0-9]{8}$]]&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-title">param</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">message</span>&gt;</span>电话号码必须是135xxxxxxxx<span class="hljs-tag">&lt;/<span class="hljs-title">message</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">field-validator</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">field</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-title">field</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"repassword"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">field-validator</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"fieldexpression"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">param</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"expression"</span>&gt;</span><span class="hljs-cdata">&lt;![CDATA[(password==repassword)]]&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-title">param</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">message</span>&gt;</span>两次密码输入不一致<span class="hljs-tag">&lt;/<span class="hljs-title">message</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">field-validator</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">field</span>&gt;</span>

    <span class="hljs-tag">&lt;/<span class="hljs-title">validators</span>&gt;</span>   </code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li></ul></pre>

<p>内建校验器 <br>
* required (必填校验器,要求被校验的属性值不能为null) <br>
* requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格) <br>
* stringlength (字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格) <br>
* regex (正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true) <br>
* int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值) <br>
* double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值) <br>
* fieldexpression (字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过) <br>
* email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址) <br>
* url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址) <br>
* date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)</p>



<h1 id="result结果类型"><a name="t25"></a>Result结果类型</h1>

<p>Action处理请求后, 返回字符串(逻辑视图名), 需要在struts.xml 提供 元素定义结果页面  <br>
1、 局部结果页面 和 全局结果页面 </p>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering">    <span class="hljs-tag">&lt;<span class="hljs-title">action</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"result"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"cn.itcast.struts2.demo6.ResultAction"</span>&gt;</span>
                <span class="hljs-comment">&lt;!-- 局部结果  当前Action使用 --&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">result</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"success"</span>&gt;</span>/demo6/result.jsp<span class="hljs-tag">&lt;/<span class="hljs-title">result</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">action</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-title">global-results</span>&gt;</span>
                <span class="hljs-comment">&lt;!-- 全局结果 当前包中 所有Action都可以用--&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">result</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"success"</span>&gt;</span>/demo6/result.jsp<span class="hljs-tag">&lt;/<span class="hljs-title">result</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">global-results</span>&gt;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul></pre>

<p>2、 结果页面跳转类型  <br>
    result标签 <br>
1.name  与action中的method的返回值匹配,进行跳转. <br>
2.type  作用:是用于定义跳转方式</p>

<p>dispatcher:它代表的是请求转发,也是默认值。它一般用于从action跳转到页面。 <br>
chain:它也相当于请求转发。它一般情况下用于从一个action跳转到另一个action。</p>

<pre><code>&lt;!--hello是一个Action的name--&gt;
&lt;result name="success" type="chain"&gt;hello&lt;/result&gt;
</code></pre>

<p>redirect:它代表的是重定向  它一般用于从action跳转到页面 <br>
redirectAction: 它代表的是重定向  它一般用于从action跳转另一个action。</p>

<pre><code>&lt;result name="success" type="redirectAction"&gt;hello&lt;/result&gt;
</code></pre>

<p>stream:代表的是服务器端返回的是一个流,一般用于下载。</p>



<h1 id="在jsp中显示错误信息"><a name="t26"></a>在jsp中显示错误信息</h1>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering">    <span class="hljs-tag">&lt;<span class="hljs-title">s:fieldError</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">s:fielderror</span> <span class="hljs-attribute">fieldName</span>=<span class="hljs-value">""</span>&gt;</span>展示特定名称的错误信息.</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>



<h1 id="struts2国际化"><a name="t27"></a>Struts2国际化</h1>



<h2 id="资源文件编写"><a name="t28"></a>资源文件编写</h2>

<p>properties文件命名 :  基本名称<em>语言(小写)</em>国家(大写).properties <br>
编写3个property文件</p>

<p>message.properties</p>

<pre><code>name=tom
</code></pre>

<p>messages_zh_CN.properties //中国中文</p>

<pre><code>name=汤姆
</code></pre>

<p>messages_en_US.properties //美国英文</p>

<pre><code>name=tom
</code></pre>



<h2 id="资源文件作用域"><a name="t29"></a>资源文件作用域</h2>

<p>1.针对于action类 <br>
位置:与action类在同一个包下. <br>
名称:ActionClassName.properties. <br>
这个配置文件只对当前action有效。</p>

<p>2.针对于package下所有action <br>
位置:在指定的包下 <br>
名称:package.properties</p>



<h2 id="怎样使用"><a name="t30"></a>怎样使用</h2>

<p>1.在action类中使用 <br>
前提:action类要继承ActionSupport类。 <br>
getText(String name)就可以获取配置文件中对应名称的值。</p>

<p>2.在validation.xml文件中使用</p>

<pre><code>&lt;message key="名称"/&gt;
</code></pre>

<p>3.在jsp页面上使用</p>

<p>s:text name=”名称” 如果没有使用s:i18n name=”“来指定,会从全局配置文件中获取。 <br>
如果要从某一个配置文件中获取,通过name属性来指定,  包名.配置文件名称 .</p>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering">    <span class="hljs-tag">&lt;<span class="hljs-title">s:i18n</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"cn.itcast.action.package"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">s:text</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"nameerror"</span>/&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">s:i18n</span>&gt;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>



<h2 id="在struts2中国际化配置文件中使用动态文本"><a name="t31"></a>在struts2中国际化配置文件中使用动态文本</h2>

<p>1.action中怎样使用</p>

<p>xxxx.property</p>

<pre><code>msg=hello world  {0}
</code></pre>

<p>action</p>

<pre><code>this.getText("msg",new String[]{"tom"})
</code></pre>

<p>结果就是 hello world tom</p>

<p>2.jsp页面上怎样使用</p>

<p>xxxx.property <br>
    msg=hello world  {0}</p>

<pre><code>&lt;s:i18n name="cn.itcast.action.I18nDemo1Action"&gt;
    &lt;s:text name="msg"&gt;
        &lt;s:param&gt;张三&lt;/s:param&gt;
    &lt;/s:text&gt;
&lt;/s:i18n&gt;
</code></pre>

<p>结果就是 hello world  张三</p>



<h1 id="struts2拦截器"><a name="t32"></a>Struts2拦截器</h1>

<p>struts2中在struts-default.xml文件中声明了所有的拦截器。 <br>
而struts2框架默认使用的是defaultStack这个拦截器栈。 <br>
在这个拦截器栈中使用了18个拦截器。简单说,struts2框架 <br>
在默认情况下,加载了18个拦截器。 <br>
<strong>注意:只要显示声明使用了一个拦截器。那么默认的拦截器就不在加载。</strong></p>



<h2 id="常用struts2-拦截器"><a name="t33"></a>常用struts2 拦截器</h2>

<pre><code>&lt;interceptor-ref name="modelDriven"/&gt; 模型驱动
&lt;interceptor-ref name="fileUpload"/&gt; 文件上传
&lt;interceptor-ref name="params"&gt; 参数解析封装
&lt;interceptor-ref name="conversionError"/&gt; 类型转换错误
&lt;interceptor-ref name="validation"&gt; 请求参数校验
&lt;interceptor-ref name="workflow"&gt; 拦截跳转 input 视图
</code></pre>



<h2 id="自定义拦截器"><a name="t34"></a>自定义拦截器</h2>

<p>struts.xml</p>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag">&lt;<span class="hljs-title">interceptors</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">interceptor</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"my"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"cn.itcast.intercept.MyInterceptor"</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">interceptor</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-title">interceptor</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"bookInterceptor"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"cn.itcast.intercept.BookInterceptor"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">param</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"includeMethods"</span>&gt;</span>add,update,delete<span class="hljs-tag">&lt;/<span class="hljs-title">param</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">interceptor</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-title">interceptor-stack</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"myStack"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">interceptor-ref</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"bookInterceptor"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-title">interceptor-ref</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">interceptor-ref</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"defaultStack"</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">interceptor-stack</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">interceptors</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-title">action</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"demo1"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"cn.itcast.action.Demo1Action"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">result</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"login"</span>&gt;</span>/login.jsp<span class="hljs-tag">&lt;/<span class="hljs-title">result</span>&gt;</span>
    <span class="hljs-comment">&lt;!-- &lt;interceptor-ref name="my" /&gt; &lt;interceptor-ref name="defaultStack"/&gt; --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">interceptor-ref</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"myStack"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">action</span>&gt;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul></pre>

<p>action</p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BookInterceptor</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">MethodFilterInterceptor</span> {</span>

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> String <span class="hljs-title">doIntercept</span>(ActionInvocation invocation) <span class="hljs-keyword">throws</span> Exception {

        <span class="hljs-comment">// 1.得到session中的user</span>
        User user = (User) ServletActionContext.getRequest().getSession().getAttribute(<span class="hljs-string">"user"</span>);

        <span class="hljs-keyword">if</span> (user == <span class="hljs-keyword">null</span>) {
            BookAction action = (BookAction) invocation.getAction(); <span class="hljs-comment">// 得到当前拦截的action对象。</span>
            action.addActionError(<span class="hljs-string">"权限不足,请先登录"</span>);<span class="hljs-comment">// 存储错误信息</span>
            <span class="hljs-keyword">return</span> Action.LOGIN;
        }
        <span class="hljs-keyword">return</span> invocation.invoke();
    }
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul></pre>



<h1 id="ognl表达式和值栈"><a name="t35"></a>OGNL表达式和值栈</h1>

<p>关于valueStack内部结构详解URL <br>
<a href="http://blog.csdn.net/qq32933432/article/details/51568939">http://blog.csdn.net/qq32933432/article/details/51568939</a></p>



<h2 id="值栈在开发中应用"><a name="t36"></a>值栈在开发中应用</h2>



<h3 id="主流应用-值栈-解决-action-向-jsp-传递-数据问题"><a name="t37"></a>主流应用 : 值栈 解决 Action 向 JSP 传递 数据问题</h3>



<h3 id="action-向jsp-传递数据处理结果-结果数据有两种形式"><a name="t38"></a>Action 向JSP 传递数据处理结果 ,结果数据有两种形式</h3>



<h4 id="1-消息-string类型数据"><a name="t39"></a>1) 消息 String类型数据</h4>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering"><span class="hljs-keyword">this</span>.addFieldError(<span class="hljs-string">"msg"</span>, <span class="hljs-string">"字段错误信息"</span>);
<span class="hljs-keyword">this</span>.addActionError(<span class="hljs-string">"Action全局错误信息"</span>);
<span class="hljs-keyword">this</span>.addActionMessage(<span class="hljs-string">"Action的消息信息"</span>);</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>

<ul>
<li>fieldError 针对某一个字段错误信息 (常用于表单校验)、actionError (普通错误信息,不针对某一个字段 登陆失败)、 actionMessage 通用消息   </li>
</ul>

<p>在jsp中使用 struts2提供标签 显示消息信息</p>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag">&lt;<span class="hljs-title">s:fielderror</span> <span class="hljs-attribute">fieldName</span>=<span class="hljs-value">"msg"</span>/&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-title">s:actionerror</span>/&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-title">s:actionmessage</span>/&gt;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>



<h4 id="2-数据-复杂类型数据"><a name="t40"></a>2) 数据 (复杂类型数据)</h4>

<p>使用值栈 </p>



<pre class="prettyprint" name="code"><code class="hljs perl has-numbering">valueStack.<span class="hljs-keyword">push</span>(products);</code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<p>哪些数据默认会放入到值栈 ???  <br>
    1)每次请求,访问Action对象 会被压入值栈 ——- DefaultActionInvocation 的 init方法 stack.push(action); <br>
    * Action如果想传递数据给 JSP,只要将数据保存到成员变量,并且提供get方法就可以了  <br>
    2)ModelDriven 接口 有一个单独拦截器  <br>
     <br>
    在拦截器中 ,将model对象 压入了 值栈 stack.push(model); <br>
    * 如果Action 实现ModelDriven接口,值栈默认栈顶对象 就是model对象</p>



<h2 id="ognl表达式-常见使用"><a name="t41"></a>OGNL表达式 常见使用</h2>



<h3 id="符号使用"><a name="t42"></a>、 % 、$ 符号使用</h3>

<p>1) # 的 使用 </p>



<h4 id="用法一-代表-actioncontextgetcontext-上下文"><a name="t43"></a>用法一  # 代表 ActionContext.getContext() 上下文</h4>

<pre><code>  &lt;s:property value="#request.name" /&gt;  ------------&gt;  ActionContext().getContext().getRequest().get("name");
</code></pre>

<p>#request <br>
  #session <br>
  #application <br>
  #attr <br>
  #parameters </p>



<h4 id="用法二-不写-默认在-值栈中root中进行查找"><a name="t44"></a>用法二 : 不写# 默认在 值栈中root中进行查找</h4>

<pre><code>   &lt;s:property value="name" /&gt; 在root中查找name属性
</code></pre>

<ul>
<li><p>查询元素时,从root的栈顶元素 开始查找, 如果访问指定栈中元素   </p>

<pre><code>&lt;s:property value="[1].name" /&gt;  访问栈中第二个元素name属性
</code></pre></li>
<li><p>访问第二个元素对象 </p>

<pre><code>&lt;s:property value="[1].top" /&gt;
</code></pre></li>
</ul>



<h4 id="用法三-进行投影映射-结合复杂对象遍历"><a name="t45"></a>用法三 :进行投影映射 (结合复杂对象遍历 )</h4>



<h5 id="1集合的投影只输出部分属性"><a name="t46"></a>1)集合的投影(只输出部分属性</h5>

<p>遍历集合只要name属性</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">&lt;s:iterator <span class="hljs-keyword">value</span>=<span class="hljs-string">"products.{name}"</span> <span class="hljs-keyword">var</span>=<span class="hljs-string">"pname"</span>&gt;
    &lt;s:property <span class="hljs-keyword">value</span>=<span class="hljs-string">"#pname"</span>/&gt;
&lt;/s:iterator&gt;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>



<h5 id="2遍历时对数据设置条件"><a name="t47"></a>2)遍历时,对数据设置条件</h5>

<p>遍历集合只要price大于1500商品</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">&lt;s:iterator <span class="hljs-keyword">value</span>=<span class="hljs-string">"products.{?#this.price&gt;1500}"</span> <span class="hljs-keyword">var</span>=<span class="hljs-string">"product"</span>&gt;
    &lt;s:property <span class="hljs-keyword">value</span>=<span class="hljs-string">"#product.name"</span>/&gt; --- &lt;s:property <span class="hljs-keyword">value</span>=<span class="hljs-string">"#product.price"</span>/&gt;    
&lt;/s:iterator&gt;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>



<h5 id="3综合"><a name="t48"></a>3)综合</h5>

<p>只显示价格大于1500 商品名称</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">&lt;s:iterator <span class="hljs-keyword">value</span>=<span class="hljs-string">"products.{?#this.price&gt;1500}.{name}"</span> <span class="hljs-keyword">var</span>=<span class="hljs-string">"pname"</span>&gt;
    &lt;s:property <span class="hljs-keyword">value</span>=<span class="hljs-string">"#pname"</span>/&gt;
&lt;/s:iterator&gt;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>



<h4 id="用法四-使用构造map集合"><a name="t49"></a>用法四: 使用#构造map集合</h4>

<p>经常结合 struts2 标签用来生成 select、checkbox、radio <br>
使用#构造map集合 遍历</p>



<pre class="prettyprint" name="code"><code class="hljs coffeescript has-numbering">&lt;<span class="hljs-attribute">s</span>:iterator value=<span class="hljs-string">"<span class="hljs-subst">#{<span class="hljs-string">'name'</span>:<span class="hljs-string">'aaa'</span>,<span class="hljs-string">'age'</span>:<span class="hljs-string">'20'</span>, <span class="hljs-string">'hobby'</span>:<span class="hljs-string">'sport'</span> }</span>"</span> <span class="hljs-reserved">var</span>=<span class="hljs-string">"entry"</span>&gt;
    key : &lt;<span class="hljs-attribute">s</span>:property value=<span class="hljs-string">"#entry.key"</span><span class="hljs-regexp">/&gt; , value:  &lt;s:property value="#entry.value"/</span>&gt; &lt;br/&gt;
&lt;/<span class="hljs-attribute">s</span>:iterator&gt;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>

<p>2) %的使用  <br>
<code>&lt;s:property value="表达式"&gt;</code> 对于s:property标签,它的value属性会被默认做为ognl. <br>
   用法一: 结合struts2 表单使用, 通过%通知struts, %{}中内容是一个OGNL表达式,进行解析 </p>

<pre><code>   &lt;s:textfield name="username" value="%{#request.username}"/&gt;
</code></pre>

<p>用法二: 设置ognl表达式不解析 %{‘ognl表达式’}</p>

<pre><code>   &lt;s:property value="%{'#request.username'}"/&gt;
</code></pre>

<p>3)<code>$</code>的使用  <br>
   用法一 :用于在国际化资源文件中,引用OGNL表达式 在properties文件 msg=欢迎您${#request.username} <br>
    在页面</p>

<pre><code>    &lt;s:i18n name="messages"&gt;
        &lt;s:text name="msg"&gt;&lt;/s:text&gt;
    &lt;/s:i18n&gt;
    * 自动将值栈的username 结合国际化配置信息显示
</code></pre>

<p>用法二 :在Struts 2配置文件中,引用OGNL表达式</p>

<pre><code>    &lt;!-- 在Action 提供 getContentType方法 --&gt;
    &lt;param name="contentType"&gt;${contentType}&lt;/param&gt;
</code></pre>

<p>{contentType} 读取值栈中contentType数据,在Action提供 getContentType 因为Action对象会被压入值栈, contentType是Action属性,从值栈获得</p>

<p>结论: #使用ognl表达式获取数据,% 控制ognl表达式是否解析 ,$ 用于配置文件获取值栈的数据</p>



<h1 id="使用ognl访问-对象方法-和-静态方法"><a name="t50"></a>使用OGNL访问 对象方法 和 静态方法</h1>

<p>OGNL 在jsp 结合 struts2 标签库 使用 , <code>&lt;s:property value="ognl表达式" /&gt;</code> 执行 ognl表达式  <br>
调用 实例方法 : 对象.方法()  —- <code>&lt;s:property value="'hello,world'.length()"/&gt;</code>  <br>
调用 静态方法 : @[类全名(包括包路径)]@[方法名]  — <code>&lt;s:property value="@java.lang.String@format('您好,%s','小明')"/&gt;</code> <br>
使用 静态方法调用 必须 设置 <code>struts.ognl.allowStaticMethodAccess=true</code></p>



<h1 id="struts2-防止表单重复提交"><a name="t51"></a>Struts2 防止表单重复提交</h1>

<p>1、 在jsp 通过 <code>&lt;s:token /&gt;</code> 生成令牌号  <br>
生成表单隐藏域 <br>
将令牌号保存到Session</p>

<p>2、 通过struts2 提供 tokenIntercetor 拦截器 完成请求中令牌号 和 session中令牌号 比较 </p>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag">&lt;<span class="hljs-title">interceptor</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"token"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"org.apache.struts2.interceptor.TokenInterceptor"</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">action</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"token"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"cn.itcast.struts2.TokenAction"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">result</span>&gt;</span>/index.jsp<span class="hljs-tag">&lt;/<span class="hljs-title">result</span>&gt;</span>
        <span class="hljs-comment">&lt;!-- 重新定义拦截器 --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">interceptor-ref</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"defaultStack"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-title">interceptor-ref</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">interceptor-ref</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"token"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-title">interceptor-ref</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">action</span>&gt;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul></pre>

<p>3、 当表单重复提交时,token拦截器自动跳转 result name=”invalid.token” <br>
 通过  显示错误信息 </p>

<p>覆盖重复提交信息  struts.messages.invalid.token=您已经重复提交表单,请刷新后重试</p>

<h1 id="struts2-内置json插件"><a name="t52"></a>Struts2 内置json插件</h1>



<h2 id="1导入json插件包"><a name="t53"></a>1.导入json插件包</h2>

<pre><code>在struts2的lib包下  struts2-json-plugin-2.3.15.1.jar。
</code></pre>



<h2 id="2在strutsxml文件中配置"><a name="t54"></a>2.在struts.xml文件中配置</h2>

<pre><code>1.&lt;package extends="json-default"&gt;
2.设置视图&lt;result type="json"&gt;
</code></pre>

<p>这样设置后,会将valueStack栈顶数据变成json。 <br>
对于我们的程序,也就是会将action对象转换成json。</p>



<h2 id="设置只将指定的数据转json"><a name="t55"></a>设置只将指定的数据转json</h2>

<pre><code>&lt;param name="root"&gt;p&lt;/param&gt;
</code></pre>

<p>如果没有设置,可以理解成将整个action都转换成json的数据。也就是 <br>
 在action中提供的getXxx方法,就是json中的一个属性。 <br>
如果设置了root,那么,只将指定数据转换成json.</p>



<h2 id="怎样设置转换成json的对象中不包含特定的属性"><a name="t56"></a>怎样设置转换成json的对象中不包含特定的属性?</h2>

<ol>
<li>@JSON(serialize=false) 在getXxx方法上设置 </li>
<li><p>还可以通过json插件的interceptor完成. <br>
设置只展示products的name属性</p>

<pre><code>&lt;param name="includeProperties"&gt;products\[\d+\]\.name&lt;/param&gt;
</code></pre></li>
</ol></div>
        <script type="text/javascript">
            $(function () {
                $('pre.prettyprint code').each(function () {
                    var lines = $(this).text().split('\n').length;
                    var $numbering = $('<ul></ul>').addClass('pre-numbering').hide();
                    $(this).addClass('has-numbering').parent().append($numbering);
                    for (i = 1; i <= lines; i++) {
                        $numbering.append($('<li></li>').text(i));
                    };
                    $numbering.fadeIn(1700);
                });
            });
        </script>
   

0 0
原创粉丝点击