2005年11月15日

 HttpServletRequest,HttpServletResponse:这两个属性的作用范围最小。
    时间上:只是本身请求和应答完成就失效,当然转发是把当前的request对象取出来传给另一
          个资源,其实本身的request对象还是只生存到本次请求结束,response也同样。
    空间上:只能发送请求的客户端有效。

    HttpSession:一次连结到客户端关闭,时间作用范围比上面两个大,空间任用范围相同。

    ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet
    有效,一个servlet的ServletConfig对象不能被另一个servlet访问。

    ServletContext:对任何servlet,任何人在任何时间都有效,这才是真正全局的对象。那么,ServletConfig参数和ServletContext参数到底应该如何使用,如何取得?

    一般来说,对整个应用的配置,为了不使用"硬编码",应该配置为ServletContext参数,比如字
    符集设定。
    <web-app>
        ……………..
        <init-param>
            <param-name>charset</param-name> 
            <param-&#118alue>GB2312</param-&#118alue> 
        </init-param>
        ……………..
    </web-app>
    注意以上格式只是2。0以后的标准格式,旧容器(引擎)采用服务商自己的格式配置。注意它的
    父元素应该是<web-app>也就是说它是对一个应用作用的。

    而如果只有一个特定的servlet要设定的参数,其它servlet不能共享,应该配置为ServletConfig
    参数,如一个读取附件的servlet要用到绝对目录,而别的servlet不会用到:
    <servlet>
            <servlet-name>GetAtt</servlet-name>
        <servlet-class>mail.GetAttServlet</servlet-class>
        <init-param>
            <param-name>absPath</param-name> 
            <param-&#118alue>/usr/mail/ax/axman/Maildir/</param-&#118alue> 
        </init-param>
    </servlet>
    不用说,因为在<servlet>标签中已经指定了name和class,也就是说只有mail.GetAttServlet这个
    servlet中才能取到path,而别的Servlet是不能取到的。

    那么如何访问这两个对象的参数呢?
    访问ServletConfig参数:
        首先要取得ServletConfig对象,然后调用它的getInitParameter();方法。要访问
    ServletConfig对象,jsp中直接使用config内置对象,但因为你的JSP编译后的servlet一般不会被
    加到web.xml中的,所以一般不会通过jsp来取对本JSP编译后的servlet的配置参数,那么在servlet
    中要得到ServletConfig对象有两种方法:

    在inii()方法中取到:通过init的重载方法传递

    …..
    public class Test extends HttpServlet 
    {
        ServletConfig config;
        public void init(ServletConfig config) throws ServletException {
            this.config = config;
        }
        ………………
    }
    然后在下面的方法中就可以访问config对象。但要注意,为了确保能从构造方法中到到当前servlet的
    config对象,应该调用父类的构造方法:
    …..
    public class Test extends HttpServlet 
    {
        ServletConfig config;
        public void init(ServletConfig config) throws ServletException {
            super.init(config);
            this.config = config;
        }
        ………………
    }

    通过getServletConfig()方法直接到时,这样做的好处是不必调手工传递属性,想在任何时候都可
    以得到。

    还有第三种方法,要自己实现一些接口,这里作为一般讨论就不介绍了。

    要访问ServletContext对象,只要从现有的ServletConfig对象getServletContext()就可以了,然后
    调用它的getInitParameter()方法就可以获取它的参数。

九、HttpUtils\
      
定义\
      public class HttpUtils
      
收集HTTP Servlet使用的静态的有效的方法。
      
方法
      1
getRequestURL
      public static StringBuffer getRequestURL(HttpServletRequest
            request);
      
在服务器上重建客户端用来建立请求的URL。这个方法反映了不同的协议(例如httphttps)和端口,但不包含查询字符串。
      
这个方法返回一个StringBuffer而不是一个String,这样URL可以被Servlet开发者有效地修改。
      2
parsePostData
      public static Hashtable parsePostData(int len, 
            ServletInputstream in);
      
解析一个包含MIME类型application/x-www-form-urlencoded的数据的流,并创建一个具有关键值-数据对的hash table。这里的关键值是字符串,数据是该字符串所对应的值的列表。一个关键值可以在POST的数据中出现一次或多次。这个关键值每出现一次,它的相应的值就被加入到hash table中的字符串所对应的值的列表中。
      
POST数据读出的数据将经过URL解码,+将被转换为空格以十六进制传送的数据(例如%xx)将被转换成字符。
      
POST数据无效时,该方法抛出一个IllegalArgumentException
      3
parseQueryString
      public static Hashtable parseQueryString(String s);
      
解析一个查询字符串,并创建一个具有关键值-数据对的hash table。这里的数据是该字符串所对应的值的列表。一个关键值可以出现一次或多次。这个关键值每出现一次,它的相应的值就被加入到hash table中的字符串所对应的值的列表中。
      
从查询字符串读出的数据将经过URL解码,+将被转换为空格以十六进制传送的数据(例如%xx)将被转换成字符。
      
当查询字符串无效时,该方法抛出一个IllegalArgumentException

       bytecode 
      
字节码:由Java编译器和Java解释程序生成的机器代码。
cookie 
      
Web服务器建立的数据,该数据存储在用户的计算机上,提供了一个Web站点跟踪用户的参数并存储在用户自己硬盘上的方法。
HTTP 
      
超文本传输协议。一个请求响应协议用来连接WWW服务器向客户端浏览器传输HTML页面。
输入流对象\r
         
一个对象,由ServletInputStream类定义,被Servlet用来从客户端读取请求。
映射\r
      
Servlet实例和Servlet返回数据的URL组成的一对,例如,HelloServlet/hello/index.html
输出流对象\r
         
一个对象,由ServletOutputStream class类定义,被Servlet用来向客户端返回数据。
request dispatcher object 
      
RequestDispatcher接口定义的一个对象,用来从客户端接收请求,并将其发送到Web服务器上可用的其他资源(例如ServletCGIHTML文件或JSP文件)。
sandboxed servlet 
      
在一个安全性约束下运行的Servlet
servlet 
         
一个小的,具有平台无关性的,没有图形用户界面的Java程序。它可以在许多方面扩充Web服务的功能。
servlet configuration object 
      ServletConfig
接口定义的一个对象,用来配置一个Servlet
servlet context object 
      ServletContext
接口定义的一个对象。给予Servlet有关Servlet引擎的信息。
servlet
引擎\r
      
Web服务器提供商制作的一个环境,可以允许Servlet在具体的Web服务器上运行。
servlet
请求对象 
      
ServletRequest接口定义的一个对象,允许Servlet获得用关客户端请求的数据。
servlet response object 
      
ServletResponse接口定义的一个对象,允许Servlet作出响应。
servlet runner 
         Java Servlet Developer
s Kit (JSDK)中的sun.servlet.http.HttpServer过程,它使得Servlet得以运行。
会话跟踪 
      
在一个Web应用程序中,识别一个从同一个客户端发出的连续的唯一的请求的能力。
SSL 
      
加密套接字协议层。一个安全协议,用来在Iternet上的客户端浏览器和服务器交换密钥和加密数据。
URI 
      
统一资源标识。定义一个Internet地址,它是一个URL的超集。
URL 
      
统一资源路径。这个地址定义了到达一个WWW上的文件的路线,通常由协议前缀、域名、目录名和文件名组成。

七、HttpServlet\
      
定义\
      public class HttpServlet extends GenericServlet implements 
         Serializable
      
这是一个抽象类,用来简化HTTP Servlet写作的过程。它是GenericServlet类的扩充,提供了一个处理HTTP协议的框架。
      
在这个类中的service方法支持例如GETPOST这样的标准的HTTP方法。这一支持过程是通过分配他们到适当的方法(例如doGetdoPost)来实现的。
      
方法
      1
doDelete
      protected void doDelete(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException;
      
被这个类的service方法调用,用来处理一个HTTP DELETE操作。这个操作允许客户端请求从服务器上删除URL。这一操作可能有负面影响,对此用户就负起责任。
      
这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理DELETE请求时,你必须重载这一方法。
      2
doGet
      protected void doGet(HttpServletRequest request, 
            HttpServletResponse response) throws ServletException,
            IOException;
      
被这个类的service方法调用,用来处理一个HTTP GET操作。这个操作允许客户端简单地从一个HTTP服务器“获得”资源。对这个方法的重载将自动地支持HEAD方法。
      GET
操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复。
      
这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。
      3
doHead
      protected void doHead(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException;
      
被这个类的service方法调用,用来处理一个HTTP HEAD操作。默认的情况是,这个操作会按照一个无条件的GET方法来执行,该操作不向客户端返回任何数据,而仅仅是返回包含内容长度的头信息。
      
GET操作一样,这个操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复。
      
这个方法的默认执行结果是自动处理HTTP HEAD操作,这个方法不需要被一个子类执行。 
      4
doOptions
      protected void doOptions(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException;
      
被这个类的service方法调用,用来处理一个HTTP OPTION操作。这个操作自动地决定支持哪一种HTTP方法。例如,一个Servlet写了一个HttpServlet的子类并重载了doGet方法,doOption会返回下面的头:
      Allow: GET,HEAD,TRACE,OPTIONS
      
你一般不需要重载这个方法。
      5
doPost
      protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException;
      
被这个类的service方法调用,用来处理一个HTTP POST操作。这个操作包含请求体的数据,Servlet应该按照他行事。
      
这个操作可能有负面影响。例如更新存储的数据或在线购物。
      
这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理POST操作时,你必须在HttpServlet的子类中重载这一方法。
      6
doPut
      protected void doPut(HttpServletRequest request, 
            HttpServletResponse response) throws ServletException,
            IOException;
      
被这个类的service方法调用,用来处理一个HTTP PUT操作。这个操作类似于通过FTP发送文件。
      
这个操作可能有负面影响。例如更新存储的数据或在线购物。
      
这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理PUT操作时,你必须在HttpServlet的子类中重载这一方法。
      7
doTrace
      protected void doTrace(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException;
      
被这个类的service方法调用,用来处理一个HTTP TRACE操作。这个操作的默认执行结果是产生一个响应,这个响应包含一个反映trace请求中发送的所有头域的信息。
      
当你开发Servlet时,在多数情况下你需要重载这个方法。
      8
getLastModified
      protected long getLastModified(HttpServletRequest request);
      
返回这个请求实体的最后修改时间。为了支持GET操作,你必须重载这一方法,以精确地反映最后修改的时间。这将有助于浏览器和代理服务器减少装载服务器和网络资源,从而更加有效地工作。返回的数值是自1970-1-1日(GMT)以来的毫秒数。 
默认的执行结果是返回一个负数,这标志着最后修改时间未知,它也不能被一个有条件的GET操作使用。
      9
service
      protected void service(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException;
      public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException;
      
这是一个ServletHTTP-specific方案,它分配请求到这个类的支持这个请求的其他方法。
      
当你开发Servlet时,在多数情况下你不必重载这个方法。

      
八、HttpSessionBindingEvent\
      
定义\
      public class HttpSessionBindingEvent extends EventObject
      
这个事件是在监听到HttpSession发生绑定和取消绑定的情况时连通HttpSessionBindingListener的。这可能是一个session被终止或被认定无效的结果。
      
事件源是HttpSession.put&#118alueHttpSession.remove&#118alue
      
构造函数
      public HttpSessionBindingEvent(HttpSession session, String name);
      
通过引起这个事件的Session和发生绑定或取消绑定的对象名构造一个新的HttpSessionBindingEvent
      
方法
      1
getName
      public String getName();
      
返回发生绑定和取消绑定的对象的名字。
      2
getSession
      public HttpSession getSession();
      
返回发生绑定和取消绑定的session的名字。

 五、HttpSessionContext接口
      
定义\
      
此接口将被取消\
      public interface HttpSessionContext
      
这个对象是与一组HTTP session关联的单一的实体。
      
这个接口由于安全的原因被取消,它出现在目前的版本中仅仅是为了兼容性的原因。这个接口的方法将模拟以前的版本的定义返回相应的值。
      
方法
      1
getSession
      public HttpSession getSession(String sessionId);
      
当初用来返回与这个session id相关的session。现在返回空值。
      2
getIds
      public Enumeration getIds();
      
当初用来返回这个环境下所有session id的列表。现在返回空的列表。

      
六、Cookie\
      
定义\
      public class Cookie implements Cloneable
      
这个类描述了一个cookie,有关cookie的定义你可以参照Netscape Communications Corporation的说明,也可以参照RFC 2109
      
构造函数
      public Cookie(String name, String &#118alue);
      
用一个name-&#118alue对定义一个cookie。这个name必须能被HTTP/1.1所接受。
      
以字符$开头的nameRFC 2109保留。
      
给定的name如果不能被HTTP/1.1所接受,该方法抛出一个IllegalArgumentException
      
方法
      1
getComment
      public String getComment();
      
返回描述这个cookie目的的说明,如果未定义这个说明,返回空值。
      2
getDomain
      public String getDomain();
      
返回这个cookie可以出现的区域,如果未定义区域,返回空值。
      3
getMaxAge
      public int getMaxAge();
      
这个方法返回这个cookie指定的最长存活时期。如果未定义这个最长存活时期,该方法返回-1
      4
getName
      public String getName();
      
该方法返回cookie名。
      5
getPath
      public String getPath();
      
返回这个cookie有效的所有URL路径的前缀,如果未定义,返回空值。
      6
getSecure
      public boolean getSecure();
      
如果这个cookie只通过安全通道传输返回真,否则返回假。
      7
get&#118alue
      public String get&#118alue();
      
该方法返回cookie的值。
      8
getVersion
      public int getVersion();
      
返回cookie的版本。版本1RFC 2109解释。版本0Netscape Communications Corporation的说明解释。新构造的cookie默认使用版本0
      9
setComment
      public void setComment(String purpose);
      
如果一个用户将这个cookie提交给另一个用户,必须通过这个说明描述这个cookie的目的。版本0不支持这个属性。
      10
setDomain
      public void setDomain(String pattern);
      
这个方法设置cookie的有效域的属性。这个属性指定了cookie可以出现的区域。一个有效域以一个点开头(.foo.com),这意味着在指定的域名解析系统的区域中(可能是www.foo.com但不是a.b.foo.com)的主机可以看到这个cookie。默认情况是,cookie只能返回保存它的主机。
      11
setMaxAge
      public void setMaxAge(int expiry);
      
这个方法设定这个cookie的最长存活时期。在该存活时期之后,cookie会被终目。负数表示这个cookie不会生效,0将从客户端删除这个cookie
         12
setPath
      public void setPath(String uri);
      
这个方法设置cookie的路径属性。客户端只能向以这个给定的路径String开头的路径返回cookie
      13
setSecure
      public void setSecure(boolean flag);
      
指出这个cookie只能通过安全通道(例如HTTPS)发送。只有当产生这个cookie的服务器使用安全协议发送这个cookie值时才能这样设置。
      14
set&#118alue
      public void set&#118alue(String new&#118alue);
      
设置这个cookie的值,对于二进制数据采用BASE64编码。
      
版本0不能使用空格、{}()=、,、“”、/?@、:以及;。
      15
setVersion
      public void setVersion(int v);
      
设置cookie的版本号

三、HttpSession接口
      
定义\
      public interface HttpSession
      
这个接口被Servlet引擎用来实现在HTTP客户端和HTTP会话两者的关联。这种关联可能在多外连接和请求中持续一段给定的时间。session用来在无状态的HTTP协议下越过多个请求页面来维持状态和识别用户。
      
一个session可以通过cookie或重写URL来维持。
      
方法
      1
getCreationTime
      public long getCreationTime();
      
返回建立session的时间,这个时间表示为自1970-1-1日(GMT)以来的毫秒数。 
      2
getId
      public String getId();
      
返回分配给这个session的标识符。一个HTTP session的标识符是一个由服务器来建立和维持的唯一的字符串。
      3
getLastAccessedTime
      public long getLastAccessedTime();
      
返回客户端最后一次发出与这个session有关的请求的时间,如果这个session是新建立的,返回-1。这个时间表示为自1970-1-1日(GMT)以来的毫秒数。 
      4
getMaxInactiveInterval
      public int getMaxInactiveInterval();
      
返加一个秒数,这个秒数表示客户端在不发出请求时,sessionServlet引擎维持的最长时间。在这个时间之后,Servlet引擎可能被Servlet引擎终止。如果这个session不会被终止,这个方法返回-1
      
session无效后再调用这个方法会抛出一个IllegalStateException
      5
get&#118alue
      public Object get&#118alue(String name);
      
返回一个以给定的名字绑定到session上的对象。如果不存在这样的绑定,返回空值。
      
session无效后再调用这个方法会抛出一个IllegalStateException
      6
get&#118alueNames
      public String[] get&#118alueNames();
      
以一个数组返回绑定到session上的所有数据的名称。
      
session无效后再调用这个方法会抛出一个IllegalStateException
      7
invalidate
      public void invalidate();
      
这个方法会终止这个session。所有绑定在这个session上的数据都会被清除。并通过HttpSessionBindingListener接口的&#118alueUnbound方法发出通告。
      8
isNew
      public boolean isNew();
      
返回一个布尔值以判断这个session是不是新的。如果一个session已经被服务器建立但是还没有收到相应的客户端的请求,这个session将被认为是新的。这意味着,这个客户端还没有加入会话或没有被会话公认。在他发出下一个请求时还不能返回适当的session认证信息。
      
session无效后再调用这个方法会抛出一个IllegalStateException
      9
put&#118alue
      public void put&#118alue(String name, Object &#118alue);
      
以给定的名字,绑定给定的对象到session中。已存在的同名的绑定会被重置。这时会调用HttpSessionBindingListener接口的&#118alueBound方法。
      
session无效后再调用这个方法会抛出一个IllegalStateException
      10
remove&#118alue
      public void remove&#118alue(String name);
      
取消给定名字的对象在session上的绑定。如果未找到给定名字的绑定的对象,这个方法什么出不做。 这时会调用HttpSessionBindingListener接口的&#118alueUnbound方法。
      
session无效后再调用这个方法会抛出一个IllegalStateException
      11
setMaxInactiveInterval
      public int setMaxInactiveInterval(int interval);
      
设置一个秒数,这个秒数表示客户端在不发出请求时,sessionServlet引擎维持的最长时间。
      
以下这个方法将被取消\
      12
getSessionContext
      public HttpSessionContext getSessionContext();
      
返回session在其中得以保持的环境变量。这个方法和其他所有HttpSessionContext的方法一样被取消了。

      
四、HttpSessionBindingListener接口
      
定义\
      public interface HttpSessionBindingListener
      
这个对象被加入到HTTPsession中,执行这个接口会通告有没有什么对象被绑定到这个HTTP session中或被从这个HTTP session中取消绑定。
      
方法
      1
&#118alueBound
      public void &#118alueBound(HttpSessionBindingEvent event);
      
当一个对象被绑定到session中,调用此方法。HttpSession.put&#118alue方法被调用时,Servlet引擎应该调用此方法。
      2
&#118alueUnbound
      public void &#118alueUnbound(HttpSessionBindingEvent event);
      
当一个对象被从session中取消绑定,调用此方法。HttpSession.remove&#118alue方法被调用时,Servlet引擎应该调用此方法。

二、HttpServletResponse接口
      
定义\\r

      public interface HttpServletResponse extends ServletResponse
      
描述一个返回到客户端的HTTP回应。这个接口允许Servlet程序员利用HTTP协议规定的头信息。
      
成员变量
      public static final int SC_CONTINUE = 100;
      public static final int SC_SWITCHING_PROTOCOLS = 101;
      public static final int SC_OK = 200;
      public static final int SC_CREATED = 201;
      public static final int SC_ACCEPTED = 202;
      public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
      public static final int SC_NO_CONTENT = 204;
      public static final int SC_RESET_CONTENT = 205;
      public static final int SC_PARTIAL_CONTENT = 206;
      public static final int SC_MULTIPLE_CHOICES = 300;
      public static final int SC_MOVED_PERMANENTLY = 301;
      public static final int SC_MOVED_TEMPORARILY = 302;
      public static final int SC_SEE_OTHER = 303;
      public static final int SC_NOT_MODIFIED = 304;
      public static final int SC_USE_PROXY = 305;
      public static final int SC_BAD_REQUEST = 400;
      public static final int SC_UNAUTHORIZED = 401;
      public static final int SC_PAYMENT_REQUIRED = 402;
      public static final int SC_FORBIDDEN = 403;
      public static final int SC_NOT_FOUND = 404;
      public static final int SC_METHOD_NOT_ALLOWED = 405;
      public static final int SC_NOT_ACCEPTABLE = 406;
      public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
      public static final int SC_REQUEST_TIMEOUT = 408;
      public static final int SC_CONFLICT = 409;
      public static final int SC_GONE = 410;
      public static final int SC_LENGTH_REQUIRED = 411;
      public static final int SC_PRECONDITION_FAILED = 412;
      public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;
      public static final int SC_REQUEST_URI_TOO_LONG = 414;
      public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
      public static final int SC_INTERNAL_SERVER_ERROR = 500;
      public static final int SC_NOT_IMPLEMENTED = 501;
      public static final int SC_BAD_GATEWAY = 502;
      public static final int SC_SERVICE_UNAVAILABLE = 503;
      public static final int SC_GATEWAY_TIMEOUT = 504;
      public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
      
以上HTTP产状态码是由HTTP/1.1定义的。
      
方法
      1
addCookie
      public void addCookie(Cookie cookie);
      
在响应中增加一个指定的cookie。可多次调用该方法以定义多个cookie。为了设置适当的头域,该方法应该在响应被提交之前调用。
      2
containsHeader
      public boolean containsHeader(String name);
      
检查是否设置了指定的响应头。
      3
encodeRedirectURL
      public String encodeRedirectURL(String url);
      
sendRedirect方法使用的指定URL进行编码。如果不需要编码,就直接返回这个URL。之所以提供这个附加的编码方法,是因为在redirect的情况下,决定是否对URL进行编码的规则和一般情况有所不同。所给的URL必须是一个绝对URL。相对URL不能被接收,会抛出一个IllegalArgumentException
      
所有提供给sendRedirect方法的URL都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。
      4
encodeURL
      public String encodeURL(String url);
      
对包含session IDURL进行编码。如果不需要编码,就直接返回这个URLServlet引擎必须提供URL编码方法,因为在有些情况下,我们将不得不重写URL,例如,在响应对应的请求中包含一个有效的session,但是这个session不能被非URL的(例如cookie)的手段来维持。
      
所有提供给ServletURL都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。
      5
sendError
      public void sendError(int statusCode) throws IOException;
      public void sendError(int statusCode, String message) throws
         IOException;
      
用给定的状态码发给客户端一个错误响应。如果提供了一个message参数,这将作为响应体的一部分被发出,否则,服务器会返回错误代码所对应的标准信息。
      
调用这个方法后,响应立即被提交。在调用这个方法后,Servlet不会再有更多的输出。
      6
sendRedirect
      public void sendRedirect(String location) throws IOException;
      
使用给定的路径,给客户端发出一个临时转向的响应(SC_MOVED_TEMPORARILY)。给定的路径必须是绝对URL。相对URL将不能被接收,会抛出一个IllegalArgumentException
      
这个方法必须在响应被提交之前调用。调用这个方法后,响应立即被提交。在调用这个方法后,Servlet不会再有更多的输出。
      7
setDateHeader
      public void setDateHeader(String name, long date);
      
用一个给定的名称和日期值设置响应头,这里的日期值应该是反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。如果响应头已经被设置,新的值将覆盖当前的值。
      8
setHeader
      public void setHeader(String name, String &#118alue);
      
用一个给定的名称和域设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。
      9
setIntHeader
      public void setIntHeader(String name, int &#118alue);
      
用一个给定的名称和整形值设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。
      10
setStatus
      public void setStatus(int statusCode);
      
这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。
      
以下的几个方法将被取消\
      11
encodeRedirectUrl
      public String encodeRedirectUrl(String url);
      
该方法被encodeRedirectURL取代。 
      12
encodeUrl
      public String encodeUrl(String url);
      
该方法被encodeURL取代。 
      13
setStatus
      public void setStatus(int statusCode, String message);
      
这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。如果提供了一个message,它也将会被作为响应体的一部分被发送。

 一、HttpServletRequest接口
      
定义\
      public interface HttpServletRequest extends ServletRequest;
      
用来处理一个对ServletHTTP格式的请求信息。
      
方法
      1
getAuthType
      public String getAuthType();
      
返回这个请求的身份验证模式。
      2
getCookies
      public Cookie[] getCookies();
      
返回一个数组,该数组包含这个请求中当前的所有cookie。如果这个请求中没有cookie,返回一个空数组。
      3
getDateHeader
      public long getDateHeader(String name);
      
返回指定的请求头域的值,这个值被转换成一个反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。
      
如果头域不能转换,抛出一个IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1
      4
getHeader
      public String getHeader(String name);
      
返回一个请求头域的值。(译者注:与上一个方法不同的是,该方法返回一个字符串)
      
如果这个请求头域不存在,这个方法返回-1
      5
getHeaderNames
      public Enumeration getHeaderNames();
      
该方法返回一个String对象的列表,该列表反映请求的所有头域名。
      
有的引擎可能不允许通过这种方法访问头域,在这种情况下,这个方法返回一个空的列表。
      6
getIntHeader
      public int getIntHeader(String name);
      
返回指定的请求头域的值,这个值被转换成一个整数。
      
如果头域不能转换,抛出一个IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1
      7
getMethod
      public String getMethod();
      
返回这个请求使用的HTTP方法(例如:GETPOSTPUT
      8
getPathInfo
      public String getPathInfo();
      
这个方法返回在这个请求的URLServlet路径之后的请求URL的额外的路径信息。如果这个请求URL包括一个查询字符串,在返回值内将不包括这个查询字符串。这个路径在返回之前必须经过URL解码。如果在这个请求的URLServlet路径之后没有路径信息。这个方法返回空值。
      9
getPathTranslated
      public String getPathTranslated();
      
这个方法获得这个请求的URLServlet路径之后的额外的路径信息,并将它转换成一个真实的路径。在进行转换前,这个请求的URL必须经过URL解码。如果在这个URLServlet路径之后没有附加路径信息。这个方法返回空值。
      10
getQueryString
      public String getQueryString();
      
返回这个请求URL所包含的查询字符串。一个查询字串符在一个URL中由一个“?”引出。如果没有查询字符串,这个方法返回空值。
      11
getRemoteUser
      public String getRemoteUser
      
返回作了请求的用户名,这个信息用来作HTTP用户论证。
      
如果在请求中没有用户名信息,这个方法返回空值。
      12
getRequestedSessionId
      public String getRequestedSessionId();
      
返回这个请求相应的session id。如果由于某种原因客户端提供的session id是无效的,这个session id将与在当前session中的session id不同,与此同时,将建立一个新的session
      
如果这个请求没与一个session关联,这个方法返回空值。
      13
getRequestURI
      public String getRequestURI();
      
HTTP请求的第一行返回请求的URL中定义被请求的资源的部分。如果有一个查询字符串存在,这个查询字符串将不包括在返回值当中。例如,一个请求通过/catalog/books?id=1这样的URL路径访问,这个方法将返回/catalog/books。这个方法的返回值包括了Servlet路径和路径信息。
      
如果这个URL路径中的的一部分经过了URL编码,这个方法的返回值在返回之前必须经过解码。
      14
getServletPath
      public String getServletPath();
      
这个方法返回请求URL反映调用Servlet的部分。例如,一个Servlet被映射到/catalog/summer这个URL路径,而一个请求使用了/catalog/summer/casual这样的路径。所谓的反映调用Servlet的部分就是指/catalog/summer
      
如果这个Servlet不是通过路径匹配来调用。这个方法将返回一个空值。
      15
getSession
      public HttpSession getSession();
      public HttpSession getSession(boolean create);
      
返回与这个请求关联的当前的有效的session。如果调用这个方法时没带参数,那么在没有session与这个请求关联的情况下,将会新建一个session。如果调用这个方法时带入了一个布尔型的参数,只有当这个参数为真时,session才会被建立。
      
为了确保session能够被完全维持。Servlet开发者必须在响应被提交之前调用该方法。
      
如果带入的参数为假,而且没有session与这个请求关联。这个方法会返回空值。
      16
isRequestedSessionIdValid
      public boolean isRequestedSessionIdValid();
      
这个方法检查与此请求关联的session当前是不是有效。如果当前请求中使用的session无效,它将不能通过getSession方法返回。
      17
isRequestedSessionIdFromCookie
      public boolean isRequestedSessionIdFromCookie();
      
如果这个请求的session id是通过客户端的一个cookie提供的,该方法返回真,否则返回假。
      18
isRequestedSessionIdFromURL
      public boolean isRequestedSessionIdFromURL();
      
如果这个请求的session id是通过客户端的URL的一部分提供的,该方法返回真,否则返回假。请注意此方法与isRequestedSessionIdFromUrlURL的拼写上不同。
      
以下方法将被取消\\r

      19
isRequestedSessionIdFromUrl
      public boolean isRequestedSessionIdFromUrl();
      
该方法被isRequestedSessionIdFromURL代替。

这是一份关于2.1Java Servlet API的说明文档,作为对这本文档的补充,你可以到http://java.sun.com/products/servlet/index.html下面下载Javadoc格式的文档。

      
谁需要读这份文档
      
这份文档描述了Java Servlet API的最新版本2.1版。所以,这本书对于Servlet的开发者及servlet引擎的开发者同样适用。

      Java Servlet API
的组成
      Java Servlet API
由两个软件包组成:一个是对应HTTP的软件包,另一个是不对应HTTP的通用的软件包。这两个软件包的同时存在使得Java Servlet API能够适应将来的其他请求-响应的协议。
      
这份文档以及刚才提及的Javadoc格式的文档都描述了这两个软件包,Javadoc格式的文档还描述了你应该如何使用这两个软件包中的所有方法。

      
有关规范
      
你也许对下面的这些Internet规范感兴趣,这些规范将直接影响到Servlet API的发展和执行。你可以从http://info.internet.isi.edu/7c/in-notes/rfc/.cache 找到下面提到的所有这些RFC规范。
      RFC 1738 
统一资源定位器(URL) 
      RFC 1808 
相关统一资源定位器 
      RFC 1945 
超文本传输协议–HTTP/1.0 
      RFC 2045 
多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第一部分:Internet信息体格式 
      RFC 2046 
多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第二部分:媒体类型 
      RFC 2047 
多用途网际邮件扩充协议(MIME)(多用途Internet邮件扩展)第三部分:信息标题扩展用于非ASCII文本 
      RFC 2048 
多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第四部分注册步骤 
      RFC 2049 
多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第五部分:一致性标准和例子 
      RFC 2068 
超文本传输协议 – HTTP/1.1 
      RFC 2069 
一个扩展HTTP:摘要访问鉴定 
      RFC 2109 HTTP
状态管理机制 
      RFC 2145 HTTP 
版本号的使用和解释 
      RFC 2324 
超文本Coffee Pot控制协议 (HTCPCP/1.0)
      
万维网协会(http://www.w3.org)管理着这些协议的规范和执行。


有关Java Servlets
      JavaTM servlets
是一个不受平台约束的Java小程序,它可以被用来通过多种方法扩充一个Web服务器的功能。你可以把Servlet理解成Server上的applets,它被编译成字节码,这样它就可以被动态地载入并用效地扩展主机的处理能力。
      Servlet
applets不同的地方是,它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。
      
一个客户端程序,可以是一个Web浏览器,或者是非其他的可以连接上Internet的程序,它会访问Web服务器并发出请求。这个请求被运行在Web服务器上的Servlet引擎处理,并返回响应到ServletServlet通过HTTP将这个响应转发到客户端。
在功能上,ServletCGINSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。

      Java Servlet
概论
      Servlet
与其他普通的server扩展机制有以下进步:
      
因为它采用了不同的进程处理模式,所以它比CGI更快。
      
它使用了许多Web服务器都支持的标准的API
      
它继承了Java的所有优势,包括易升级以及平台无关性。
      
它可以调用Java所提供的大量的API的功能模块。
      
这份文档说明了Java Servlet API的类和接口的方法。有关更多的信息,请参看下面的API说明。

      Servlet
的生命周期
      
一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet如何被载入并被初始化,如何接收请求并作出对请求的响应,如何被从服务中清除。Servlet的生命周期被javax.servlet.Servlet这个接口所定义。
      
所有的Java Servlet都会直接地或间接地执行javax.servlet.Servlet接口,这样它才能在一个Servlet引擎中运行。Servlet引擎是Web 服务器按照Java Servlet API定制的扩展。Servlet引擎提供网络服务,能够理解MIME请求,并提供一个运行Servlet的容器。
      javax.servlet.Servlet
接口定义了在Servlet的生命周期中特定时间以及特定顺序被调用的方法。

      Servlet
的解析和载入\r
      Servlet
引擎解析并载入一个Servlet,这个过程可以发生在引擎启动时,需要一个Servlet去响应请求时,以及在此之间的任何时候。
      Servlet
引擎利用Java类载入工具载入一个ServletServlet引擎可以从一个本地的文件系统、一个远程的文件系统以及网络载入Servlet

      Servlet
的初始化
      Servlet
引擎载入Servlet后,Servlet引擎必须对Servlet进行初始化,在这一过程中,你可以读取一些固定存储的数据、初始化JDBC的连接以及建立与其他资源的连接。
      
在初始化过程中,javax.servlet.Servlet接口的init()方法提供了Servlet的初始化信息。这样,Servlet可以对自己进行配置。
      init()
方法获得了一个Servlet配置对象(ServletConfig)。这个对象在Servlet引擎中执行,并允许Servlet通过它获处相关参数。这个对象使得Servlet能够访问ServletContext对象。

      Servlet
处理请求\r
      Servlet
被初始化之后,它已经可以处理来自客户端的请求,每一个来自客户端的请求都被描述成一个ServletRequest对象,Servlet的响应被描述成一个ServletResponse对象。
      
当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。
      Servlet
也可以执行ServletRequest接口和ServletResponse接口。ServletRequest接口使得Servlet有权使用客户端发出的请求。Servlet可以通过ServletInputStream对象读取请求信息。
      ServletResponse
接口允许Servlet建立响应头和状态代码。通过执行这个接口,Servlet有权使用ServletOutputStream类来向客户端返回数据。

      
多线程和映射\r
      
在多线程的环境下,Servlet必须能处理许多同时发生的请求。例外的情况是这个Servlet执行了SingleThreadModel接口,如果是那样的话,Servlet只能同时处理一个请求。
      Servlet
依照Servlet引擎的映射来响应客户端的请求。一个映射对包括一个Servlet实例以及一个Servlet返回数据的URL,例如:HelloServlet with /hello/index.html
      
然而,一个映射可能是由一个URL和许多Servlet实例组成,例如:一个分布式的Servlet引擎可能运行在不止一个的服务器中,这样的话,每一个服务器中都可能有一个Servlet实例,以平衡进程的载入。作为一个Servlet的开发者,你不能假定一个Servlet只有一个实例。

      Servlet
的卸载
      Servlet
引擎并不必需保证一个Servlet在任何时候或在服务开启的任何时候都被载入。Servlet引擎可以自由的在任何时候使用或清除一个Servlet。因此,我们不能依赖一个类或实例来存储重要的信息。
      
Servlet引擎决定卸载一个Servlet时(例如,如果这个引擎被关闭或者需要让资源),这个引擎必须允许Servlet释放正在使用的资源并存储有关资料。为了完成以上工作,引擎会调用Servletdestroy()方法。 
      
在卸载一个Servlet之前,Servlet引擎必须等待所有的service()方法完成或超时结束(Servlet引擎会对超时作出定义)。当一个Servlet被卸载时,引擎将不能给Servlet发送任何请求。引擎必须释放Servlet并完成无用存储单元的收集

      Servlet
映射技术\r
      
作为一个Servlet引擎的开发者,你必须对于如何映射客户端的请求到Servlet有大量的适应性。这份说明文档不规定映射如何发生。但是,你必须能够自由地运用下面的所有技术:

      
映射一个Servlet到一个URL
      
例如,你可以指定一个特殊的Servlet它仅被来自/feedback/index.html的请求调用。

      
映射一个Servlet到以一个指定的目录名开始的所有URL
      
例如,你可以映射一个Servlet/catalog,这样来自/catalog/ /catalog/garden/catalog/housewares/index.html的请求都会被映射到这个Servlet。但是来自/catalogtwo /catalog.html的请求没被映射。

      
映射一个Servlet到所有以一个特定的字段结尾的所有URL
      
例如,你可以映射一个来自于所有以in.thtml结尾的请求到一个特定的Servlet

      
映射一个Servlet到一个特殊的URL /servlet/servlet_name
      
例如,如果你建立了一个名叫listattributesServlet,你可以通过使用/servlet/listattributes来访问这个Servlet

      
通过类名调用Servlet
      
例如,如果Servlet引擎接收了来自/servlet/com.foo.servlet.MailServlet的请求,Servlet引擎会载入这个com.foo.servlet.MailServlet类,建立实例,并通过这个Servlet来处理请求。

      Servlet
环境
      ServletContext
接口定义了一个Servlet环境对象,这个对象定义了一个在Servlet引擎上的Servlet的视图。通过使用这个对象,Servlet可以记录事件、得到资源并得到来自Servlet引擎的类(例如RequestDispatcher对象)。一个Servlet只能运行在一个Servlet环境中,但是不同的Servlet可以在Servlet引擎上有不同的视图。
      
如果Servlet引擎支持虚拟主机,每个虚拟主机有一个Servlet环境。一个Servlet环境不能在虚拟主机之间共享。
      Servlet
引擎能够允许一个Servlet环境有它自己的活动范围。
      
例如,一个Servlet环境是属于bank应用的,它将被映射到/bank目录下。在这种情况下,一个对getContext方法的调用会返回/bankServlet环境。

      HTTP
会话
      HTTP
是一个没有状态的协议。要建立一个有效的Web服务应用,你必须能够识别一个连续的来自远端的客户机的唯一的请求。随着时间的过去,发展了许多会话跟踪的技术,但是使用起来都比较麻烦。
      Java Servlet API
提供了一个简单的接口,通过这个接口,Servlet引擎可以有效地跟踪用户的会话。

      
建立Session
      
因为HTTP是一个请求-响应协议,一个会话在客户机加入之前会被认为是一个新的会话。加入的意思是返回会话跟踪信息到服务器中,指出会话已被建立。在客户端加入之前,我们不能判断下一个客户端请求是目前会话的一部分。
      
在下面的情况下,Session会被认为是新的Session
      
客户端的Session在此之前还不知道
      
客户端选择不加入Session,例如,如果客户端拒绝接收来自服务器的cookie
作为一个Servlet的开发者,你必须决定你的Web应用是否处理客户机不加入或不能加入Session。服务器会在Web服务器或Servlet规定的时间内维持一个Session对象。当Session终止时,服务器会释放Session对象以及所有绑定在Session上的对象。
绑定对象到Session
      
如果有助于你处理应用的数据需求,你也许需要绑定对象到Session中,你可以通过一个唯一的名字绑定任何的对象到Session中,这时,你需要使用HttpSession对象。任何绑定到Session上的对象都可以被处理同一会话的Servlet调用。
      
有些对象可能需要你知道什么时候会被放置到Session中或从Session中移开。你可以通过使用HttpSessionBindingListener接口获得这些信息。当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener检杳什么类被绑定或被取消绑定。这个接口的方法会通报被绑定或被取消绑定的对象。

        软件包:javax.servlet.http 
      
所包含的接口:HttpServletRequestHttpServletResponseHttpSessionHttpSessionBindingListenerHttpSessionContext
      
所包含的类:CookieHttpServletHttpSessionBindingEventHttpUtils

2005年11月14日

一、准备安装程序

       1JDK 5.0 安装程序下载

       下载地址:

https://jsecom15b.sun.com/ECom/EComActionServlet/DownloadPage:~:com.sun.sunit.sdlc.content.DownloadPageInfo;jsessionid=502E87C71D77E3BC297C08B35DAC9AD4;jsessionid=502E87C71D77E3BC297C08B35DAC9AD4

同意协议后,可以下载jdk-1_5_0_05-windows-i586-p.exe

       2tomcat 5.5.9下载

下载地址:http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi

最新版本是5.5.11alpha版,由于是测试版,所以,可能存在不确定的因素,所以,我们这里下载5.5.9 exe

      

       3Sysdeo Eclipse Tomcat Launcher plugin 3.1beta版下载

       下载地址:http://www.sysdeo.com/eclipse/tomcatplugin

       这里下载tomcatPluginV31beta.zip

       4eclipse 3.1安装程序下载

       下载地址:http://www.eclipse.org/downloads/index.php

       这里需要对应版本的JDT,如果下载的是Eclipse SDK版本就自带了,如果没有,同一个下载页面的靠后部分有JDT的下载链接,下载后将对应的文件分别拷贝进eclipse安装目录下的对应的文件夹即可。

       这里我们下载eclipse-SDK-3.1-win32.zip

      

       5GEF 3.1 安装程序下载

       下载地址:

http://download.eclipse.org/tools/gef/downloads/drops/R-3.1-200507071758/index.php

这里我们下载GEF-ALL-3.1.zip

        6Eclipse HTML Editor 1.6.7 安装程序下载

下载地址:https://sourceforge.jp/projects/amateras/files/

这里我们下载:tk.eclipse.plugin.htmleditor_1.6.6.zip

        7StrutsIDE 1.1.6 安装程序下载

下载地址:https://sourceforge.jp/projects/amateras/files/

这里我们下载:tk.eclipse.plugin.struts_1.1.6.zip

OK,到此我们准备好了所有的安装包。

二、安装JDK并配置开发环境

       这里只需要双击JDK安装包的exe文件,按照提示安装即可。安装完成后,将JDK安装目录下的bin文件夹设置进环境变量的path路径中去。同时,将JRElib目录下的rt.jar包设置进环境变量的classpath中去。

       这里我们把JDK安装到了默认安装路径C:\Program Files\Java\jdk1.5.0_02下。

       这里就不多说了,网上可以搜索到很多JDK安装配置的文章。

三、安装tomcat服务器

       只需要双击tomcat安装包的exe文件,按照提示安装即可,这里我们的安装目录为D:\Tomcat5.5,管理员密码设置为12345678

       网上的资料也很多,就不多说了。

四、安装Eclipse开发工具

       只需要把eclipse-SDK-3.1-win32.zip安装包解压,然后把里面的eclipse文件夹剪切至想放置的目录即可,这里我们把eclipse安装到了D:\eclipse目录下。

       在安装目录下双击eclipse.exe文件,即可启动eclipse。中间会询问默认的工作目录,你可以按其默认设定的,也可以自己设定工作目录,这里设置为E:\workspace目录。请选中Use this as the default and do not ask again选项,这样以后启动就不会再询问了。

       到此eclipse安装成功。

五、安装tomcatPlugin插件

       安装很简单,解压我们已经下载的安装包tomcatPluginV31beta.zip,将解压后的com.sysdeo.eclipse.tomcat_3.1.0.beta文件夹拷贝至D:\eclipse\plugins目录下即可。我们关掉已经打开的eclipse,重新打开,OK,现在我们会发现工具栏上多了几个雄猫的图标,就是tomcat的启动、停止和重启动的按钮。打开eclipsewindow/preferences,我们在左边的树种也可以找到tomcat一项。

       点击tomcat项,在右边我们选择version 5.x版本,然后设定tomcat homeD:\Tomcat5.5Contexts directoryD:\Tomcat5.5\conf\Catalina\localhost。到此tomcat plugin设置完毕。

六、安装GEF插件

       同样,将GEF-ALL-3.1.zip解压缩,然后拷贝解压后的eclipse目录下的三个文件夹到D:\eclipse目录下,覆盖所有的现有文件夹。

       OK,到此GEF安装完成。

七、安装Eclipse HTML Editor插件

       解压缩tk.eclipse.plugin.htmleditor_1.6.6.zip包,然后将plugins目录拷贝至D:\eclipse目录下覆盖原文件夹即可。

       OK,到此Eclipse HTML Editor插件安装完成。

八、安装StrutsIDE插件

       解压缩tk.eclipse.plugin.struts_1.1.6.zip包,然后将plugins目录拷贝至D:\eclipse目录下覆盖原文件夹即可。

       OK,到此StrutsIDE插件安装完成。

2005年11月12日

以下所说的struts-config.xml和ApplicationResources.properties等文件名是缺省时使用的,如果你使用了多模块,或指定了不同的资源文件名称,这些名字要做相应的修改。

1、“No bean found under attribute key XXX”
在struts-config.xml里定义了一个ActionForm,但type属性指定的类不存在,type属性的值应该是Form类的全名。或者是,在Action的定义中,name或attribute属性指定的ActionForm不存在。


2、“Cannot find bean XXX in any scope”
在Action里一般会request.setAttribute()一些对象,然后在转向的jsp文件里(用tag或request.getAttribute()方法)得到这些对象并显示出来。这个异常是说jsp要得到一个对象,但前面的Action里并没有将对象设置到request(也可以是session、servletContext)里。
可能是名字错了,请检查jsp里的tag的一般是name属性,或getAttribute()方法的参数值;或者是Action逻辑有问题没有执行setAttribute()方法就先转向了。
还有另外一个可能,纯粹是jsp文件的问题,例如<logic:iterate>会指定一个id值,然后在循环里<bean:write>使用这个值作为name的值,如果这两个值不同,也会出现此异常。(都是一个道理,request里没有对应的对象。)


3、“Missing message for key "XXX"”
缺少所需的资源,检查ApplicationResources.properties文件里是否有jsp文件里需要的资源,例如:


<bean:message key="msg.name.prompt"/>

这行代码会找msg.name.prompt资源,如果AppliationResources.properties里没有这个资源就会出现本异常。在使用多模块时,要注意在模块的struts-config-xxx.xml里指定要使用的资源文件名称,否则当然什么资源也找不到,这也是一个很容易犯的错误。

4、“No getter method for property XXX of bean teacher”
这条异常信息说得很明白,jsp里要取一个bean的属性出来,但这个bean并没有这个属性。你应该检查jsp中某个标签的property属性的值。例如下面代码中的cade应该改为code才对:

<bean:write name="teacher" property="cade" filter="true"/>


5、“Cannot find ActionMappings or ActionFormBeans collection”
待解决。

6、“Cannot retrieve mapping for action XXX”
在.jsp的<form>标签里指定action=’/XXX’,但这个Action并未在struts-config.xml里设置过。

7、HTTP Status 404 – /xxx/xxx.jsp
Forward的path属性指向的jsp页面不存在,请检查路径和模块,对于同一模块中的Action转向,path中不应包含模块名;模块间转向,记住使用contextRelative="true"。

8、没有任何异常信息,显示空白页面
可能是Action里使用的forward与struts-config.xml里定义的forward名称不匹配。


9、“The element type "XXX" must be terminated by the matching end-tag "XXX".”
这个是struts-config.xml文件的格式错误,仔细检查它是否是良构的xml文件,关于xml文件的格式这里就不赘述了。

10、“Servlet.init() for servlet action threw exception”
一般出现这种异常在后面会显示一个关于ActionServlet的异常堆栈信息,其中指出了异常具体出现在代码的哪一行。我曾经遇到的一次提示如下:

java.lang.NullPointerException
    at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:1003)
    at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:955)


为解决问题,先下载struts的源码包,然后在ActionServlet.java的第1003行插入断点,并对各变量进行监视。很丢人,我竟然把struts-config.xml文件弄丢了,因此出现了上面的异常,应该是和CVS同步时不小心删除的。

11、“Resources not defined for Validator”
这个是利用Validator插件做验证时可能出现的异常,这时你要检查validation.xml文件,看里面使用的资源是否确实有定义,form的名称是否正确,等等。

以下所说的struts-config.xml和ApplicationResources.properties等文件名是缺省时使用的,如果你使用了多模块,或指定了不同的资源文件名称,这些名字要做相应的修改。

1、“No bean found under attribute key XXX”
在struts-config.xml里定义了一个ActionForm,但type属性指定的类不存在,type属性的值应该是Form类的全名。或者是,在Action的定义中,name或attribute属性指定的ActionForm不存在。


2、“Cannot find bean XXX in any scope”
在Action里一般会request.setAttribute()一些对象,然后在转向的jsp文件里(用tag或request.getAttribute()方法)得到这些对象并显示出来。这个异常是说jsp要得到一个对象,但前面的Action里并没有将对象设置到request(也可以是session、servletContext)里。
可能是名字错了,请检查jsp里的tag的一般是name属性,或getAttribute()方法的参数值;或者是Action逻辑有问题没有执行setAttribute()方法就先转向了。
还有另外一个可能,纯粹是jsp文件的问题,例如<logic:iterate>会指定一个id值,然后在循环里<bean:write>使用这个值作为name的值,如果这两个值不同,也会出现此异常。(都是一个道理,request里没有对应的对象。)


3、“Missing message for key "XXX"”
缺少所需的资源,检查ApplicationResources.properties文件里是否有jsp文件里需要的资源,例如:


<bean:message key="msg.name.prompt"/>

这行代码会找msg.name.prompt资源,如果AppliationResources.properties里没有这个资源就会出现本异常。在使用多模块时,要注意在模块的struts-config-xxx.xml里指定要使用的资源文件名称,否则当然什么资源也找不到,这也是一个很容易犯的错误。

4、“No getter method for property XXX of bean teacher”
这条异常信息说得很明白,jsp里要取一个bean的属性出来,但这个bean并没有这个属性。你应该检查jsp中某个标签的property属性的值。例如下面代码中的cade应该改为code才对:

<bean:write name="teacher" property="cade" filter="true"/>


5、“Cannot find ActionMappings or ActionFormBeans collection”
待解决。

6、“Cannot retrieve mapping for action XXX”
在.jsp的<form>标签里指定action=’/XXX’,但这个Action并未在struts-config.xml里设置过。

7、HTTP Status 404 – /xxx/xxx.jsp
Forward的path属性指向的jsp页面不存在,请检查路径和模块,对于同一模块中的Action转向,path中不应包含模块名;模块间转向,记住使用contextRelative="true"。

8、没有任何异常信息,显示空白页面
可能是Action里使用的forward与struts-config.xml里定义的forward名称不匹配。


9、“The element type "XXX" must be terminated by the matching end-tag "XXX".”
这个是struts-config.xml文件的格式错误,仔细检查它是否是良构的xml文件,关于xml文件的格式这里就不赘述了。

10、“Servlet.init() for servlet action threw exception”
一般出现这种异常在后面会显示一个关于ActionServlet的异常堆栈信息,其中指出了异常具体出现在代码的哪一行。我曾经遇到的一次提示如下:

java.lang.NullPointerException
    at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:1003)
    at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:955)


为解决问题,先下载struts的源码包,然后在ActionServlet.java的第1003行插入断点,并对各变量进行监视。很丢人,我竟然把struts-config.xml文件弄丢了,因此出现了上面的异常,应该是和CVS同步时不小心删除的。

11、“Resources not defined for Validator”
这个是利用Validator插件做验证时可能出现的异常,这时你要检查validation.xml文件,看里面使用的资源是否确实有定义,form的名称是否正确,等等。