用PHP建立XML-RPC的Web Sevice系統

PHP 中集成了XML-RPC和SOAP两种协议的访问,都是集中在xmlrpc扩展当中。另外,在PHP的PEAR中,不管是 PHP 4还是PHP 5,都已经默认集成了XML-RPC扩展,而且该扩展跟xmlrpc扩展无关,能够独立实现XML-RPC的协议交互,如果没有xmlrpc扩展,建议使用PEAR::XML-RPC扩展。
Web Service介绍

Web Service就是为了异构系统的通信而产生的,它基本的思想就是使用基于XML的HTTP的远程调用提供一种标准的机制,而省去建立一种新协议的需求。目前进行Web Service通信有两种协议标准,一种是XML-RPC,另外一种是SOAP。 XML-RPC比较简单,出现时间比较早,SOAP比较复杂,主要是一些需要稳定、健壮、安全并且复杂交互的时候使用。

我们这里主要是以XML-RPC来简单描述Web Service的交互过程,部分内容来自PHP手册,更详细内容,建议参考手册。

 

安 装xmlrpc扩展

如果你的系统中没有安装xmlrpc的php扩展,那么请正确安装。

在Windows平台下,首先把PHP安装目录下的扩展php_xmlrpc.dll放到C:\Windows或者C:\Winnt 目录下,(PHP4的扩展在C:\php\extensions目录中,PHP5的扩展在C: \php\ext目录中),同时在C:\Windows\php.ini或者C: \Winnt\php.ini中把extension=php_xmlrpc.dll前面的分号";"去掉,然后重启Web服务器后查看phpinfo()有没有XML-RPC项目就能够确定是否已经正确安装xmlrpc扩展。

在Unix/Linux平台下,如果没有安装xmlrpc扩展,请在重新编译PHP,在configure的时候请加入 --with-xmlrpc 选项,然后查看phpinfo()看是否正常安装xmlrpc。

(注意:以下操作都是建立在xmlrpc扩张正常安装前提下,请务必正确安装。)

 

XML-RPC工作原理

XML-RPC大致就是整个过程就是使用XML 来进行通信。首先构造一个RPC 服务器端用来出来从RPC客户端传递过来的使用XML封装的请求,并且把处理结果通过XML的形式返回给RPC客户端,客户端就去分析XML获取自己需要 的数据。

XML-RPC的服务器端必须有现成的函数提供给客户端调用, 并且客户端提交的请求中的函数和方法必须和服务器端的一致,否则将无法获取所需要的结果。

下 面我进行简单的代码来描述整个过程。

 

XML-RPC实践

服务器端使用xmlrpc_server_create函数产生一个服务器端,然后把需要需要暴露的RPC调用接口进行注册,接受 RPC客户端POST过来的XML数据,然后进行处理,处理结果通过XML的形式显示给客户端。

代码如下: rpc_server.php

<?php

/**

* 函数:提供给RPC客户端调用的函数

* 参数:

* $method 客户端需要调用的函数

* $params 客户端需要调用的函数的参数数组

* 返回:返回指定调用结果

*/

function rpc_server_func($method, $params) {

$parameter = $params[0];

if ($parameter == "get"){

$return = ''This data by get method'';

}else{

$return = ''Not specify method or params'';

}

return $return;

}

//产生一个XML-RPC的服务器端

$xmlrpc_server = xmlrpc_server_create();

//注册一个服务器端调用的方法rpc_server,实际指向的是rpc_server_func函数

xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func");

//接受客户端POST过来的XML数据

$request = $HTTP_RAW_POST_DATA;

// 执行调用客户端的XML请求后获取执行结果

$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null);

//把函数处理后的结果XML进行输出

header(''Content-Type: text/xml'');

echo $xmlrpc_response;

//销毁XML-RPC服务器端资源

xmlrpc_server_destroy($xmlrpc_server);

?>

服务器端构造好了,那么再构造我们的RPC客户端。客户端大致通过Socket访问XML-RPC服务器端的80端口,然后把需要调用的RPC接口封装到XML里,通过POST请求提 交给RPC服务器端,最后获取服务器端返回结果。

代码如下:rpc_client.php

<?php

/**

* 函数:提供给客户端进行连接XML-RPC服务器端的函数

* 参数:

* $host 需要连接的主机

* $port 连接主机的端口

* $rpc_server XML-RPC服务器端文件

* $request 封装的XML请求信息

* 返回:连接成功成功返回由服务器端返回的XML信息,失败返回false

*/

function rpc_client_call($host, $port, $rpc_server, $request) {

//打开指定的服务器端

$fp = fsockopen($host, $port);

//构造需要进行通信的XML-RPC 服务器端的查询POST请求信息

$query = "POST $rpc_server HTTP/1.0\nUser_Agent: XML-RPC
Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length:
".strlen($request)."\n\n".$request."\n";

//把构造好的HTTP协议发送给服务器,失败返回false

if (!fputs($fp, $query, strlen($query))) {

$errstr = "Write error";

return false;

}

//获取从服务器端返回的所有信息,包括HTTP 头和XML信息

$contents = '''';

while (!feof($fp)){

$contents .= fgets($fp);

}

// 关闭连接资源后返回获取的内容

fclose($fp);

return $contents;

}

//构造连接RPC服务器端的信息

$host = ''localhost'';

$port = 80;

$rpc_server = ''/~heiyeluren/rpc_server.php'';

//把需要发送的XML请求进行编码成XML,需要调用的方法是rpc_server,参数是get

$request = xmlrpc_encode_request(''rpc_server'', ''get'');

//调用rpc_client_call函数把所有请求发送给XML-RPC服务器端后获取信息

$response = rpc_client_call($host, $port, $rpc_server, $request);

//分析从服务器端返回的XML,去掉HTTP头信息,并且把XML 转为PHP能识别的字符串

$split = ''<?phpxml version=?>1.0" encoding="iso-8859-1""'';

$xml = explode($split, $response);

$xml = $split . array_pop($xml);

$response = xmlrpc_decode($xml);

//输出从RPC服务器端获取的信息

print_r($response);

?>

大致我们上面的例子就是提交一个叫做rpc_server的方法过去,参数是get,然后获取服务器端的返回,服务器端返回的XML 数据是:

<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<string>This data by get method</string>
</value>
</param>
</params>
</methodResponse>

那么我们再通过 xmlrpc_decode函数把这个XML编码为PHP的字符串,我们就能够随意处理了,整个Web Service交互完成。


结束语

不管是XML-RPC也好,SOAP也罢, 只要能够让我们稳定、安全的进行远程过程的调用,完成我们的项目,那么就算整个Web Service就是成功的。另外,如果可以的话,也可以尝试使用PEAR中的XML-RPC来实现上面类似的操作,说不定会更简单,更适合你使 用。

简单的使用XML-RPC进行Web Service交互就完成了,部分代码参考PHP手册,想获取详细信息建议参考手册,如果文章有不正确,请指正。

很实用的一篇HTTP状态码

100系列码

从100到199范围的HTTP状态码是信息报告码。基于各种原因考虑,大多数情况下我们 是很少看见这些代码的。首先,如果一个浏览器尝试访问一个网站,而网站返回这些代码时,它们往往都不会显示在屏幕上。它们只是浏览器使引用的内部码。另 外,这些代码不常见的另外一个原因是起初HTTP标准不允许使用这一范围的状态码。就其本身而言,它们也一直没有被广泛地使用。

200系列码

从200到299范围的状态码是操作成功代码。同样的,在正常的Web上网中,你也很可能 不曾在屏幕上看到这些代码。相反的,这些代码是在浏览器内部使用的,用以确认操作成功确认和当前请求状态。虽然这些代码通常不显示,但是有一些故障排除工 具能够读到它们,就像和其它大多数的HTTP状态码一样,它们在错误诊断过程中是非常有用的。

300系列码

从300到399范围的状态码是重定向代码。本质上,它们告诉Web浏览器必须执行其它一 些操作以完成请求。基于这个命令的特点,它可以自动地执行,或者要求额外的用户输入。比如,状态码301表示一个特定资源已经被永久地先移除,因此将来所 有访问该资源请求都应该定向到一个特定的URL上。

400系列码

在400范围的状态码是客户端错误码。这种类型的错误码往往跟安全相关。比如,如果一个客 户端尝试访问一个未授权访问的资源,服务器就会返回一个状态码401。类似地,如果客户端尝试访问一个禁止的资源,在这种情况下客户端的认证状态是一样 的,那么服务器可能会返回一个状态码403,表示禁止对该资源进行访问。

如果请求不正确或客户端超时,400级错误码也可能被返回。然而,有一个400级的代码总 是具有误导性:404。虽然这个代码在技术上被归类为客户端错误,但是事实上它可以同时表示客户端或服务器上的错误。但这个错误码只是简单地显示为没有找 到请求的资源。当这个错误发生在客户端时,它往往表示的是网络连接问题。在其他时候,这个错误的发生还可能是由于资源已从服务器上转移或重命名而造成的。

500系列码

500级状态码表示的是服务器错误。比如,如果Web服务器超时,它就会产生一个504错 误。虽然,一个500级的错误往往表示的不是服务器的问题,而是在服务器上运行的Web应用的问题。比如,我自己的个人网站是用ASP编写的,它负责动态 生成HTML网页。在调试的过程中,有Bug的代码总会导致我的Web服务器返回HTTP状态码500,该代码是一般表示内部服务器错误。这个代码只是出 现问题了,并且HTTP无法解决该问题。

—————————————–

1xx – 信息提示

“100″:Continue

“101″:witchingProtocols

2xx – 成功

“200″:OK

“201″:Created

“202″:Accepted

“203″:Non-AuthoritativeInformation

“204″:NoContent

“205″:ResetContent

“206″:PartialContent

3xx – 重定向

“300″:MultipleChoices

“301″:MovedPermanently

“302″:Found

“303″:SeeOther

“304″:NotModified

“305″:UseProxy

“307″:TemporaryRedirect

4xx – 客户端错误

“400″:BadRequest

“401″:Unauthorized

“402″:PaymentRequired

“403″:Forbidden

“404″:NotFound

“405″:MethodNotAllowed

“406″:NotAcceptable

“407″:ProxyAuthenticationRequired

“408″:RequestTime-out

“409″:Conflict

“410″:Gone

“411″:LengthRequired

“412″:PreconditionFailed

“413″:RequestEntityTooLarge

“414″:Request-URITooLarge

“415″:UnsupportedMediaType

“416″:Requestedrangenotsatisfiable

“417″:ExpectationFailed

5xx – 服务器错误

“500″:InternalServerError

“501″:NotImplemented

“502″:BadGateway

“503″:ServiceUnavailable

“504″:GatewayTime-out

“505″:HTTPVersionnotsupported

状态代码状态信息含义
100Continue初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)
101Switching Protocols服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)
200OK一切正常,对GET和POST请求的应答文档跟在后面。
201Created服务器已经创建了文档,Location头给出了它的URL。
202Accepted已经接受请求,但处理尚未完成。
203Non-Authoritative Information文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。
204No Content没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205Reset Content没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。
206Partial Content客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。
300Multiple Choices客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
301Moved Permanently客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
302Found类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。

注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器 返回301,有的则返回302。

严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

303See Other类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。
304Not Modified客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告 诉客户,原来缓冲的文档还可以继续使用。
305Use Proxy客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。
307Temporary Redirect和302 (Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定 向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只 能跟随对GET请求的重定向。(HTTP 1.1新)
400Bad Request请求出现语法错误。
401Unauthorized客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填 写合适的Authorization头后再次发出请求。
403Forbidden资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
404Not Found无法找到指定位置的资源。这也是一个常用的应答。
405Method Not Allowed请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)
406Not Acceptable指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。
407Proxy Authentication Required类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)
408Request Timeout在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)
409Conflict通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)
410Gone所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而 404表示由于未知的原因文档不可用。(HTTP 1.1新)
411Length Required服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)
412Precondition Failed请求头中指定的一些前提条件失败(HTTP 1.1新)。
413Request Entity Too Large目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。
414Request URI Too LongURI太长(HTTP 1.1新)。
416Requested Range Not Satisfiable服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)
500Internal Server Error服务器遇到了意料不到的情况,不能完成客户的请求。
501Not Implemented服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。
502Bad Gateway服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。
503Service Unavailable服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个 Retry-After头。
504Gateway Timeout由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)
505HTTP Version Not Supported服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)

兼容ie FF 多浏览器的js获取url参数

<script language="javascript" type="text/javascript">
//js获取url参数的function
function request(paras){
var url = location.href;   //url
var paraString = url.substring(url.indexOf("?")+1,url.length).split("&");  
var paraObj = {}   //参数组
for (i=0; j=paraString[i]; i++){  
paraObj[j.substring(0,j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf
("=")+1,j.length);  
}  
var returnValue = paraObj[paras.toLowerCase()];  
if(typeof(returnValue)=="undefined"){  
return "";  
}else{  
return returnValue;  
}  
}
var theurl
theurl=request("url");
if (theurl!=''){
location=theurl
}
</script>

Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决篇

在系统中出现乱码一般是编码设定和编码转换问题,那么我们来看看当中有多少编码设定和编码转换的呢?



显示界面,JSP 2.0      

JAVA容器:Tomcat 5.X

MVC构架:Struts 1.2

ORM工具:Hibernate 3

数据库:MySQL   5.0

编译IDE:MyEclipse 5.0



知道了有六个地方要设定编码,那么哪种编码最好呢?使用中文可以GBK,但我认为UTF-8会是更好的选择,如果想知道了解编码的更多细节,请访问:

计算机编码大全-A

计算机编码大全-B



好现在选定UTF-8,在上面的这六个地方一一设定吧:



显示界面,JSP

       在页面的开头加入或修改成:<%@ page language="java" pageEncoding="utf-8"%> 红色部分为要设定部分。



JAVA容器:Tomcat

       本人参照某兄台的之作:Tomcat中文编码问题解决方案(简) 有兴趣可以进去看看。

       下面开始设定,在Tomcat安装目录下的conf文件打开Server.xml文件,找到相应段落并更改成以下字样:

       <Connector port="8080" maxThreads="150" minSpareThreads="25"

maxSpareThreads="75" enableLookups="false" redirectPort="8443"

acceptCount="100" debug="0" connectionTimeout="20000"

        disableUploadTimeout="true"  URIEncoding="utf-8"/>

       红色部分为要设定部分。



MVC构架:Struts

       在这里添加一个字符集的Fliter,代码如下:

package com.ruder.filters;

//上面的包名表示你把这个Fliter文件放在哪个包中,在下面的Web.xml也要相应改动。
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}

下面是对Web.xml的配置:

<filter>

                   <filter-name>Set Character Encoding</filter-name>

                           <filter-class>com.ruder.filters.SetCharacterEncodingFilter</filter-class>

                   <init-param>

                           <param-name>encoding</param-name>

                          <param-value>UTF-8</param-value>

                </init-param>

      </filter>

       <filter-mapping>

                           <filter-name>Set Character Encoding</filter-name>

                   <url-pattern>
21    public void init(FilterConfig arg0) throws ServletException {
22        // TODO Auto-generated method stub
23        this.filterConfig = arg0;
24        this.defaultEncoding = filterConfig.getInitParameter("defaultencoding");
25    }
26
27   
30    public void doFilter(
31        ServletRequest request,
32        ServletResponse response,
33        FilterChain chain)
34        throws IOException, ServletException {
35        // TODO Auto-generated method stub
36        request.setCharacterEncoding(selectEncoding(request));
37        chain.doFilter(request, response);
38    }
39
40
41    public void destroy() {
42        
43        this.defaultEncoding = null;
44        this.filterConfig = null;
45    }
46
47
48    protected String selectEncoding(ServletRequest request) {
49
50        return this.defaultEncoding;
51    }
52
53}


4.提交表单的jsp页面设置
<%@ page language="java"  contentType="text/html; charset=UTF-8"%>




至此问题已经解决,但是还有一些我们应该了解的,下面我简述一下:

为 每个jsp页面设置了其编码格式(utf-8),但传递数据到另一页面时依然显示为乱码?  首先要需要了解的是web容器默认编码是iso- 8859-1,一个汉字占用两个字节,而在utf-8中一个汉字占用三个字节。所以在数据传递过程中,必须手动设定容器编码格式,否则会出现字符位丢失的 情况。即3个字节变为两个字节,自然会变成乱码。为什么保存到数据库中的数据都变成了乱码?  原理同上,首先要搞清楚使用的数据库默认的编码格式,比如 mysql默认的字符编码是ISO-8859-1。所以必须手动修改其默认编码格式。  清楚了以上问题后,再来看如何解决utf-8的乱码问题。

1. 设置web容器的编码格式。为你的servlet的doGet或doPost方法开始处加入如下代 码:request.setCharacterEncoding("utf-8");   response.setCharacterEncoding ("utf-8");

2.为每个jsp页面指定其编码格式。<%@ page pageEncoding="utf-8"%>

3.在连接数据库用的URL后加入:useUnicode=true; characterEncoding=utf-8 如: url="jdbc:mysql:///db1?useUnicode=true; characterEncoding=utf-8"

4.为指定数据库默认编码格式。在C:\WINDOWS目录下找到my.ini文件,并在 [mysqld]中加入default-character-set=gbk,重新启动mysql服务。 

至此,乱码问题全部解决。

起初总搞上去不清,为什么要将mysql的默认编码格式设置为gbk,后来由相关的资料得知utf-8默认输入编码方式为gbk,默认输出编码方式为utf-16be。  

个 人认为,将数据进行utf-8进行编码的目的(即将中文编码为%的形式),主要是为了在多层服务间进行数据传输时,防止发生字符丢失(如msn)。普通的 web程序显然没有必要这样做,只要使用以上方法进行处理,就可以有效的解决乱码问题,从而结省存储空间。如果都像公司的SC系统那样,将一个汉字编码为 18个字符后,再存储到数据库中,抛开效率不说,就存储空间的浪费就够人受的,要知道,那是需要银子地!

sevlet学习摘要

1.    Servlet
2.    什么是servlet:在web容器中运行的服务器端JAVA程序,主要用于响应HTTP请求。Servlet一般用于MVC中的控制器部分。
3.    什么是servlet容器:用来管理servlet生命周期的应用程序如(tomcat)。
4.    servlet构架:
public class servlet extendsHttpServlet{
    public void init() throws ServletException {}//初始化
    public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{}//doget
public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{}//dopost
public void destroy() {}//销毁servlet对象
}
5.    写Hello Servlet
public class Hello extends HttpServlet {   
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Response.setContentType ("text/html");
        PrintWriter out = response.getWriter();
        out.println("<HTML>");
        out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println(" <BODY>");
        out.print("Hello");
        out.println(" </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }   
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response)       
    }
}
6.    servlet的继承关系


7.    描述servlet容器与servlet API的关系
8.    什么是JSP Page
java server page 是servlet的扩展,强调web页面表达,编译后是一个类servlet。
9.    servlet与JSP各有什么特点,如何选择这两种技术
10.    JSP构架模型
Model1:纯jsp 维护难,代码可复用性差
Model2:jsp+javabean 在jsp中使用usebean标签,代码在jsp中本质同Model1
Mvc:jsp+servlet+javabean

11.    JSP标签
动作标签:jsp:include
          jsp:forword
          jsp:usebean
          jsp:set/get Property
指令标签:<%@page……%>
<%@include…..%>
<%@taglib…..%>
12.    servlet中如何
1)    从HTML表单中获得参数
request.getParameterNames();enumer;
request.getParameter(); String
2)    如何获得请求头部的信息
Enumeration enumer=request.getHeaderNames();
While(enumer. HasMoreElements())
{
    String header= enumer.next();
    String result=request.getHeader(header);
    Out.print(result);
}
3)    如何获得客户cookie的信息
request.getCookies();array[]
4)    如何设置response的头部信息
response.setHeader();
5)    如何设置响应的content type
response.setContentType(“text/html charset=utf-8”);
6)    如何获得I/O流、text流、二进制流
7)    如何从当前的servlet重定向到其他的URL
response.sendRedirect(“url”)
RequstDispatcher rd=request.get RequstDispatcher(“url”)
Rd.forword(request,response);
8)    如何向客户端写cookie
Cookie cookie=new Cookie(“object”,”jklj”);
Cookie.setMaxAge(时间);
Response.addCookie(cookie);
13.    描述servlet的生命周期,谁来控制servlet的生命周期,servlet生命周期在J2EE规范中是如何来定义的
服务器实例化一个servlet对象,容器运行其init方法,请求到达时运行其service方法,service方法根据请求的类型调用(doGet,doPost)方法,当服务器决定将实例销毁时调用其destory方法。
14.    如何创建Request Dispatcher对象,如何将请求转发给其它的web资源(包含其它的web资源),描述如何利用request来存状态,以及与其它保存状态方法有什么区别
RequstDispatcher rd=request.get RequstDispatcher(“url”)
Rd.forword(request,response);
Request.setAttribute(“object”,”内容”);
一旦产生响应request的生命周期就结束了
15.    如何在web.xml中配置servlet
定义
<servlet>
        <servlet-name>name</servlet-name>
<servlet-class>package</servlet-class>
</servlet>
映射
<servlet-mapping>
    <servlet-name>name</servlet-name>
    <url-patten>/patten</url-patten>
</servlet-mapping>
16.    获得ServletConfig对象
ServletConfig sc=getServletConfig();
17.    如何获得servletContext对象
servletContext sc=getservletContext();
18.    <html><body>
<a href=”/servlet/HelloServlet”>POST</a>
</body></html>
调用servlet时采用了doPost、doGet、doForm、doHref中的哪个方法
doGet方法
19.    doGet:
PrintWriter out = res.getWriter();
Out.println(“<html><body>Hello</body></html>”);
If(!res.isCommitted()) 判断是否response提交了
If(reg.getParameter(”name”)==null)
{
    res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
20.    说明如下的web的资源应该放在web容器中的什么目录下,静态页面JSP、servlet class、web.xml、Tag libraries、JAR File、java class以及需要保护的资源文件
tomcat容器
web.xml, Tag libraries: \webapps\工程名\WEB-INF
servlet,javaclass: \webapps\工程名\WEB-INF\classes \
jar: \webapps\工程名\WEB-INF\lib\
21.    如何打war包
将web项目压缩成rar文件然后将后缀名改为war。
22.    如何利用ServletContext对象获得初始化参数
servletContext sc=getservletContext();
String s=sc.getInitParameter(key);
23.    如何在配置文件中配置ServletContext初始化参数
<init-param>
    <param-name>name</param-name>
    <param-value>vlaue</param-value>
</init-param>
24.    写代码来将对象放入ServletContext中以及取出对象
servletContext sc=getservletContext();
sc.setAttribute(key,value);
25.    描述request session web application的区别,创建监听器类来监听每个scope的生命周期
生命周期不同request产生响应时生命周期结束,session在web.xml中设置生命周期时间、手动清除web容器重启生命周期结束。Webapplication容器重启、手动清除
26.    如何配置listener
27.    如何来写以及配置filter
28.    创建一个request或response对象的包装类
29.    写一段servlet代码,用来将对象存入session以及从session中取出该对象
HttpSession session=request.getSession();
session.setAttribute(key,value);
30.    描述用来访问session对象的API
31.    说明session对象的生命周期
session在web.xml中设置生命周期时间、手动清除web容器重启生命周期结束
32.    写一段代码来响应当对象加入session时的事件
33.    描述web容器使用了什么机制来管理session
34.    如何使session失效
session在web.xml中设置生命周期时间、手动清除web容器重启生命周期结束
35.    描述将session与客户端Birding的流程及方法
36.    当client不支持cookie时,如何使用session
37.    什么是Authentication(识别(用户)):识别用户 是谁?什么是Authorization(授权)对识别后的用户给予什么样的权限。数据的完整性:提交数据,操作数据,数据库数据。数据的机密性:加密,HTTPS
38.    JSP中指令标签的形式
JSP中声明标签的形式
JSP中代码段标签的形式
JSP中动作标签的形式
JSP中注释标签的形式
JSP中的表达式标签的形式
39.    指令标签有哪些?
40.    action标签有哪些?
41.    page的属性
42.    <%!int i;%>→成员变量
<%int j;%>→局部变量
<%=i++%><%=j++%>
43.    JSP中的内置对象
44.    <%@ include file=” ”%>与<jsp:include page=” ”/>不同
45.    jsp:useBean(id,scope,type,type,class)的使用