您的位置:首页 > Web前端 > JavaScript

JDBC-Servlet-JSP入门

2005-04-28 08:22 453 查看
第一部分介绍及配置 J2EE说白了其实就是一些规范的集合,其中包括JDBC、Servlet、JSP、EJBs、JavaMail、XML等。这里主要介绍一下JDBC-Servlet-JSP这三项技术,它们主要用于开发一些WEB应用。 1.JDBC是一组Java连接数据库的标准API,使用它们能够简单方便地实现纯Java的数据库访问操作。一个普通数据库的连接过程为: 1.加载驱动程序 2.通过DriverManager到得一个与数据库连接的句柄 3.通过连接句柄绑定要执行的语句 4.接收执行结果 5.对结果进行必要的处理以提取自己想要的数据 6.关闭数据库的连接 无论实现本地数据库开发或者Web数据库开发,JDBC连接数据库的基本步骤都和上面的过程类似。 2.Servlet是一个专门用于编写网络服务器应用程序的Java组件。所有基于Java服务器编程都是基于Servlet的。如后面要介绍的JSP最后是也要通过JSP引擎转换为Servlet的。Servlet适用于多种网络协议,如Http、Ftp、Smtp等等。目前只有Http服务形成了标准组件,也就是我们要用到的javax.servlet.http这个包。作为一种服务器端的应用,当被请求时开始执行,这和CGI Perl脚本很相似。Servlets和CGI脚本的一个很大的区别是:每一个CGI在开始的时候都要求开始一个新的进程,而servlets是在servlet引擎中以分离的线程来运行的。 3.JSP则相对于ASP是用来开发动态网页的,JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。一般为了使网站更易于开发和维护,都采用简单的JSP页面+JavaBean。 JSP一般的运行方式为:当服务器启动后,当Web浏览器端发送过来一个页面请求时,Web服务器先判断是否是JSP页面请求。如果该页面只是一般的HTML/XML页面请求,则直接将HTML/XML页面代码传给Web浏览器端。如果请求的页面是JSP页面,则由JSP引擎检查该JSP页面,如果该页面是第一次被请求、或不是第一次被请求但已被修改,则JSP引擎将此JSP页面代码转换成Servlet代码,然后JSP引擎调用服务器端的Java编译器javac.exe对Servlet代码进行编译,把它变成字节码(.class)文件,然后再调用JAVA虚拟机执行该字节码文件,然后将执行结果传给Web浏览器端。如果该JSP页面不是第一次被请求,且没有被修改过,则直接由JSP引擎调用JAVA虚拟机执行已编译过的字节码.class文件,然后将结果传送Web浏览器端。 一般JSP开发Web应用的主要框架如下: Web应用(如网站等) JSP引擎 Web服务器 操作系统 由于JSP是基于Java的一个J2EE协议,所以也能够write one,run everywhere。所以底层的操作系统既可以使用Windows,也可以使用Unix、Solaris。Web服务器目前比较流行的有WebLogic、WebSphere、JBoss等,还有一些是免费的如Tomcat、Resin等。至于JSP引擎,一般的Web服务器都自带,如Tomcat,引擎主要是将JSP的代码转换位Servlet代码的。 一般学习使用这三项技术实现Web应用可以先采用较为简单易用的服务器,如Tomcat,然后再逐步深入使用其它一些复杂的商业性服务器。本篇主要使用Tomcat来展开学习。至于数据库则采用Mysql,原因主要是它开源免费而且好用,Yahoo的数据库用的好像也是它。 开发Web应用的第一步就是进行开发环境的搭建,对于入门来说这真的是一件让人很头疼的事,不知以后会不会出现那种自动帮助我们配置的工具。我们选择的开发环境是Eclipse+Tomcat+Mysql,下面介绍配置步骤: 1.下载Eclipse(绿色软件免安装,Java的开发环境) 2.下载jdk1.5.0_01并安装,启动Eclipse,选择 Window > Preferences > Java,选择或者新添jre地址,ok,现在试着建一个project,写写HelloWorld看是否配置成功。 3.下载Tomcat安装、下载Eclipse的Tomcat插件tomcatPluginV3.zip将其解压到Eclipse的plugins目录下,启动Eclipse,选择 Window > Preferences > Tomcat,选择对应的Tomcat,并填入Tomcat的安装路径。 4.下载Lomboz和EMF runtime并将它们解压放到plugins目录下,启动Eclipse,选择Window > Preferences >Lomboz,对Lomboz进行配置包括jre和Tomcat,注意须在Library中加入Tomcat的common的lib目录下的一些jar文件,ok,现在来试试看Tomcat是否配置成功, 41.建一个Lomboz J2EE project,填入name为TestJsp; 42.下一步,再下一步; 43.添加WebModules的name为test,Targeted Servers选择Tomcat,注意选择已安装的Tomcat版本,ok完成; 44.找到Lomboz J2EE View,这里头有刚才建的test的WebModules,单击右键对这个Modules进行deploy(这一步粉重要)后再Start Tomcat; 45.在左边的workspace里找到刚建的test目录,单击右键选择Lomboz J2EE>Show in Browser,如果出现Welcome的网页就表示配置ok了。 5.下载Mysql安装、下载Java-Mysql的connector并取其中的xxxbin.jar将其复制到Tomcat的common的lib目录下。建一个本地数据库访问程序: 51.在Mysql中建一个数据库,添加表,插入数据。 52.建一个Java project,在Library中添加Add Extended Library中添入Mysql的Connector。 53.根据数据库的编写步骤,写一个访问数据库的程序。先写一个访问本地数据库的程序调试一下是否配置成功,再写Web的,Web数据库的操作与本地数据库类似,只不过是在JSP页面或JavaBean中实现的。 第二部分深入协议1.JDBC简要介绍1)Class.forNameClass.forName("xxxxxxxxxxxxxxxxxxxxxxx"); 用于加载驱动程序2)DriverManagerDriverManager类是 JDBC 的管理层,作用于用户和驱动程序之间。通常通过DriverManager.getConnection建立与数据库的连接。3)statement(Statement、PreparedStatement、CallableStatement)Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL 语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和 CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句: Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存储过程的调用。Statement 接口提供了执行语句和获取结果的基本方法。PreparedStatement 接口添加了处理 IN 参数的方法;而 CallableStatement 添加了处理 OUT 参数的方法。Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。 方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句。 方法 executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。 方法 execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。4)ResultSet结果集一般是一个表,其中有查询所返回的列标题及相应的值。它包含符合 SQL 语句中条件的所有行。ResultSet.next 方法用于移动到 ResultSet 中的下一行,使下一行成为当前行。方法 getXXX 提供了获取当前行中某列值的途径。要确定给定结果值是否是 JDBC NULL,必须先读取该列,然后使用 ResultSet.wasNull 方法检查该次读取是否返回 JDBC NULL。 实现及示例再简述一遍连接数据库过程 : 1.加载驱动程序 2.通过DriverManager到得一个与数据库连接的句柄 3.通过连接句柄绑定要执行的语句 4.接收执行结果 5.对结果进行必要的处理以提取自己想要的数据 6.关闭数据库的连接下面是连接mysql的实例,可以对照看一下import java.sql.*; public class ConMySQL { public static void main(String arg[]) { String dbName = "test"; String Login = "root"; String Password = "pluto"; String ConnStr = "jdbc:MySQL://localhost/" + dbName + "?user=" + Login + "&password=" + Password; try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(ConnStr); Statement stmt = conn.createStatement(); ResultSet results = stmt.executeQuery("select * from stuinfo"); while (results.next()) { String name = results.getString("name"); String sex = results.getString("sex"); System.out.println(name + " " + sex); } conn.close(); } catch (Exception exc) { exc.printStackTrace(); } }}对于插入的操作,一般使用PreparedStatement,请看下面实例PreparedStatement stm;stm=con.prepareStatement("insert into Indent(IndentID,UserName,TPrice)values(?,?,?);");stm.setInt(1, id);String user = (String)session.getAttribute("username");stm.setString(2, user);stm.setInt(3, 100); stm.executeUpdate(); 2.Servlet要理解Servlet可以先将Servlet和Applet、CGI、JSP等进行比较。Servlet主要包括两个包:1)javax.servlet interface RequestDispatcher
  //定义一种对象,用于从客户接受请求,并将请求发送到服务器上任何指定的资源,如一个Servlet 、JSP 或 HTML 文件。
  interface Servlet
  //定义了所有 Servlet 必须实现的方法。
  interface ServletConfig
  //定义Servlet config 对象,由Servlet 引擎用在 Servlet 初始化时,向 Servlet 传递信息。
  interface ServletContext
  //定义了一系列方法,以便Servlet与其运行的环境通信。
  interface ServletRequest
  //定义了用于向Servlet传递客户请求信息的对象。
  interface ServletResponse
  //定义了一个对象,由Servlet用于向客户发送响应。
  interface SingleThreadModel
  //用于保证Servlet在任一时刻,只处理一个请求。
  class GenericServlet
  //继承Servlet接口,定义了一个通用的,与协议无关的Servlet。
  class ServletInputStream
  //定义了一个输入流,用于由Servlet从中读取客户请求的二进制数据。
  class ServletOutputStream
  //定义了一个输出流,用于由Servlet向客户发送二进制数据。
  class ServletException
  //定义了一个当Servlet遇到问题时可以抛出的异常。
  class UnavailableException
  //定义了一种异常,用于由Servlet指明它永远或暂时不可用。 其中一个最重要的类是GenericServlet,它继承Servlet接口,定义了一个通用的,与协议无关的Servlet,通过它继承它,可以进行一些处理客户请求的操作。一个Servlet的工作过程包括(与Applet类似): 1.创建并初始化(init()) 2.处理客户端的请求(service(ServletRequest req,ServletResponse res)) 3.删除Servlet,回收资源,终止Servlet运行(destroy())示例:import java.io.*;import java.util.*;import javax.servlet.*;public class TestGenericServlet extends GenericServlet { public void init(ServletConfig config)throws ServletException { super.init(config); //调用父类的初始化方法;也可以加入自己需要的初始化代码。 } public void destroy() { //destroy方法中加入一些做最后清理工作的代码; } public String getServletInfo() { return "This servlet is a simple Servlet's example."; //返回此servlet的信息 ; } public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException { //service是最主要的方法,提供服务 //获得服务器当前时间。 Date today=new Date(); ServletOutputStream out=res.getOutputStream(); //通过输出流向客户端写回了一个HTML文件; out.println("<html><head><title>HelloServlet.java</title></head><body>"); out.println("Hello,this is my first test.+<BR>"); out.println("Today is "+today.toString()+"<BR>"); out.println(getServletInfo()+"<BR>"); }} 2)javax.servlet.http interface HttpServletRequest  //继承了ServletRequest 接口,为HTTPServlet 提供请求信息。  interface HttpServletResponse  //继承了ServletResponse 接口,为HTTPServlet 输出响应信息提供支持。  interface HttpSession  //为维护 HTTP 用户的会话状态提供支持。  interface HttpSessionBindingListener  //使得某对象在加入一个会话或从会话中删除时能够得到通知。  interface HttpSessionContext  //由Servlet 2.1 定义,该对象在新版本已不被支持。  class Cookie //用在Servlet 中使用Cookie 技术  class HttpServlet //定义了一个抽象类,继承 GenericServlet 抽象类,应被 HTTPServlet 继承。  class HttpSessionBindingEvent  //定义了一种对象,当某一个实现了HttpSessionBindingListener接口的对象被加入会话或从会//话中删除时,会收到该类对象的一个句柄
  class HttpUtils  //提供了一系列便于编写HTTPServlet 的方法。 其中一个最重要的类是HttpServlet,它从GenericServlet 继承而来,因此它具有GenericServlet 类似的方法和对象,一般的Servlet编程都用这个类,而少用GenericServlet类。HttpServlet类中包括几个常用的方法(几乎对应于Http1.1)如:doGet();doPost();doDelete();doPut();doOptions();doTrace()等。 虽然HttpServlet在响应客户请求时没有显示的调用service而只是调用doGet等方法,但是Servlet内部还是会进行转化的,service与doGet等方法是一致的。Service是处理客户请求的核心。示例:import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class TestHttpServlet extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException { res.setContentType("text/html"); ServletOutputStream out=res.getOutputStream(); out.println("<html>"); out.println("<head><title>testHttpServlet.java</title></head>"); out.println("<body>"); out.println("<h3>Hello,this is a HttpServlet's test!</h3>"); out.println("</body></html>"); } } 3.JSPJSP的语法1)HTML注释语法:<!-- comment [ <%= expression %> ] -->2)隐藏注释语法:<%-- comment --%>3)声明语法:<%! declaration; [ declaration; ]+ ... %>4)表达式语法:<%= expression %>5)程序段语法:<% code fragment %>6)Include 指令语法:<%@ include file="relativeURL" %>7)Page 指令语法:
<%@ page
[ language="java" ] 声明脚本语言的种类,暂时只能用"java"
[ extends="package.class" ] 标明JSP编译时需要加入的Java Class的全名,但是得慎重的使用它,它会限制JSP的编译能力.
[ import="{package.class | package.*}, ..." ] 需要导入的Java包的列表,这些包就作用于程序段,表达式,以及声明。
[ session="true | false" ] 设定客户是否需要HTTP Session.(学过ASP的人,应该对它不陌生)如果它为true,那么Session是有用的。
[ buffer="none | 8kb | sizekb" ] buffer的大小被out对象用于处理执行后的JSP对客户浏览器的输出。缺省值是8kb
[ autoFlush="true | false" ] 设置如果buffer溢出,是否需要强制输出,如果其值被定义为true(缺省值),输出正常,如果它被设置为false,如果这个buffer溢出,就会导致一个意外错误的发生.如果你把buffer设置为none,那么你就不能把autoFlush设置为false.
[ isThreadSafe="true | false" ] 设置Jsp文件是否能多线程使用。缺省值是true,也就是说,JSP能够同时处理多个用户的请求,如果设置为false,一个jsp只能一次处理一个请求
[ info="text" ] 一个文本在执行JSP将会被逐字加入JSP中,你能够使用Servlet.getServletInfo方法取回。
[ errorPage="relativeURL" ] 设置处理异常事件的JSP文件。
[contentType="mimeType[;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
设置MIME类型 。缺省MIME 类型是: text/html, 缺省字符集为 ISO-8859-1.[ isErrorPage="true | false" ] 设置此页是否为出错页,如果被设置为true,你就能使用exception对象.
%>8)<jsp:forward>语法:用法⒈<jsp:forward page={"relativeURL" | "<%= expression %>"} />
用法⒉<jsp:forward page={"relativeURL" | "<%= expression %>"} >
<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />+ </jsp:forward> <jsp:forward>常用页面跳转,并可在页面之间传递参数。9)<jsp:include> 语法: 1.jsp:include page="{relativeURL | <%= expression%>}" flush="true" /> 2. <jsp:include page="{relativeURL | <%= expression %>}" flush="true" > <jsp:param name="parameterName" value="{parameterValue|<%=expression%>}"/></jsp:include><jsp:include>元素允许你包含动态文件和静态,这两种包含文件的结果是不同的。如果文件仅是静态文件,那么这种包含仅仅是把包含文件的内容加到jsp文件中去,而如果这个文件动态的,那么这个被包含文件也会被Jsp编译器执行。如果这个包含文件是动态的,那么你还可以用<jsp:param>还传递参数名和参数值。10)<jsp:plugin><jsp:plugin>元素用于在浏览器中播放或显示一个对象(典型的就是applet和Bean),而这种显示需要在浏览器的java插件。11)<jsp:useBean> 语法:<jsp:useBean
id="beanInstanceName"
scope="page | request | session | application"
{
class="package.class" |
type="package.class" |
class="package.class" type="package.class" |
beanName="{package.class | <%= expression %>}" type="package.class"
}
{
/> |
> other elements </jsp:useBean><jsp:useBean>用于定位或示例一个JavaBeans组件。<jsp:useBean>首先会试图定位一个Bean实例,如果这个Bean不存在,那么<jsp:useBean>就会从一个class或模版中进行示例。12)<jsp:setProperty> 与<jsp:useBean>元素连用,用于设置Bean的属性值。13)<jsp:getProperty>语法:<jsp:getProperty name="beanInstanceName" property="propertyName" />这个<jsp:getProperty>元素将获得Bean的属性值,并可以将其使用或显示在JSP页面中.在你使用<jsp:getProperty>之前,必须用<jsp:useBean>创建它。name="beanInstanceName" ,bean的名字,由<jsp:useBean>指定;property="propertyName" ,所指定的Bean的属性名。14)在设计JSP网页时还有几点是常用的: (1)连接数据库 连接数据库可以直接嵌入JSP页面中,也可以做成Bean方式,再通过useBean在页面中使用,个人感觉后者结构比较清晰,推荐后者。 (2)登陆验证 主要是先获得用户填入的username和password,再将它们和数据库中的信息表相比较如果符合,则通过session来设置用户的访问权限,否则转至error页面。在用户访问其它页面时也都要先判断用户的session来验证用户是否有权访问该页面。 (3)页面跳转 主要是通过forword来实现页面之间的跳转并通过param传递参数值。也可通过网页中的herf来实现跳转。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: