随笔 - 26  文章 - 2  trackbacks - 0
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

  • Java语言使用国际字符集(Unicode)。Unicode字符集定义了一套国际标准字符集。通常的ASCII码是8位的,而Unicode字符集中的每个字符占16位,即2个字节,整个字符集共包括65336个字符,兼容ASCII,排在Unicode字符集最前面的256个字符就是ASCII码。Unicode除了可以表示256个ASCII码外,还可以表示汉字、拉丁语、希腊字母、朝鲜语等。 
  • Java语言规定标识符是以字母、下划线"_"或美元符号"$"开始,随后可跟数字、字母、下划线或美元符号的字符序列。
    Java标识符大小写敏感,没有长度限制,可以为标识符取任意长度的名字,但关键字不能作为标识符。

    n为增强程序可读性,Java作如下的约定:
    n类、接口:通常使用名词,且每个单词的首字母要大写
    n方法:通常使用动词,首字母小写,其后用大写字母分隔每个单词
    n常量:全部大写,单词之间用下划线分隔
    n
    变量:通常使用名词,首字母小写,其后大写字母分隔每个单词,避免使用$符号。

     
    nJava中的关键字
    nabstract boolean break byte case catch char class continue default do double else extends final finally float for if implements import instanceof int interface long native new null package private protected public return short static super switch synchronized this throw throws transient try void volatile while

    n

    ntruefalse不是关键字,类似地,对象值null没有列入关键字。但是不能把它们派作其它用途。
    n还有些关键字,如castfuturegotogenericinneroperatorouterrestvar都是Java保留的没有意义的关键字。

    总结:

    • 1. 只能以字母,下划线(_)或美元符($)开头,数字不能作为开头
    • 2. 不能包含美元符($)以外的特殊符号
    • 3. 不能包含空格
    • 4. 可以是中文字符或日文字符
posted @ 2011-10-09 21:25 Java_liyadong 阅读(3288) | 评论 (0)编辑 收藏
     摘要: java内存分配栈、堆、常量池虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同。本文将深入Java核心,详细讲解Java内存分配方面的知识。Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ...  阅读全文
posted @ 2011-10-09 21:23 Java_liyadong 阅读(145) | 评论 (0)编辑 收藏

这是我在网上找到的资料,本来我以为我知道他们的区别,认为主要是当前的请求变量是否继续有效,但看了这个,了解了请求的作用范围,才完全明白其中的原因,希望对大家有用。

不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。

重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。

转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

正文开始:

先是看上去不同,他们的调用分别如下:

request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp

response.sendRedirect("apage.jsp");//重定向到apage.jsp

在jsp页面中你也会看到通过下面的方式实现转发:

<jsp:forward page="apage.jsp" />

提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个链接时,也创建了一个新的请求。那么一个请求的作用域到底有多大呢?例如:

在页面a.jsp中有一个链接<a href="b.jsp?id=1">这是指向b的一个链接,而且还带了一个参数</a>。当我们点击这个连接的时候,就产生了一个请求,为了明确起见,我们把它叫做requestA->B。现在,在b.jsp页面中我们就可以从这个请求中获取信息了。在b.jsp中你可以写入out.println(request.getParameter("id"))进行测试。下面更复杂一点,我们在b.jsp页面中增加下面的语句:

request.setAttribute("name","funcreal");

out.println(request.getAttriblute("name"));//成功显示了name变量的值。

现在在b.jsp中再增加一个链接:<a href="c.jsp?age=23">这是指向c的一个链接,而且还带了一个参数</a>,当我们点击这个连接的时候,将产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为id,name这两个变量都属于requestA-B,此时他已经不存在了。下面是源代码:

a.jsp

<%@ page c %>

<html>

<body bgcolor="#ffffff">

<a href="b.jsp?id=1">指向b.jsp,而且还带了一个参数id=1。requestA-B现在诞生了</a>

</body>

</html>

b.jsp

<%@ page c %>

<html>

<body bgcolor="#ffffff">

<%

out.println("id=" + request.getParameter("id"));

request.setAttribute("name","Func Real");

out.println("name=" + request.getAttribute("name"));

%>

<a href="c.jsp?age=23">requestA-B已经结束了。指向c.jsp,而且还带了一个参数age=23</a>

</body>

</html>

c.jsp

<%@ page c %>

<html>

<body bgcolor="#ffffff">

<%

out.println("id=" + request.getParameter("id"));

out.println("name=" + request.getAttribute("name"));

out.println("age=" + request.getParameter("age"));

%>

</body>

</html>

那么转发又是怎么回事呢?现在增加一个页面叫做d.jsp,并且在c.jsp中</body>前面增加一句<jsp:forward page="d.jsp"/>

d.jsp

<%@ page c %>

<html>

<body bgcolor="#ffffff">

requestB-C的魔爪已经伸到了d.jsp页面

<%

out.println("age=" + request.getParameter("age"));

%>

</body>

</html>

运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp但实际上,但浏览器中显示的已经是d.jsp的内容了,而且看到了从b.jsp传过来的参数。你可以简单得这样理解:转发,就是延长了requestB-C的作用域,<jsp:forward page="d.jsp"/>,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。

如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward("xxx");了。因为我们在这个Action中设置的请求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。

总结:

用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。

不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。

重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。

转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址, web应用程序会要求客户端浏览器重新发出请求地址,客户端会重新连接至所指定的地址,因此浏览器的地址会出现重新导向的信息,重新导向后的请求由浏览器发出。

forward与include共享Request范围内的对象,而redirect则不行,

forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源

posted @ 2011-10-09 17:41 Java_liyadong 阅读(1300) | 评论 (0)编辑 收藏
在网上看到很多说法:
jsp静态包含和动态包含的区别:
  1. 动态INCLUDE 用jsp:include 动作实现。   
  2. <jsp:include page="included.jsp"  
  3. flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并   
  4. 且可以带参数   
  5. 静态INCLUDE 用include 伪码实现,定不会检查所含文件的变化,适用于包   
  6. 含静态页面:<%@ include file="included.htm" %>  

可是经本人验证这种说话是不完全正确的,至少动态<jsp:inlude>指令是可以包含动态页面的。

个人认为区别是:

1<jsp:inlude>在同一个页面中可以包含尽可能多的条数,不管这个页面中有什么内容,只要页面本身合法就行,而<%@ include>伪指令如果被包含页面有定义变量和方法的话只能包含一条。

(这个是和第二条的编译方式相一致的)

2动态包含在请求到来时编译包含页面和被包含页面,如果都是jsp页面,那么将生成俩个页面对应的class文件和java文件。而静态包含只会生成包含页面的java文件和类文件。

3所谓动态包含是指在请求包含页面的时候遇到动态包含指令将请求转到被包含页面,这时去编译被包含页面。静态包含是在请求包含页面时去编译包含页面,编译时遇到静态页面包含伪码将被包含页面的内容复制到被包含页面中进行编译。

4<jsp:inlude >指令时相对包含页面的被包含文件路径,但静态包含是相对被包含文件路径的。(这一点孙鑫老师在《java web 深入详解》中讲的很清楚)

5引用被包含页面的范围属性时动态包含的指令是与位置相关的,即在<jsp:include>指令之前引用被包含页面中设置的属性值是无效的。但是静态包含是不区分包含指令的位置的,可以在包含指令之前引用被包含页面设置的属性,是有效的。

俩者是有相同点的:

1 都可以进行交互,request范围对象中的属性包含页和被包含页之间可以交互使用。

2被包含页面中引用包含页面设置的属性时俩者都和设置包含页面中范围属性的值有关,即在包含被包含页面之前设置的范围属性才有效。

代码如下: 包含页面: index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" buffer="23kb"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>this is 'index.jsp' </title>

</head>

<body> 
这是包含页面<br/>

<%--静态包含前引用被包含页面设置的属性 --%>
${name }静态包含前引用被包含页面设置的属性<br/>
<%--包含页面设置属性 --%>
   
   <%request.setAttribute("pws","456") ;%>

   <%--<%@include file="MyJsp.jsp"%>此处因为MyJsp.jsp中定义了变量,固不可以重复包含 --%>
   <%-- --%><%@include file="MyJsp.jsp" %>
   
    ${name }包含静态页面之后引用属性<br/>
   <%--此处没有you.jsp中没有定义变量,所以可以重复包含 --%>
   ${wangzhanming }<br/>
   <%@include file="you.jsp" %>
   <%@include file="you.jsp" %>
   ${wangzhanming }<br/>
  

<jsp:include page="MyJsp.jsp" ></jsp:include>
<jsp:include page="MyJsp.jsp" ></jsp:include>

<%request.setAttribute("pws","lyx") ;%>
<%--此处可以重复包含--%>
   <jsp:include page="MyJsp.jsp" ></jsp:include>
   <%@include file="you.jsp" %>
   ${name }<br/>
</body>
</html>
设置变量的包含页面: MyJsp.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--定义变量 --%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <base href="<%=basePath%>">
    
    <title>this is 'MyJsp.jsp' </title>
    
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
这是定义变量的包含页面<br/>
<%--被包含页面中设置范围属性 --%>
<%request.setAttribute("name","wzm"); %>
    ${name } <br>
    <%--被包含页面中引用包含页面的属性 --%>
    ${pws }<br/>
</body>
</html>

不包含变量设置的被包含页面: you.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>

    
    <title>this is 'you.jsp' </title>
    
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
    这是不定义变量的被包含页面 <br>
    <%request.setAttribute("wangzhanming","haoren"); %>
    ${wangzhanming }<br/>
    ${pws }<br/>
</body>
</html>

posted @ 2011-10-09 17:36 Java_liyadong 阅读(11132) | 评论 (1)编辑 收藏
JSP常用指令

一.指令元素
1.page指令
import
session
contentType
buffer
isTreadSafe
info
errorPage
isErrorPage
2.include指令
3.taglib指令
二.脚本元素
1.声明元素
2.表达式元素
3.脚本元素
4.注释元素
三.标准动作元素
1.<jsp:param>
2.<jsp:include>
3.<jsp:forward>
4.<jsp:plugin>
5.<jsp:useBean>
6.<jsp:setProperty>
7.<jsp:getProperty>
四.内置对象
1.request
2.response 
3.out
4.session
5.pageContext
6.application
7.config
8.page
9.exception
五.JavaBeans的使用
1.JavaBeans在JSP中的基本使用格式
2.scope范围的具体设定
3.session事件的运用
4.Bean的保存与读取
六.JSP中的文件操作
七.JSP运行原理剖析
-------------------------------------------------

在早期,开发网络数据库应用程序主要采用CGI(Common Gateway Interface)技术。编写CGI程序可以使用不同的程序语言,如Perl、Visual Basic、Delphi或C/C++等。虽然CGI技术已经发展成熟而且功能强大,但由于其编程困难、效率低下、修改复杂等缺陷,所以有被新技术取代的技术。
在这样的背景下,新的技术纷纷面世,如ASP(Active Server Page)、PHP(Personal Home Page)、JSP(Java Server Page)等。其中,JSP被许多人认为是未来最有发展前途的动态网站技术。
JSP页面一般由HTML标签和JSP元素构成,其中的JSP元素则又是由“指令元素”、“脚本元素” 、“标准动作元素” 、“内置对象”四个部分组成。下面,就让我们一起来探究JSP的奥秘吧……

一.    指令元素

可以把JSP理解为用来通知JSP引擎的消息。JSP不直接生成可见的输出,用JSP指令设置JSP引擎处理JSP页面的机制。
一般JSP指令用标签<%@…%>表示,JSP指令包括page、include和taglib。page指令是针对当前页面的指令,而include指令用来指定如何包含另外一个文件,taglib指令用来定义和访问自定义标记库。这三种指令通常都有默认值,这样开发人员就不必显式的使用每一个指令予以确认。
1.    page指令
page指令的设置语法格式是:<%@ page attribute1=”value1” attribute2=”value2”…%>
下面介绍指令中包括的几个常用属性,并作简要说明。
l    import
import指令是所有page指令中,唯一可以多次设置的指令,而且累加每个设置。它用来指定jsp网页中所需要使用到的一些类。例如:
<%@ page import=”java.io.*,java.util.Date”%>
l    session
定义当前页面是否参与http会话。当设置为”true”时,可以获得隐含名为session的对象,为”false”时,则不能。默认设置为”true”。
l    contentType
设置jsp网页输出时数据时,所使用的字符压缩方式,以及所使用的字符集,当编写中文网页时,设置如下:
<%@page contentType=”text/html;charset=Gb2312”%>
此属性的默认值为”text/html;charset=ISO-8859-1”。
l    buffer
设置jsp网页的缓冲区大小,默认为”8k”,如果设置为”none”,则表示不使用缓冲,所有的响应输出都将被PrintWriter直接写到ServletResponse中。
l    isTreadSafe
定义当前页面是否支持线程安全。如果为”true”,则该页面可能同时收到jsp引擎发出的多个请求,反之,jsp引擎会对收到的请求进行排队,当前页面在同一时刻只能处理一个请求。默认为”true”。
l    info
设置页面的文本信息,可以通过Servlet.getServletInfo()的方法获得该字符串。
l    errorPage
定义指向另一个jsp页面的URL。当页面出现一个没有被捕获的异常时,错误信息将以throw语句抛出,而被设置为错误信息网页的jsp页面,将利用exception隐含对象,取得错误信息。
默认没有错误处理页面。    
l    isErrorPage
设置此jsp网页是否为错误处理页面。默认值为”false”。当设置为”true”时,jsp页面将可存取隐含的exception对象,并通过该对象取得从发生错误之网页所传出的错误信息。取得错误信息的语法如下:
<% =exception.getMessage()%>
²    一个页面错误处理的例子
产生错误的页面文件为MakeError.jsp,处理错误的页面文件为ErrorPage.jsp,它们的源程序如下:
MakeError.jsp

<%@ page errorPage="ErrorPage.jsp"%> 
<html>  
<head> 
   <title>产生错误页面</title> 
</head> 
<body> 
<% 
int i=8,j=0; 
out.println(ij); 
%> 
</body> 
</html> 
ErrorPage.jsp 
<%@ page isErrorPage="true"%> 
<html>  
<head> 
   <title>错误处理页面</title> 
</head> 
<body> 
<font color=red> 
 错误原因:<%=exception.getMessage()%> 
</font> 
</body> 
</html>

运行程序MakeError.jsp的结果如下:
 
2.    include指令
使用include指令可以把其他的文本文件加入到当前的jsp页面,格式如下:
<%@ include file=”header.inc”%>
如此,则在当前页面中加入header.inc源代码然后再编译整个文件。
可以使用include指令把一个页面分成不同的部分,最后合成一个完整的文件,使用jsp的include指令有助于实现jsp页面的模块化。
3.    taglib指令
(略)

二.    脚本元素

JSP规格提供了四种类型的脚本元素,包括:
l    声明
l    表达式
l    脚本
l    注释
下面分别对它们进行详细叙述。
1.    声明元素
声明用于定义jsp页面中的变量与函数,这些经过定义的变量和函数,将成为Servlet类的属性与方法(关于Servlet请参看后文)。声明并不会产生任何的数据输出,声明时可同时设置初始值,提供给其他的声明、表达式或脚本使用。
声明的语法格式为:

<%! 
    //声明语句 
%> 
举例: 
<%! 
//此处定义的变量将成为此jsp页面的全局变量 
int i = 0; 
static int j=100; 
String s = “注意”;  
%> 
<%! 
//此处定义的函数将成为此jsp页面的公共函数 
Public int square(int i) 

    return(i*i); 

%>

²    jspInit函数与jspDestroy函数
若要在jsp页面开始执行时进行某些数据的初始化,可以利用jspInit函数完成。此函数将在jsp页面被执行时调用,且当jsp页面重新整理时,并不会被再度执行。当关闭服务器时,jspDestroy函数将被执行,可以利用该函数进行数据的善后处理工作。下面举个简单的例子说明,文件InitDes.jsp代码如下:

<%@ page contentType="text/html; charset=GB2312"%> 
<%! 
public void jspInit() 

    System.out.println("jspInit is called!"); 
}

public void jspDestroy() 

    System.out.println("jspDestroy is called!"); 

%> 
<HTML> 
<HEAD><TITLE>jspInit函数与jspDestroy函数的使用</TITLE></HEAD> 
<BODY> 
<CENTER> 
<FONT SIZE = 5 COLOR = blue>jspInit函数与jspDestroy函数的使用</FONT> 
</CENTER> 
<HR><BR> 
</BODY> 
</HTML>

首次执行此页面时,Resin服务器输出如下:
Resin 1.2.2 -- Tue Jan 16 09:53:18 PST 2001
http listening to *:8080
srun listening to 127.0.0.1:6802
jspInit is called!
刷新此页面数次后,Resin服务器输出仍然如上。
此时,如果关闭服务器,则输出如下:
Resin 1.2.2 -- Tue Jan 16 09:53:18 PST 2001
http listening to *:8080
srun listening to 127.0.0.1:6802
jspInit is called!
closing server
jspDestroy is called!
由此,我们得到启发,在数据库的开发过程中,可以利用jspInit函数来进行数据库的连接工作,用jspDestroy函数来进行数据库的关毕工作。下面以一个分页显示数据库内容的程序为例子,让读者进一步体会jspInit与jspDestroy的功用与好处。
在Pages.jsp这个分页程序中,我们把数据库连接的动作写在jspInit函数中,这样,每一次重新整理页面时,就可以避免重新执行数据库的连接动作。如下:

<%@ page contentType="text/html; charset=GB2312"  
    import="java.sql.*"%> 
<%! 
int PageSize = 2; //设置每张网页显示两笔记录 
int ShowPage = 1; //设置欲显示的页数 
int RowCount = 0; //ResultSet的记录笔数 
int PageCount = 0; //ResultSet分页后的总页数 
Connection con = null; 
Statement stmt = null; 
ResultSet rs = null;

public void jspInit() //执行数据库与相关数据的初始化 
{     
    try 
        { 
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
        //载入驱动程序类别

        con = DriverManager.getConnection("jdbc:odbc:test"); 
        //建立数据库链接

        stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
                       ResultSet.CONCUR_READ_ONLY); 
        //建立Statement对象, 并设置记录指标类型为可前后移动

        rs = stmt.executeQuery("SELECT * FROM products"); 
        //建立ResultSet(结果集)对象,并执行SQL语句

        rs.last(); //将指标移至最后一笔记录

        RowCount = rs.getRow(); //取得ResultSet中记录的笔数 
     
        PageCount = ((RowCount % PageSize) == 0 ?  
                (RowCountPageSize) : (RowCountPageSize)+1); 
        //计算显示的页数 
    } 
    catch(Exception ex) 
    {     
        System.out.println(ex.toString()); 
    } 
}

public void jspDestroy() //执行关闭各种对象的操作 

    try 
        { 
        rs.close(); //关闭ResultSet对象 
        stmt.close(); //关闭Statement对象 
        con.close(); //关闭数据库链接对象 
    } 
    catch(Exception ex) 
    { 
        System.out.println(ex.toString()); 
    } 

%> 
<HTML> 
<HEAD> 
<TITLE>记录的分页显示</TITLE> 
</HEAD> 
<BODY> 
<CENTER> 
<FONT SIZE = 5 COLOR = blue>记录的分页显示</FONT> 
</CENTER> 
<HR> 
<P></P> 
<CENTER> 
<% 
String ToPage = request.getParameter("ToPage");

//判断是否可正确取得ToPage参数,  
//可取得则表示JSP网页应显示特定分页记录的语句 
if(ToPage != null) 

    ShowPage = Integer.parseInt(ToPage); //取得指定显示的分页页数 
     
    //下面的if语句将判断用户输入的页数是否正确 
    if(ShowPage > PageCount) 
    { //判断指定页数是否大于总页数, 是则设置显示最后一页 
        ShowPage = PageCount; 
    } 
    else if(ShowPage <= 0) 
    { //若指定页数小于0, 则设置显示第一页的记录 
        ShowPage = 1; 
    } 
}

rs.absolute((ShowPage - 1) * PageSize + 1);  
//计算欲显示页的第一笔记录位置 
%> 
<H3>目前在第<FONT SIZE = 4 COLOR = red> 
<%= ShowPage %></FONT>页, 共有 
<FONT SIZE = 4 COLOR = red> 
<%= PageCount %></FONT>页</H3> 
<P></P> 
<% 
//利用For循环配合PageSize属性输出一页中的记录 
for(int i = 1; i <= PageSize; i++) 

    %> 
    <TABLE border=1 bordercolor=RoyalBlue bgcolor=LightBlue> 
        <TR><TD bgcolor=LightYellow width= 100> 
        <B>商品名</B></TD> 
        <TD width= 100><B><%= rs.getString("product_name") %> 
        </B></TD> 
        <TD bgcolor=LightYellow width= 100> 
        <B>价格</B></TD> 
        <TD width= 100><B><%= rs.getInt("price") %> 
        </B></TD> 
        <TD bgcolor=LightYellow width= 100> 
        <B>描述</B></TD> 
        <TD width= 100><B><%= rs.getString("description") %> 
        </B></TD> 
        </TR> 
    </TABLE><BR> 
    <% 
    //下面的if判断语句用于防止输出最后一页记录时,  
    //将记录指标移至最后一笔记录之后 
    if(!rs.next())     //判断是否到达最后一笔记录 
        break;  //跳出for循环 

%> 
<TABLE> 
<TR valign=baseline align=center> 
<% 
//判断目前所在分页是否为第一页, 
//不是则显示到第一页与上一页的超链接 
if(ShowPage != 1) 

//下面建立的各超链接将链接至自己,  
//并将欲显示的分页以ToPage参数传递给自己 
    %> 
    <TD Width=150> 
    <A Href=Pages.jsp?ToPage=<%= 1 %>>到第一页</A> 
    </TD> 
    <TD Width=150> 
    <A Href=Pages.jsp?ToPage=<%= ShowPage - 1 %>>到上一页</A> 
    </TD> 
    <% 
}

//判断目前所在分页是否为最后一页, 
//不是则显示到最后一页与下一页的超链接 
if(ShowPage != PageCount) 

//下面建立的各超链接将链接至自己,  
//并将欲显示的分页以ToPage参数传递自己 
    %>     
    <TD Width=150> 
    <A Href=Pages.jsp?ToPage=<%= ShowPage + 1%>>到下一页</A> 
    </TD>   
    <TD Width=150> 
    <A Href=Pages.jsp?ToPage=<%= PageCount %>>到最后一页</A> 
    </TD> 
    <% 

%> 
<TD Width=150> 
<FORM action=Pages.jsp method=POST> 
到  
<!-- 
供用户输入欲查看页数的文字方块, 预设值为目前所在的分页,  
当用户在此文字方块中完成数据输入后按下 Enter 即可将数据送出, 
相当于按下Submit按钮, 因此此表单中将省略Submit按钮 
--> 
<INPUT type="text" name=ToPage style="HEIGHT: 25px; WIDTH: 40px" 
 value=<%= ShowPage%> > 页 
</FORM></TD></TR> 
</TABLE> 
</CENTER> 
</BODY> 
</HTML>

执行后,结果如下图:
 
2.    表达式元素
表达式是一个简化了的out.println语句。
表达式的语法格式为:
<%=//要输出的数据%>
举例:
<%=square(5)%>
3.    脚本元素
脚本是java程序的一段代码,只要符合java语法的语句都可以写在这里,它是在请求时期执行的,它可以使用jsp页面所定义的变量、方法、表达式或JavaBeans。
脚本的语法格式为:

<% 
    //java代码 
%> 
举例: 
<% 
if(age<18) 

   out.println(“你是未成年人!!!!”); 

else 

   out.println(“你已经成年了!!!!”); 

%>

4.    注释元素
用来对程序进行说明注释。注释大体有下列三种格式:
<!—客户端注释à
<!--<%=客户端动态注释%>-->
<%--服务器端注释--%>

三.    标准动作元素

标准动作元素用于执行一些常用的JSP页面动作,例如:将页面转向、使用JavaBean、设置JavaBean的属性等。在JSP中,标准动作元素共有以下几种:
l    <jsp:param>
l    <jsp:include>
l    <jsp:forward>
l    <jsp:plugin>
l    <jsp:useBean>
l    <jsp:setProperty>
l    <jsp:getProperty>
其中<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>这三个是专门用来操作JavaBeans的。
下面分别介绍它们。
1.    <jsp:param>
<jsp:param>动作用于传递参数,必须配合<jsp:include>、<jsp:forward>、<jsp:plugin>动作一起使用。
语法格式:
<jsp:param name = “name1” value = “value1”/>
2.    <jsp:include>
<jsp:include>动作用于动态加载HTML页面或者JSP页面。
语法格式:
<jsp:include page = “网页路径”>
<jsp:param name = “name1” value = “value1”/>
<jsp:param name = “name2” value = “value2”/>
<jsp:include/>
在jsp页面中,可以利用下面的语法取得返回的参数:
request.getParameter(“name1”);
若不传递参数时,则语法格式如下:
<jsp:include page = “网页路径”/>
举例:
a.jsp页面代码如下:

<jsp:include page = "b.jsp"> 
    <jsp:param name = "name1" value = "value1"/> 
    <jsp:param name = "name2" value = "value2"/> 
</jsp:include>

b.jsp页面代码如下:
名字1、;<%=request.getParameter("name1")%>
<hr color=red>
名字2、;<%=request.getParameter("name2")%>
执行结果如下:
 
“include标准动作”和“include指令”的差别在于:“include标准动作”包含的页面在运行时被加入,而“include指令”在编译时就被加入了。
3.    <jsp:forward>
<jsp:forward>动作用于将浏览器显示的页面导向到另一个HTML页面或者jsp页面。
语法格式:
<jsp:forward page = “网页路径”/>
当然,<jsp:forward>动作中也可以加入<jsp:param>参数,其设置和获得参数的方法与<jsp:include>类似。
4.    <jsp:plugin>
<jsp:plugin>动作用于加载applet,用途与HTML语法中的<Applet>及<Object>标记相同。该动作是在客户端执行的,这里就不作介绍了。
5.    <jsp:useBean>
(见后文的“JavaBeans”的使用)
6.    <jsp:setProperty>
(见后文的“JavaBeans”的使用)
7.    <jsp:getProperty>
(见后文的“JavaBeans”的使用)

四.    内置对象

在jsp页面中有一些已经完成定义的对象,称之为内置对象。这些对象可以不经过定义就直接使用,因为它们是由jsp页面自己定义的。
jsp程序常用的内建对象有如下几个:request、response、out、session、pageContext、application、config、page、exception。你可以在jsp页面中直接使用它们,用以加强jsp程序的功能。
下面分别介绍它们。
1.    request
与request相联系的是HttpServletRequest类。通过getParameter方法可以获得相应的参数值。
2.    response 
与response相联系的是HttpServletResponse类。表示Web页面针对请求的应答。
3.    out
与out相联系的是PrintWrite类。可以使用此对象将内容输出到页面中。
4.    session
与session相联系的是HttpSession类。用来传递客户的会话内容。
5.    pageContext
与pageContext相联系的是pageContext类。用它能方便的访问本页面中设置的共享数据。
6.    application
与application相联系的是ServletContext类。用它能够实现应用程序级别的数据共享。
7.    config
与config相联系的是ServletConfig类。用来在jsp页面范围内处理jsp配置。
8.    page
代表jsp页面编译成的Servlet实例,一般不用。
9.    exception
与exception相联系的是Throwable类。用来捕获jsp执行时抛出的异常。
五.    JavaBeans的使用
JavaBeans是运行于java虚拟机上的100%的纯java组件,它的概念描述很类似于Microsoft的COM组件概念。
JavaBeans传统的应用在于可视化领域,如AWT下的应用。其实,基于AWT的任何java程序已经是一个Bean,完全可以把它当作一个组件来使用。
现在,JavaBeans更多的应用在不可视化领域,它在服务器端应用方面表现出了越来越强的生命力。不可视化的JavaBeans在JSP程序中用来封装事务逻辑,可以很好的实现业务逻辑和前台程序的分离,使得系统具有更好的健壮性和灵活性。
JavaBeans描述了JDK1.1以前的java所没有的东西,因此,运行JavaBeans最小的需求是JDK1.1或者以上的版本。
1.    JavaBeans在JSP中的基本使用格式
l    在JSP中调用JavaBeans的格式
//加载Bean
<jsp:useBean id = “名称” scope = “有效范围” class = “Bean类位置”/>

//设定Bean属性(两种方法)
//方法一:“标签设定”
<jsp:setProperty name = “名称” property = “属性” value = “值”/>
//方法二:“方法设定(用于java程序中)”
Bean对象名称.set属性(值)

//获取Bean属性(两种方法)
//方法一:“标签获取”
<jsp:getProperty name = “名称” property = “属性”/>
//方法二:“方法获取(用于java程序中)”
Bean对象名称.get属性()
l    JavaBean编写的格式
//定义Bean类所属于的包

package 包名

//定义为公开等级的类,并且类名称与源代码文件名相同 
public class类名 

   //Bean类的属性,其等级定义为private 
   private 数据类型 属性名

   //用来初始化的构造函数 
   //Bean的构造函数无输入参数 
   public 类名 
   {  }


   //以setXXX函数,作为设定Bean类属性的接口 
   public void set属性名称(数据类型 参数) 
   { 
      this.属性 = 参数 
   }

   //以getXXX函数,作为取得Bean类属性的接口 
   public void get属性名称() 
   { 
      return this.属性 
   } 
}

²    一个简单的使用JavaBeans的例子
Bean文件LoginData.java的源代码如下:

package j2ee.jsp; 
//定义Bean所属的包

public class LoginData 

    //Bean属性 
    private String Name = ""; 
    private String Pwd = "";

    public LoginData()  //构造函数 
    {         
    }

    //以下为设定Bean属性的方法 
    public void setLoginName(String name) 
    { this.Name = name; } 
    public void setPassword(String pwd) 
    { this.Pwd = pwd; }

    //以下为取得Bean属性的方法 
    public String getLoginName() 
    { return this.Name; } 
    public String getPassword() 
    { return this.Pwd; } 
}

调用Bean的jsp文件UseBean.jsp源程序如下:

<%@ page contentType="text/html; charset=GB2312" %> 
<HTML> 
<HEAD> 
<TITLE>使用Beans</TITLE> 
</HEAD> 
<BODY> 
<CENTER> 
<FONT SIZE = 5 COLOR = blue>使用Beans</FONT> 
</CENTER> 
<HR> 
<P></P> 
<H2> 
<jsp:useBean id="login" scope="application"   
    class="j2ee.jsp.LoginData"/> 
<jsp:setProperty name="login"  
    property="loginName" value="最后的决定"/> 
<% 
login.setPassword("123456"); //调用Bean对象的方法, 设定属性 
%>

<Font color = red>LoginName</Font>属性值为 
<Font color = blue> 
<jsp:getProperty name="login" property="loginName"/> 
</Font><BR> 
<Font color = red>Password</Font>属性值为 
<Font color = blue> 
<%--以调用Bean对象方法的方式取得属性--%> 
<%= login.getPassword() %></Font> 
</BODY> 
</HTML>

运行结果如下:
 
在前面的使用中,有两点值得注意:
(1)    Bean中各个方法名的“命名规则及大小写”与调用Bean时的“方法名规则及大小写”之间的对应关系需要注意。
(2)    Beans的存放目录将随选用服务器的不同而不同。以resin服务器而言,Beans默认定义存放在application-programme\WEB-INF\classes子目录中。
2.    scope范围的具体设定
JavaBeans可以定义四种生命周期?D?Dpage、request、session与application,将分别运用pageContext、request、session、application四种对象的setAttribute方法,将JavaBeans对象保存在该对象中。下面分别说明:
l    Page的有效范围仅仅涵盖使用JavaBeans的页面,一旦你离开此页面,JavaBeans对象的实体也将随之消失。
l    Request的有效范围仅及于使用JavaBeans的请求而已,一旦你结束该页面的请求,JavaBeans对象的实体也将随之消失。
l    Session的有效范围涵盖了整个用户会话时期。在用户会话期间,JavaBeans对象的实体均不会消失。当用户会话结束时,JavaBeans对象的实体才会消失。
l    Application的有效范围则涵盖了整个应用程序时期。在应用程序期间,JavaBeans对象的实体均不会消失。只有当应用程序结束时,JavaBeans对象的实体才会消失。
下面,举一个简单的例子,对Request与Session两种生命周期做具体的演示。
Bean文件counter.java的源代码如下:

package j2ee.jsp; 
public class counter 

    private int count = 0; 
     
    public void setCount(int c) 
    { 
        this.count = c; 
    } 
     
    public int getCount() 
    { 
        this.count++; 
        return this.count; 
    } 
}    

Request实例
两个jsp文件b1.jsp与b2.jsp代码分别如下:
b1.jsp

<jsp:useBean id="counter" scope="request" class="j2ee.jsp.counter"/>

<% 
counter.setCount(100); 
%>

<jsp:forward page="b2.jsp"/> 
b2.jsp 
<jsp:useBean id="counter" scope="request" class="j2ee.jsp.counter"/>

<% 
out.println(counter.getCount()); 
%>

运行结果如下:
 
Session实例
两个jsp文件c1.jsp与c2.jsp代码分别如下:
c1.jsp
<jsp:useBean id="counter" scope="session" class="j2ee.jsp.counter"/>

<%
out.println(counter.getCount());
%>

<a href="c2.jsp" target="_blank">c2.jsp</a>
c2.jsp
<jsp:useBean id="counter" scope="session" class="j2ee.jsp.counter"/>

<%
out.println(counter.getCount());
%>
运行结果如下:
 
3.    session事件的运用
在jsp页面中,将Bean对象保存至session对象时,可以定义Bean响应HttpSessionBindingEvent事件。当Bean对象加入session、Bean从session中删除以及session对象终止时,将会触发此事件。因此,我们可以利用这两个事件,执行数据起始、善后的工作。
由此,我们可以想到,把jsp页面中最耗费服务器资源的数据库连接工作放入HttpSessionBindingEvent事件中。当一个会话开始时,建立一个“数据库连机”,随后的整个会话过程中,所有与数据库相关的操作均使用这一个“连机”,这样,就避免了每执行一次数据库操作就产生一个数据库连机的巨大消耗。当此会话结束时,再关闭释放这个“数据库连机”。
如果要Bean对象响应HttpSessionBindingEvent事件,则该Bean对象必须实现HttpSessionBindingListener接口,并且定义响应会话开始的valueBound方法以及响应会话结束的valueUnbound方法。
现在,我们来实做一个例子,首先,建立一个“用来建立会话级别数据库联机”的Bean文件DBCon.java,它的源代码如下所示:

/* 
 * 文件名:DBCon.java 
 * 
 * 类名:DBCon 
 * 
 * 所属包:j2ee.jsp 
 * 
 * 导入包:java.sql.*;javax.servlet.http.*;  
 * 
 * 作者:杨?? 
 * 
 * 创建时间:2003.12.9 
 * 
 * 用途描述:在此JavaBean中建立会话级别的数据库联机,供会话过程中的各个jsp页面使用 
 *  
 * 版本号:1.0 
 * 
 */

package j2ee.jsp;

import javax.servlet.http.*;  
import java.sql.*;

//定义DBCon类别实做HttpSessionBindingListener介面 
public class DBCon implements HttpSessionBindingListener 

    //与数据库连结有关的Bean属性 
    private Connection con = null; 
     
      /** 
       * 方法名:BulidConnection 
       * 级别:private 
       * @param     (无) 
       * @return    (无) 
       * @throws    (无) 
       * 作用:建立一个数据库联机 
       */ 
    private void BulidConnection() 
    { 
        try 
        { 
            System.out.println("BulidConnection()方法被调用");      
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
            //载入驱动程式类别 
     
            con = DriverManager.getConnection("jdbc:odbc:test"); 
            //建立数据库连线             
        } 
        catch(Exception ex) 
        {     
            System.out.println(ex.toString()); 
        }         
    }

      /** 
       * 方法名:close 
       * 级别:private 
       * @param     (无) 
       * @return    (无) 
       * @throws    (无) 
       * 作用:关闭数据库联机 
       */ 
    private void close() 
    { 
        try 
        { 
            con.close(); //关闭Connection对象         
            con =  null; 
        } 
        catch(SQLException sex) 
        {     
            System.out.println(sex.toString()); 
        }     
    }

      /** 
       * 方法名:getConnection 
       * 级别:public 
       * @param     (无) 
       * @return    Connection     数据库联机 
       * @throws    (无) 
       * 作用:返回一个数据库联机 
       */ 
    public Connection getConnection() 
    {  
        //若con为null时, 重新建立数据库连结 
        if(con == null) 
            BulidConnection();

        return this.con; 
    }    

      /** 
       * 方法名:valueBound 
       * 级别:public 
       * @param     HttpSessionBindingEvent     事件 
       * @return    (无) 
       * @throws    (无) 
       * 作用:建立一个数据库联机,并输出相关信息 
       */ 
    public void valueBound(HttpSessionBindingEvent event) 
       { 
         BulidConnection(); 
            System.out.println("会话级别的数据库连接已经建立!!!"); 
       }

      /** 
       * 方法名:valueUnbound 
       * 级别:public 
       * @param     HttpSessionBindingEvent     事件 
       * @return    (无) 
       * @throws    (无) 
       * 作用:关闭一个数据库联机,并输出相关信息 
       */ 
    public void valueUnbound(HttpSessionBindingEvent event) 
    { 
        if(con != null) 
            close(); //呼叫close方法 
            System.out.println("会话级别的数据库连接已经关闭!!!"); 
    } 
}

编译这个Bean源文件。注意,编译前要设定好classpath的路径,使得它所包含的类库中有javax.servlet.http.*包。
然后,建立两个用来测试此Bean的jsp页面文件DBBean1.jsp与DBBean2.jsp,它们的程序代码差不多,都是用来显示数据库内容的,现在就只列出DBBean1.jsp的源文件,如下:

<%@ page contentType="text/html; charset=GB2312"  
    import="java.sql.*"%> 
<HTML> 
<HEAD> 
<TITLE>利用Bean对象建立数据库链接</TITLE> 
</HEAD> 
<BODY> 
<CENTER> 
<FONT SIZE = 5 COLOR = blue> 
利用Bean对象建立数据库链接 
</FONT> 
</CENTER> 
<HR> 
<P></P>

<CENTER> 
<%--起始建立数据库链接的Bean对象--%> 
<jsp:useBean id="ConBean" scope="session"   
    class="j2ee.jsp.DBCon"/> 
<% 
Connection con = ConBean.getConnection(); 
//从Bean对象取得已完成建立的数据库链接

Statement stmt = con.createStatement(); 
//建立Statement对象

ResultSet rs = stmt.executeQuery("SELECT product_name, price FROM products"); 
//建立ResultSet(结果集)对象,并执行SQL叙述 
%> 
<TABLE  bgcolor=DodgerBlue> 
    <TR  bgcolor=SkyBlue>     
    <TD><B>书  名</B></TD><TD><B>价   格</B></TD>     
    </TR>     
    <% 
    //利用while循环将数据表中的记录列出 
    while (rs.next()) 
    { 
        %> 
        <TR bgcolor=LightGoldenrodYellow>         
        <TD><B><%= rs.getString("product_name") %></B></TD> 
        <TD><B><%= rs.getString("price") %></B></TD>             
        </TR> 
        <% 
    }

    rs.close(); //关闭记录集 
    stmt.close(); //关闭Statement对象 
%>     
</TABLE> 
</CENTER> 
<a href="DBBean2.jsp">DBBean2.jsp</a> 
</BODY> 
</HTML>

posted @ 2011-10-09 17:13 Java_liyadong 阅读(1032) | 评论 (0)编辑 收藏

page指令

 

功能:设定整个JSP网页的属性和相关功能。
语法:<%@ page attribute1="value1" attribute2="value2" %>

page指令元素的属性

language="language"    指定JSP Container要用什么语言来编译JSP网页,默认值为Java。

import="importList"    定义此JSP页面可以使用哪些Java API。用逗号分隔列出一个或多个类名。此列表用于在生成的java servlet中创建相应的导入语句。默认情况下,JSP文件中会自动导入如下的类:java.lang.*;java.servlet.*;java.servlet.jsp.*;java.servlet.http.* 

contentType="ctinfo"    表示将在生成servlet中使用的MIME类型和可选字符解码。设置格式为contentType="MIME类型"或contentType="MIME类型;charset=编码"。在JSP页面默认情况下设置的字符编码为ISO-8859-1,即contentType="text/html;charset=ISO-8859-1".

session="true|false"    指明JSP页面是否需要一个HTTP会话,如果为true,那么产生的servlet将包含创建一个HTTP会话(或访问一个HTTP会话)的代码,缺省为true。

buffer="none|size in kb"    指定输出流缓存的大小。值为none表示没有缓存,直接输出至客户端的浏览器中,此属性用来设定out对象缓存处理的缓冲区的大小。

authflush="true|false":    决定输出流的缓冲区是否要自动清除。当值为true时缓存满时将被自动刷新,当值为false时,缓冲区满会抛出溢出异常。缺省值为true。 

isThreadSafe="true|false"   如果值为true,则此JSP页面可同时响应多个客户的请求,如果为false则某个时刻只能处理一个客户的请求。默认值为true。

info="text"    表示此JSP页面的相关信息,可用getServletInfo()方法来获得这个字符串。

errorPage="error_url"    表示如果发生异常错误,网页会被重新指向一个URL页面。错误页面必须在其page指令元素中指定isErrorPage="true"  

isErrorPage="true|false"    如果此页面被用作处理异常错误的页面,则为true。在这种情况下,页面可被指定为另一页面page指令元素中errorPage属性的取值。指定此属性为true将使exception隐含变量对此页面可用。缺省值为false。

pageEncoding="ctinfo"    表示JSP页面的编码方式。       

isELIgnored="true|false"    表示是否在此JSP网页中执行或忽略EL表达式。如果为true,JSP Container将忽略EL表达式。     

 

    page指令的属性值是在请求期间、运行期之前得出的。

    不能将page指令像模板文本一样条件性地插入到输出中。因而下面的尝试不管checkUserRequest方法的结果如何,都会产生Excel内容

  <% boolean usingExcel=checkUserRequest(request);

If(usingExcel) {%>

<%@page contentType=”application/vnd.ms-excel”%>

 <%}%>

我们可以使用scriptlet和常规的servlet方式——response.setContentType,如下面的片段所示:

<%String format=request.getParameter(“format”);

  If((format!=null)&&(format.equals(“excel”))){

Response.setContentType(“application/vnd.ms-excel”);

   }

 %>

    page指令作用于整个JSP页面,同样包括静态的包含文件。但是page指令不能作用于动态的包含文件,比如 <jsp:include>
    你可以在一个页面中使用多个page指令,但是其中的属性只能用一次,不过也有个例外,那就是import属性。因为import属性和Java中的import语句差不多,所以你能多次使用import属性.
    无论你把page指令放在JSP的文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及好的编程习惯,最好还是把它放在JSP文件的顶部.

 

include指令

功能:在JSP编译时插入包含一个文件。包含的过程是静态的,包含的文件可以是JSP、HTML、文本或是Java程序。

语法:<%@ include file="relativeURLspec" %>

include指令是对文件的静态包含,所以如果两个文件中均设置了page指令的contentType属性将会出错。

taglib指令

功能:使用标签库定义新的自定义标签,在JSP页面中启用定制行为。

语法:<%@ taglib uri="tabLibraryURI" prefix"tagPrefix" %>

标签元素:<jsp:directive.taglib uri="tabLibraryURI" prefix"tagPrefix" />
    taglib指令元素的属性       

uri="tagLibraryURI"    标签库描述器的URI,主要是说是tagLibrary的存放位置。       

prefix="tagPrefix"    用于标识在页面后面部分使用定制标签的唯一前缀。     

posted @ 2011-10-09 17:09 Java_liyadong 阅读(281) | 评论 (0)编辑 收藏

一、include动作指令

 

<jsp:include>标签表示包含一个静态的或者动态的文件。

语法:
            <jsp:include page="文件路径" flush="true" />
            或者
            <jsp:include page="path" flush="true">
               <jsp:param name="参数名1" value="参数1值" />

           ...............

           <jsp:param name="参数名n" value="参数n值" />
            </jsp:include>

注:

1、flush="true" 必须使用flush为true,它默认值是false。

2、<jsp:param>子句能让你传递一个或多个参数给动态文件,也可在一个页面中使用多个<jsp:param>来传递多个参数给动态文件。

 

二、forward动作指令

 

<jsp:forward>标签从一个JSP文件向另一个文件传递包含用户请求的request对象。

语法:
            <jsp:forward page="文件路径" />
            或者
            <jsp:forward page="文件路径">
               <jsp:param name="参数名1" value="参数1值" />

            ...............

           <jsp:param name="参数名n" value="参数n值" />

        </jsp:forward>

 

三、useBean动作指令

 

<jsp:useBean>标签表示用来在JSP页面中创建一个BEAN实例并指定它的名字以及作用范围。

语法:
<jsp:useBean id="name" scope="page | request | session | application" typeSpec />
其中typeSpec有以下几种可能的情况:
class="包名.类名" | class="包名.类名" type="typeName" | beanName="包名.类名" type="typeName"

 

在JSP中使用bean,class属性必须使用完全限定类名——包括包名的类名。不管你是否使用<%@ page import ...%>输入包,都要满足这个要求。

 

<jsp:useBean id=”book” class=”core.Book”/> 等价于 <%core.Book book=new core.Book();%>

仅当找不到相同id和scope的bean时,jsp:useBean元素才会实例化新的bean。如果存在相同id和scope的bean,则只是将已有的bean绑定到相关的变量(由id指定)。

我们可以不使用  <jsp:useBean…/>

转而使用        <jsp:useBean>statements</jsp:useBean>

使用第二种形式的意义在于,jsp:useBean的起始标签和结束标签之间的语句只是在创建新的bean时执行,如果使用已有的bean,则不执行。

 

四、getProperty动作指令

 

<jsp:getProperty>标签表示获取BEAN的属性的值并将之转化为一个字符串,然后将其插入到输出的页面中。

语法:
<jsp:getProperty name="bean的名称" property="属性名称" />

注:
1、在使用<jsp:getProperty>之前,必须用<jsp:useBean>来创建它。
2、不能使用<jsp:getProperty>来检索一个已经被索引了的属性。
3、能够和JavaBeans组件一起使用<jsp:getProperty>,但是不能与Enterprise Java Bean一起使用。

 

五、setProperty动作指令

 

<jsp:setProperty>标签表示用来设置Bean中的属性值。

四种语法格式:

<jsp:setProperty name="bean的名称" property="*" />

<jsp:setProperty name="bean的名称" property="属性名称"/>

<jsp:setProperty name="bean的名称" property="属性名称" param="参数值" />

<jsp:setProperty name="bean的名称" property="属性名称" value="属性值" />

第一种语法格式中,property="*",应用这种格式要求bean属性的名字与类型要和request对象中参数名称与类型一致,一次用bean中的属性来接收客户输入的数据,系统会根据名称来自动匹配。

第二种语法格式则指设置其中匹配的一个bean的属性。

第三种语法格式根据制定的request对象中的参数与属性匹配。

第四种语法格式用来给bean的属性赋值,属性值的数据类型要与属性的数据类型一致,否则会出错。字符串转换为其他数据类型的函数分别为:

转换为boolean  Boolean.valueof(String str).booleanValue()

转换为byte     Byte.valueof(String str).byteValue()

转换为char     Character.valueof(String str).charValue()

转换为double   Double.valueof(String str).doubleValue()

转换为float    Float.valueof(String str).floatValue()

转换为int      Integer.valueof(String str).intValue()

转换为long     Long.valueof(String str).longValue()

注:使用 jsp:setProperty 来为一个Bean的属性赋值;可以使用两种方式来实现。
    1、在jsp:useBean后使用jsp:setProperty:
      <jsp:useBean id="myUser" … />
      
      <jsp:setProperty name="user" property="user" … />
      在这种方式中,jsp:setProperty将被执行。
    2、jsp:setProperty出现在jsp:useBean标签内:
      <jsp:useBean id="myUser" … >
      
      <jsp:setProperty name="user" property="user" … />
      </jsp:useBean>
     在这种方式中,jsp:setProperty只会在新的对象被实例化时才将被执行。

在同一个setProperty动作指令中不能同时存在param和value参数。

 

六、plugin动作指令

 

这个动作指令用来在JSP中加载Java applet小程序。用<applet></applet>也可以是客户端下载并运行Java applet小程序,但有的浏览器不支持,如果Java applet小程序使用了这样的类,将无法执行。用plugin动作指令可以较好的解决这个问题。

语法:
<jsp:plugin 
      type="applet" 
      code="小程序的类文件" 
      codebase="小程序所在的位置" 
      [ height="小程序显示高度" ] 
      [ width="小程序显示宽度" ] 
      [ jreversion="虚拟机版本号" ] 
      [ <jsp:params> 
         [ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ]+ 
      </jsp:params> ] 
      [ <jsp:fallback> 客户端浏览器是否支持插件下载的提示信息</jsp:fallback> ]
</jsp:plugin>

注:

code参数是指小程序经过编译后的字节码文件,扩展名为.class。

codebase参数值出这个字解码文件所在的位置,可以是相对路径也可以是绝对路径,但在这个参数中不需要文件名,只需要目录路径就可以了,如果自己吗文件与调用的jsp文件在同一目录下,则此参数可以省略。

posted @ 2011-10-09 17:08 Java_liyadong 阅读(1041) | 评论 (0)编辑 收藏


主要有四中方法: 

1。<%-- 与 --%> 

2。// 

3。/**与**/ 

4。<!--与--> 



在jsp文件中能用注释为<!-- --> 

而在jsp文件或HTML<% %>中能用的注释为//、/** */、 





<!--注释内容-->:这种注释方式客户端可以查看到 

<%--注释内容--%>:这种注释方式客户端查看不到 



JSP页面注释问题 

jsp注释:  <%-- 注释内容 --%>   通过原文件查看不到 

html注释: <!-- 注释内容  -->  通过源文件可以查看到 



在JSP里面进行多行注释 

用<!-- (里面写代码啊) -->。

posted @ 2011-10-09 15:32 Java_liyadong 阅读(6213) | 评论 (1)编辑 收藏

Servlet是一种可以在Servlet容器中运行的组件,那么理所当然就应该有一个从创建到销毁的过程,这个过程我们可以称之为Servlet生命周期。Servlet的生命周期可以分为加载、实例化、初始化、处理客户请求和卸载五个阶段,体现在方法上主要是init()、service()和destroy()三个方法。生命周期的具体说明如下:

  • Servlet容器完成加载Servlet类和实例化一个Servlet对象
  • init()方法完成初始化工作,该方法由Servlet容器调用完成
  • service()方法处理客户端请求,并返回响应结果
  • destroy()方法在Servlet容器卸载Servlet之前被调用,释放一些资源

加载并初始化Servlet

在前面已经说过Servlet容器完成加载和实例化Servlet的工作,该工作既可以在容器启动时完成,也可以在容器收到请求时完成,或者是两者之间的某个时间启动。之后需要初始化Servlet,即读取配置信息、读取初始化参数等,这些基本上在整个生命周期中只需要执行一次。关于init()方法已经在积累GenericServlet中提供缺省实现,如果不需特殊处理则没有必要再进行定义,否则要重写。

处理客户端请求

当容器接收到客户端请求时,Servlet引擎将创建一个ServletRequest请求对象和一个ServletResponse响应对象,然后把这两个对象作为参数传递给对应Servlet对象的service方法。

该方法是一个重点实现的方法,ServletRequest对象可以获得客户端发出请求的相关信息,如请求参数等,ServletResponse对象可以使得Servlet建立响应头和状态代码,并可以写入响应内容返回给客户端。

在此说明一点,当Servlet中有doGet()或者doPost()方法时,那么service方法就可以省略,默认为调用这两个方法。

卸载Servlet

Servlet的卸载是由容器本身定义和实现,在卸载Servlet之前需要调用destroy()方法,以让Servlet自行释放占用的系统资源。虽然Java虚拟机提供了垃圾自动回收处理机制,但是有一部分资源却是该机制不能处理或延迟很久才能处理的,如关闭文件,释放数据库连接等。

 

Servlet生命周期的五个阶段是相互关联的,后面几个阶段建立在前面阶段的基础之上,在使用Servlet的时候可以根据自己的需要灵活处理。

posted @ 2011-10-08 20:40 Java_liyadong 阅读(262) | 评论 (0)编辑 收藏

总结
1、= =操作符比较的是操作符两端的操作数是否是同一个对象;另外= =操作符两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
2、String的equals()方法比较的是两个String对象的内容是否一样
3、= =比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为TRUE,如:
int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆栈;如下题111;
 String s= "hello";
String t = "hello";
char c[] = {'h','e','l','l','o'} 
Which return true?
A. s.equals(t);
B. t.equals(c);
C. s==t;
D. t.equals(new String("hello"));
E. t==c.
答案:(acd)
题目:哪些返回true。
这个在前面第10题的equals()方法和==操作符的讨论中论述过。==操作符比较的是操作符两端的操作数是否是同一个对象,而String的equals()方法比较的是两个String对象的内容是否一样,其参数是一个String对象时才有可能返回true,其它对象都返回假。需要指出的是由于s和t并非使用new创建的,他们指向内存池中的同一个字符串常量,因此其地址实际上是相同的(这个可以从反编译一个简单的测试程序的结果得到,限于篇幅不列出测试代码和反编译的分析),因此答案c也是正确的。

 Given the following class:
public class Sample{
long length;
public Sample(long l){ length = l; }
public static void main(String arg[]){
Sample s1, s2, s3;
s1 = new Sample(21L);
s2 = new Sample(21L); 
s3 = s2;
long m = 21L;
}
}
Which expression returns true?
A. s1 == s2;
B. s2 == s3;
C. m == s1;
D. s1.equals(m).
答案:(b)//D不对,只有String的equals()方法才比较值;
题目:给出下面的类:  …
哪个表达式返回true。
前面已经叙述过==操作符和String的equals()方法的特点,另外==操作符两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。

再看以下几道
 17. float f=4.2F; 
Float g=new Float(4.2F); 
Double d=new Double(4.2); 
Which are true? 
A. f= =g   B. g= =g   C. d= =f   D. d.equals(f)  E d.equals(g)  F. g.equals(4.2); 
答案:B
 93. Click the exhibit button:
1. public class X { 
2. public static void main (String[]args)  { 
3. String s1 = new String (“true”); 
4. Boolean b1 = new Boolean (true); 
5. if (s2.equals(b1))   { 
6. System.out.printIn(“Equal”);
 7.       } 8.      } 9.     }   
What is the result?
A. The program runs and prints nothing.
B. The program runs and prints “Equal.”
C. An error at line 5 causes compilation to fail.
D. The program runs but aborts with an exception.
答案:A

比较下题,小心使用equals 和 = =的区别;
 93. Click the exhibit button:
1. public class X { 
2. public static void main (String[]args)  { 
3. String s1 = new String (“true”); 
4. Boolean b1 = new Boolean (true); 
5. if (s2 = = b1) { //= =操作符两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过
6. System.out.printIn(“Equal”);
 7.       } 8.      } 9.     }   
What is the result?
A. The program runs and prints nothing.
B. The program runs and prints “Equal.”
C. An error at line 5 causes compilation to fail.
D. The program runs but aborts with an exception.
答案:C
 111. Given:
1. public class Foo {
2. private int val;
3. public foo(int v) (val = v;)  }
4. public static void main (String [] args)  {
5. Foo a = new Foo (10);
6. Foo b = new Foo (10);
7. Foo c = a;
8. int d = 10;
9. double e = 10.0;
10. }
11. }
Which three logical expressions evaluate to true? (Choose Three)  
A.(a ==c)
B.(d ==e)
C.(b ==d)
D.(a ==b)
E.(b ==c)
F.(d ==10.0)
答案:ABF //= =比较的是地址,他们都指向地址为10的堆栈;

Given the following code, what test would you need to put in place of 
the comment line? 
//place test here to result in an output of the string Equal 
public class EqTest{
  public static void main(String argv[]){
   EqTest e=new EqTest();
  }

 EqTest(){
   String s="Java";
   String s2="java";//小心大小写
   //place test here {
    System.out.println("Equal");
    }else
    {
    System.out.println("Not equal");
   }
  }
}
1) if(s==s2) 
2) if(s.equals(s2) 
3) if(s.equalsIgnoreCase(s2)) 
4)if(s.noCaseMatch(s2))
答案:3)//小心大小写

posted @ 2011-10-08 16:36 Java_liyadong 阅读(6376) | 评论 (0)编辑 收藏
仅列出标题
共3页: 上一页 1 2 3 下一页