JSP入门教程

知识博客专集

JSP中include指令和include行为区别


我们都知道在jsp中include有两种形式,分别是
<%@ include file=” ”%>
<jsp:include page=” ” flush=”true”/></p>

    前者是指令元素、后者是行为元素。具体它们将在何处用?如何用及它们有什么区别?这应该是很多人看到它都会想到的问题。下面一起来看看吧。</p>

    通常当应用程序中所有的页面的某些部分(例如标题、页脚和导航栏)都相同的时候,我们就可以考虑用include。具体在哪些时候用<%@ include file=” ”%>,哪些时候用<jsp:include page=” ” flush=”true”/>.这种形式。首先要明白的是它们之间的区别。只有了解了它们用法的不同才理解该在何时去用以及如何选择。
<%@ include file=” ”%>,jsp的include指令元素读入指定页面的内容。并把这些内容和原来的页面融合到一起。(这个过程是在翻译阶段:也就是jsp被转化成servlet的阶段进行的。</p>

    这里对翻译阶段进行一下说明:我们知道,jsp页面不能原封不动地被传送给浏览器,所有的jsp元素都必须首先由服务器进行处理。这是通过将jsp页面转达化成servlet,然后执行这个servlet来完成的。服务器需要一个jsp容器来处理jsp页面。jsp容器通常以servlet的形式来实现,这个servlet经过配置,可以处理对jsp页面的所有请求。</p>

    jsp容器负责将jsp页面转化成servlet(称为jsp页面实现类?jsp page implementation class),并编译这个servlet。这两步就构成了翻译阶段.</p>

    由此我们就会知道:jsp页面是把include指令元素所指定的页面的实际内容(也就是代码段)加入到引入它的jsp页面中,合成一个文件后被jsp容器将它转化成servlet。可以看到这时会产生一个临时class文件和一个java文件。下面举个例子。</p>

    服务器用tomcat,引入页面的jsp文件叫test.jsp。被引入的页面叫date.jsp.这个jsp文件里存放的是一个有关时间的jsp代码,当前的上下文根设为test
//======date.jsp的源文件=====//
<%@ page language=”java” contenttype=\”text/html;charset=gb2312\”%>
<%
java.util.date date=new java.util.date();
string date_cn =\”\”;
string datestr = \”\”;
switch(date.getday())
{
case 0:date_cn =\”日\”; break;
case 1:date_cn =\”一\”; break;
case 2:date_cn =\”二\”; break;
case 3:date_cn =\”三\”; break;
case 4:date_cn =\”四\”; break;
case 5:date_cn =\”五\”; break;
case 6:date_cn =\”六\”; break;
}
datestr = (1900 date.getyear()) \”年\” (date.getmonth() 1) \”月\” date.getdate() \”日(星期\” date_cn \”)\”;
%>
document.write(\”<%=datestr%>\”);
//======以下是test.jsp的源文件=============//
<%@ page language=”java” contenttype=”text/html;charset=gb2312”%>
<html>
<head>
<title>include的两种用法</title>
<jsp:include page=”date.jsp” flush=”true”/>
<%–@ include file=”date.jsp” %–>
//我们在这里用include的两种不同形式来引入date.jsp这个文件.
<head>
<body>
<table><tr><td>
有关jsp中include的两种用法.敬请关注。
</td></tr></table>
</body>
</html></p>

      在test.jsp 文件中,我们只输出了一行文本“ 有关jsp中include的两种用法.敬请关注。”,现在让我们先用<%@ include file=”date.jsp” %>这种形式引入date.jsp这个文件。你想会出现什么问题了吗?此时出现了错误提示:
http status 500 ?
org.apache.jasper.jasperexception: /date.jsp(0,0) page directive: can\’t have multiple occurrences of contenttype
以下还有一堆错误,但我们只要看这里就知道问题的所在了。状态码为http 500服务器内部错误。再看下面的提示。在date.jsp页面中不能指定多个contenttype.</p>

    原因就在这里了。是因为在翻译阶段,date.jsp文件的代码被原封不动地加入到了test.jsp页面从而合成一个文件。合成后的文件中就会相同的:
<%@ page language=”java” contenttype=”text/html;charset=gb2312”%>
这句代码。解决的办法是把date.jsp文件中的这句删掉。刷新后再请求test.jsp页面</p>

请求test.jsp在页面显示如下
2003年12月10日 13:12:40
有关jsp中include的两种用法.敬请关注。</p>

这时我们还不能发现什么。还是去查看tomcat下的临时文件吧。到那里去看看date.jsp文件的内容是否已被加入到了test.jsp文件中。
<注.此处的tomcat装在e盘根目录下>
目录
e:\\tomcat\\work\\standalone\\localhost\\test.
在这个目录下会看到
test_jsp.java和test_jsp.class两个文件。</p>

   这里的java文件就是jsp容器将jsp转化成了servlet而得到的test_jsp.java这个文件。</p>

     相对应的test_jsp.class这个文件就是编译test_jsp.java这个servlet文件产生的类文件了。打开所产生的servlet文件(test_jsp.java)。此时我们会发现,在test.jsp 文件被转化成servlet文件时,在输出的<haed>之间加入了一些不是test.jsp页面里面的代码,新加入的内容就是 date.jsp里面的代码: 新加入了哪些内容或是否真的加入了新的内容请自己测试去看一下就会一目了然了.在这里不再详述.</p>

以上就是我们用<%@ include file=”date.jsp”%>这种形式得到的结果.
下面我们换用<jsp:include page=”dae.jsp” flush=”true”/>也就是将
<%@ include file=”date.jsp”%>换成<jsp:include page=”dae.jsp” flush=”true”/>,然后请求test.jsp.
2003? ê 12??10?? 13:30:13
有关jsp中include的两种用法.敬请关注。</p>

    此时会在页面上看见.我们所引入date.jsp输出的日期中中文出现了乱码.什么原因?是因为include行为元素是在请求处理阶段执行的(此处要对请求处理阶段进行说明一下.jsp容器除了上面提到的负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.请求处理阶段仅执行类文件)。</p>

   所以在我们作include行为元素引入页面时,实际只是引用了date.jsp这个文件被转化并被编译后产生的servlet类文件.既如此, date.jsp就是作为一个单独的文件在执行后才被test.jsp文件运行时调用.由于date.jsp文件中没有指定字符编码.所以出现了乱码.解决办法是在date.jsp文件中重新把刚才去掉的
<%@ page language=”java” contenttype=”text/html;charset=gb2312”%>
这行语句加入后刷新重新运行.此时页面显示正确,并跟用include指令正常运行时一样.再查看tomcat下的临时文件会发现.此时多出了一个 date_jsp.java文件和一个date_jsp.class文件.这两个文件得来的方式跟test_jsp.java和 test_jsp.class文件得来的方式一样.再查看一下此时test_jsp.java文件的代码会发现.此时只新增加了一句代码:
jspruntimelibrary.include(request, response, \”date.jsp\”, out, true);</p>

它并没有把date.jsp文件的代码加入到test.jsp.</p>

   只是在运行时引入了date.jsp页面执行后所产生的应答.这意味着我们可以指定任何能够产生应答的web资源,(例如一个servlet或一个jsp页面),只要这些资源所产生的类型和jsp页面产生的内容类型相同.jsp容器将通过一个内部的函数调用来执行指定的资源.因此,这些被引入的资源可以帮助处理原来的请求,所以这些资源可以访问请求作用域内的所有对象.以及所有原来的请求参数.</p>

    由于在主页面被请求时,这些页面还没有被引入到主页面中,所以你可以对page属性使用一个请求时属性值,以便根据运行时的情况来决定要引入哪一个页面.还可以添加一些将被引入的页面读取的请求参数.
<jsp:include page=”<%=pageselectedatruntime%>” flush=”true” >
<jsp:param name=”fitstparamer” value=”firstvalue”>
<jsp:param name=”lastparamer” value=”lastvalue”>
</jsp:include></p>

    如果修改了被引入的jsp页面,那么可以立刻使用该页面的最新版本,这是因为对待被引入的页面的方式与对待由浏览器直接调用的jsp页面的方式完全相同.即容器检测页面的变化,并自动进入翻译阶段,以得到页面的最新版本.</p>

(注意,include行为元素同jsp其它元素一样,没有行为体时要以”/”结束.就像下面这样.
<jsp:include page=”<%=pageselectedatruntime%>” flush=”true” />)</p>

以下是对include 两种用法的区别
主要有两个方面的不同;
一:执行时间上:
<%@ include file=”relativeuri”%> 是在翻译阶段执行
<jsp:include page=”relativeuri” flush=”true” /> 在请求处理阶段执行.
二:引入内容的不同:
<%@ include file=”relativeuri”%>
引入静态文本(html,jsp),在jsp页面被转化成servlet之前和它融和到一起.
<jsp:include page=”relativeuri” flush=”true” />引入执行页面或servlet所生成的应答文本.
另外在两种用法中file和page属性都被解释为一个相对的uri.如果它以斜杠开头,那么它就是一个环境相关的路径.将根据赋给应用程序的uri的前缀进行解释,如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释.更多有关url是如何解释的请参考相关资料或书籍

jsp显示bean里面的数据集显示不出来id


定义了数据类型,也从数据库中读出来了,但是显示的到jsp网页中就是显示不出来,

<c:if test=\”\”>></c:if>

想了所有的情况,以为是因为id名称出了问题,昨天晚上有类型的情况,名字换成id就好了,这个类有两个类为了区别加上了前缀,特地的加了个“-”在中间,其实问题就出在这里,换了名称还是不行,接下来以为是数据类型的问题,但是都不是。

在网上看到的

bean类里面有 img_path 这个属性吗?它的get、set方法都有吗?
估计问题就是出在这里了,值得注意一点的是,img_path用hiberante生成bean后,变成了imgpath,所以,你在页面上使用的时候也要用imgpath,而不是img_path,总之,你的页面上使用的属性要和bean类里面的属性一致。

我一看我的get和set方法和属性比起来多了个-,这个正是我特意为了区分加上去的,去除掉之后运行成功了,好了,原来是这样的,属性名和get与set方法后面的名称要相同,要不然jjsp显示的时候找不到属性值,这个倒是挺怪的,估计是默认的调用get方法来显示jsp中的名字,总之是好 咯。

 

ASP、JSP、PHP 杂谈五


  asp全名active server pages,是一个web服务器端的开发环境,利用它可以产生和执行动态的、互动的、高性能的web服务应用程序。asp采用脚本语言vbscript(java script)作为自己的开发语言。

  php是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用c,java和perl语言的语法, 并耦合php自己的特性,使web开发者能够快速地写出动态产生页面。它支持目前绝大多数数据库。还有一点,php是完全免费的,不用花钱,你可以从php官方站点(http: //www.php.net)自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。

  jsp是sun公司推出的新一代网站开发语言,sun公司借助自己在java上的不凡造诣,将java从java应用程序和java applet之外,又有新的硕果,就是jsp,java server page。jsp可以在serverlet和javabean的支持下,完成功能强大的站点程序。

  三者都提供在 html代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。但jsp代码被编译成 servlet并由java虚拟机解释执行,这种编译操作仅在对jsp页面的第一次请求时发生。在asp 、php、jsp环境下,html代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的 html页面只依赖于web服务器,而asp 、php、jsp页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到html代码中,然后一起发送给浏览器。asp 、php、jsp三者都是面向web服务器的技术,客户端浏览器不需要任何附加的软件支持。

技术特点:
asp:
1. 使用vbscript 、 jscript等简单易懂的脚本语言,结合html代码,即可快速地完成网站的应用程序。
2. 无须compile编译,容易编写,可在服务器端直接执行。
3. 使用普通的文本编辑器,如windows的记事本,即可进行编辑设计。
4. 与浏览器无关(browser independence), 客户端只要使用可执行html码的浏览器,即可浏览active server pages所设计的网页内容。active serverpages 所使用的脚本语言(vbscript 、 jscript)均在web服务器端执行,客户端的浏览器不需要能够执行这些脚本语言。
5.active server pages能与任何activex scripting语言兼容。除了可使用vb script或jscript语言来设计外,还通过plug-in的方式,使用由第三方所提供的其它脚本语言,譬如rexx 、perl 、tcl等。脚本引擎是处理脚本程序的com(component object model) 对象。
6. 可使用服务器端的脚本来产生客户端的脚本。
7. activex server components(activex 服务器组件 )具有无限可扩充性。可以使用visual basic 、java 、visual c 、cobol等程序设计语言来编写你所需要的activex server component 。

php:
1 数据库连接
php可以编译成具有与许多数据库相连接的函数。php与mysql是现在绝佳的群组合。你还可以自己编写外围的函数去间接存取数据库。通过这样的途径当你更换使用的数据库时,可以轻松地修改编码以适应这样的变化。phplib就是最常用的可以提供一般事务需要的一系列基库。但php提供的数据库接口支持彼此不统一,比如对oracle, mysql,sybase的接口,彼此都不一样。这也是php的一个弱点。

jsp:
1.将内容的产生和显示进行分离
使用jsp技术,web页面开发人员可以使用html或者xml标识来设计和格式化最终页面。使用jsp标识或者小脚本来产生页面上的动态内容。产生内容的逻辑被封装在标识和javabeans群组件中,并且捆绑在小脚本中,所有的脚本在服务器端执行。如果核心逻辑被封装在标识和beans中,那么其它人,如web管理人员和页面设计者,能够编辑和使用jsp页面,而不影响内容的产生。在服务器端,jsp引擎解释jsp标识,产生所请求的内容(例如,通过存取javabeans群组件,使用jdbc技术存取数据库),并且将结果以html(或者xml)页面的形式发送回浏览器。这有助于作者保护自己的代码,而又保证任何基于html的web浏览器的完全可用性。

2.强调可重用的群组件
绝大多数jsp页面依赖于可重用且跨平台的组件(如:javabeans或者enterprise javabeans)来执行应用程序所要求的更为复杂的处理。开发人员能够共享和交换执行普通操作的组件,或者使得这些组件为更多的使用者或者用户团体所使用。基于组件的方法加速了总体开发过程,并且使得各种群组织在他们现有的技能和优化结果的开发努力中得到平衡。

3.采用标识简化页面开发
web页面开发人员不会都是熟悉脚本语言的程序设计人员。javaserver page技术封装了许多功能,这些功能是在易用的、与jsp相关的xml标识中进行动态内容产生所需要的。标准的jsp标识能够存取和实例化javabeans组件,设定或者检索群组件属性,下载applet,以及执行用其它方法更难于编码和耗时的功能。通过开发定制化标识库,jsp技术是可以扩展的。今后,第三方开发人员和其它人员可以为常用功能建立自己的标识库。这使得web页面开发人员能够使用熟悉的工具和如同标识一样的执行特定功能的构件来工作。 jsp技术很容易整合到多种应用体系结构中,以利用现存的工具和技巧,并且扩展到能够支持企业级的分布式应用。作为采用java技术家族的一部分,以及java 2ee的一个成员,jsp技术能够支持高度复杂的基于web的应用。由于jsp页面的内置脚本语言是基于java程序设计语言的,而且所有的jsp页面都被编译成为java servlet,jsp页面就具有java技术的所有好处,包括健壮的存储管理和安全性。作为java平台的一部分,jsp拥有java程序设计语言“一次编写,各处执行”的特点。随着越来越多的供货商将jsp支持加入到他们的产品中,您可以使用自己所选择的服务器和工具,修改工具或服务器并不影响目前的应用。

应用范围:
asp是microsoft开发的动态网页语言,也继承了微软产品的一贯传统,只能执行于微软的服务器产品,iis(internet information server) (windows nt)和pws(personal web server)(windows 98)上。unix下也有chilisoft的组件来支持asp,但是asp本身的功能有限,必须通过asp+com的群组合来扩充,unix下的com实现起来非常困难。

php3可在windows,unix,linux的web服务器上正常执行,还支持iis,apache等一般的web服务器,用户更换平台时,无需变换php3代码,可即拿即用。

jsp同php3类似,几乎可以执行于所有平台。如win nt,linux,unix。在nt下iis通过一个外加服务器,例如jrun或者servletexec,就能支持jsp。知名的web服务器apache已经能够支持jsp。由于apache广泛应用在nt、unix和linux上,因此jsp有更广泛的执行平台。虽然现在nt操作系统占了很大的市场份额,但是在服务器方面unix的优势仍然很大,而新崛起的linux更是来势不小。从一个平台移植到另外一个平台,jsp和javabean甚至不用重新编译,因为java字节码都是标准的与平台无关的。

性能比较:
有人做过试验,对这三种语言分别做回圈性能测试及存取oracle数据库测试。在循环性能测试中,jsp只用了令人吃惊的四秒钟就结束了20000*20000的回圈。而asp、php测试的是2000*2000循环(少一个数量级),却分别用了63秒和84秒。(参考phplib)。 数据库测试中,三者分别对 oracle 8 进行 1000 次 insert,update,select和delete: jsp 需要 13 秒,php 需要 69 秒,asp则 需要 73 秒。

前景分析:
  目前在国内php与asp应用最为广泛。而jsp由于是一种较新的技术,国内采用的较少。但在国外,jsp已经是比较流行的一种技术,尤其是电子商务类的网站,多采用jsp。采用php的网站如新浪网(sina)、中国人(chinaren)等,但由于php本身存在的一些缺点,使得它不适合应用于大型电子商务站点,而更适合一些小型的商业站点。首先,php缺乏规模支持。其次,缺乏多层结构支持。对于大负荷站点,解决方法只有一个:分布计算。数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开,群组成二维数组。而php则缺乏这种支持。还有上面提到过的一点,php提供的数据库接口支持不统一,这就使得它不适合运用在电子商务中。

asp和jsp则没有以上缺陷,asp可以通过microsoft windowsd的com/dcom获得activex规模支持,通过dcom和transcation server获得结构支持;jsp可以通过sun java的java class和ejb获得规模支持,通过ejb/corba以及众多厂商的application server获得结构支持。三者中,jsp应该是未来发展的趋势。世界上一些大的电子商务解决方案提供商都采用jsp/servlet。比较出名的如ibm的e-business,它的核心是采用jsp/servlet的web sphere。它们都是通过cgi来提供支持的。但去年10月后它推出了enfinity,一个采用jsp/servlet的电子商务application server,而且声言不再开发传统软件。

总之,asp,php,jsp三者都有相当数量的支持者,由此也可以看出三者各有所长。正在学习或使用动态页面的朋友可根据三者的特点选择一种适合自己的语言.

jsp程序员成长之路


一:说明

  在本文章中使用精通、熟练、熟悉、了解标志你对某技术的掌握程度。

  精通:能够掌握此技术的85%技术要点以上,使用此技术时间超过两年,并使用此技术成功实施5个以上的项目。能使用此技术优化性能或代码,做到最大可能的重用。

  熟练:能够掌握此技术的60%技术要点以上,使用此技术时间超过一年,并使用此技术成功实施3个以上的项目。能使用此技术实现软件需求并有经验的积累在实现之前能做优化设计尽可能的实现模块或代码的重用。

  熟悉:能够掌握此技术的50%技术要点以上,使用此技术时间超过半年上,并使用此技术成功实施1个以上的项目。能使用此技术实现软件需求。

  了解:可以在实际需要时参考技术文档或帮助文件满足你的需要,基本知道此项技术在你运用是所起的作用,能够调用或者使用其根据规定提供给你的调用方式。

  二:基本要求

  1:html 掌握程度:熟练。原因:不会html你可能写jsp?
  2:javascript/jscript:掌握程度:熟悉。原因:client端的数据校验、一些页面处理需要你使用脚本。
  3:css 掌握程度:熟悉。原因:实现页面风格的统一通常会使用css去实现。
  4:java基础编程 掌握程度:熟练。原因:不会java你能写jsp?开玩笑吧。还有你必须非常熟悉以下几个包java.lang;java.io;java.sql;java.util;java.text;javax.sevrlet;javax.servlet.http; javax.mail;等。
  5:sql 掌握程度:熟练。原因:如果你不使用数据库的话你也许不需要掌握sql。同时你必须对以下几种数据库中的一种以上的sql比较熟悉。oracle,db2,mysql,postgresql.
  6:xml 掌握程度:了解 原因:appserver的配置一般是使用xml来实现的。
  7:ejb 掌握程度:了解 原因:很多项目中商业逻辑是由ejb来实现的,所以呢……
  8:以下几种appserver(engnier) 你需要了解一个以上。

  a:)tomcat
  b:)weblogic
  c:)websphere
  d:)jrun
  e:)resin

三:选择要求(因项目而定)

  1:ldap 掌握程度:了解 原因:ladp越来越多的运用在权限控制上面。
  2:struts 掌握程度:熟练 原因:如果符合mvc设计通常会使用struts实现c。
  3:xsp 掌握程度:根据需要而定很多时候是不使用的,但在不需要使用ejb但jsp servlet bean实现不了的时候xsp是一个非常不错的选择。
  4:linux 掌握程度:熟悉 原因:如果你的运用跑在linux/unix上你最少要知道rm ,mv,cp,vi,tar gzip/gunzip 是用来做什么的吧。

  四:工具的使用

  1:ultraedit(editplus) jakarta-ant jakarta-log4j;
  2:jubilder4-6
  3:visual age for java
  4:vcafe

  以上的工具你选择你自己熟悉的吧。不过强烈建议你用log4j做调试工具。

  五:成长之路

  1:html 学习时间,如果你的智商在80以上,15天时间应该够用了。至少你能手写出一个页面来。
  2:jacascript/jscript学习时间,这真的不好说,比较深奥的东西,够用的话一个礼拜可以学写皮毛。
  3:css 学习时间,三天的时间你应该知道如何使用css了,不要求你写,一般是美工来写css。
  4:java 学习时间,天才也的三个月吧。慢满学吧。如果要精通,那我不知道需要多少时间了。用来写
jsp,四个月应该够了。
  5:sql 学习时间,只需要知道insert ,delete ,update ,select,create/drop table的话一天你应该知道了。
  6:xml 学习时间,我不知道我还没有学会呢。呵呵。不过我知道dtd是用来做什么的。
  7:ejb 学习时间,基本的调用看3天你会调用了。不过是建立在你学会java的基础上的。
  8:熟悉appserver,tomcat四天你可以掌握安装,配置。把jsp跑起来了。如果是weblogic也够了,但要使用ejb那不关你的事情吧。sa做什么去了。
  9:熟悉linux那可得需要不少时间。慢慢看man吧。
  10:struts如果需要你再学习。

JSP-Servlet中转发(forward)与重定向(sendRedirect)的区别


尽管httpservletresponse.sendredirect 方法和requestdispatcher.forward  方法都可以让浏览器获得另外一个url所指向的资源,但两者的内部运行机制有着很大的区别。

下面是httpservletresponse.sendredirect 方法实现的请求重定向与requestdispatcher.forward 方法实现的请求转发的总结比较:
        (1)requestdispatcher.forward 方法只能将请求转发给同一个web应用中的组件;而httpservletresponse.sendredirect 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对url重定向到其他站点的资源。
        如果传递给httpservletresponse.sendredirect 方法的相对url以“/”开头,它是相对于整个web站点的根目录;如果创建requestdispatcher 对象时指定的相对url以“/”开头,它是相对于当前web应用程序的根目录。
        (2)调用httpservletresponse.sendredirect 方法重定向的访问过程结束后,浏览器地址栏中显示的url会发生改变,由初始的url地址变成重定向的目标url;而调用 requestdispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的url地址不变。
        (3)httpservletresponse.sendredirect 方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个url的访问请求。requestdispatcher.forward 方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
        (4)requestdispatcher.forward 方法的调用者与被调用者之间共享相同的request 对象和response 对象,它们属于同一个访问请求和响应过程;而httpservletresponse.sendredirect 方法调用者与被调用者使用各自的request 对象和response 对象,它们属于两个独立的访问请求和响应过程。
        对于同一个web应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用 httpservletrequest.setattribute 方法传递预处理结果,那就应该使用requestdispatcher.forward 方法。
        不同web应用程序之间的重定向,特别是要重定向到另外一个web站点上的资源的情况,都应该使 httpservletresponse.sendredirect 方法。
        (5)无论是requestdispatcher.forward 方法,还是httpservletresponse.sendredirect 方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中清除。

jsp 数据表格 datagird


//文件datagird.java

package datagird;

import java.io.ioexception;
import java.io.printwriter;
import javadb.idb;

import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

public class datagird extends httpservlet
{
public void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {
response.setcontenttype("text/html; charset=gbk");
printwriter out = response.getwriter();

/*数据库处理接口
* 主要有两个函数
* 1.selectlist 返回arraylist数组
* 数组第一行为列标题 第二行开始为数据
* 2.selectset 返回resultset数据集
*/
javadb.idb idb=new javadb.jdbcoracle();

/*
* 当使用此表格时,需要在此修改代码
*/
int pagen=1;//当前页-自动计算
int num=idb.getcount("select count(*) from czht_department");
int pagenum=0;//总页数-自动计算
int pageleng=10;//页大小
if(num%pageleng==0)
   pagenum=(int)math.floor(num/pageleng);
else
   pagenum=(int)math.floor(num/pageleng) 1;
  

/*表单处理 用于处理表格事件,添加 删除 更新 等
* 每次页面显示时都经过此处验证,如果是要对页面处理,则页面经处理后
* 才会对数组集填充,把最新的结果显示出来。
*/

int action;
try{
action=integer.parseint(request.getparameter("act"));//动作类型
}
catch (exception e)
{
   e.printstacktrace();
   action=-1;
}

if (action>0)
{
   switch(action)
   {
   case 1:
    //添加函数
    string addsql="insert into czht_department values('"
       request.getparameter("depcode") "','"
       idb.tochinese(request.getparameter("depname")) "','"
       idb.tochinese(request.getparameter("depallname")) "','"
       request.getparameter("p_depcod") "','"
       request.getparameter("htqdflag") "','"
       request.getparameter("area") "','"
       request.getparameter("population") "')";
    //out.println("添加");
    //out.println(addsql);
    idb.update(addsql);   
    break;
   case 2:
    //删除函数,根据指定字段depcode 进行删除
    string delsql="delete from czht_department where depcode='"
    request.getparameter("depcode") "' ";
    idb.update(delsql);
    out.println("删除" delsql);   
    break;
   case 3:
    //更新函数,根据指定字段depcode 进行更新
   
    string upsql="update czht_department set "   
    "depname='" idb.tochinese(request.getparameter("depname")) //中文转换
    "',depallname='" idb.tochinese(request.getparameter("depallname")) //中文转换
    "',p_depcod='" request.getparameter("p_depcod")
    "',htqdflag='" request.getparameter("htqdflag")
    "',area='" request.getparameter("area")
    "',population='" request.getparameter("population")
      "' where depcode='" request.getparameter("depcode") "' ";
    //out.println("更新");
    //out.println(upsql);
    idb.update(upsql);  
    break;
   case 4:
    //换页函数   
    pagen=integer.parseint(request.getparameter("pagen"));//为请求页  
    if(pagen<=0)
     pagen=1;
    if(pagen>pagenum)
     pagen=pagenum;  
    break;
    } //end switch
     }//end if ———— 表单处理结束——————

/*—————数据源填充———————
*通过数据库读取函数返回java.util.arraylist类型,
*将java.util.arraylist 类型变量做为参数传递给
*表格输出过程
*
*当使用此表格时,需要在此修改代码
*/
string sqlselectlist="select depcode,depname,depallname,p_depcod,htqdflag,area,population from "
"(select rownum as rn,czht_department.* from czht_department) where rn<" (pagen*pageleng 1) " and rn>" (pagen-1)*pageleng;
java.util.arraylist data[]=idb.selectlist(sqlselectlist);
  
int rowsleng=data[0].size();//列数
int pagesize=data.length;//页大小
//标题数组,可以指定中文的显示标题,
string title[]=new string[rowsleng];
for(int i=0;i<title.length;i )
{
   title[i]=data[0].get(i).tostring();
}
title[0]="编号";
title[1]="名称";
title[2]="全称";
title[3]="上级编号";
title[4]="操作代码";
title[5]="面积";
title[6]="人口";
//编辑参数数组true为可编辑false为不可编辑。默认全部可以编辑,
boolean edit[]=new boolean[rowsleng];
for(int i=0;i<edit.length;i )
{
   edit[i]=true;
}
edit[0]=false;//将第一列设为不可编辑

//———————页面输出——————–
//css
out.println("<link href='../css/javatable.css' rel='stylesheet' type='text/css' />");

//javascript
out.println("<script language='javascript' src='../js/javatable.js'></script>");

out.println("<table width='100%' border='0' cellpadding='1' cellspacing='1' bgcolor='#cccccc'>");
//打出表头
out.println("<tr id='trtitle' class='title'>");
for(int j=0;j<rowsleng;j )
{
   out.println(" <td>" title[j] "</td>");
}
out.println(" <td>操作</td>");
out.println("</tr>");
//——–表格主体———
for(int i=1;i<pagesize;i )
{
   //表格显示部分********************
   out.println("<form action='' method='post'>");
   out.println(" <input name='act' type='hidden' value=''/>");
   out.println(" <input name='" data[0].get(0) "' type='hidden' value='" data[i].get(0) "'/>");
     out.println("<tr id='tridshow_" i "' class='tr1'>");
   for(int j=0;j<rowsleng;j )
   {
    out.println(" <td>" data[i].get(j) "</td>");
   }
   out.println(" <td width='100'><img src='../images/edit.gif' title='编辑' onclick='startedit(" i ")'>"
     "&nbsp;<label onclick=\\"javascript:if ( confirm ('确定删除?') )"
"{form.act.value='2';setdisabled();form.submit();}\\"><img src='../images/del.gif' title='删除'></label></td>");
     out.println("</tr>");
     out.println("</form>");
    
     //表格编辑部分********************
     out.println("<form action='' method='post'>");
     out.println(" <input name='act' type='hidden' value=''/>");
     out.println("<tr id='tridhide_" i "' class='selected' style='display:none'>");
     for(int j=0;j<rowsleng;j )
   {
     if(edit[j])
     out.println(" <td><input class='test' type='text' name='" data[0].get(j) "' value='" data[i].get(j) "' /></td>");
     else
    out.println(" <td><input class='test' type='text' name='" data[0].get(j) "' value='" data[i].get(j) "' disabled=\\"true\\" /></td>");
   }
   out.println(" <td width='100'><label class='buttext' onclick=\\"javascript:form.act.value='3';setdisabled();form.submit();\\">更新</label> <label class='buttext' onclick='stopedit(" i ")'>取消</label></td>");
     out.println("</tr>");
     out.println("</form>");    
}
//表格添加部分***********************
     out.println("<form action='' method='post'>");
     out.println(" <input name='act' type='hidden' value=''/>");
     out.println("<tr id='tridadd' class='selected' style='display:none'>");
   for(int j=0;j<rowsleng;j )
   {
    out.println(" <td><input class='test' type='text' name='" data[0].get(j) "' /></td>");
   }
   out.println(" <td width='100'><label class='buttext' onclick=\\"javascript:form.act.value='1';setdisabled();form.submit();\\">确定</label> <label class='buttext' onclick='canceladd();'>取消</label></td>");
     out.println("</tr>");
     out.println("</form>");
    
out.println("</table>");
out.println("<div style='width:100%' align='center'><table width='100%' class='footer'><tr><td align='center'>"
"<form action='' method='post' style='margin:0'><label onclick=\\"javascript:form.pagen.value–;form.submit();\\">上一页</label> <label onclick=\\"javascript:form.pagen.value ;form.submit();\\">下一页</label> 共" pagenum " 页 当前" pagen " 页 "
"      <label>    <input type='text' name='pagego' style='width:40px' />    </label>    <label>    <input type='button' name='submit' value='转到' style='height:20px' onclick=\\"javascript:form.pagen.value=form.pagego.value;form.submit();\\"/>"
" </label><input name='pagen' type='hidden' value='" pagen "'/><input name='act' type='hidden' value='4'/></form> </td><td width='100px' ><img src='../images/add.gif' title='添加' onclick='add();'></td></tr></table></div>");
out.flush();
out.close();

}
public void dopost(httpservletrequest request,httpservletresponse response) throws servletexception, ioexception
   {
   doget(request, response);
   }
}

//文件javatable.js

// javascript document

//进入编辑状态
function startedit(tr_id)
{
document.getelementbyid("tridhide_" tr_id).style.display="";
document.getelementbyid("tridshow_" tr_id).style.display="none";
}
//退出编辑状态
function stopedit(tr_id)
{
document.getelementbyid("tridhide_" tr_id).style.display="none";
document.getelementbyid("tridshow_" tr_id).style.display="";
}
//添加一行
function add()
{
document.getelementbyid("tridadd").style.display="";
}
//取消添加
function canceladd()
{
document.getelementbyid("tridadd").style.display="none";
}
//设置disabled属性,在数据提交前使所有文本框有效
function setdisabled()
{
var es=document.getelementsbytagname("input");
      for(var j=0;j<es.length;j )
       {
        if(es[j].type=="text")
        es[j].disabled="";
       }
}

JSP语法 表达式


表达式

包含一个符合jsp语法的表达式

jsp 语法

<%= expression %>

例子

<font color="blue"><%= map.size() %></font>
<b><%= numguess.gethint() %></b>.

描述

表达式元素表示的是一个在脚本语言中被定义的表达式,在运行后被自动转化为字符串,然后插入到这个表达示在jsp文件的位置显示。因为这个表达式的值已经被转化为字符串,所以你能在一行文本中插入这个表达式(形式和asp完全一样).

当你在jsp中使用表达式时请记住以下几点:

你不能用一个分号(";")来作为表达式的结束符.但是同样的表达式用在scriptlet中就需要以分号来结尾了!查看scriptlet 这个表达式元素能够包括任何在java language specification中有效的表达式.

有时候表达式也能做为其它jsp元素的属性值.一个表达式能够变得很复杂,它可能由一个或多个表达式组成,这些表达式的顺序是从左到右。

 

JSP内置对象,跳转和指令


       内置对象:1.pagecontext 2.request 3.session 4.application 5.response 6.config 7.out 8.cookie 9.exception

       共享对象:1.page 页面级别 2.request 请求级别  3.session  会话级别  4.application  容器级别

       页面跳转的几种方式:

       服务器端跳转:能够自动的在服务器内部进行页面的跳转,所以对于客户端来讲这种跳转是透明的,而request范围的属性服务器只能站点内进行跳转。跳转方式有以下几种:

                               request.getrequestdispatcher(\”pathname\”).forward(request,response);

                               pagecontext.getrequest()getrequestdispatcher(\”pathname\”).forward(request,response);

                               <jsp:forward page=\”\”/>

服务器跳转时的\”/\”代表本网站的根。

       客户端跳转:客户段跳转是服务器请求结果返回给客户端,客户端再向服务器发起另一个请求。客户端要参与跳转过程;客户段跳转能够进行网站外的跳转。有以下几种方式:

                            response.sendredirect(\”\”)

                            <a href=\”\”></a>

                            <meta http-equiv=\”refresf\” content=\”3;url=2.jsp\”>

                            javascript:history.back();

                            response.setheader(\”refresh\”,\”3;url=\’3.jsp\’\”);

客户端跳转时\”/\”代表服务器的根。(绝对路劲)

include指令(静态包含)<@ include file=\”\” />

静态包含,可以包含任意格式的文件,静态包含就是将被包含的文件内容拷贝到包含问价中,进行执行。

include动作(动态包含)<jsp:include page=\”\”/>

动态包含,只能包含动态页面,动态包含是先执行被包含的文件,再将结果包含到包含页面中,然后执行包含文件的结果。

JSP乱码解决思路总结 (转)


对于java由于默认的编码方式是 unicode,所以用中文也易出问题,常见的解决是
string s2 = new string(s1.getbytes(\”iso-8859-1\”),\”gbk\”);
前三种方法是我比较常用的方法,别人的经验告诉我:通常get方法通过改server.xml解决,
post方法通过过滤器或者设置字符集解决,呵呵,不知道是否可行!

1、utf8解决jsp中文乱码问题

一般说来在每个页面的开始处,加入:

<%@ page lang ge=\”java\” contenttype=\”text/html; charset=utf-8\”
pageencoding=\”utf-8\”%>

<%
reqst.setcharacterencoding(\”utf-8\”);
%>

charset=utf-8 的作用是指定jsp向客户端输出的编码方式为\”utf-8\”

pageencoding=\”utf-8\” 为了让jsp引擎能正确地解码含有中文字符的jsp页面,这在linux中很有效

reqst.setcharacterencoding(\”utf-8\”); 是对请求进行了中文编码

有时,这样仍不能解决问题,还需要这样处理一下:

string msg = reqst.getparameter(\”message\”);
string str=new string(msg.getbytes(\”iso-8859-1\”),\”utf-8\”);
out.println(st);

2、tomcat 5.5 中文乱码(利用tomcat已经写好的字符集过滤器)

1)只要把%tomcat安装目录%/ webapps\\servlets-examples\\web-inf\\classes\\filters\\setcharacterencodingfilter.class 文件拷到你的webapp目录/filters下,如果没有filters目录,就创建一个。

2)在你的web.xml里加入如下几行:
<filter>
<filter-name>set character encoding</filter-name>
<filter-class>filters.setcharacterencodingfilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-val>gbk</param-val>
</init-param>
</filter>
<filter-mapping>
<filter-name>set character encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3、 get方式的解决办法(修改tomcat server.xml,但是不建议使用的说)

1) 打开tomcat的server.xml文件,找到区块,加入如下一行:
uriencoding=\”gbk\”
完整的应如下:

<connector
port=\”80\” maxthreads=\”150\” minsparethreads=\”25\” maxsparethreads=\”75\”
enablelookups=\”false\” redirectport=\”8443\” acceptcount=\”100\”
debug=\”0\” connectiontimeout=\”20000\”
disableuploadtimeout=\”tr\”
uriencoding=\”gbk\”
/>

4、xmlhttpreqst中文问题

页面jsp用的gbk编码

<%@ page contenttype=\”text/html; charset=gbk\”%>

javascript部分
function addfracasreport() {
var url=\”controler?actionid=0_06_03_01&actionflag=0010\”;
var urlmsg=\”&reportid=\” fracasreport1.textreportid.val; //故障报告表编号
var xmlhttp=common.createxmlhttpreqst();
xmlhttp.onreadystatechange = common.getreadystatehandler(xmlhttp, eval(\”turnanalypage\”));
xmlhttp.open(\”post\”,url,tr);
xmlhttp.setreqstheader( \” content-type \” , \” application/x-www-form-urlencoded);
xmlhttp.send(urlmsg);
}

后台java中获得的reportid是乱码,不知道该怎么转,主要是不知道xmlhttp.send(urlmsg); 以后是什么编码?在后面用java来转,试了几种,都没有成功,其中有:

p lic static string utf_8togbk(string str) {
try {
return new string(str.getbytes(\”utf-8\”), \”gbk\”);
} catch (exception ex) {
return null;
}
}

p lic static string utf8togbk(string str) {
try {
return new string(str.getbytes(\”utf-16be\”), \”gbk\”);
} catch (exception ex) {
return null;
}
}

p lic static string gbk(string str) {
try {
return new string(str.getbytes(\”gbk\”),\”gbk\”);
} catch (exception ex) {
return null;
}
}
p lic static string getstr(string str) {
try {
string temp_p = str;
string temp = new string(temp_p.getbytes(\”iso8859_1\”), \”gbk\”);
temp = sqlstrchop(temp);
return temp;
} catch (exception e) {
return null;
}
}

5、solaris下servlet编程的中文问题及解决办法

在使用java开发internet上的一个应用系统时,发现在windows下调试完全正常的servlet,上传到solaris 服务器上,运行却出现故障–返回的网页不能显示中文,应为中文的信息全为乱码;用中文信息做关键字,不能正确检索数据库。后来采用加入检查代码等方法探知故障原因如下:

显示乱码主要是因为通过类 httpservletresponse提供的方法setcontenttype 无法改变返回给客户的数据的编码方式,正确的编码方式应为gb2312或者gbk,而事实上为缺省的iso8859-1。无法检索中文信息则是因为,客户提交的中文信息经浏览器编码到达服务器后,servlet无法将其正确解码。

举例说明显示乱码解决方法

servlet 一般通常做法如下:

p lic class zldtestservlet extends httpservlet {

p lic void doget (httpservletreqst reqst,httpservletresponse response)throws servletexception, ioexception{

//在使用 writer向浏览器返回数据前,设置 content-type header ,在这里设置相应的字符集gb2312

response.setcontenttype(\”text/html; charset=gb2312\”);

printwriter out = response.getwriter(); //*

// 正式返回数据

out.println(\”〈html〉〈head〉〈title〉servlet test〈/title〉〈/head〉\” );

out.println(\”这是一个测试页!\”);

out.println(\”〈/body〉〈/html〉\”);

out.close();

}

}

解决页面显示乱码问题,需将*处代码换成如下内容:

printwriter out = new printwriter(new outputstreamwriter(response.getoutputstream(),\”gb2312\”));

solaris中文信息检索问题的解决
浏览器利用表单向服务器提交信息时,一般采用x-www-form-urlencoded 的mime格式对数据进行编码。如果使用get方法,参数名称和参数值经编码后附加在url后,在java中称作查询串(qry string)。

在servlet程序中,如果采用servletreqst的方法getparameter取得参数值,在solaris环境下,对汉字却不能正确解码。因而无法正确检索数据库。

在java 1.2的包–java.net中提供了urlencode和urldecode类。类urlencode提供了按x-www-form-urlencoded格式对给定串进行转换的方法。类urlencode则提供了逆方法。

6、common mail乱码问题

common mail是一个小而方便的mail包,他实现了对java mail的封装,使用起来十分的方便,但是我在使用他的时候发现,使用纯文本的内容发送,结果是乱码,代码如下:

p lic class testcommonmail {
p lic static void main(string[] args) throws emailexception, messagingexception {
simpleemail email = new simpleemail();
email.setcharset(\”gb2312\”);
email.sethostname(\”smtp.163.com\”);
email.sets ject(\”test\”);
email.addto(\”test@163.com\”);
email.setfrom(\”test@163.com\”);
email.setmsg(\”我的测试\”);
email.setauthentication(\”test\”, \”test\”);
email.send();
}
}

分析了一下commons mail的源码找到了原因。源码如下:

p lic class simpleemail extends email
{
p lic email setmsg(string msg) throws emailexception, messagingexception
{
if (emailutils.isempty(msg))
{
throw new emailexception(\”invalid message supplied\”);
}

setcontent(msg, text_plain);
return this;
}
}

email代码片段

p lic void setcontent(object aobject, string acontenttype)
{
this.content = aobject;
if (emailutils.isempty(acontenttype))
{
this.contenttype = null;
}
else
{
// set the content type
this.contenttype = acontenttype;

// set the charset if the input was properly formed
string strmarker = \”; charset=\”;
int charsetpos = acontenttype.tolowercase().indexof(strmarker);
if (charsetpos != -1)
{
// find the next space (after the marker)
charsetpos = strmarker.length();
int intcharsetend =
acontenttype.tolowercase().indexof(\” \”, charsetpos);

if (intcharsetend != -1)
{
this.charset =
acontenttype.s string(charsetpos, intcharsetend);
}
else
{
this.charset = acontenttype.s string(charsetpos);
}
}
}
}

email.send(); 的send方法将调用
p lic void buildmimemessage() throws emailexception
{
try
{
this.getmailsession();
this.message = new mimemessage(this.session);

if (emailutils.isnotempty(this.s ject))
{
if (emailutils.isnotempty(this.charset))
{
this.message.sets ject(this.s ject, this.charset);
}
else
{
this.message.sets ject(this.s ject);
}
}

// ========================================================
// start of replacement code
if (this.content != null)
{
this.message.setcontent(this.content, this.contenttype);
}
// end of replacement code
// ========================================================
else if (this.emailbody != null)
{
this.message.setcontent(this.emailbody);
}
else
{
this.message.setcontent(\”\”, email.text_plain);
}

if (this.fromaddress != null)
{
this.message.setfrom(this.fromaddress);
}
else
{
throw new emailexception(\”sender address required\”);
}

if (this.tolist.size() this.cclist.size() this.bcclist.size() == 0)
{
throw new emailexception(
\”at least one receiver address required\”);
}

if (this.tolist.size() > 0)
{
this.message.setrecipients(
message.recipienttype.to,
this.tointernetaddressarray(this.tolist));
}

if (this.cclist.size() > 0)
{
this.message.setrecipients(
message.recipienttype.cc,
this.tointernetaddressarray(this.cclist));
}

if (this.bcclist.size() > 0)
{
this.message.setrecipients(
message.recipienttype.bcc,
this.tointernetaddressarray(this.bcclist));
}

if (this.replylist.size() > 0)
{
this.message.setreplyto(
this.tointernetaddressarray(this.replylist));
}

if (this.headers.size() > 0)
{
iterator iterheaderkeys = this.headers.keyset().iterator();
while (iterheaderkeys.hasnext())
{
string name = (string) iterheaderkeys.next();
string val = (string) headers.get(name);
this.message.addheader(name, val);
}
}

if (this.message.getsentdate() == null)
{
this.message.setsentdate(getsentdate());
}

if (this.popbeforesmtp)
{
store store = session.getstore(\”pop3\”);
store.connect(this.pophost, this.popusername, this.poppassword);
}
}
catch (messagingexception me)
{
throw new emailexception(me);
}
}
由代码可以知道纯文本方式最终调用了java mail的
message.setcontent(this.content, this.contenttype);
content是内容
contenttype是类型,如text/plain,
(我们可以试试直接用java mail发邮件,设置文本内容不使用settext方法,也使用setcontent(\”测试\”, \”text/plain\”)方式,你可以看到内容也是乱码)

关键就在于text/plain,我们改成text/plain; charset=gb2312,ok乱码解决了。在commons mail我们看simpleemail 类中setmsg方法调用的就是 setcontent(msg, text_plain); 我们只需要将email类中的常量text_plain修改一下加入 charset=你的字符集 ,重新打包jar,这样就可以了

7、toad的字符集的设置与oracle的安装

oracle数据库服务器的安装一般是中文字符集,有时安装在不同的平台下,设置为iso编码,toad是oracle开发的最好工具,不是我说的,可是中文环境下安装的toad,打开英文字符的oracle时,中文全是乱码。必须进行设置

环境变量—〉系统变量

nls_lang=simplified chinese_china.zhs16gbk

nls_lang=american_america.we8iso8859p1

american_america.we8mswin1252

或者

打开注册表,点击hkey_local_mathine
再点击software,再点击oracle
在点击home(oracle所在目录)
在注册表的右半面有nls_lang,
双击它,将你想要的覆盖掉原来的就可以了
最好记下旧的,以便可以改回来。

connect sys/chang_on_install
update props&
set val&=\’zhs16cgb231280\’
where name=\’nls_characterset\’;
commit;
这样就ok了

8、如何解決gwt(google web toolkit)中文的問題

gwt 中文乱码解决方法

1.把你要显示的中文\”测试字符串\”输入到一个文件,如:1.txt
2.进入命令行,进入1.txt所在的目录,敲入以下命令:native2ascii.exe 1.txt 2.txt 回车。这样就生成了另外一个文件2.txt。
3.2.txt的内容如下:\\测\\试\\字\\符\\串
4.然后用上面的编码,在gwt中使用,就可以了.

9、xmlhttp得到的网页怎么是乱码?

(1)在服务器端使用webreqst而不是xmlhttp
(2) 将

streamreader sr = new streamreader(stream);

对于简体中文改成:

streamreader sr = new streamreader(stream , encoding.default );

对于utf-8改成:

streamreader sr = new streamreader(stream , encoding.utf8 );

当然,encoding枚举还有很多其他的成员,对于不同的编码content-type可以有选择的应用

(3)后来我发现无论是content-type是gb2312还是utf-8,用

streamreader sr = new streamreader(stream , encoding.default );

都可以返回正常的汉字,所以统一的改成encoding.default

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

最后,在服务器端从一个url获得网页的源代码的代码如下:

/// <summary>
/// post一个指定的url,获得网页的源代码(用webreqst实现)
/// </summary>
/// <param name=\”url\”></param>
/// <returns>
/// 如果请求失败,返回null
/// 如果请求成功,返回网页的源代码
/// </returns>
p lic static string getcontentfromurl2( string url )
{
//变量定义
string respstr;

webreqst mywebreqst=webreqst.create(url);
// mywebreqst.preauthenticate=tr;
// networkcredential networkcredential=new networkcredential( username , password , domain );
// mywebreqst.credentials=networkcredential;

// assign the response object of \’webreqst\’ to a \’webresponse\’ variable.
webresponse mywebresponse=mywebreqst.getresponse();
system.io.stream stream = mywebresponse.getresponsestream();
streamreader sr = new streamreader(stream , encoding.default );
//以字符串形式读取数据流
respstr = sr.readtoend();
sr.close();

return respstr;

}

Live Messenger遇到80048820错误的解决


  用windows live messenger时遇到出错信息:80048820,总是说防火墙设置阻止msn的连接。这是怎么回事?

  请按照所列顺序尝试以下解决方法:

  1. 使用“连接问题疑难解答程序”解决问题。

  a. 启动 msn messenger。

  b. 在“工具”菜单上,单击“选项”。

  c. 在“选项”对话框中,单击“连接”,然后在“连接设置”下单击“连接测试”。

  注意:对于msn messenger 7.5,单击“连接”,然后在“连接问题疑难解答程序”单击“开始”。

  d. 按照“连接问题疑难解答程序”中的步骤进行操作。

  2. 确认msn messenger是否被防火墙所阻止。

  请至http://webmessenger.msn.com/ 登录web messenger。点击“启动msn web messenger”确认您是否可以登录。如果可以,那么msn messenger有可能被防火墙所阻止。如果您的计算机运行的是第三方(非 microsoft)软件或防火墙软件(例如,zone alarm,norton网络安全专家,或mcafee),请确保该软件配置为允许 messenger 运行,然后再次尝试登录 msn messenger。

  3. 通过执行下列操作调整 internet explorer 中的代理服务器设置。

  a. 打开 internet explorer。

  b. 在“工具”菜单上,单击“internet 选项”。

  c. 单击“连接”选项卡,然后单击“局域网设置”。

  d. 清除“自动检测设置”复选框。

  e. 单击“确定”,然后再次单击“确定”。

  4. 请按如下步骤在msn messenger中清除代理服务器设置:

  a. 开启msn messenger7.5

  b. 单击“工具”菜单上的“选项”。

  c. 单击“连接”,然后点击“高级设置”

  d. 在socks 下删除内容

  e. 连续按两次“确定”保存设置。

  5. 调整 microsoft internet explorer 安全设置:

  a. 启动 internet explorer。

  b. 在“工具”菜单上,单击“internet 选项”,然后单击“高级”选项卡。

  c. 在“安全”部分,确保选中了以下所有复选框:

  - 检查服务器证书吊销

  - 使用 ssl 2.0

  - 使用 ssl 3.0

  d. 单击“确定”关闭窗口。

  e. 注册 ssl 安全库。要执行此操作,请单击“开始”,单击“运行”,然后按照适用于您的操作系统的步骤进行操作。

  注意 在成功执行每个命令后,您都会收到“dllregisterserver succeeded.”消息。请在收到此消息后再执行下一条命令。

  - microsoft windows xp 和 microsoft windows 2000:

  i. 键入 %windir%\\system32\\regsvr32 softpub.dll,然后按 enter 键。

  ii. 键入 %windir%\\system32\\regsvr32 wintrust.dll,然后按 enter 键。

  iii. 键入 %windir%\\system32\\regsvr32 initpki.dll,然后按 enter 键。

  - microsoft windows millennium edition (me) 和 microsoft windows 98:

  i. 键入 %windir%\\system\\regsvr32 softpub.dll,然后按 enter 键。

  ii. 键入 %windir%\\system\\regsvr32 wintrust.dll,然后按 enter 键。

  iii. 键入 %windir%\\system\\regsvr32 initpki.dll,然后按 enter 键。

  f. 如果您使用的是 windows xp,请清除安全套接字层 (ssl) 状态和自动完成历史记录:

  i. 启动 internet explorer。

  ii. 在“工具”菜单上,单击“internet 选项”,然后单击“内容”选项卡。

  iii. 在“证书”下,单击“清除 ssl 状态”。

  iv. 收到报告 ssl 缓存成功清除的消息后单击“确定”。

  6. 双击屏幕右下角的时区验证您的计算机的日期和时间设置正确无误。

  7. 请再次尝试登录msn messenger

  8. 有可能是杀毒软件原因

  如果您正在运行反病毒程序,请先关闭,看是否能登录msn messenger。如果可以,请联系您的软件制造厂商或查看相关文件如何配置解决此冲突。

  9. 如果您仍然无法登录msn messenger, .net messenger服务可能临时不可用。

  请等待几分钟后再尝试登录。或者至visit http://messenger.msn.com/status.aspx 查看服务器状态。

  10. 再试试

  在运行菜单中运行以下程序:

  regsvr32 softpub.dll /s

  regsvr32 wintrust.dll /s

  regsvr32 initpki.dll /s

  regsvr32 dssenh.dll /s

  regsvr32 rsaenh.dll /s

  regsvr32 gpkcsp.dll /s

  regsvr32 sccbase.dll /s

  regsvr32 slbcsp.dll /s

  regsvr32 cryptdlg.dll /s

网站目录

搜索

文章归档

标签云



Powered By wordpress Copyright JSP入门教程 © 2009-2012 版权所有