<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>flustar</title>
    <description>本人希望在此多结交一些学习Java的朋友，共同提高，共同进步！失业中。。。</description>
    <link>http://flustar.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>flustar</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flustar.javaeye.com">flustar</a>&nbsp;
                    链接：<a href="http://flustar.javaeye.com/blog/166176" style="color:red;">http://flustar.javaeye.com/blog/166176</a>&nbsp;
          发表时间: 2008年02月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、什么是拦截器？<br /><br />提到拦截器，使我不得不想起武侠剧中劫匪们常说的一句话：“此山是我开，此树是我栽，要打此路过，留下买路财！”。难不成程序中也有“打劫”的，说的没错，拦截器就是个打劫的。在现实生活中，劫匪劫的大都是钱财，当然也有别的什么，那么程序中的“劫匪”劫的又是什么呢？或者说程序中为什么需要它？在我们的日常编程中少不了写一些重复的代码，例如在一个地方中写了一段代码，后来发现这段代码在其它地方中同样需要，在传统的编程中我们一定会采取复制、粘贴的办法。如果这段代码只在这一两个处需要，我们采取这种办法，还说的过去，但是如果系统对这段代码过于依赖，也就是这段代码在系统中出现的过多，如果那一天我们发现这段代码中在某些地方还需要完善，我们是不是要着个修改它们呢？我估计没有人会这么做，它严重违反了软件开发中一条非常重要的DRY规则，不写重复代码。说了这么多你一定知道我们为什么需要在程序中弄一个“劫匪”了吧。这个“劫匪”就是并不是劫取什么东西，只是为了在某个程序执行前后，动态的增加一些功能（以前所写通用代码块）或进行一些检查工作。那么这个拦截器到底是怎么实现的呢？实际上它是用Java中的动态代理来实现的，具体可以参考《设计模式学习笔记(十六)—Proxy模式》。<br /><br />二、拦截器在Struts2中的应用<br /><br />对于Struts2框架而言，正是大量的内置拦截器完成了大部分操作。像params拦截器将http请求中参数解析出来赋值给Action中对应的属性。Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action……struts2内置的拦截器有很多，在此我就不一一列举了，具体可以参考《Struts2中有关struts-default.xml,struts.xml,struts.properties文件详解》。<br /><br />那么怎么在struts2中定义自己的拦截器呢?<br /><br />很简单Struts2为我们提供了一个Interceptor接口,该接口源代码如下:<br /><br />publicinterface Interceptor extends Serializable {<br /><br />&nbsp;&nbsp;&nbsp; void destroy();<br /><br />&nbsp;&nbsp;&nbsp; void init();<br /><br />&nbsp;&nbsp;&nbsp; String intercept(ActionInvocation invocation) throws Exception;<br /><br />}<br /><br />1)&nbsp;&nbsp;&nbsp; init():在拦截器执行之前调用，主要用于初始化系统资源。<br /><br />2)&nbsp;&nbsp;&nbsp; destroty():与init()对应，用于拦截器执行之后销毁资源。<br /><br />3)&nbsp;&nbsp;&nbsp; intercept():拦截器的核心方法，实现具体的拦截操作。与action一样，该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了action，则返回一个真正的，也就是该action中execute()方法返回的逻辑视图，反之，则返回一个自定义的逻辑视图。<br /><br />通常我们使用拦截器并不需要申请资源，为此Struts2还为我们提供了一个AbstractInterceptor类，该类的init()和destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。<br /><br />下面创建一个判断用户是否登录的拦截器。代码如下:<br /><br />/** *//** <br /> *<br /> * @author &lt;a href="mailto:flustar2008@163.com">flustar&lt;/a><br /> * @version 1.0 <br /> * Creation date: Feb 12, 2008 5:05:28 PM<br /> */<br /><br />import java.util.Map;<br />import com.opensymphony.xwork2.Action;<br />import com.opensymphony.xwork2.ActionInvocation;<br />import com.opensymphony.xwork2.interceptor.AbstractInterceptor;<br /><br />@SuppressWarnings("serial")<br />public class CheckLoginInterceptor extends AbstractInterceptor {<br /><br />&nbsp;&nbsp;&nbsp; @SuppressWarnings("unchecked")<br />&nbsp;&nbsp;&nbsp; public String intercept(ActionInvocation actionInvocation) throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("begin check login interceptor!");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 检查Session中是否存在user<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map session = actionInvocation.getInvocationContext().getSession();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String username = (String) session.get("user");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (username != null &amp;&amp; username.length() > 0) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 存在的情况下进行后续操作。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("already login!");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return actionInvocation.invoke();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 否则终止后续操作，返回LOGIN<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("no login, forward login page!");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Action.LOGIN;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br /><br />&nbsp;&nbsp;&nbsp; }<br /><br /><br />创建好拦截器后，还不能使用，还需要我们在struts.xml中配置一下。<br /><br />下面看一下怎么配置拦截器。<br /><br />&lt;interceptors><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" /><br /><br />&lt;/interceptors><br /><br />这个定义好的拦截器在Action中怎么使用呢？使用方法很简单，如下：<br /><br />&lt;action name=" " class=" " ><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result> &lt;/result><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="checkLogin" /><br /><br />&lt;/action><br /><br />一旦我们为某个action引用了自定义的拦截器，struts2默认的拦截器就不会再起作用，因此还需要引用默认拦截器。<br /><br />&lt;action name=" " class=" " ><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result> &lt;/result><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="checkLogin" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="defaultStack" /><br /><br />&lt;/action><br /><br />但是我们这么做似乎也不太方便，因为如果拦截器checkLogin需要被多个action引用的话，每一个都要配置一遍太麻烦了。我们可以把它定义成默认的拦截器。<br /><br />&lt;interceptors><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!—-定义一个拦截器栈--><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="mydefault"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="defaultStack" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="checkLogin" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&lt;/interceptors><br /><br />&lt;default-interceptor-ref name="mydefault" /><br /><br />另外，struts2还为我们提供了一个方法过滤的拦截器MethodFilterInterceptor类，该类继承AbstractInterceptor类，重写了intercept(ActionInvocation invocation)并提供了一个新的方法doInterceptor(ActionInvocation invocation)抽象方法。该类的使用方法很简单，就不举例了。这个拦截器与以往的拦截器配置有所不同。那就是可以指定哪些方法需要被拦截，那些不需要。通常在引用该拦截器时指定。<br /><br />&lt;interceptor-ref name="&nbsp; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="exculdeMethods">&lt;/param><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="includeMethods">&lt;/param>&nbsp;&nbsp;&nbsp; <br /><br />&lt;/interceptor-ref><br /><br />exculdeMethods：是不被拦截的方法，如果有多个以逗号分隔。<br /><br />includeMethods：需要被拦截的方法，如果有多个以逗号分隔。
          <br/><br/>
          <span style="color:red;">
            <a href="http://flustar.javaeye.com/blog/166176#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Feb 2008 16:08:43 +0800</pubDate>
        <link>http://flustar.javaeye.com/blog/166176</link>
        <guid>http://flustar.javaeye.com/blog/166176</guid>
      </item>
          <item>
        <title>Struts2中使用Common-FileUpload实现文件上传</title>
        <author>flustar</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flustar.javaeye.com">flustar</a>&nbsp;
                    链接：<a href="http://flustar.javaeye.com/blog/166174" style="color:red;">http://flustar.javaeye.com/blog/166174</a>&nbsp;
          发表时间: 2008年02月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在web应用中，文件上传似乎是很常见的，但是采用传统的方法不但复杂而且难以控制，需要写很多代码，像控制文件大小、文件类型的过滤、存放目录等等。这些复杂的问题在Struts2中已经不存在了，struts2默认使用common-fileupload实现文件的上传。在struts.properties中我们可以看到:struts.multipart.parser=Jakarta 。下面我们就以Common-FileUpload来实现文件上传。<br /><br />首先，把commons-fileupload.jar和commons-io.jar拷贝到classpath路径下。<br /><br />建立一个上传文件的页面，upload.jsp。<br /><br />&lt;%@ page contentType="text/html; charset=utf-8" %><br />&lt;%@taglib prefix="s" uri="/struts-tags"%><br />&lt;! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <br />&lt;html xmlns ="http://www.w3.org/1999/xhtml" > <br />&lt;head> <br />&nbsp;&nbsp;&nbsp; &lt;title> Struts 2 File Upload &lt;/title > <br />&lt;/head > <br />&lt;body ><br />&nbsp;&nbsp;&nbsp; &lt;div style="color.red"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:fielderror /> <br />&nbsp;&nbsp;&nbsp; &lt;/div><br />&nbsp;&nbsp;&nbsp; &lt;s:form action ="upload" method ="post" enctype ="multipart/form-data" > <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:textfield name ="title" label ="文件标题" /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:file name ="upload" label ="选择文件" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:submit value="上传" /> <br />&nbsp;&nbsp;&nbsp; &lt;/s:form><br />&lt;/body > <br />&lt;/html > <br /><br /><br />上传成功后的succ.jsp<br /><br />&lt;%@ page contentType="text/html;charset=utf-8" %><br />&lt;%@ taglib prefix="s" uri="/struts-tags"%><br />&lt;! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <br />&lt;html xmlns ="http://www.w3.org/1999/xhtml" > <br />&lt;head> <br />&nbsp;&nbsp;&nbsp; &lt;title> Struts 2 File Upload &lt;/title > <br />&lt;/head> <br />&lt;body> <br />&nbsp;&nbsp;&nbsp; &lt;div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" > <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;img src ='upload/&lt;s:property value ="uploadFileName" /> ' /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:property value ="title" /> <br />&nbsp;&nbsp;&nbsp; &lt;/div > <br />&lt;/body > <br />&lt;/html > <br /><br /><br />然后编写UploadAction.java<br /><br />/** *//** <br /> *<br /> * @author &lt;a href="mailto:flustar2008@163.com">flustar&lt;/a><br /> * @version 1.0 <br /> * Creation date: Feb 15, 2008 10:24:36 PM<br /> */<br />package test;<br /><br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br /><br />import org.apache.struts2.ServletActionContext;<br /><br />import com.opensymphony.xwork2.ActionSupport;<br /><br />public class UploadAction extends ActionSupport{<br />&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = -7887613751080170362L;<br />&nbsp;&nbsp;&nbsp; private String title;//设置上传文件的标题<br />&nbsp;&nbsp;&nbsp; private File upload;//封装上传文件<br />&nbsp;&nbsp;&nbsp; private String uploadFileName;//设置上传文件的文件名<br />&nbsp;&nbsp;&nbsp; private String uploadContentType;//上传文件的类型<br />&nbsp;&nbsp;&nbsp; private String savePath;//上传文件的保存路径<br />&nbsp;&nbsp;&nbsp; public String getTitle() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return title;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void setTitle(String title) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.title = title;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public File getUpload() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return upload;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void setUpload(File upload) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.upload = upload;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public String getUploadFileName() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return uploadFileName;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void setUploadFileName(String uploadFileName) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.uploadFileName = uploadFileName;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public String getUploadContentType() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return uploadContentType;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void setUploadContentType(String uploadContentType) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.uploadContentType = uploadContentType;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public String getSavePath() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(ServletActionContext.getServletContext().getRealPath(savePath));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ServletActionContext.getServletContext().getRealPath(savePath);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void setSavePath(String savePath) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.savePath = savePath;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("savePath: "+savePath);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public String execute()throws Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+getUploadFileName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream fis=new FileInputStream(getUpload());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer=new byte[1024];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((len=fis.read(buffer))>0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fos.write(buffer, 0, len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br /><br />编写struts.xml<br /><br />&lt;?xml version="1.0" encoding="UTF-8" ?><br />&lt;!DOCTYPE struts PUBLIC<br />&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />&nbsp;&nbsp;&nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"><br />&lt;struts><br />&nbsp;&nbsp;&nbsp; &lt;package name="blog" extends="struts-default"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&lt;action name="upload" class="test.UploadAction"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Struts2内置的文件上传拦截器 --><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="fileUpload"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="allowedTypes">image/bmp,image/x-png,image/gif,image/pjpeg&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="maximumSize">2048000&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="defaultStack" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="savePath">/upload&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result>/succ.jsp&lt;/result><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="input">/upload.jsp&lt;/result><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&lt;/package><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&lt;/struts><br /><br /><br />编写struts.properties<br /><br /> <br />struts.custom.i18n.resources=mess<br /><br />struts.multipart.parser=jakarta<br /><br />struts.multipart.maxSize=10000000<br /><br /> <br /><br />编写国际化的资源文件mess.properties<br /><br /> <br />struts.messages.error.content.type.not.allowed="Thetypeisnotbeallowed!"<br /><br />struts.messages.error.file.too.large="Thefileistoolarge!"<br /><br />struts.messages.error.uploading="unknownerror"<br /><br /> <br /><br />在这里我没有把调试的过程写出来，这完全没必要，网上已经有很多这方面的例子了，但是网上好多例子都有一个通病，那就是错误的信息实在是太多了，都是搜索引擎惹得祸。按照上面的步骤来做，很难成功！我按照上面的步骤来操作，发现两个比较普遍的错误：<br /><br />1） 不能上传png和jpg类型的图片。解决办法可以参考上面的struts.xml。<br /><br />2） 上传过大的文件没有提示信息，而是直接抛出下面的异常:<br /><br />&nbsp;&nbsp; org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (2359629) exceeds the configured maximum (2097152)<br /><br />为什么会出现这个错误？刚开始我还以为是Struts2的一个bug，于是我就开始研究是struts2内置的fileUpload拦截器，我研究了FileUploadInterceptor.java的源代码并调试了半天依然不能解决这个问题，我都被它快折磨死了。最后我想起了在我们编写struts.properties中有这么一句struts.multipart.parser=Jakarta，实际上这一句也可以不写因为这是struts2为了支持文件上传默认的。那么这个Jakarta到底是什么东西呢？实际上Jakarta实际上就是org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类。打开JakartaMultiPartRequest.java的源代码你会发现这个类实现了MultiPartRequest接口，在这个类封装了对底层ServletFileUpload的操作，由于common-fileupload组件默认最大支持上传文件的大小为2M,当我们上传大于2M的文件时，就会出现上面的异常。是这个异常的发生导致了fileUpload拦截器没有机会执行，所以我看到的是页面没有任何变化，也没有任何提示信息，只是在控制台打印出了上面的异常。解决的办法在struts.properties文件中把struts.multipart.maxSize设置成一个比较大的值，也是就说maxSize远远要大于可能上传文件的大小和fileUpload拦截器中maxinumSize的值，可参见上面的struts.xml和struts.properties文件。
          <br/><br/>
          <span style="color:red;">
            <a href="http://flustar.javaeye.com/blog/166174#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Fri, 29 Feb 2008 16:07:20 +0800</pubDate>
        <link>http://flustar.javaeye.com/blog/166174</link>
        <guid>http://flustar.javaeye.com/blog/166174</guid>
      </item>
          <item>
        <title>Struts2中Action详解</title>
        <author>flustar</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flustar.javaeye.com">flustar</a>&nbsp;
                    链接：<a href="http://flustar.javaeye.com/blog/166173" style="color:red;">http://flustar.javaeye.com/blog/166173</a>&nbsp;
          发表时间: 2008年02月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Struts2中Action部分，也就是Controller层采用了低侵入的方式。为什么这么说？这是因为在Struts2中action类并不需要继承任何的基类，或实现任何的接口，更没有与Servlet的API直接耦合。它通常更像一个普通的POJO（通常应该包含一个无参数的execute方法）,而且可以在内容定义一系列的方法(无参方法)，并可以通过配置的方式，把每一个方法都当作一个独立的action来使用，从而实现代码复用。<br /><br />例如:<br /><br />package example;<br /><br />public class UserAction {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String username;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String password;<br /><br />&nbsp;&nbsp;&nbsp; public String execute() throws Exception {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //…………..<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return “success”;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public String getUsername() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return username;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public void setUsername(String username) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.username = username;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public String getPassword() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return password;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public void setPassword(String password) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.password = password;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />}<br /><br />在这个Action类里的属性，既可以封装参数，又可以封装处理结果。系统并不会严格区分它们。<br /><br />但是为了使用户开发的Action类更规范，Struts2为我们提供了一个接口Action,该类定义如下：<br /><br />publicinterface Action {<br /><br />&nbsp;&nbsp;&nbsp; publicstaticfinal String ERROR="error";<br /><br />&nbsp;&nbsp;&nbsp; publicstaticfinal String INPUT="input";<br /><br />&nbsp;&nbsp;&nbsp; publicstaticfinal String NONE="none";<br /><br />&nbsp;&nbsp;&nbsp; publicstaticfinal String LOGIN="login";<br /><br />&nbsp;&nbsp;&nbsp; publicstaticfinal String SUCCESS="success";<br /><br />&nbsp;&nbsp;&nbsp; public String execute()throws Exception;<br /><br />}<br /><br />但是我们写Action通常不会实现该接口，而是继承该接口的实现类ActionSupport.<br /><br />该类代码如下:<br /><br />public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; ................<br /><br />&nbsp;&nbsp;&nbsp; public void setActionErrors(Collection errorMessages) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validationAware.setActionErrors(errorMessages);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public Collection getActionErrors() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return validationAware.getActionErrors();<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public void setActionMessages(Collection messages) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validationAware.setActionMessages(messages);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public Collection getActionMessages() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return validationAware.getActionMessages();<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Collection getErrorMessages() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getActionErrors();<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Map getErrors() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getFieldErrors();<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />//设置表单域校验错误<br /><br />&nbsp;&nbsp;&nbsp; public void setFieldErrors(Map errorMap) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validationAware.setFieldErrors(errorMap);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public Map getFieldErrors() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return validationAware.getFieldErrors();<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public Locale getLocale() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionContext ctx = ActionContext.getContext();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ctx != null) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ctx.getLocale();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG.debug("Action context not initialized");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />//获取国际化信息的方法<br /><br />&nbsp;&nbsp;&nbsp; public String getText(String aTextName) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return textProvider.getText(aTextName);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public String getText(String aTextName, String defaultValue) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return textProvider.getText(aTextName, defaultValue);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public String getText(String aTextName, String defaultValue, String obj) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return textProvider.getText(aTextName, defaultValue, obj);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .........<br /><br /> //用于访问国际化资源包的方法<br /><br />&nbsp;&nbsp;&nbsp; public ResourceBundle getTexts() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return textProvider.getTexts();<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public ResourceBundle getTexts(String aBundleName) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return textProvider.getTexts(aBundleName);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />//添加action的错误信息<br /><br />&nbsp;&nbsp;&nbsp; public void addActionError(String anErrorMessage) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validationAware.addActionError(anErrorMessage);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />//添加action的普通信息<br /><br />&nbsp;&nbsp;&nbsp; public void addActionMessage(String aMessage) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validationAware.addActionMessage(aMessage);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public void addFieldError(String fieldName, String errorMessage) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validationAware.addFieldError(fieldName, errorMessage);<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp;&nbsp; public void validate() {<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public Object clone() throws CloneNotSupportedException {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return super.clone();<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br /> ..........<br /><br />}<br /><br />前面说到struts2并没有直接与Servlet的API耦合，那么它是怎么访问Servlet的API的呢？<br /><br />原来struts2中提供了一个ActionContext类，该类模拟了Servlet的API。其主要方法如下:<br /><br />1)Object get (Object key)：该方法模拟了HttpServletRequest.getAttribute(String name)方法。<br /><br />2)Map getApplication()返回一个Map对象，该对象模拟了ServletContext实例.<br /><br />3)static ActionContext getContext():获取系统的ActionContext实例。<br /><br />4)Map getSession():返回一个Map对象，该对象模拟了HttpSession实例.<br /><br />5)Map getParameters():获取所有的请求参数，模拟了HttpServletRequest.getParameterMap()<br /><br />你也许会奇怪为什么这些方法老是返回一个Map?这主要是为了便于测试。至于它是怎么把Map对象与实际的Servlet API的实例进行转换的，这个我们根本就不要担心，因为struts2已经内置了一些拦截器来帮我们完成这一转换。<br /><br />为了直接使用Servlet的API，Struts2为我们提供了以下几个接口。<br /><br />1）ServletContextAware:实现该接口的Action可以直接访问ServletContext实例。<br /><br />2）ServletRequestAware:实现该接口的Action可以直接访问HttpServletRequest实例。<br /><br />3）ServletResponseAware：实现该接口的Action可以直接访问HttpServletResponse实例。<br /><br />以上主要讲了action访问servlet,下面让我们来看一下Struts2的Action是如何实现代码复用的。就拿UserAction来说，我如果让这个action既处理用户注册（regist）又处理登录（longin）该如何改写这个action呢？改写后的UserAction如下:<br /><br />package example;<br /><br />public class UserAction extends ActionSupport {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String username;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String password;<br /><br />&nbsp;&nbsp;&nbsp; public String regist() throws Exception {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //…………..<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br /> public String login() throws Exception {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //…………..<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public String getUsername() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return username;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public void setUsername(String username) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.username = username;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public String getPassword() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return password;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public void setPassword(String password) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.password = password;<br /><br />&nbsp;&nbsp;&nbsp; }<br /><br />}<br /><br />是不是这么写就ok了，当然不行我们还必须在struts.xml文件中配置一下。配置方法有两种:<br /><br />1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用普通的方式为Action元素指定method属性.<br /><br />&lt;action name=”loginAction” class=”example.UserAction” method=”login”><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=”success”>/success.jsp&lt;/result><br /><br />&lt;/action><br /><br />&lt;action name=”registAction” class=”example.UserAction” method=”regist”><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=”success”>/success.jsp&lt;/result><br /><br />&lt;/action><br /><br />2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 采用通配符的方式为Action元素指定method属性。<br /><br />&lt;action name=”*Action” class=”example.UserAction” method=”{1}”><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name=”success”>/success.jsp&lt;/result><br /><br />&lt;/action><br /><br />使用通配符的方式过于灵活，下面是一个较复杂的配置情况。<br /><br />&lt;action name=”*_*” class=”example.{1}Action” method=”{2}”><br /><br />……….<br /><br /> &lt;/action><br /><br />其中占位符{1}与_的前一个*匹配，{2}与后一个*匹配。
          <br/><br/>
          <span style="color:red;">
            <a href="http://flustar.javaeye.com/blog/166173#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Feb 2008 16:05:25 +0800</pubDate>
        <link>http://flustar.javaeye.com/blog/166173</link>
        <guid>http://flustar.javaeye.com/blog/166173</guid>
      </item>
          <item>
        <title>Struts2中有关struts-default.xml,struts.xml,struts.pro</title>
        <author>flustar</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flustar.javaeye.com">flustar</a>&nbsp;
                    链接：<a href="http://flustar.javaeye.com/blog/166166" style="color:red;">http://flustar.javaeye.com/blog/166166</a>&nbsp;
          发表时间: 2008年02月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          学习Struts2也有一段时间了，早就想写一些关于它的文章，可由于自己太懒了，不想动手去写，最近看到blogjava中一位叫max的大侠写的struts2专栏很不错，使我更不想写了（有点自卑啊，呵呵）。但这段时间自己实在也太无聊了，于是还是写写吧。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每学习一个框架，我们都免不了要学习一些关于的配置文件，struts2也不例外，下面我就讲一下struts2中几个主要的配置文件。<br /><br />1） struts-default.xml<br /><br />这个文件是struts2框架默认加载的配置文件。它定义struts2一些核心的bean和拦截器。<br /><br />&lt;?xml version="1.0" encoding="UTF-8" ?><br /><br />&lt;!DOCTYPE struts PUBLIC<br />&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />&nbsp;&nbsp;&nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"><br /><br />&lt;struts><br />&lt;!--struts2中工厂bean的定义--><br />&nbsp;&nbsp;&nbsp; &lt;bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" /><br /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.ActionProxyFactory" name="xwork" class="com.opensymphony.xwork2.DefaultActionProxyFactory"/><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.ActionProxyFactory" name="struts" class="org.apache.struts2.impl.StrutsActionProxyFactory"/><br />&lt;!--类型检测bean的定义--><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.util.ObjectTypeDeterminer" name="tiger" class="com.opensymphony.xwork2.util.GenericsObjectTypeDeterminer"/><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.util.ObjectTypeDeterminer" name="notiger" class="com.opensymphony.xwork2.util.DefaultObjectTypeDeterminer"/><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.util.ObjectTypeDeterminer" name="struts" class="com.opensymphony.xwork2.util.DefaultObjectTypeDeterminer"/><br />&lt;!--文件上传bean的定义--><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="struts" class="org.apache.struts2.dispatcher.mapper.DefaultActionMapper" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="composite" class="org.apache.struts2.dispatcher.mapper.CompositeActionMapper" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful" class="org.apache.struts2.dispatcher.mapper.RestfulActionMapper" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful2" class="org.apache.struts2.dispatcher.mapper.Restful2ActionMapper" /><br /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="struts" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" optional="true"/><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" optional="true" /><br />&lt;!--标签库bean的定义--><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.views.TagLibrary" name="s" class="org.apache.struts2.views.DefaultTagLibrary" /><br />&lt;!--一些常用视图bean的定义--><br />&nbsp;&nbsp;&nbsp; &lt;bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="struts" optional="true"/><br />&nbsp;&nbsp;&nbsp; &lt;bean class="org.apache.struts2.views.velocity.VelocityManager" name="struts" optional="true" /><br /><br />&nbsp;&nbsp;&nbsp; &lt;bean class="org.apache.struts2.components.template.TemplateEngineManager" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.components.template.TemplateEngine" name="ftl" class="org.apache.struts2.components.template.FreemarkerTemplateEngine" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.components.template.TemplateEngine" name="vm" class="org.apache.struts2.components.template.VelocityTemplateEngine" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="org.apache.struts2.components.template.TemplateEngine" name="jsp" class="org.apache.struts2.components.template.JspTemplateEngine" /><br />&lt;!--类型转换bean的定义--><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.util.XWorkConverter" name="xwork1" class="com.opensymphony.xwork2.util.XWorkConverter" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.util.XWorkConverter" name="struts" class="com.opensymphony.xwork2.util.AnnotationXWorkConverter" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.TextProvider" name="xwork1" class="com.opensymphony.xwork2.TextProviderSupport" /><br />&nbsp;&nbsp;&nbsp; &lt;bean type="com.opensymphony.xwork2.TextProvider" name="struts" class="com.opensymphony.xwork2.TextProviderSupport" /><br /><br />&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; Struts2中一些可以静态注入的bean,也就是不需要实例化的 --><br />&nbsp;&nbsp;&nbsp; &lt;bean class="com.opensymphony.xwork2.ObjectFactory" static="true" /><br />&nbsp;&nbsp;&nbsp; &lt;bean class="com.opensymphony.xwork2.util.XWorkConverter" static="true" /><br />&nbsp;&nbsp;&nbsp; &lt;bean class="com.opensymphony.xwork2.util.OgnlValueStack" static="true" /><br />&nbsp;&nbsp;&nbsp; &lt;bean class="org.apache.struts2.dispatcher.Dispatcher" static="true" /><br />&nbsp;&nbsp;&nbsp; &lt;bean class="org.apache.struts2.components.Include" static="true" /><br />&nbsp;&nbsp;&nbsp; &lt;bean class="org.apache.struts2.dispatcher.FilterDispatcher" static="true" /><br />&nbsp;&nbsp;&nbsp; &lt;bean class="org.apache.struts2.views.util.ContextUtil" static="true" /><br />&nbsp;&nbsp;&nbsp; &lt;bean class="org.apache.struts2.views.util.UrlHelper" static="true" /><br />&lt;!-- 定义Struts2默认包--><br />&nbsp;&nbsp;&nbsp; &lt;package name="struts-default" abstract="true"><br />&nbsp;&nbsp;&nbsp; &lt;!-- 结果类型的种类--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-types><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="redirect-action" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result-type name="plaintext" class="org.apache.struts2.dispatcher.PlainTextResult" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/result-types><br /><br />&lt;!--struts2中拦截器的定义--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptors><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--实现在不同请求中相似参数别名的准换--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--与Spring整合时自动装配的拦截器--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--构建一个action链，使当前action可以访问前一个action，与&lt;result-type="chain" />配合使用--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/><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; &lt;interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--使用配置的name,value来是指cookies --><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--负责创建httpSession--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" /><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; &lt;interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" /><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; &lt;interceptor name="externalRef" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--后台执行action负责发送等待画面给用户--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/><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; &lt;interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/><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; &lt;interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/><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; &lt;interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--日志记录--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--模型拦截器，当action实现了ModelDriven接口时，负责把getModel的结果放入valueStack中--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--有生命周期的ModelDriven--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--负责解析请求中的参数，并赋值给action中对应的属性--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--实现该Preparable接口的action，会调用拦截器的prepare方法--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--负责将action 标签下的param参数值传递给action实例--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/><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; &lt;interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--用于访问Servlet API--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--输出action执行时间--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/><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; &lt;interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--与token拦截器相似，只是把token保存到HttpSession--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--负责表单字段的验证 *-validation.xml--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--负责执行action的validate()--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--存储和重新获取Action 消息/错误/字段错误为Action，实现ValidationAware接口到seesion--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--添加自动checkbox处理代码,这样检探测checkbox和添加它作为一个参数使用默认值(通常’false’).使用一个指定名字隐藏字段探测没提交的checkbox--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--JAAS服务拦截器--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" /><br /><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; &lt;interceptor-stack name="basicStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="exception"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="servletConfig"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="prepare"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="checkbox"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="params"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="conversionError"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 简单的validtion和webflow栈 --><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="validationWorkflowStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="basicStack"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="validation"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="workflow"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><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; &lt;interceptor-stack name="fileUploadStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="fileUpload"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="basicStack"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- model-driven 栈&nbsp; --><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="modelDrivenStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="modelDriven"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="basicStack"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- action链的拦截器栈 --><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="chainStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="chain"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="basicStack"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; i18n 拦截器栈 --><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="i18nStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="i18n"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="basicStack"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 结合preparable和ModenDriven拦截器--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="paramsPrepareParamsStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="exception"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="alias"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="params"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="servletConfig"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="prepare"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="i18n"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="chain"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="modelDriven"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="fileUpload"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="checkbox"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="staticParams"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="params"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="conversionError"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="validation"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="excludeMethods">input,back,cancel&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="workflow"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="excludeMethods">input,back,cancel&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--定义默认的拦截器栈&nbsp; --><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="defaultStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="exception"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="alias"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="servletConfig"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="prepare"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="i18n"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="chain"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="debugging"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="profiling"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="scopedModelDriven"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="modelDriven"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="fileUpload"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="checkbox"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="staticParams"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="params"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="excludeParams">dojo\..*&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="conversionError"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="validation"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="excludeMethods">input,back,cancel,browse&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="workflow"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="excludeMethods">input,back,cancel,browse&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="completeStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="defaultStack"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="executeAndWaitStack"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="execAndWait"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="excludeMethods">input,back,cancel&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="defaultStack"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="execAndWait"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="excludeMethods">input,back,cancel&lt;/param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="external-ref" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="model-driven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="static-params" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="scoped-model-driven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="servlet-config" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="token-session" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptors><br />&lt;!--定义默认拦截器为"defaultStack"--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;default-interceptor-ref name="defaultStack"/><br />&nbsp;&nbsp;&nbsp; &lt;/package><br /><br />&lt;/struts><br /><br /><br />2） struts.xml<br /><br />该文件也是struts2框架自动加载的文件，在这个文件中可以定义一些自己的action,interceptor，package等，该文件的package 通常继承struts-default包。下面是这个文件的格式。<br /><br />&lt;?xml version="1.0" encoding="GBK"?><br />&lt;!-- 下面指定Struts 2配置文件的DTD信息 --><br />&lt;!DOCTYPE struts PUBLIC<br />"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />"http://struts.apache.org/dtds/struts-2.0.dtd"><br />&lt;!-- struts是Struts 2配置文件的根元素 --><br />&lt;struts><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;constant name="" value="" /><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;bean type="" name="" class="" scope="" static="" optional="" /><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;include file="" /><br />&lt;!-- package元素是Struts配置文件的核心，该元素可以出现0次，或者无限多次 --><br />&lt;package name="必填的包名" extends="" namespace="" abstract=""<br />externalReferenceResolver><br />&lt;!-- 该元素可以出现，也可以不出现，最多出现一次 --><br />&lt;result-types><br />&lt;!-- 该元素必须出现，可以出现无限多次--><br />&lt;result-type name="" class="" default="true|false"><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;/result-type><br />&lt;/result-types><br />&lt;!-- 该元素可以出现，也可以不出现，最多出现一次 --><br />&lt;interceptors><br />&lt;!-- 该元素的interceptor元素和interceptor-stack至少出现其中之一，<br />也可以二者都出现 --><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;interceptor name="" class=""><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;/interceptor><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;interceptor-stack name=""><br />&lt;!-- 该元素必须出现，可以出现无限多次--><br />&lt;interceptor-ref name=""><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;/interceptor-ref><br />&lt;/interceptor-stack><br />&lt;/interceptors><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;default-interceptor-ref name=""><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param><br />&lt;/default-interceptor-ref><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;default-action-ref name=""><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;/default-action-ref>?<br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;global-results><br />&lt;!-- 该元素必须出现，可以出现无限多次--><br />&lt;result name="" type=""><br />&lt;!-- 该字符串内容可以出现0次或多次 --><br />映射资源<br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;/result><br />&lt;/global-results><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;global-exception-mappings><br />&lt;!-- 该元素必须出现，可以出现无限多次--><br />&lt;exception-mapping name="" exception="" result=""><br />异常处理资源<br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;/exception-mapping><br />&lt;/global-exception-mappings><br />&lt;action name="" class="" method="" converter=""><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;result name="" type=""><br />映射资源<br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;/result><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;interceptor-ref name=""><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;/interceptor-ref><br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;exception-mapping name="" exception="" result=""><br />异常处理资源<br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --><br />&lt;param name="参数名">参数值&lt;/param>*<br />&lt;/exception-mapping><br />&lt;/action><br />&lt;/package>*<br />&lt;struts><br /><br /><br />3） struts.properties文件<br /><br />这个文件是struts2框架的全局属性文件，也是自动加载的文件。该文件包含了系列的key-value对。该文件完全可以配置在struts.xml文件中，使用constant元素。下面是这个文件中一些常见的配置项及说明。<br /><br /><br />### 指定加载struts2配置文件管理器，默认为org.apache.struts2.config.DefaultConfiguration<br />### 开发者可以自定义配置文件管理器，该类要实现Configuration接口，可以自动加载struts2配置文件。<br /># struts.configuration=org.apache.struts2.config.DefaultConfiguration<br /><br />### 设置默认的locale和字符编码<br /># struts.locale=en_US<br />struts.i18n.encoding=UTF-8<br /><br /><br />### 指定struts的工厂类<br /># struts.objectFactory = spring<br /><br />### 指定spring框架的装配模式<br />### 装配方式有: name, type, auto, and constructor (name 是默认装配模式)<br />struts.objectFactory.spring.autoWire = name<br /><br />### 该属性指定整合spring时，是否对bean进行缓存，值为true or false,默认为true.<br />struts.objectFactory.spring.useClassCache = true<br /><br />### 指定类型检查<br />#struts.objectTypeDeterminer = tiger<br />#struts.objectTypeDeterminer = notiger<br /><br />### 该属性指定处理 MIME-type multipart/form-data，文件上传<br /># struts.multipart.parser=cos<br /># struts.multipart.parser=pell<br />struts.multipart.parser=jakarta<br /># 指定上传文件时的临时目录，默认使用 javax.servlet.context.tempdir <br />struts.multipart.saveDir=<br />struts.multipart.maxSize=2097152<br /><br />### 加载自定义属性文件 (不要改写struts.properties!)<br /># struts.custom.properties=application,org/apache/struts2/extension/custom<br /><br />### 指定请求url与action映射器，默认为org.apache.struts2.dispatcher.mapper.DefaultActionMapper<br />#struts.mapper.class=org.apache.struts2.dispatcher.mapper.DefaultActionMapper<br /><br />### 指定action的后缀，默认为action<br />struts.action.extension=action<br /><br />### 被 FilterDispatcher使用<br />### 如果为 true 则通过jar文件提供静态内容服务. <br />### 如果为 false 则静态内容必须位于 &lt;context_path>/struts<br />struts.serve.static=true<br /><br />### 被 FilterDispatcher使用<br />### 指定浏览器是否缓存静态内容，测试阶段设置为false，发布阶段设置为true.<br />struts.serve.static.browserCache=true<br /><br />### 设置是否支持动态方法调用，true为支持，false不支持.<br />struts.enable.DynamicMethodInvocation = true<br /><br />### 设置是否可以在action中使用斜线，默认为false不可以，想使用需设置为true.<br />struts.enable.SlashesInActionNames = false<br /><br />### 是否允许使用表达式语法，默认为true.<br />struts.tag.altSyntax=true<br /><br /><br />### 设置当struts.xml文件改动时，是否重新加载.<br />### - struts.configuration.xml.reload = true<br />### 设置struts是否为开发模式，默认为false,测试阶段一般设为true.<br />struts.devMode = false<br /><br />### 设置是否每次请求，都重新加载资源文件，默认值为false.<br />struts.i18n.reload=false<br /><br />###标准的UI主题<br />### 默认的UI主题为xhtml,可以为simple,xhtml或ajax<br />struts.ui.theme=xhtml<br />###模板目录<br />struts.ui.templateDir=template<br />#设置模板类型. 可以为 ftl, vm, or jsp<br />struts.ui.templateSuffix=ftl<br /><br />###定位velocity.properties 文件.&nbsp; 默认 velocity.properties<br />struts.velocity.configfile = velocity.properties<br /><br />### 设置velocity的context.<br />struts.velocity.contexts =<br /><br />### 定位toolbox.<br />struts.velocity.toolboxlocation=<br /><br />### 指定web应用的端口.<br />struts.url.http.port = 80<br />### 指定加密端口<br />struts.url.https.port = 443<br />### 设置生成url时，是否包含参数.值可以为: none, get or all<br />struts.url.includeParams = get<br /><br />### 设置要加载的国际化资源文件，以逗号分隔.<br /># struts.custom.i18n.resources=testmessages,testmessages2<br /><br />### 对于一些web应用服务器不能处理HttpServletRequest.getParameterMap()<br />### 像 WebLogic, Orion, and OC4J等，须设置成true,默认为false.<br />struts.dispatcher.parametersWorkaround = false<br /><br />### 指定freemarker管理器<br />#struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager<br /><br />### 设置是否对freemarker的模板设置缓存<br />### 效果相当于把template拷贝到 WEB_APP/templates.<br />struts.freemarker.templatesCache=false<br /><br />### 通常不需要修改此属性.<br />struts.freemarker.wrapper.altMap=true<br /><br />### 指定xslt result是否使用样式表缓存.开发阶段设为true,发布阶段设为false.<br />struts.xslt.nocache=false<br /><br />### 设置struts自动加载的文件列表.<br />struts.configuration.files=struts-default.xml,struts-plugin.xml,struts.xml<br /><br />### 设定是否一直在最后一个slash之前的任何位置选定namespace.<br />struts.mapper.alwaysSelectFullNamespace=false
          <br/><br/>
          <span style="color:red;">
            <a href="http://flustar.javaeye.com/blog/166166#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Fri, 29 Feb 2008 16:01:36 +0800</pubDate>
        <link>http://flustar.javaeye.com/blog/166166</link>
        <guid>http://flustar.javaeye.com/blog/166166</guid>
      </item>
          <item>
        <title>Java调用存储过程</title>
        <author>flustar</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flustar.javaeye.com">flustar</a>&nbsp;
                    链接：<a href="http://flustar.javaeye.com/blog/160827" style="color:red;">http://flustar.javaeye.com/blog/160827</a>&nbsp;
          发表时间: 2008年01月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">&nbsp;</p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">一：无返回值的存储过程<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">存储过程为：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">create or replace
procedure adddept(deptno number,dname varchar2,loc varchar2)<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>as<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">begin<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>insert into dept values(deptno,dname,loc);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>end;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">然后呢，在<span lang="EN-US">java</span>里调用时就用下面的代码：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-family: 宋体; color: black;">public</span><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"> </span><span lang="EN-US" style="font-family: 宋体; color: black;">class</span><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"> TestProcedure {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">Connection conn=</span><span lang="EN-US" style="font-family: 宋体; color: black;">null</span><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"> ;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">CallableStatement
cstmt=</span><span lang="EN-US" style="font-family: 宋体; color: black;">null</span><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"> ;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>PreparedStatement pstmt=</span><span lang="EN-US" style="font-family: 宋体; color: black;">null</span><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"> ;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">String
url="jdbc:oracle:thin:@localhost:1521:mydb";<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">String
driver="oracle.jdbc.driver.OracleDriver";<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">String
name="";<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span></span><span lang="EN-US" style="font-family: 宋体; color: black;">public</span><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"> TestProcedure() {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span></span><span lang="EN-US" style="font-family: 宋体; color: black;">try</span><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"> {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>Class.<em>forName</em>(driver);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>conn=DriverManager.<em>getConnection</em>(url,"scott","tiger");<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">cstmt=conn.prepareCall("{call
adddept(?,?,?)}");<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">cstmt.setInt(1,13);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>cstmt.setString(2,"</span><span style="line-height: 150%; font-family: 宋体; color: black;">间谍部<span lang="EN-US">2");<o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">cstmt.setString(3,"ningbo2");<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">cstmt.executeUpdate();
<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>System.<em>out</em>.println("success");<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span></span><span lang="EN-US" style="font-family: 宋体; color: black;">catch</span><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"> (Exception e){e.printStackTrace();}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">finally{<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">cstmt.close();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">conn.close();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;"><span>&nbsp;</span>}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">dept</span><span style="line-height: 150%; font-family: 宋体; color: black;">表为<span lang="EN-US">oracle</span>数据库方案<span lang="EN-US">scott</span>中的一个表<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">二：有返回值的存储过程（非列表）<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">存储过程为：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">CREATE OR REPLACE
PROCEDURE TESTB(PARA<st1:chmetcnv tcsc="0" hasspace="True" sourcevalue="1" numbertype="1" negative="False" w:st="on" unitname="in">1 IN</st1:chmetcnv>
VARCHAR2,PARA2 OUT VARCHAR2) AS<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">BEGIN <o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">SELECT INTO PARA2
FROM TESTTB WHERE I_ID= PARA1; <o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">END TESTB;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">在<span lang="EN-US">java</span>里调用时就用下面的代码：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">package
com.hyq.src;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">public class
TestProcedureTWO {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">public
TestProcedureTWO() {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">public static void
main(String[] args ){<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">String driver =
"oracle.jdbc.driver.OracleDriver";<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">String strUrl =
"jdbc:oracle:thin:@127.0.0.1:1521:hyq";<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">Statement stmt =
null;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">ResultSet rs =
null;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">Connection conn =
null;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">try {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">Class.forName(driver);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">conn =
DriverManager.getConnection(strUrl, " hyq ", " hyq ");<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">CallableStatement
proc = null;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">proc = conn.prepareCall("{
call HYQ.TESTB(?,?) }");<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">proc.setString(1,
"100");<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">proc.registerOutParameter(2,
Types.VARCHAR);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">proc.execute();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">String testPrint =
proc.getString(2);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">System.out.println("=testPrint=is="+testPrint);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">catch
(SQLException ex2) {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">ex2.printStackTrace();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">catch (Exception
ex2) {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">ex2.printStackTrace();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">finally{<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">try {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">if(rs != null){<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">rs.close();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">if(stmt!=null){<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">stmt.close();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">if(conn!=null){<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">conn.close();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">catch
(SQLException ex1) {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">注意，这里的<span lang="EN-US">proc.getString(2)</span>中的数值<span lang="EN-US">2</span>并非任意的，而是和存储过程中的<span lang="EN-US">out</span>列对应的，如果<span lang="EN-US">out</span>是在第一个位置，那就是<span lang="EN-US">proc.getString(1)</span>，如果是第三个位置，就是<span lang="EN-US">proc.getString(3)</span>，当然也可以同时有多个返回值，那就是再多加几个<span lang="EN-US">out</span>参数了。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">三：返回列表<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">由于<span lang="EN-US">oracle</span>存储过程没有返回值，它的所有返回值都是通过<span lang="EN-US">out</span>参数来替代的，列表同样也不例外，但由于是集合，所以不能用一般的参数，必须要用<span lang="EN-US">pagkage</span>了<span lang="EN-US">.</span>所以要分两部分，<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">1</span><span style="line-height: 150%; font-family: 宋体; color: black;">， 建一个程序包。如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">CREATE OR REPLACE
PACKAGE TESTPACKAGE AS<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">TYPE Test_CURSOR
IS REF CURSOR;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">end TESTPACKAGE;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">2</span><span style="line-height: 150%; font-family: 宋体; color: black;">，建立存储过程，存储过程为：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">CREATE OR REPLACE
PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS <o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">BEGIN<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">OPEN p_CURSOR FOR
SELECT * FROM HYQ.TESTTB;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">END TESTC;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">可以看到，它是把游标（可以理解为一个指针），作为一个<span lang="EN-US">out </span>参数来返回值的。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="line-height: 150%; font-family: 宋体; color: black;">在<span lang="EN-US">java</span>里调用时就用下面的代码：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">package
com.hyq.src;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">import java.sql.*;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">import
java.io.OutputStream;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">import
java.io.Writer;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">import
java.sql.PreparedStatement;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">import
java.sql.ResultSet;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">import
oracle.jdbc.driver.*;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">public class
TestProcedureTHREE {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">public
TestProcedureTHREE() {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">public static void
main(String[] args ){<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin: 7.5pt; background: white none repeat scroll 0% 50%; text-align: left; text-indent: 24pt; line-height: 150%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; color: black;">String driver =
"oracle.jdbc.driver.OracleDriver";