lark----2005.7.29
********************************************************************
第一章:JSP技术概述
1.优势:
一次编写,到处运行;
系统的多平台支持;
强大的可伸缩性;
多样化和功能强大的开发工具之处;
2.特点:
(1)将内容的生成和显示进行分离;
(2)生成可重用的组件;
(3)采用标识简化页面开发;
(4)jsp能提供所有的Servlets功能;
(5)健壮的存储管理和安全性;
(6)一次编写,随处运行;
(7)jsp的平台适应性更广;
(8)java中连接数据库的技术是JDBC;
(9)简单易学;
3.例子:
//helloworld.jsp
<!DOCTYPE PUBLIC "_//W3C//DTD HTML 4.0 Transitional//EN">
<%@page language="java" congtentType="text/html;charset=gb2312" %>
<%@page info="a hello world example" %>
<html>
<head><title>理解jsp的原理</title></head>
<body>
<center><h1>
<%
int times=Integer.parseInt(request.getParameter("times"));
for(int i=09;i<times;i++)
{
out.println("Hello World!");
out.println("<br>");
}
%>
</h1></center>
</body>
</html>
//
//helloworld.jsp在第一次调用时会被JSP引擎编译,以后将驻留内存;
//以下是helloworld.jsp编译后生成的java源文件.
//
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final helloworld_jsp extentds org.apache.jasper.runtime.HttpJSpBase
implements org.apache.jasper.runtime.JspSourceDependant
{
public String getServletInfo()
{
return "a hello world example";
}
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants()
{
return _jspx_dependants;
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException
{
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWritter out = null;
Object page = this;
JspWritter _jspx_out = null;
try
{
_jspxFactory=JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=gb2312");
pageContext=_jspxFactory.getPageContext(this,request,response,null,true,8192,true);
application=pageContext.getServletContext();
config=pageContext.getServletConfig();
session=pageContext.getSession();
out.pageContext.getOut();
_jspx_out=out;
out.write("/r/n");
out.write("/r/n");
out.write("<html>/r/n/t");
out.write("<head>/r/n/t/t");
out.write("<title>理解jsp的原理");
out.write("</title>/r/n/t");
out.write("</head>/r/n/t");
out.write("<body>/r/n/t/t");
out.write("<center>/r/n/t/t");
out.write("<h1>/r/n/t/t");
int times=Integer.paraseInt(request.getParameter("times"));
for(int i=0;i<times;i++)
{
out.println("Hello World!");
out.println("<br>");
}
out.write("/r/n/t/t");
out.write("<h1>/r/n/t/t");
out.write("</center>/r/n/t");
out.write("</body>/r/n");
out.write("</html>/r/n");
}
catch(Throwable t)
{
if(!(t instanceof javax.servlet.jsp.SkipPageException))
{
out=_jspx_out;
if(out!=null && out.getBufferSize()!=0)
out.clearBuffer();
if(pageContext!=null)
pageContext.handlePageException(t);
}
}
finally
{
if(_jspxFactory!=null)_jspxFactory.releasePageContext(pageContext);
}
}
}
//
**************************************************************************
第二章:搭建开发环境
1.遵循JSP 2.0 和Servlet2.4 规范,需要和JDK1.4.1结合使用.
(1)JDK安装与设置:
设置JAVA_HOME环境变量为:c:/jdk1.4-------------------(jDK安装目录)
设置CLASSPATH环境变量为:C:/jdk1.4/lib/tools.jar;----(搜索java类路径)
设置PATH变量:C:/jdk1.4/bin;-------------------------(搜索可执行程序路径)
(2)Tomcat服务器安装与配置:
(3)BEA WebLogic服务器安装与配置:
(4)IBM WebSphere服务器安装与配置:
(5)集成开发环境的设置:如JBuilder等.
(6)数据库服务器的设置:如Oracle,MS SQL Server,MySql等.
***************************************************************************
第三章:JSP语法详解
1.注释:
(1)HTML/XML注释,在客户端显示出来的一个注释:
语法:<!--comment[<%=expression%>]-->
例子:<!--当前时间是:<%=(new java.util.Date()).toLocaleString()%>-->
(2)隐藏注释,只在源文件中显示:
语法:<%--comment--%>
例子:<%--以下是循环遍历Cookies--%>
(3)Scriptlets中的注释,和java中的一样:
例子://这里是单行注释
/**
*这里是多行注释
*/
2.脚本元素:包括声明(Declaration),表达式(Expression),Scriptlets
例子:
<%
int i;
String color1="99cc99";
String color2="993366";
for(i=0;i<count;i++)
{
String color="";
if(i%2==0)color=color1;
else color=color2;
out.println("<tr bgcolor="+color+"><td>------------</td></tr>");
}
%>
3.指令元素:(包括)
页面(page)指令,include指令,taglib指令(自定义标签的使用).
如:<%@ include file="header.jsp"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
(1)页面指令详细语法:
<%@ page
[language="java"] //定义要使用的脚本语言,目前只能是java
[import="{package.class|package.*},..."] //和一般的java import一样,用.隔开包或者类列表
[contentType="TYPE;charset=CHARSET"] //定义JSP字符编码和页面响应的MIME类型
[session="True|false"] //指定一个Http会话中这个页面是否参与
[buffer="none|8kb|sizekb"] //指定到客户输出流的缓冲方式,设置缓冲区大小
[autoFlush="True|false"] //缓冲区满时,true表示到客户端输出被刷新;false表示出现运行异常,缓冲溢出
[isThreadSafe="True|false"] //设置JSP文件是否能多线程使用,即同时处理多个用户的请求
[info="text"] //关于JSP文件的信息,使用servlet.getServletInfo()获得该字符串信息
[errorPage="relativeURL"] //定义出现异常时调用的页面
[isErrorPage="True|false"] //表明当前页面是否其他页面的errorPage的目标,true则可以使用exception对象,否则不行
[extends="package.class"] //
[isELIgnored="true|false"] //指定EL(表达式语言)是否被忽略,true则容器忽略"${}"表达式的计算
[pageEncoding="peinfo"] //JSP页面的字符编码,默认为ISO-8859-1
%>
(2)include指令通知容器将当前JSP页面中的内嵌的,在指定位置上的资源内容包含,同时在编译期间由JSP解析.
4.动作元素:(包括)
<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>,<jsp:param>,<jsp:include>,
<jsp:forward>,<jsp:plugin>,<jsp:fallback>,<jsp:params>,<jsp:attribute>,<jsp:body>,
<jsp:invoke>,<jsp:doBody>,<jsp:element>,<jsp:text>,<jsp:output>.
(1)<jsp:param>使用形式是:<jsp:param name="paramName" value="paramValue"/>,一般和<jsp:include><jsp:forward><jsp:plugin>一起使用,
被用来以"名-值"对的形式为其他标签提供附加信息.
(2)<jsp:include>允许在请求时间内在现成的JSP页面里包含静态或动态资源,是运行时才确定的,不同与<%@ include%>指令.
被包含的对象只有对JspWriter对象的访问权,并且不能设置头或者Cookie.
例如:<jsp:include page="filename" flush="true"/>或者
<jsp:include page="filename" flush="true">
<jsp:param name="paramName" value="paramValue">
</jsp:include>
(3)<jsp:forward>允许将请求转发到另一个JSP,Servlet或静态资源文件.
使用方式:<jsp:forward page="uri"/>或者
<jsp:forward page="uri">
<jsp:param name="paramName" value="paramValue"/>
</jsp:forward>
(4)<jsp:setProperty>和jsp:useBean一起协作,用来设置Bean的简单属性和索引属性.
使用方式:<jsp:setProperty name="beanName" propertyDetails />
其中propertyDetails可以是以下的一个:
property="*"
property="propertyName" param="parameterName"//(注意:这里是修改了request对象中参数名称与属性名称的对应关系)
property="propertyName"//(注意:这里的propertyName必须和Bean中属性相同,而且request对象中的参数名称也要和这相匹配)
property="propertyName" value="propertyValue"
例如:
<jsp:useBean id="usersession" scope="session" class="com.user.UserSession">
<jsp:setProperty name="usersession" property="name" value="lark">
</jsp:useBean>
(5)<jsp:getProperty>和jsp:userBean一起协作,用于访问Bean的属性,将属性值转化为String发送到输出流中.
使用方式:<jsp:getProperty name="beanName" property="propertyValue"/>
(6)<jsp:useBean>用来在JSP页面中创建一个Bean实例,并指定它的名字以及作用范围.
使用方式:<jsp:useBean id="id" scope="page|request|session|application" typeSpec/>
其中typeSpec可以是以下的一个:
class="classname"//Bean的类路径及类名
class="classname" type="typeName"
beanName="beanName" type="typeName"
type="typeName"
(7)<jsp:plugin>用来产生客户端浏览器的特别标签(Object或Embed),可以使用它来插入Applet或者JavaBean.
使用方式:
<jsp:plugin
type="bean|applet"
code="classFileName"
codebase="classFileDirectoryName"
[name="instanceName"]
[archive="URIToArchive,..."]
[align="bottom|top|middle|left|right"]
[height="displayPixels"]
[width="displayPixels"]
[hspace="leftRightPixels"]
[vspace="topBottomPixels"]
[jreversion="JREVertionNumber|1.1"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"]
>
[
<jsp:params>
[<jsp:param name="parameterName" value="{parameterValue|<%=expression%>}">]+
</jsp:params>
]
[<jsp:fallback>text message for user</jsp:fallback>]
</jsp:plugin>
***********************************************************************************
第四章:JSP内建对象及其实例讲解
1.包含的对象有:request,response,pageContext,session,application,out,config,page,exception对象
(1)out对象:被封装成javax.servlet.jsp.JspWriter接口,主要用来向客户端输出数据.
主要方法有:
out.print(),out.println(),out.newLine(),out.flush(),out.close(),out.clearBuffer(),
out.clear(),out.getBufferSize(),out.getRemaining(),out.isAutoFlush().
(2)request对象:被封装成HttpServletRequest接口,通过getParameter方法可以得到request的
参数,通过GET,POST,HEAD等方法可以得到request的类型,通过Cookies,Referer等可以得到请求的Http头.
主要方法有:
isUserInRole(String role),getAttribute(String name),getAttributeNames(),getCookies(),getCharacterEncoding(),
getContentLength(),getHeader(String name),getHeaders(String name),getHeaderNames(),getInputStream(),
getMethod(),getParameter(String name),getParameterNames(),getParameterValues(String name),getProtocol(),
getQueryString(),getRequestURI(),getRemoteAddr(),gtRemoteHost(),getsession([Boolean create]),getServerName(),
getServletName(),getServletPath(),getServerPort(),removeAttribute(String name),
setAttribute(String name, java.lang.Object objt),
exp:
<%
java.util.Enumeration e=request.getAttributeNames();
while(e.hasMoreElements())out.println(e.nextElement());
%>
(3)response对象:被封装成HttpServletResponse接口,响应客户端的请求.
主要方法有:
addCookie(Cookie cook),addHeader(String name, String value),containsHeader(String name),encodeURL(),
flushBuffer(),getBufferSize(),getOutputStream(),sendError(int),sendRedirect(String location),
setContentType(String contentType),setHeader(String name, String value),
exp:
<%@page import="javax.servlet.http.Cookie,java.util.*"%>
<%
String userName="lark";
Cookie[] cookie=request.getCookies();
Cookie cookie_response=null;
List list=Array.asList(cookie);
Iteratorit=list.iterator();
while(it.hasNext())
{
Cookie temp=(Cookie)it.next();
if(temp.getName().equals(userName+"_access_time"))
{
cookie_response=temp;
break;
}
}
out.println("the current time is : "+new java.util.Date()+"<br>");
if(cookie_response!=null)
{
out.println("the last time you login:"+cookie_response.getValue());
cookie_response.setValue(new Date.toString());
}
else
{
cookie_response=new Cookie(userName+"_access_time", new java.util.Date().toString());
}
response.addCookie(cookie_response);
response.setContentType("text/html");
response.flushBuffer();
%>
(4)Session对象:用来保存每个用户信息,跟踪每个用户的操作状态.
主要方法有:
getAttribute(String name),getAttributeNames(),getCreationTime(),getId(),
getLastAccessedTime(),getMaxInactiveInteval(),invalidate(),isNew(),removeAttribute(String name),
setAttribute(String name, java.lang.Object value),
exp:
<%
String name=request.getParameter("name");
String password=request.getParameter("password");
String typr=request.Parameter("type");
if(name.equals("lark"))
{
session.setAttribute("name",name);
session.setAttribute("type",type);
response.sendRedirect("loginsuccess.jsp");
}
else
{
response.sendRedirect("session_login.htm");
}
%>
//int the loginsuccess.jsp file
<%
if(session.getAttribute("type").equals("manager"))
{
%>
<a href="manage.jsp">access to the manager's system!</a>
<%
}
else
{
%>
<a href="user.jsp">access to the user's system</a>
<%
}
%>
(5)pageContext对象:被封装为javax.servlet.jsp.pageContext接口,包装页面上下文,
主要功能是管理对属于JSP中特殊可见部分中已经命名对象的访问.
主要方法:
forward(java.lang.String relativeUrlPath),getAttribute(java.lang.String name[, int scope]),
getAttributeNamesInScope(),getException(),getRequest(),getResponse(),getServletConfig(),
getServletContext(),getSession(),findAttribute(),setAttribute(),removeAttribute(),
exp:(该例子说明了:pageContext属性默认在当前页面是共享的;session属性在当前session中是共享的;servletContext属性对所有的页面都是共享的)
<%@page import="javax.servlet.http.*,javax.servlet.*"%>
<%
ServletRequest req=pageContext.getRequest();
String name=req=getParameter("name");
out.println("name="+name);
pageContext.setAttribute("userName",name);
pageContext.getServletContext().setAttribute("shareValue","something to share");
pageContext.getSession().setAttribute("session","session value");
out.println("<br>"+pageContext.getAttribute("userName"));
%>
(6)application对象:为多个用户保存信息,每个用户只共享一个application对象,该对象一直存在与服务器运行期间.
主要方法:
getAttribute(String name),getAttributeNames(),getInitParameter(String name),
getServletInfo(),setAttribute(String name, Object object),
exp:(计数器的例子)
//application.jsp
<%
int count=0;
String counter_name=request.getParameter("counter_name");
try
{
count=Integer.parseInt(application.getAttribute(counter_name).toString());
}
catch(Exception e)
{
}
out.println("自从服务器启动后,此页面已经访问了"+count+"次");
count++;
application.setAttribute(counter_name, new Integer(count));//这里必须要Integer转化成类
%>
//use_counter.jsp
<jsp:include page="application.jsp">
<jsp:param name="counter_name" value="use_counter"/>//use_counter在不同的页面可以不同,可实现不同页面的分开计数
</jsp:include>
(7)config对象:被封装成javax.servlet.ServletConfig接口,表示Servlet的配置.
主要方法:
getServletContext(),getServletName(),getInitParameter(String name),getInitParameterNames(),
(8)page对象:是java.lang.Object类的一个实例,是JSP本身,只有在JSP页面范围内有效.
(9)exception对象:是java.lang.Throwable类的一个实例,指的是运行时的异常,只有在错误页面才可以使用
(在页面指令里有isErrorPage=true的页面)
exp:
<%@page contentType="text/html;charset=gb2312" language="java" isErrorPage="true"%>
<%=exception.getMessage()%>
2.一些实用的编程基础代码:
(1)数据库链接操作等
<%@page import="java.sql.*,com.microsoft.jdbc.sqlserver.SQLServerDriver"%>
<%
Class.forName(CLASSFORNAME);
Connection con=DriverManager.getConnection(SERVANDDB,USER,PWD);
Statement statement=con.createStatement();
String isCorrect="select * from user_info where userid='"+id"' and password='"+psw+"'";
ResultSet result=statement.executeQuery(isCorrect);
//......
statement.close();
con.close();
%>
***************************************************************************************************