JSP
概述
JSP(全称JavaServer Pages)是由Sun Microsystems公司倡导和许多公司参与共同建立的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。JSP是开放式的、可免费获取的规范,也是J2EE(Java 2 Enterprise Edition)规范的重要组成部分。
从架构上说,JSP实际上是Servlet编程模型的一个扩充,可以被看作是从servlets高级抽象而来,作为Servlet2.1 API的扩展而应用。Servlets和JSPs最早都是由Sun Microsystems(升阳公司)开发的。
JSP使Java代码和特定的预定义动作可以嵌入到静态页面中。JSP句法增加了被称为JSP动作的XML标签,它们用来调用内建功能。另外,可以创建JSP标签库,然后象使用标准HTML或XML标签一样使用它们。标签库提供了一种和平台无关的扩展服务器性能的方法。
JSP被JSP编译器编译成Java Servlets。一个JSP编译器可以把JSP编译成JAVA代码写的servlet然后再由JAVA编译器来编译成机器码,也可以直接编译成二进制码。
JSP和Servlets版本历史
Servlets和JSP是一起开发并一起用于复杂的Web应用程序的。
Java servlet技术是开发Java Web应用程序的主要技术。它是由Sun Microsystems在1996年开发的,当前的版本是2.3,但人们正在为版本2.4做准备。
从JSP1.2版本以来,JSP处于Java Community Process开发模式下。JSR 53规定了JSP 1.2 和 Servlet 2.4的规范,
JSR 152 规定了 JSP 2.0的规范。JSP 2.0 版本包括新的用于提升程序员工作效率功能,主要有:An Expression Language (EL) 允许开发者创建 Velocity-样式 templates (among other things).,更快更简单的创建新标签的方法: Hello, ${param.visitor} <%– same as: Hello, <%=request.getParameter(“visitor”)%> –%>
2006年5月,JSP 2.1的规范作为Java EE 5的一部份,在JSR245中发布。
JSP服务器端软件配置
1, WWW服务的软件:PWS、IIS、APACHE
Apache:(a patchy server,充满补丁的服务器) http://www.enanshan.com/new/server/apache.htm
通常是 Linux+Apache+Php+MySql http://www.apache.org
2, J2EE中间件应用服务器:websphere、silverstream
3, JSP引擎(servlet和jsp容器, 弱的WWW服务功能):重点是Web Container管理和应用程序部署:你的servlets和JSP页面在一个叫做servlet/JSP container或 Web container的引擎中运行。你至少需要知道如何为测试以及生产运行部署你的Web资源。例如,如果你运用Tomcat,你需要了解的一件事就是如何映射配置文件(server.xml)中的应用程序,使Tomcat知道如何调用你的JSP页面。另外,你需要知道在哪里保存你的库以及如何创建应用程序部署描述符。
A, Tomcat:是jakarta项目中的一个重要的子项目,是sun公司官方推荐的servlet和jsp容器。
B, Resin:达到JSP解释器的目的,有和IIS集成和独立运行Httpd两种方法, http://didadi.cxc.cc/jsp/text8/text81.htm 下载: http://www.caucho.com/download/
C, JSWDK(JavaServer Web Development Kit):比TOMCAT简化的服务器平台。http://sm.fixdown.net:88/article/article/1028.htm
D,WebSphere:商业化,需要收费。它是IBM e-Business应用架构的核心。该服务器基于一个Java Servelt引擎,将常用的Web服务器(如Apache服务器,Microsoft的IIS,Netscape的企业服务器和Lotus Domino Go Web Server)增强为基于Java的Web应用服务器。http://websphere.sina.com.cn/content_school.html
E,JRun :在MX产品套件公诸于世之后两周,Macromedia宣布JRun 4即将问世,这是Macromedia最新的J2EE应用服务器。http://www.cnbruce.com/blog/showlog.asp?cat_id=26&log_id=290
F,JWS(Java Web Server):类似PWS。该服务器全部用Java写成,而且是首先提供Servlet 2.1和JSP 1.0规范完整支持的Web服务器之一。虽然Sun现在已转向Netscape/I-Planet Server,不再发展Java Web Server,但它仍旧是一个广受欢迎的Servlet、JSP学习平台。http://www.zsjy.gov.cn/study_garden/jsp/8-3.htm
G, weblogic:BEA WebLogic BEA公司的WebLogic服务器能为企业级应用程序的开发提供强大的通用应用服务器。http://www.bea.com.cn/products/beawebLogic/index.jsp
4, 邮件服务软件:SMTP、 POP3:iis的smtp,exchange,lotus domino
5, FTP服务软件:iis所自带
JSP 语法基础
本地化和中文显示问题
1, JSP的本地化是通过和JAVA应用程序相同的方式完成的,即使用 resource bundle.
2,中文显示问题:若是直接赋值的中文字符串,用<%@ page contentType=”text/html;charset=gb2312”%>就可正常显示。但不能用getStr(String name)函数或类似的函数转换内码,否则不能正常显示中文。若是request传过来的中文字符串,必须要用getStr(String name)函数或类似的函数转换内码,否则不能正常显示中文。如:
String aa=str; byte[] aa=aa.getBytes(“ISO8859-1”); String bb=new String(aa); 在不同平台、不同的服务器jsp中文问题的解决方法各不相同,应自行试验。
模-视图-控件 MVC模式
为了把表现层presentation从请求处理request processing 和数据存储data storage中分离开来,升阳公司推荐在JSP文件中使用一种模-视图-控件Model-view-controller 模式。 规范的SERVLET或者分离的JSP文件用于处理请求。当请求处理完后,控制权交给一个只作为创建输出作用的JSP页。有几种平台都基于服务于网络层的模-视图-控件 模式(比如Struts 和Spring framework)。Model 2结构在该类别技术中是最先进的。建议用这种结构来构建相当复杂的Java Web应用程序。Model 2结构是基于Model-View-Controller设计范例的。
编译样例
不管JSP编译器是生成SERVLET的JAVA源码,或者是直接发布二进制码,了解一下JSP编译器是如何把文件转换成一个JAVA SERVLET,都是很有帮助的。例如,看一下如下输入JSP和它最后生成的JAVA SERVLET:
'Input JSP'
<pre> <%@ page errorPage="myerror.jsp" %> <%@ page import="com.foo.bar" %> <html> <head> <%! int serverInstanceVariable = 1;%> ... <% int localStackBasedVariable = 1; %> <table> <tr><td><%= "expanded inline data " + 1 %></td></tr> ... </pre>
'Resulting servlet'
<pre> package jsp_servlet; import java.util.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import com.foo.bar; //imported as a result of <%@ page import="com.foo.bar" %> import ... class _myserlvet implements javax.servlet.Servlet, javax.servlet.jsp.HttpJspPage { //inserted as a //result of <%! int serverInstanceVariable = 1;%> int serverInstanceVariable = 1; ... public void _jspService( javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response ) throws javax.servlet.ServletException, java.io.IOException { javax.servlet.ServletConfig config = ...;//get the servlet config Object page = this; PageContext pageContext = ...;//get the page context for this request javax.servlet.jsp.JspWriter out = pageContext.getOut(); HttpSession session = request.getSession( true ); try { out.print( "<html>\r\n" ); out.print( "<head>\r\n" ); ... //from <% int localStackBasedVariable = 1; %> int localStackBasedVariable = 1; ... out.print( "<table>\r\n" ); out.print( " <tr><td>" ); //note, toStringOrBlank() converts the expression into a string or if // the expression is null, it uses the empty string. //from <%= "expanded inline data " + 1 %> out.print( toStringOrBlank( "expanded inline data " + 1 ) ); out.print( " </td></tr>\r\n" ); ... } catch ( Exception _exception ) { //clean up and redirect to error page in <%@ page errorPage="myerror.jsp" %> } } } </pre>
客户端与服务器端的交互
1, 客户端做的工作:可在客户端进行校验、以及页面的修饰等功能;最重要的是请求(发出提交)服务器端。客户端的提交方法分两种:get(明码可见传送2kb左右信息)与post(加密不可见传送大量信息)提交。
post提交:所有的post提交只能在form中产生, 提交方式又分两种:直接提交(submit提交)、间接提交(脚本提交) 1)直接提交:点击提交按钮,立即发生提交 <form method=post action=*.asp> <input type=submit value=”注册”> 注:submit按钮有一个默认事件,就是提交 <input type=submit value=”注册” onclick=”alert(‘hello’);return ture or false;”> 注:在提交前,首先在屏幕上返回一个警告框”hello”,若return的是true,则页面发生提交; 若return的是false,页面不会发生提交。 </form> 2)间接提交:是指点击按钮本身并不能完成提交,而只有通过脚本才能完成的提交 <input type=button value=”注册” onclick=”check();submit();”> 注: 在onclick处还可为onmousedown、onmouseup等事件名称 button只是普通按钮,本身并不能发生提交,只能通过onclick指定的脚本程序才能完成提交 点击“注册”后,先执行onclick事件触发的函数,若返回值为true则发生提交,否则提交中止。 get提交: get提交发生在form表单和url中 1)在form中产生的:<form method=get action=*.asp> 2)在所有的url中产生的: 在地址栏中输入url地址,后跟所要传递的参数http://*.asp?name=www&age=20 在超链接上<a href=”*.asp>mode=1&grade=1”>click me </a> 在图片的src属性中<img src=”*.asp?name=www”> 在帧里的src属性中<frame src=” *.asp?name=www” name=框架名> 在asp重定向语句中response.redirect ” *.asp?name=www” 在客户端对象document中:document.location=” http:// *.asp?name=www” 在客户端对象window中:window.open(” http:// *.asp?name=www”)
2, 服务器端做的工作:获得客户端信息的方法是通过request对象来完成的。
客户端提交到服务器端的信息分为三类: 第一类:客户机信息(包括客户端的ip地址、端口号、主机名、提交方式等等) 第二类:通过form或url方式提交到服务器端的信息 第三类:cookie信息 获得第一类信息用: request.getHeader(“User-agent”)返回客户端浏览器的版本号、类型 getHeader(String name):获得http协议定义的传送文件头信息, request. getMethod():获得客户端向服务器端传送数据的方法有GET、POST、PUT等类型 request. getRequestURI():获得发出请求字符串的客户端地址 request. getServletPath():获得客户端所请求的脚本文件的文件路径 request. getServerName():获得服务器的名字 request.getServerPort():获得服务器的端口号 request.getRemoteAddr():获得客户端的IP地址 request.getRemoteHost():获得客户端电脑的名字,若失败,则返回客户端电脑的IP地址 request.getProtocol(): request.getHeaderNames():返回所有request header的名字, 结果集是一个Enumeration(枚举)类的实例 request.getHeaders(String name):返回指定名字的request header的所有值, 结果集是一个Enumeration(枚举)类的实例 获得第二类 get 信息用: request. getQueryString(“变量名呀或控件名”)获得查询字符串, 该串由客户端以GET方法向服务器端传送 获得第二类 post 信息用: request.getParameter(String name):获得客户端传送给服务器端的参数值,该参数由name指定 request.getParameterNames():获得客户端传送给服务器端的所有的参数名, 结果集是一个Enumeration(枚举)类的实例 request.getParameterValues(String name):获得指定参数所有值 获得第三类Cookie信息用: request.getCookies( “cookie变量名”):返回客户端的cookie对象,结果是一个cookie数组
JDBC数据库初级
1, JDBC原理:JDBC是JAVA与数据的连接。因为ODBC是完全用C语言编写的,而JAVA中实现与C语言程序的通信是比较困难的,因此就产生了由JAVA语言编写的用于JAVA程序与数据库连接的接口技术。
A, 配置DSN步骤(以ACCESS为例):在“开始”|“设置”|“控制面板”|“管理工具”|“数据源(ODBC)”|“系统DSN”|“添加”|“选择数据源驱动程序”|“完成”|“ODBC安装填写数据源名,点击‘确定’”|“完成”即可。
B, 数据库连接的五要素:A,IP地址,B, 端口号(端口号对某个数据库服务是基本固定的,除非特别设定)意味着对应的数据库的驱动程序,C, 选择数据库,D, 帐号、密码(是分配给数据库的),E, 发出SQL语句(通过Statement对象发送)
C, JDBC与数据库的连接:JDBC与具体的某种数据库连接,是直接通过JDBC API类库中的类来自动装载驱动程序的。此类库一般在java.sql包中,它包含了用于实现与数据库连接的其它功能的类,包括与数据库建立连接、传送查询和接受查询结果。以下有四个类的详细介绍。
作用:与数据库建立连接,发送SQL语句,处理结果 connection cn=DriverManager.getConnection(“jdbc:odbc:wombat”,”login”,”password”); Statement stmt=cn.createStatement();//发送SQL语句 ResultSet rs=stmt.executeQuery(“select a,b,c from table1”); while(rs.next()){ int x=rs.getInt(“a”); String s=rs.getString(“b”); float f=rs.getFloat(“c”); }//处理结果
2, DriverManager类: 用于装载驱动程序,它所有的成员都是静态成员,所以在程序中无须对它进行实例化,直接通过类名就可以访问它。DriverManager类是JDBC的管理层,作用于用户和驱动程序间
加载驱动程序
Class.forName(“公司名.数据库名.驱动程序名”)
如:Class.forName(“sun.jdbc.odbc.jdbcOdbcDriver”)
建立连接
加载Driver类并在DriverManager类注册后,就可用来与数据库建立连接。
当调用Driver.Manager.getConnection()发出连连接请求时,
DriverManager将检查每个驱动程序,看它是否可以建立连接。
方法:Connection getConnection(String url,String user,String password) 其中user和password是登录数据库的用户和密码 第一个参数是指向数据库的url,它的格式如下: jdbc:(subprotocol):(subname) subprotocol:子协议,指定连接何种数据库或用什么方式连接数据库 subname:确立一个连接,可以是一个数据源名,也可以是指向一个网上数据库 如:以下是通常用驱动程序(JDBC-ODBC桥驱动程序), 并连一个student数据源,用匿名登录的的示例: Class.forName(“sun.jdbc.odbc.jdbcOdbcDriver”);//加载驱动程序 String url=”jdbc:odbc:student”; Connection cn=DriverManager.getConnection(url,”anonymous”,””); GetConnection():返回一个连接类对象。 若成功,此对象就指向此数据库的一个连接;否则,此对象将为空null
3,Connection类:connection类是指向同一个数据库的连接。
作用:管理指向数据库的连接,
如:向数据库发送查询和接收数据库的查询结果都是在它基础上的;
完成同数据库的连接的所有任务之后关闭此连接。
方法: Statement createStatment(): //新建一个Statement对象,此对象可以向数据库发送查询信息 void close():关闭同数据库的连接并释放占有的JDBC资源 Boolean isClose():判断是否仍与数据库连接
4,Statement类:
作用:Statement对象用于将SQL语句发送到数据库中。
创建Statement对象 建立了到特定数据库的连接后,就可用该连接发送SQL语句。 Statement对象用Connection的方法createStatement创建。 Connection cn=DriverManager.getconnection(rul,”sunny”,””); statement stmt=cn.createStatement(); 为了执行Statement对象,被发送到数据库的SQL语句将被作为参数提供给Statement的方法 ResultSet rs=stmt.executeQuery(“select a,b,c from table2”); 使用Statement对象执行语句 Statement接口提供了三种执行SQL语句的方法 executeQuery():用于产生单个结果集的语句,如:select语句 executeUpdate():用于执行insert、update或delete、语句等, 返回值是一个整数,指示受影响的行数(即更新计数) execute():用于执行返回多个结果集、多个更新计数或二者组合的语句 语句完成 语句在已执行且所有结果返回时,即认为已完成。 对于返回一个结果集的executeQuery()方法,在检索完ResultSet对象 的所有行时该语句完成。 对于方法executeUpdate(),当它执行时语句即完成 在少数调用execute()的情况下, 只有在检索所有结果集或它生成的更新计数之后语句才完成 关闭Statement对象 Statement对象将由Java垃圾收集程序自动关闭。 但我们最好显示地关闭它们,因为会立即释放数据管理系统资源,有助避免潜在内存问题。 主要方法 ResultSet executeQuery(String sql):返回一个静态的sql查询结果 int executeUpdate(String sql): //查询一行sql声明中insert、update、delete的数目或返回0 void close():关闭同数据库的连接和所占有的JDBC资源 [/code]
5, ResultSet类(纪录集)
作用:装载查询结果,并可以通过它的不同方法提取出查询结果。ResultSet包含符合SQL语句中条件的所有行,且它通过一套get方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。
ResultSet.next():将纪录指针移动到ResultSet纪录集的下一行,使之成为当前行。 注:纪录集是一张二维表,其中有查询所返回的列标题及相应的值。 对于方法executeUpdate(),当它执行时语句即完成 在少数调用execute()的情况下,只有在检索所有结果集或它生成的更新计数之后语句才完
出版物
* <cite>[http://www.amazon.com/gp/product/0596005636 JavaServer Pages, Third Edition]</cite>, Hans Bergsten, O'Reilly & Associates, Inc., Sebastopol, California, 2003. ISBN 0-596-00563-6
参见
JSP 速成教程(PDG).rar 5447k
JSP1.0简明教程.pdf 1091k
JSPIntro.pdf 487k
JSP高级编程(希望版).pdf 8466k
Oreilly.Java.Server.Pages.3rd.Edition.eBook-LiB.chm 2163k
* JSTL
* Java EE
* SSJS
外部链接
* Sun's JSP product description
* JSR 245 (JSP 2.1)
* JSR 152 (JSP 2.0)
* JSR 53 (JSP 1.2)
* Free JSP training/learning materials
JSP的其它缩写意思
JavaServer Pages JSP页面
Java stored procedure JAVA存储过程
Jackson Structured Programming JACKSON结构编程(数据库编程)
JSP Records JSP音乐记录标签
Japanese Surrendered Personnel 日本战俘
Jacketed Soft Point bullet 软头包壳子弹