??xml version="1.0" encoding="utf-8" standalone="yes"?> 二、表单提交中文时出现q
三、数据库q接时出Cؕ?
大家在JSP的开发过E中Q经常出C文ؕ码的问题Q可能一臛_扰着您,我现在把我在JSP开发中遇到的中文ؕ码的问题及解军_法写出来供大家参考?
一、JSP面昄q
下面的显C页?display.jsp)出Cؕ码:
对不同的WEB服务器和不同的JDK版本Q处理结果就不一栗原因:服务器用的~码方式不同和浏览器对不同的字符昄l果不同而导致的。解军_法:在JSP面中指定编码方?gb2312),卛_面的第一行加上:
可以消除ؕ码了。完整页面如下:
二、表单提交中文时出现q
下面是一个提交页?submit.jsp)Q代码如下:
下面是处理页?process.jsp)代码Q?
如果submit.jsp提交英文字符能正显C,如果提交中文时就会出Cؕ码。原因:览器默认用UTF-8~码方式来发送请求,而UTF-8和GB2312~码方式表示字符时不一Pq样出C不能识别字符。解军_?通过request.seCharacterEncoding("gb2312")对请求进行统一~码Q就实现了中文的正常昄。修改后的process.jsp代码如下Q?
三、数据库q接出现q
只要涉及中文的地方全部是qQ解军_法:在数据库的数据库URL中加上useUnicode=true&characterEncoding=GBKOK了?
四、数据库的显CZؕ?
在mysql4.1.0?varcharcdQtextcd׃出现中文qQ对于varcharcd把它设ؓbinary属性就可以解决中文问题Q对于textcdp用一个编码{换类来处理,实现如下Q?
字符存入数据库时?gb2iso()函数Q将字符从数据库取出Ӟ再用 iso2gb()函数?/p>
在一个JSP文gW一ơ被hӞJSP引擎把该JSP文g转换成ؓ一个servlet。而这个引擎本w也是一个servletQ在JSWDK或WEBLOGIC中,它就是JspServlet?nbsp;JSP引擎先把该JSP文g转换成一个Java源文Ӟ在{换时如果发现jsp文g有Q何语法错误,转换q程中断,q向服务端和客户端输出出错信息;如果转换成功Q?nbsp;JSP引擎用javac把该Java源文件编译成相应的class文g。然后创Z个该SERVLET的实例,该SERVLET的jspInit()Ҏ被执行,jspInit()Ҏ在servlet的生命周期中只被执行一ơ。然后jspService()Ҏ被调用来处理客户端的h。对每一个请求,JSP引擎创徏一个新的线E来处理该请求。如果有多个客户端同时请求该JSP文gQ则JSP引擎会创建多个线E。每个客Lh对应一个线E。以多线E方式执行可大大降低对系l的资源需?提高pȝ的ƈ发量及响应时?但应该注意多U程的编E限Ӟ׃该servlet始终M内存Q所以响应是非常快的?nbsp;如果.jsp文g被修改了Q服务器根据设|决定是否对该文仉新编译,如果需要重新编译,则将~译l果取代内存中的servletQƈl箋上述处理q程?nbsp;虽然JSP效率很高Q但在第一ơ调用时׃需要{换和~译而有一些轻微的延迟?nbsp;此外Q如果在M时候如果由于系l资源不的原因QJSP引擎以某种不确定的方式servlet从内存中Ud。当q种情况发生时jspDestroy()Ҏ首先被调? 然后servlet实例便被标记加入"垃圾攉"处理?nbsp;jspInit()及jspDestory()格式如下Q可在jspInit()中进行一些初始化工作,如徏立与数据库的q接Q或建立|络q接Q从配置文g中取一些参数等Q在jspDestory()中释攄应的资源?nbsp;
<%!
public void jspInit()
{
System.out.println("jspinit");
}
%>
<%!
public void jspDestory()
{
System.out.println("jspDestory");
}
%>
二、服务端的输出缓冲区
~省情况?服务端要输出到客L的内?不直接写到客L,而是先写C个输出缓冲区?只有在下面三中情况下Q才会把该缓冲区的内容输出到客户端上Q?nbsp;
该JSP|页已完成信息的输出
输出~冲区已?nbsp;
JSP中调用了out.flush()或response.flushbuffer()
输出~冲区的大小可以?或response.setBufferSize()讄,如下Q?nbsp;
讄输出~冲区的大小?KB。或response.setBufferSize(1);
讄输出~冲区的大小?Q即不缓册Ӏ或response.setBufferSize(0);
用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大?单位为字? 用response.isCommitted()可检查看服务端是否已数据输出到客户? 如果q回值是TRUE则已数据输出到客户?是FALSE则还没有.
三、服务端输出重定?nbsp;
有以?U方法可以做到输出重定向:
RESPONSE.SETREDERECT("URL") 该方法通过修改HTTP协议的HEADER部分,Ҏ览器下达重定向指令的,使浏览器昄重定向网늚内容. response.sendRedirect("http://localhost:7001/index.html");
下面的方法也能改变HTTP HEADER属性,它的原理?nbsp;1 是一L.
<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn="/index.html";
response.setHeader("Location",newLocn);
% >
采用<JSP:FORWORD> 该方法是利用服务器端先将数据输出到缓冲区的机?在把~冲区的内容发送到客户端之?原来的不发?改ؓ发送该面的内?如果?lt;JSP:FORWORD>之前有很多输?前面的输出已使缓冲区?自动输出到客户?那么该语句将不v作用,q一点应该特别注? 如下面的例子?1)会输出index.html的内容,2 不会输出index.html的内容,而是输出out.println("@@@@@@@@@@@@@@@@@"); 中的内容,q且在服务端会抛?java.lang.IllegalStateException: Response already committed 异常Q但客户端没有Q何错误输出?nbsp;
(1)
<%@page buffer="1kb"%>
<%
long i=0;
for(i=0;i<10;i++)
{
out.println("@@@@@@@@@@@@@@@@@");
}
%>
<jsp:forward page="./index.html" />
(2)
<%@page buffer="1kb"%>
<%
long i=0;
for(i=0;i<600;i++)
{
out.println("@@@@@@@@@@@@@@@@@");
}
%>
说明Q?nbsp;
1. Ҏ(1),(2)可以使用变量表示重定向的地址;Ҏ(3)不能使用变量表示重定向的地址?nbsp;
String add="./index.html";
<jsp:forward page= add />
无法重定向到index.html中去
String add=http://localhost:7001/index.html
response.sendRedirect(add);
可以重定向到http://localhost:7001/index.html中去?nbsp;
2. 采用Ҏ(1),(2)request中的变量(通过request.setAttribute()保存到request中的?不能在新的页面中采用,采用Ҏ(3)? lg,我们应该采用(1),(2)重定向比较好.
四、JSP中正应用类:
应该把类当成JAVA BEAN来用Q不要在<% %> 中直接? 如下的代?1)l过JSP引擎转化后会变ؓ代码(2):
从中可看出如果把一个类在JSP当成JAVA BEAN 使用,JSP会根据它的作用范围把它保存到相应的内部对象中.
如作用范围ؓrequest,则把它保存到request对象?q且只在W一ơ调?对象的gؓnull)它时q行实例? 而如果在<% %>中直接创cȝ一个对?则每ơ调用JSP?都要重新创徏该对?会媄响性能.
代码(1)
<jsp:useBean id="test" scope="request" class="demo.com.testdemo">
</jsp:useBean>
<%
test.print("this is use java bean");
testdemo td= new testdemo();
td.print("this is use new");
%>
代码(2)
demo.com.testdemo test = (demo.com.testdemo)request.getAttribute("test");
if (test == null)
{
try
{
test = (demo.com.testdemo) java.beans.Beans.instantiate(getClass().getClassLoader(),"demo.com.testdemo");
}
catch (Exception _beanException)
{
throw new weblogic.utils.NestedRuntimeException("cannot instantiate 'demo.com.testdemo'",_beanException);
}
request.setAttribute("test", test);
out.print("\r\n");
}
out.print("\r\n\r\n\r\n");
test.print("this is use java bean");
testdemo td= new testdemo();
td.print("this is use new");
五、JSP的调?nbsp;
JSP的调试比较麻?特别是当bean是在一个session中存在时Q更加困难。得从好几个面开始往里面走才行。通常是用out.println()或System.out.print()来打一大堆的信息来查问题。如果是用jbuilder做开?它能直接调试JSP.不过更重要的是知道错误生的原因及解x法。下面对一些JSP~程常见错误q行分析?nbsp;
(1).java.lang.NullPointerException异常
一般是对一个ؓNULL值的变量q行操作引v?如下面的操作׃抛出
java.lang.NullPointerException
String a = null;
a.substring(0,1);
为避免这U异常最好在对变量操作之前检查看它是否ؓNULL??
<% String ss=Session.getAttribute("NAME")
if isnull(ss)
{
}
else
{
}
%>
(2).JSP是用JAVA写的Q所以它是大写敏感的,用过其他~程语言的h最Ҏ犯这个错误。另外在览器的地址栏中输入的访问JSP的地址也是区分大小写的.如http://localhost:7001/demo/t.jsp与http://localhost:7001/Demo/t.jsp是不一L
(3).在jsp中判断字W串要用compareToҎQ不要用==Q因为在java中String变量不是一个简单的变量而是一个类实例Q不同的Ҏ会得?nbsp;不同的结果,如下所C:
String str1="ABCD";
String str2="ABCD"; (?nbsp;String str2="AB"+"CD";
if (str1==str2)
out.print("yes");
else
out.print("no");
l果?yes"?nbsp;
String str1,str2,str3;
str1="ABCD";
str2="AB";
str3=str2+"CD";
if (str1==str3)
out.print("yes");
else
out.print("no");
l果?no"?nbsp;
String str1=new String("ABCD");
String str2=new String("ABCD");
if (str1==str2)
out.print("yes");
else
out.print("no");
l果?no"?nbsp;
String str1=new String("ABCD");
String str2=new String("ABCD");
if (str1.compareTo(str2)==0)
out.print("yes");
else
out.print("no");
l果?yes"?nbsp;
(4)防止JSP或SERVLET中的输出被浏览器保存在缓冲区?
览器在默认情况下会把浏览过的网保存在~冲Z,在调试时,一般不希望q样.把下面的脚本加入E序?可防止JSP或SERVLET中的输出被浏览器保存在缓冲区?nbsp;
<%
response.setHeader("Cache-Control","no-store"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
%>
在IE中也可通过讄实现Q把/工具/INTERNET选项/常规/讄/的检察所存页面的较新版本,设ؓ每次讉K该页旉?
六、COOKIE
HTTP COOKIE实质是服务端与在客户端之间传送的普通HTTP?可保存也可不保存在客L盘?如果保存,每一个文件大不过4K的文本文?多个COOKIE可保存到同一个文件中. 如果从编E角度来?在JSP中COOKIE是JAVA提供的一个类.常用的方法如下所表示Q因为客L可能不接受COOKIEQ所以徏议不用它Q改用SESSION{其他方式?nbsp;
public class cookie
{
public String getDomain() //q回该COOKIE的有效域
public int getMaxAge() //q回该COOKIE的有效期,单位为秒
public String getName() //q回该COOKIE的名U?nbsp;
public String getPath() //q回该COOKIE的有效\?nbsp;
public boolean getSecure() //q回该COOKIE的安全设|?nbsp;
public String getValue() //q回该COOKIE的?nbsp;
public void setDomain(java.lang.String pattern) //讄该COOKIE的有效域
public void setMaxAge(int expiry) //讄该COOKIE的有效期,单位为秒
public void setPath(java.lang.String uri) //讄该COOKIE的有效\?nbsp;
public void setSecure(boolean flag) //讄该COOKIE的安全设|?nbsp;
public void setValue(java.lang.String newValue) //讄该COOKIE的?nbsp;
}
一个COOKIE包含以下五部?
NAME/VALUE?讄该COOKIE的名字及它保存的?nbsp;
COOKIE通常和服务器相关,如果域设ؓJAVA.SUN.COM,那么该COOKIE和q个域相?只对该网址起作?当浏览该|址?览器将把该COOKIE的内容发送给服务?COOKIE是作为HTTP HEADER的一部分被发送的Q如果没有设|域,那么COOKIE只和创COOKIE的服务器相关.
路径用于指定服务器上可以使用该COOKIE的文件所在的路径,它只对该|址下的该\径下的应用v作用."/"表示服务器上所有目录都可以使用该COOKIE.
COOKIE都有一个有效期,有效期默认gؓ-1,q表C没有保存该COOKIE,当该览器退出时,该COOKIE立即失效.
安全选项true/false,如果讄为true,那么在服务端与在客户端之间传送该COOKIE的内Ҏ,采用HTTPS协议.
如何查一个客L是否支持COOKIE的方?
用下面的Ҏ写一个COOKIE到客L,q确认成?nbsp;
try
{
Cookie c = new Cookie("mycookie","COOKIE TEST");
response.addCookie(c);
}
catch(Exception e)
{
System.out.println(e);
}
然后在一个新的JSP文g?用下面的Ҏ取客L的COOKIE到cookies? 如果cookies.length ==0,说明该客L的浏览器不支持COOKIE
try
{
Cookie[] cookies = request.getCookies();
if(cookies.length ==0)
{
System.out.println("not support cookie");
}
}
catch(Exception e)
{
System.out.println(e);
}
七、JSP和SERVLET的区?
SUN首先发展出SERVLETQ其功能比较强劲Q体p设计也很先q,只是Q它输出HTML语句q是采用了老的CGI方式Q是一句一句输出,所以,~写和修改HTML非常不方ѝ?nbsp;后来SUN推出了类gASP的JSPQ把JAVA代码嵌套到HTML语句中,q样Q就大大化和方便了网늚设计和修攏VASPQPHPQJSP都是嵌套型的SCRIPT语言?nbsp;一个分布式pȝ应分Z层:表示?业务逻辑?数据存取?在J2EE体系l构?SERVLET用来写业务逻辑层是很强大的Q但是对于写表示层就很不方便。JSP则主要是Z方便写表C层而设计的。ENTITY BEAN实现数据存取层,SESSION BEAN实现业务逻辑层。如果是单的应用pȝ,可采用JSP+BEANS的结构进行设?JSP中应该仅仅存放与表示层有关的东西Q也是_只放输出HTML|页的部份。而所有的数据计算Q数据分析,数据库联l处理,l统是属于业务逻辑层,应该攑֜JAVA BEANS中。通过JSP调用JAVA BEANSQ实C层的整合?nbsp;实际上,微Y的DNA技术,单说Q就是ASP+COM/DCOM技术。与JSP+BEANS完全cMQ所有的表示层由ASP完成Q所有的业务逻辑由COM/DCOM完成?nbsp;Z么要采用q些lg技术呢Q因为单U的ASP/JSP语言是非怽效率执行的,如果出现大量用户点击Q纯SCRIPT语言很快到达了他的功能上限Q而组件技术就能大q度提高功能上限Q加快执行速度。另外一斚wQ纯SCRIPT语言表C层和业务逻辑层在一P造成修改不方便,q且代码不能重复利用Q采用组件技术就只改lg可以了?nbsp;对于复杂的应用,应该采用ENTITY BEAN实现数据存取层,SESSION BEAN实现业务逻辑层,用JSP来调用SESSION BEANQ由SESSION BEAN调用ENTITY BEAN。即采用JSP+EJB来构Z个复杂的分布式系l。它比JSP+BEANh更高的吞吐量Q可靠性,安全性。综上所qͼ对简单应用,可采用JSP+BAENQ对复杂的应用系l,应采用JSP+EJBQSERVLET变的无轻重。用JSP完全可替代它?
]]>
JSP 语法
<%= expression %>
例子
<font color="blue"><%= map.size() %></font>
<b><%= numguess.getHint() %></b>.
用于在页面上输出信息Q语法格式如下:
<%= expression %> ?br><%= 表达?%>
<% a=12;b=a; c=a+b;%>
<font color="blue">
<%=date.toString()%>
</font> <br>
<b>a=<%= a %></b><br>
<b>b=<%= b %></b><br>
<b>c=<%= c %></b><br>
</center>
</body>
</html>
表达式元素表C的是一个在脚本语言中被定义的表辑ּQ在q行后被自动转化为字W串Q然后插入到q个表达C在JSP文g的位|显C。因个表辑ּ的值已l被转化为字W串Q所以你能在一行文本中插入q个表达式(形式和ASP完全一?.
当你在JSP中用表辑ּ时请C以下几点Q?
你不能用一个分P"Q?Q来作ؓ表达式的l束W?但是同样的表辑ּ用在scriptlet中就需要以分号来结了Q查看Scriptlet q个表达式元素能够包括Q何在Java Language Specification中有效的表达?
有时候表辑ּ也能做ؓ其它JSP元素的属性?一个表辑ּ能够变得很复杂,它可能由一个或多个表达式组成,q些表达式的序是从左到叟?br>
JSP 语法格式如下Q?br><% code fragment %> ?br><% 代码 %>
<%@ page language="java" import="java.util.*" %>
<%! int condition;%>
<html>
<head>
<title> test </title>
</head>
<body>
<%
condition=1;
switch(condition){
case 0:
out.println("You must select condition 0!"+"<br>");
break;
case 1:
out.println("You must select condition 1!"+"<br>");
break;
case 2:
out.println("You must select condition 2!"+"<br>");
break;
default:
out.println("Your select not in \"0,1,2\",select again!!"+"<br>");
}
%>
</body>
</html>
转义W? 双引?\“ Q单引号\’Q反斜杠\\Q回车\rQ换行\nQ制表符\tQ退?nbsp;\b
HTTP协议。如果用过ASPQ又对Java有一定的了解的话Q那么对q几UJSP内置对象的用应该能q速掌
握。需要注意的问题是对象名的写法,包括q些对象Ҏ的调用时也要书写正确Q因为Java语言本n是大
写敏感的?br>从本质上ԌJSP的这些内|对象其实都是由特定的JavacL产生的,在服务器q行时根据情况自动生成,所以如果你有较好的Java基础Q可以参考相应的c说明,?.1l出了他们的对应关系。更q一步的讲解会在讲解Servlet的一章中展开Q如果你的Java基础不太好,可以先熟悉在q一章里所介绍的各U方法的使用?br>
描述
声明你将要在JSPE序中用到的变量和方法。你也必这样做Q不然会出错.
你可以一ơ性声明多个变量和ҎQ只要以";"l尾pQ当然这些声明在Java中要是合法的?
当你声明Ҏ或变量时Q请注意以下的一些规?
声明必须?;"l尾(Scriptlet有同L规则Q但?表达式就不同?.
一个声明仅在一个页面中有效。如果你x个页面都用到一些声明,最好把它们写成一个单独的文gQ然后用<%@ include %>?lt;jsp:include >元素包含q来?
<%@ include file=“header.jsp”%> Jsp:include的优点在?它L会检查所含文件中的变?
用jsp:include 控制动态内?br>了解include 指o与动态jsp:include 元素之间的差?br><%@include file=“test.html”%>高速缓?br><jsp:include page=“include.html” flush=“true”>
唯一有些不同的就是,你可以在q个注释中用表达式(例子2所C?。这个表辄是不定的Q由面不同而不同,你能够用各U表辑ּQ只要是合法的就行?br>
隐藏注释
写在JSPE序中,但不是发l客戗?br>JSP 语法
<%-- comment --%>
例子Q?/p>
<%@ page language="java" %>
<html>
<head><title>A Comment Test</title></head>
<body>
<h2>A Test of Comments</h2>
<%-- This comment will not be visible in the page source --%>
</body>
</html>
描述
用隐藏注释标记的字符会在JSP~译时被忽略掉。这个注释在你希望隐藏或注释你的JSPE序时是很有用的?br>JSP~译器不是会?lt;%--and--%>之间的语句进行编译的Q它不会昄在客L览器中Q也不会在源代码中看到在<%-- --%>之间Q你可以L写注释语?
定义JSP文g中的全局属?
JSP 语法
<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*}, ..." ]
[ session="true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relativeURL" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ isErrorPage="true | false" ]
%>
例子
<%@ page import="java.util.*, java.lang.*" %>
<%@ page buffer="5kb" autoFlush="false" %>
<%@ page errorPage="error.jsp" %>
描述
<%@ page %>指o作用于整个JSP面Q同样包括静态的包含文g。但?lt;% @ page %>指o不能作用于动态的包含文gQ比?<jsp:include>
你可以在一个页面中用上多个<% @ page %>指oQ但是其中的属性只能用一ơ,不过也有个例外,那就是import属性。因为import属性和Java中的import语句差不?参照Java Language)Q所以你p多用此属性几ơ了.
无论你把<% @ page %>指o攑֜JSP的文件的哪个地方Q它的作用范围都是整个JSP面。不q,ZJSPE序的可L,以及好的~程习惯Q最好还是把它放在JSP文g的顶?
3QerrorPage="relativeURL"
讄处理异常事g的JSP文g?
4QisErrorPage="true | false"
讄此页是否为出错页Q如果被讄为true,你就能用exception对象
a.jsp 内容Q?/p>
b.jsp 内容Q?I?
_a.class a.jsp~译成类的内?
-------------------------------------------------------------------------------------
a.jsp 内容Q?/p>
b.jsp 内容Q?/p>
_a.class a.jsp~译成类的内?/p>
-------------------------------------------------------------------------------------
a.jsp 内容Q?br>
b.jsp 内容Q?/p>
_a.class a.jsp~译成类的内?/p>
以上是在?WebSphere Application Server 6.1 ~译生成的代码反~译出来?_a.class?br>
接下来要看看 jsp 指oQ如Q?br><%@page contentType="text/html; charset=UTF-8" %>
<%@page autoFlush="false" %>
<%@page buffer="20kb" %>
<%@page isThreadSafe="true" %>
<%@page errorPage="" %>
<%@page extends="" %>
....................
会体现在生成?class 文g的何处,分别起什么作用?br>