JSP:Java server pages,是一种动态网页技术;“动态”指的是交互性,而不是动画或者js特效的动态。
同类产品:ASP,PHP,......
JSP的服务器:Tomcat,Weblogic,webSphere,JBoss,JRun,Resin.....
Tomcat目录:
bin:Tomcat的启动和关闭程序
Common:一些库文件
Conf:配置信息。
WebApps:站点放在此
Work:jsp会被译成servlet,放在此目录下
站点的创建:
1。在WebApps目录下创建一个目录,比如:JspStudy。
2。编写first.jsp,内容就是以前的HTML代码。
3。在JspStudy下创建一个文件夹:WEB-INF
4。在WEB-INF下创建一个文件:web.xml
5。编写web.xml的内容为:
<?xmlversion="1.0" encoding="ISO-8859-1"?>
<web-app>
<welcome-file-list>
<welcome-file>first.jsp</welcome-file>
</welcome-file-list>
</web-app>
6。<welcome-file-list>可以省略,它指的是访问站点时的默认首页;可以有多个,会依次寻找。
7。访问:http://localhost:8080/JspStudy
8080为端口号;JspStudy是你的站点目录名;localhost可以换成IP地址;
更改端口号:
1。打开conf\server.xml文件。
2。找到port="8080"
3。更改。注意:不要与系统中其它软件的端号冲突。
将服务目录创建在任意的目录下,而不是webapps目录下:
1。打开conf\server.xml文件。
2。在</host>前加:
<Contextpath="/站名"docBase="实际目录"debug="0" reloadable="true"></Context>
注意:大小写;XML是区分大小写;
3。访问:http://localhost:端口号/站名
比如:<Context path="/cat"docBase="c:/myCatSite" debug="0" reloadable="true"></Context>
DW中的站点配置:
1。菜单:stie(站点)/manage site(管理站点)
2。对话框上:单击“new”/"site"
3。advance选项卡,local root folder:本地文夹,找到webapps下的你的站点目录;
4。左侧remote info(远程信息):Access(访问)设置为local/network(本地/网络):指定站点根目录,同上。
5。左侧Testing Server(测试服务器),server modal(服务器模型):设置为jsp,
Access(访问):local/network,URL prefix(URL前缀):设置你的站点访问的URL,比如:
http://localhost:6688/JspStudy/
即:http://localhost:端口号/站点名/
JSP嵌入在HTML中,就是使用:<%%>以及其它特定的指令或者动作
<%="输出一条语句"%>:注意:只能是一条语句;
<%out.println("输出语句")%>:注意:可以有N个out.println();区别java没有System
练习:写一段代码,求出1-100和,并输出
JSP输出语句中可以使用HTML
<%
if(3>2)
out.println("3>2");
else
out.println("3<2");
%>
以上代码可以写成:
<%if(3>2){%>
3>2
<%}else{%>
3<2
<%}%>
请理解!
JSP文件的构成元素:
1.HTML 2.注释 3.脚本(scriptLet) 4.指令 5.动作
注释元素:
<!--注释内容--> 其实是HTML注释
<!--<%=jsp代码%>--> 其实还是HTML注释,只不过是注释的内容是由jsp决定的
<%--注释内容--%> 此种注释不同于上两种,不会显示在客户端的源码中
<%
//单行注释
/*多行注释*/
%>
此种注释是脚本种的注释,即java的注释
脚本元素:
包括三个方面:声明(Declaration);表达式(Expression);小脚本(scriptlets)
声明: 1.可以声明变量,也可声明方法;这种变量和方法会成为成员变量和成员方法;否则,为局部变量和局部方法
2.声明的办法<%! 变量;%> <%! 方法名(){}%>
3.此种声明可以在变量使用前,也可以在变量使用后;
4。而局部变量则必须在使用前声明;方法同理。
如:
<%!String color="green";%>
<BODYbgcolor="<%=color()%>">
再如:
<%!String color="green";
publicString getColor()
{
return color;
}
%>
<BODYbgcolor="<%=getColor()%>">
请查看work目录下的java文件,进行理解。
表达式;
用法:<%=表达式%>
注意:无分号;=是输出的作用;
小脚本:
<%这之间的多行java代码,就是小脚本%>
指令元素:
三种:页面指令(page);include指令;taglib指令;指令的特点是<%@ 指令%>
动作元素:
作用:可以理解为sun为我们定义的一些标签,有相应的功能;
特点:<jsp:动作></jsp:动作>;有时可以写成<jsp:动作 />
page指令:
格式;
<%@page
[langage="java"] [import="package.class|package.*,package2.class2,....."]
[contentType="TYPE;charset=CHARSET"] [session="true|false"]
[buffer="none|8kb|sizeKB"] [autoFlush="true|false"]
[info="text"] [errorPage="relativeURL"]
[isErrorPage="true|false"] [extends="package.class"]
[pageEncoding="peinfo"]
%>
注意:除import之外,其它指令只能出现一次。
说明:
属性 描述 默认值 比如
langage 定义使用的语言,只有"java" java language="java"]
import 导入包,多包之间用逗号 import="java.io.*,java.util.*"
session 此页面是否在session中有效 true session="false"
buffer 缓冲大小 buffer="64K"
autoFlush 自冲刷新缓冲 true autoFlush="true"
info 可以使用servlet.getServletInfo()
获取信息 info="一个测试"
errorPage 出现异常是,自动跳转的页 errorPage="*.jsp|*.html"
isErrorPage 指定当前页为错误页 isErrorPage="true"
contentType 指页面的MIME类型 contentType="text/html;charset=gb2312"
pageEncoding 页面的编码 pageEncoding="iso-8859-1"
info属性实例:
<%@page contentType="text/html;charset=GB2312" %>
<%@page info="我!张惠妹" %>
<HTML>
<BODY bgcolor=cyan><FONT Size=1>
<P>谁呀?
<% String s=getServletInfo();
out.print("<BR>"+s);
%>
</BODY>
<HTML>
错误页实例:注意是两个文件
文件一:此文件会产生错误,使用指令:errorPage=""
<%@page contentType="text/html; charset=gb2312" language="java" errorPage="error.jsp" %>
<%
//这个页面一定会出错。
inti=0;
intj=1;
out.println(j/i);
%>
文件二:此文件是显示错误信息的页,使用指令:isErrorPage="true"
<%@page contentType="text/html; charset=gb2312"language="java" isErrorPage="true" %>
<html>
<head>
<title>出错了!</title>
<metahttp-equiv="Content-Type" content="text/html;charset=gb2312">
</head>
<body>
出错了!<br>
发生了以下的错误:<br>
1.除数不能为零。<br><hr><font color=red>
2.<%=exception.getMessage()%><br><hr>
3.<%=exception.getLocalizedMessage()%><br><hr>
<br>
</font></body>
</html>
include指令:
作用:静态的包含一个文件;可是是txt,jsp以及其它浏览器所能识别的文件;被包含文件将成为当前文件的一部分;
注意: 1.若被包含文件修改了,则必须重新编译jsp,否则不能更新.
2.若当前jsp文件已经有某个page指令,则被包含的文件一定不能有相同指令.
3.常应用于多页有重复的内容;比如:导航栏或者版权说明;
格式:<%@ include file="文件的名称"%>
比如:
<%@page contentType="text/html;charset=GB2312"pageEncoding="iso-8859-1"%>
<html>
<BODYbgcolor=cyan>
<H3>
<%@ include file="A.txt" %>
</H3>
</BODY>
</HTML>
jsp的动作标签:
理解:自定义的标签;所以,要有结束标记;
include动作:
<jsp:includepage="文件名" />
或者
<jsp:includepage="文件名"></jsp:include>
与include指令的区别:
第一:动作标签是在执行时才对包含的文件进行处理;而指令是在编译处理;
第二:动作标签不将被包含的文件实际的合并成当前页面的一部而,而只是告知java解释器去执行被包含的文件;
第三:被包含的文件在语法和逻辑上是独立的;
第四:被包含文件内容的修改会更新在包含文件上.
forward动作:
作用:停止当前页面的执行,跳转到另一个页面;
格式:<jsp:forward page=要转向的页面" />
实例:产生一个随机数,当随机数大于0.5时自动跳转到1.jsp;否则,跳转到2.jsp
作业:根据不同的星期几跳转到对应的页面;
plugin动作:
作用:用业产生object或者embed标签,使用它可以插入Applet或者JavaBean
格式:
<jsp:plugin
type="bean|applet"
code="文件名"
codebase="文件目录"
>
<jsp:params>
<jsp:paramname="参数名" value="值|<%=jsp表达式%>" />
多参,同上
</jsp:params>
</jsp:plugin>
out对象及方法
jsp内置对象谈讨之二:
request对象
作用:封装了用户提交的信息;所以,可以由对象来获取用户请求的信息。
说明: 第一:它被包装成HttpServletRequest接口。
第二:常用来在单击表单中的提交按钮后,获取信息。
第三:表单的格式:
<formmethod=get|post action="要处理提交信息的页面">
<各表单对象>
<提交按钮>
</form>
在单击提交按钮后,会自动执行action所对应的jsp页面;action对应的页面可以获取表单中的信息;
这些信息就封装在request对象中;
request对象的方法:
getAttribute(Stringname):返回由name指定的属性值;如果属性值不存在,则返回null;
getAttributeNames():返回request对象中的所有属性的名字集合,结果的类型是枚举型;
getCookies():返回客户端所有Cookie对象,结果是一个Cookie数组;
getCharacterEncoding():返回请求的编码方式;
getContentLength():返回请求的body长度;如果不确定长度,则返回-1;
getHeader(Stringname): 返回Http协议定义的文件头信息;
getHeaders(Stringname):返回指定名字的头信息的所有值,结果是一个枚举型;
getHeaderNames():返回所有文件头信息的名字,结果是一个枚举型;
getMethod():返回客户端提交数据的方法;
getParameter(Stringname):重要方法,返回指定表单中提交参数的值;
getParameterNames():返回客户端提交的所有参数的名字,结果是一个枚举型;
getParameterValues(Stringname):获得指定参数的所有值,结果是一个字符数组;
getProtocal():返回客户端提交数据时,所使用的协议;
getQueryString():返回客户端以get方法传递参数的值;
getRequestURI():返回发出请求的页面的地址;
getRemoteAddr():返回客户端的IP;
getRemoteHost():返回客户端的主机名;
getSession([Booleancreate]):返回与请求相关的session;若create参数为true,表示如果客户端没有创建session,则创建;
getServletPath():返回请求的脚本文件的文件路径;
getServerPort():返回服务器的端口号;
removeAttribute(Stringname):删除请求中的一个属性;
setAttribute(Stringname,java.lang.Object obj):设置名字为name的request参数的值;类型由obj决定;
getLocale():返回本土信息;在此返回zh_ch;
举例:
<%@page import="java.io.*"%>
RequestObject Info:
<hr>
<%
out.println("<br>getMethod:");
out.println(request.getMethod());
out.println("<br>getParameter:");
out.println(request.getParameter("name"));
out.println("<br>getAttributeNames:");
java.util.Enumeratione=request.getAttributeNames();
while(e.hasMoreElements())
out.println(e.nextElement());
out.println("<br>getCharacterEncoding:");
out.println(request.getCharacterEncoding());
out.println("<br>getContentLength:");
out.println(request.getContentLength());
out.println("<br>getContentType:");
out.println(request.getContentType());
out.println("<br>getLocale:");
out.println(request.getLocale());
out.println("<br>getProtocol:");
out.println(request.getProtocol());
out.println("<br>getRemoteAddr:");
out.println(request.getRemoteAddr());
out.println("<br>getRemoteHost:");
out.println(request.getRemoteHost());
out.println("<br>getRemoteUser:");
out.println(request.getRemoteUser());
out.println("<br>getServerName:");
out.println(request.getServerName());
out.println("<br>getServerPort:");
out.println(request.getServerPort());
out.println("<br>getSession:");
out.println(request.getSession(true));
out.println("<br>getHeader('User-Agent')");
out.println(request.getHeader("User-Agent"));
%>
例子:返回所有的文件头信息名称及值
<%
java.util.Enumerationenum_header=request.getHeaderNames();
while(enum_header.hasMoreElements())
{
Strings=(String)enum_header.nextElement();
out.println(s+":");
out.println(request.getHeader(s)+"<br>");
}
%>
通过这个例子,我们知道request.getHeader(String name)方法的参数可以有:accept,referer,accept-language,
acceptEncoding,user-agent,host,connection,cookie等
例子:返回所有指定头名字cookie的值
<%
java.util.Enumerationenum_cookie=request.getHeaders("cookie");
while(enum_cookie.hasMoreElements())
{
Strings=(String)enum_cookie.nextElement();
out.println(s+"<br>");
}
%>
表单信息的获取,由request.getParameter("表单元素名")实现:
举例:在一文本框中输入信息,提交后在另一页面中显示
第一个文件:
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=green><FONT size=1>
<FORM action="tree.jsp"method=get name=form>
<!--action所对应的页面,会在此表单中的提交按钮(submit)单击后自动执行-->
<INPUT type="text"name="boy">
<!--注释文本框的名字,在另一个页面,可以通过request.getParameter("文本框名")来获取提交的文本框值-->
<INPUT TYPE="submit"value="Enter" name="submit">
<!--type=submit是提交按钮,它的值也可以通过request.getParameter("提交按钮名")来获取->
</FORM>
</FONT>
</BODY>
</HTML>
第二个文件:
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=green><FONT size=1>
<P>获取文本框提交的信息:
<%StringtextContent=request.getParameter("boy");
//上面语句可以获取boy表单元素的值
%>
<BR>
<%=textContent%>
<P>获取按钮的名字:
<%String buttonName=request.getParameter("submit");
//上面语句可以获取submit表单元素的值
%>
<BR>
<%=buttonName%>
</FONT>
</BODY>
</HTML>
注意:
第一:如果直接由地址栏请求处理页,则request.getParameter("表单元素"),返回值为null;
第二:可以在直址中直接传递参数;以地址?参数=值&参数=值&参数=值...
第三:若参数值有空格,则用+号或者20%来表示;切记:地址中不能有空格;
第四:表单的post方法与get方法的区别:
1.get方法会将参数及值显示在地址栏中;所以,有安全需要的信息不能这种方式;
2.post方法不会,可以提交大数据;而get方法提交时对提交的信息量有限制;所以,留言之类的信息不可用get
3.post方法是默认方法;通常使用此方法;
4.get方法,执行效率高;
第五:可以用超链接传递参数,相当于get方法;如:<ahref=tree.jsp?boy=22&submit=33>go to tree.jsp</a>
再做一例子:在文本框中输入一个数,在另一个页面显示这个数的平方根(自做,提示:需转换数据类型)
request对象中的中文乱码问题解决:
实例:
文件一:
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=green><FONT size=1>
<FORM action="tree2.jsp"method=post name=form>
<INPUT type="text"name="boy">
<INPUT TYPE="submit" value="提交" name="submit">
</FORM>
</FONT>
</BODY>
</HTML>
文件二:
<%@page contentType="text/html;charset=GB2312" %>
<MHML>
<BODY>
<P>获取文本框提交的信息:
<%StringtextContent=request.getParameter("boy");
//若没有下面的语句,将不能处理汉字.
byte b[]=textContent.getBytes("ISO-8859-1");
//ISO-8859-1是简体中文编码
//上面结果形成一个字节数组
textContent=new String(b);
//将字节数组作用字符串对象的构造参数,返回字符串对象
%>
<BR>
<%=textContent%>
<%//输出字符串%>
小结:
1。page指令中的contentType="text/html;charset=GB2312"只能用来控制页面上静态内容的中文问题;
2。String对象的getBytes("ISO-8859-1")用来解决request对象中包含中文信息的乱码问题;
3。从数据库中提取出来的值也会有乱码问题,但是Tomcat4有,Tomcat5没有。
4。使用String对象的getBytes("ISO-8859-1")方法需要对每个表单元素的值都进行转换,较麻烦;替代方法是
request.setCharacterEncoding("GBK"),将它写在所有的request.getParameter("**")之前,可以使
所有的表单元素提交的信息编码为中文。
5。也可以定义一个方法,这个方法功能为:将参数转换成中文编码,即getBytes("ISO-8859-1"),然后这个方法返回
值为一个字符串,即new String(b);在jsp页中将每个request.getParameter("**")做为这个方法的参数;
6。若没有page指令,且IE编码为“简体中文”,在Tomcat5.0下,则不需要任何转换;
实例:获取用户提交数据中的所有参数名称及值,并解决中文问题
文件一:
<html>
<head>
<title>TestHTML</title>
</head>
<body>
<formaction="params.jsp">
请输入学员ID:<br>
<Inputtype="text" name="myid"><br>
请输入学员name:<br>
<Inputtype="text" name="myname"><br>
请选择学员性别:<br>
<Inputtype="radio" name="mysex" value="m" checked>男
<Inputtype="radio" name="mysex" value="f">女<br>
<Inputtype="submit" name="mysubmit"><br>
<Inputtype="reset" value="重新填写"><br>
</form>
</body>
</html>
文件二://params.jsp
<%@pagecontentType="text/html;charset=gb2312"%>
<%@pageimport="java.util.*"%>
<%
//输出request中的所有参数名称及值
Stringcurrent_param = "";
request.setCharacterEncoding("ISO-8859-1"); //处理页面传递的中文问题
Enumerationparams = request.getParameterNames(); //得到所有的参数名称
while(params.hasMoreElements()){
current_param= (String)params.nextElement();
out.println("Name: " + current_param +"<br>");
out.println("Values:" + request.getParameter(current_param) + "<br>");
}
%>
实例:单选按钮的提交例子
文件一:
<HTML>
<%@page contentType="text/html;charset=GB2312" %>
<BODYbgcolor=cyan><Font size=1 >
<P>诗人李白是中国历史上哪个朝代的人:
<FORM action="answer.jsp"method=post name=form>
<INPUT type="radio"name="R" value="a">宋朝
<INPUT type="radio"name="R" value="b">唐朝
<INPUT type="radio" name="R"value="c">明朝
<INPUT type="radio"name="R" value="d" checked="ok">元朝
<BR>
<P>小说红楼梦的作者是:
<BR>
<INPUT type="radio"name="P" value="a">曹雪芹
<INPUT type="radio"name="P" value="b">罗贯中
<INPUT type="radio"name="P" value="c">李白
<INPUT type="radio"name="P" value="d">司马迁
<BR>
<INPUT TYPE="submit"value="提交答案"name="submit">
</FORM>
</FONT>
</BODY>
</HTML>
文件二://answer.jsp
<HTML>
<%@page contentType="text/html;charset=GB2312" %>
<BODYbgcolor=cyan><Font size=1 >
<% int n=0;
Strings1=request.getParameter("R");
Strings2=request.getParameter("P");
if(s1==null)
{s1="";}
if(s2==null)
{s2="";}
if(s1.equals("b"))
{ n++;}
if(s2.equals("a"))
{ n++;}
%>
<P>您得了<%=n%>分
</FONT>
</BODY>
</HTML>
下拉菜单实例:
文件一:
<HTML>
<%@page contentType="text/html;charset=GB2312" %>
<BODYbgcolor=cyan><Font size=1 >
<P>选择计算和的方式
<FORM action="sum.jsp"method=post name=form>
<Select name="sum" size=2>
<Option Selected value="1">计算1到n的连续和
<Option value="2">计算1到n的平方和
<Option value="3">计算1到n的立方和
</Select>
<P>选择n的值:<BR>
<Select name="n" >
<Option value="10">n=10
<Option value="20">n=20
<Option value="30">n=30
<Option value="40">n=40
<Option value="50">n=50
<Option value="100">n=100
</Select>
<BR><BR>
<INPUT TYPE="submit" value="提交你的选择" name="submit">
</FORM>
</FONT>
</BODY>
</HTML>
文件二://sum.jsp
<HTML>
<%@page contentType="text/html;charset=GB2312" %>
<BODYbgcolor=cyan><Font size=1 >
<% long sum=0;
Strings1=request.getParameter("sum");
Strings2=request.getParameter("n");
if(s1==null)
{s1="";}
if(s2==null)
{s2="0";}
if(s1.equals("1"))
{int n=Integer.parseInt(s2);
for(int i=1;i<=n;i++)
{sum=sum+i;
}
}
else if(s1.equals("2"))
{int n=Integer.parseInt(s2);
for(int i=1;i<=n;i++)
{sum=sum+i*i;
}
}
else if(s1.equals("3"))
{int n=Integer.parseInt(s2);
for(int i=1;i<=n;i++)
{sum=sum+i*i*i;
}
}
%>
<P>您的求和结果是<%=sum%>
</FONT>
</BODY>
</HTML>
复选框同名,下拉菜单可以多选,返回的值都是多值,获取办法:
request.getParameterValues("elementName")
比如:
文件一:
<html>
<head>
<title>允许多重选择的下拉菜单</title>
</head>
<bodybgcolor="#FFFFFF">
<h2>允许多重选择的下拉菜单</h2>
<hr>
<formaction="echo3b.jsp" method="POST">
<p><selectname="City" multiple size="6">
<option>北京市</option>
<option>上海市</option>
<option>天津市</option>
<option>重庆市</option>
</select></p>
<p><inputtype="submit" value=" 提 交"></p>
<hr>
</form>
</body>
</html>
文件二://echo3b.jsp
<%@page contentType="text/html;charset=GBK" %>
<%
request.setCharacterEncoding("GBK");
StringCitys[] = request.getParameterValues("City");
%>
<html>
<head>
<title>允许多重选择的下拉菜单</title>
</head>
<bodybgcolor="#FFFFFF">
<h2align="center">允许多重选择的下拉菜单</h2>
<hr>
<p>您选择的城市是: </p>
<ul>
<%
for(inti=0; i<Citys.length; i++)
out.println("<li>"+ Citys[i]);
%>
</ul>
</body>
</html>
实例:复选框同名,获取多值
文件一:
<html>
<head>
<title>复选框演示程序</title>
</head>
<bodyBGCOLOR="#FFFFFF">
<h2ALIGN="CENTER">复选框演示程序</h2>
<hr>
<p>您有兴趣的书籍是:</p>
<formAction="echo4b.jsp" Method="GET">
<inputType="CheckBox" Name="Book" Value="VB 5.0 与数据库程序设计">VB 5.0 与数据库程序设计<br>
<inputType="CheckBox" Name="Book" Value="VB 5.0 实战讲座">VB 5.0 实战讲座<br>
<inputType="CheckBox" Name="Book" Value="VB5 与 ActiveX 程序设计">VB5 与 ActiveX 程序设计<br>
<p> <input Type="Submit" Value="提 交"> </p>
</form>
</body>
</html>
文件二://echo4b.jsp
<%@page contentType="text/html;charset=GBK" %>
<HTML>
<HEAD><TITLE>复选框演示程序</TITLE></HEAD>
<BODYbgcolor="#FFFFFF">
<HTML>
<BODYBGCOLOR=#FFFFFF>
<H2ALIGN=CENTER>复选框演示程序<HR></H2>
您有兴趣的书籍是:
<UL>
<%
request.setCharacterEncoding("GBK");
String Books[] = request.getParameterValues("Book");
if(Books != null) {
for(int i=0; i<Books.length; i++)
out.println(Books[i] +"<br>");
}
%>
</UL>
</BODY>
</HTML>
多行文本框的换行问题:如果直接输出不能实现换行,需将\n转换成<br>
文件一:
<html>
<head>
<title>文字输入框(TextArea)演示程序</title>
</head>
<bodybgcolor="#FFFFFF">
<h2align="center">滚动文本框(TextArea)演示程序</h2>
<hr>
<formaction="echo2.jsp" method="POST">
<p>留言:</p>
<p><textareaname="Memo" rows="4"cols="60"></textarea></p>
<p><inputtype="submit" value="提 交"></p>
</form>
</body>
</html>
文件二://echo2.jsp
<%@page contentType="text/html;charset=GBK" %>
<html>
<head>
<title>TextareaDemo</title>
</head>
<bodybgcolor="#FFFFFF">
<h2align="center">
TextareaDemo - Your Input is
</h2>
<hr>
<%!
// 下面方法myTranslate的作用是将StringBuffer中的的回车符号换为<br>
StringBuffermyTranslate(StringBuffer sour) {
for(inti=0; i<sour.length(); i++) {
if(sour.substring(i,i+1).equals("\n")){
sour.delete(i,i+1);
sour.insert(i,"<br>");
}
}
returnsour;
}
%>
<%
request.setCharacterEncoding("GBK");
StringBufferMemo = new StringBuffer(request.getParameter("Memo"));
Memo= myTranslate(Memo);
out.println(Memo);
%>
</body>
</html>
课后作业:
1。用一个页面处理自己的表单;提交前看到表单,提交后看到request的值.(判断提交按钮的值;判断某隐藏域的值)
2。提交时的表单验证问题。(服务端验证:jsp;客户端验证:JavaScript).(要求:返回时已填值存在;自动让未真项获得焦点)
3。注册用户;成功后显示成功信息;可以检查一个用户是否已经注册过,若注册过,则不能同名注册;(请研究Hashtable类)
response内置对象:
含义与作用:它封装了HttpServletResponse接口,对客户端进行响应;与request相对应,request表示请求,response表示响应。
常见方法:
addCookie(Cookiecookie):添加一个Cookie对象,用来保存客户端的信息。
addHeader(Stringname,String value):添加Http文件头信息,并传递到客户端;若已经存在此Header,则覆盖;
containsHeader(Stringname):判断是否包含指定的Header,返回布尔值;
encodeURL():使用sessionID来封闭一个URL,如果没有必要封装,则返回原值;
flushBuffer():强制当前缓冲区中的内容发送到客户端;
getBufferSize():返回缓冲区的大小;
sendError(int):向客户端发错误信息;比如:404指网页不存在;
sendRedirect(Stringlocation):跳转到另一个页;
setContentType(StringcontentType):设置响应的MIME类型;参数:text/html;text/plain;application/msword;application/x-msexcel等
setHeader(Stringname,String value):设置header,若存在则覆盖;
setStatus(int):同sendError(int);
encodeRedirectURL():同encodeURL();
实例:设置文档类型为word格式
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><Font size=1 >
<P>我正在学习response对象的
<BR>setContentType方法
<P>将当前页面保存为word文档吗?
<FORM action=""method="get" name=form>
<INPUT TYPE="submit"value="yes" name="submit">
</FORM>
<% Stringstr=request.getParameter("submit");
if(str==null)
{str="";
}
if(str.equals("yes"))
{response.setContentType("application/msword;charset=GB2312");
}
%>
</FONT>
</BODY>
</HTML>
实例:设置头每隔五秒刷新一次
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.util.*" %>
<HTML>
<BODYbgcolor=cyan><Font size=1 >
<P>现在的时间是:<BR>
<%out.println(""+new Date());
response.setHeader("Refresh","5");
%>
</FONT>
</BODY>
</HTML>
实例:文本框是必填项,若未填则总停留在表单页;若填,则显示成功页;
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<P>填写姓名:<BR>
<FORM action="tree4.jsp"method="get" name=form>
<INPUT TYPE="text" name="boy">
<INPUT TYPE="submit"value="Enter">
</FORM>
</BODY>
</HTML>
文件二://tree4.jsp
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<%Stringstr=null;
str=request.getParameter("boy");
if(str==null)
{str="";
}
byteb[]=str.getBytes("ISO-8859-1");
str=newString(b);
if(str.equals(""))
{response.sendRedirect("Example3_13.jsp");
}
else
{out.print("欢迎您来到本网页!");
}
%>
</BODY>
</HTML>
实例二:关于多送错误报告的几个例子
<HTML>
<BODY>
<% response.setStatus(408);
out.print("不显示了");
%>
</BODY>
</HTML>
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<% response.setStatus(200);
out.println("ok");
%>
</BODY>
</HTML>
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<%
response.sendError(505);
%>
</BODY>
</HTML>
提示:可以更改参数,看不同错误报告。
session对象:
含义与作用:会话,指的是从一个客户打开浏览器并链接到服务器,到客户端关闭所有的浏览器页面并离开这个服务器,
这一个期间就叫做一个会话;包括页面间的反复跳转,反复刷新一个页面,或不断提交信息等;session
对象用来表示某一个会话期间的某一个特定的客户;比如:在一个网站的不同页面购买商品,通过session
可以用来表示是你的行为而不是其它网页的行为。
原理:当一个客户首次进行某个网站,就开始接受服务器的服务,JSP引擎将自动为每一个客户产生一个互相不同的ID;
在整个会话周期中,此ID就标识着你的身份;若你关闭浏览器,则自动收回你的ID;若你重新登录到服务器的服务
之中,则重新分配一个ID;它与Cookie有关,若浏览器屏蔽了Cookie功能,则session失效;
常见方法:
publicvoid setAttribute(String key,Object obj):类似于Hashtable,通过key对应存储一个值,此值类型为Object;
publicObject getAttribute(String key):通过key获取已经存储在session中的Object;注意:因是Object,需转换类型;
publicEnumeration getAttributeNames():返回session中的全有对象,其值为枚举类型;
publiclong getCreationTime():L返回session对象创建的时间,即离1970年7月1日所过去的毫秒数;
publiclong getLastAccessedTime():返回最后一次访问的时间,离1970年7月1日所过去的毫秒数;
publicint getMaxInactiveInterval():获取session对象的生存时间;
publicvoid setMaxInactiveInterval():设置session对象的生存时间;
publicvoid removeAttribute(String key):删除当前session对象中关键字是key的对象;
publicString getId():获取session对象分配的ID号;
publicovid invalidate():使session无效;
publicboolean isNew():是否为新客户;
//session.getId()示例,多页面,对同一客户而言在同一次会话中是相同的ID
//文件一:
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<P>
<% String s=session.getId();
%>
<P>您的session对象的ID是:
<BR>
<%=s%>
<P>输入你的姓名连接到tom.jsp
<FORM action="tom.jsp"method=post name=form>
<INPUT type="text"name="boy">
<INPUT TYPE="submit"value="送出" name=submit>
</FORM>
</BODY>
</HTML>
//文件二:tom.jsp
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<P>我是Tom页面
<% String s=session.getId();
%>
<P>您的在Tom页面中的session对象的ID是:
<%=s%>
<P>点击超链接,连接到Jerry的页面。
<AHREF="jerry.jsp">
<BR> 欢迎到Jerry屋来!
</A>
</BODY>
</HTML>
//文件三:jerry.jsp
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<P>我是Jerry页面
<% String s=session.getId();
%>
<P>您在Jerry页面中的session对象的ID是:
<%=s%>
<P>点击超链接,连接到session的页面。
<AHREF="session.jsp">
<BR> 欢迎到session屋来!
</A>
</BODY>
</HTML>
//session.setAttribute(),session.getAttribute()示例
文件一:
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><FONT Size=1>
<%session.setAttribute("customer","顾客");
//可以理解为customer="顾客",但此变量可以在整个会话中访问;
%>
<P>输入你的姓名连接到第一百货:first.jsp
<FORM action="first.jsp"method=post name=form>
<INPUT type="text"name="boy">
<INPUT TYPE="submit"value="送出" name=submit>
</FORM>
<FONT>
</BODY>
</HTML>
文件二://first.jsp
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><FONT Size=1>
<% Strings=request.getParameter("boy");
session.setAttribute("name",s);
%>
<P>这里是第一百货
<P>输入你想购买的商品连接到结帐:account.jsp
<FORM action="account.jsp"method=post name=form>
<INPUT type="text"name="buy">
<INPUT TYPE="submit"value="送出" name=submit>
</FORM>
</FONT>
</BODY>
</HTML>
文件三://account.jsp
<%@page contentType="text/html;charset=GB2312" %>
<%!//处理字符串的方法:
publicString getString(String s)
{ if(s==null)
{s="";
}
try {byteb[]=s.getBytes("ISO-8859-1");
s=new String(b);
}
catch(Exception e)
{
}
return s;
}
%>
<HTML>
<BODYbgcolor=cyan><FONT Size=1>
<% String s=request.getParameter("buy");
session.setAttribute("goods",s);
%>
<BR>
<%String 顾客=(String)session.getAttribute("customer");
String 姓名=(String)session.getAttribute("name");
String 商品=(String)session.getAttribute("goods");
姓名=getString(姓名);
商品=getString(商品);
%>
<P>这里是结帐处
<P><%=顾客%>的姓名是:
<%=姓名%>
<P>您选择购买的商品是:
<%=商品%>
</FONT>
</BODY>
</HTML>
实例:session.setAttribute()与session.getAttribute()的再举例:
//猜数游戏:系统自动产生一个随机数,能判断你猜大了或者猜小了;猜对了可以告知你用的时间,猜的次数,以及所猜的数;
//要点:通过session保存随机数以及猜的次数
文件一:
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><FONT Size=1>
<P>随机分给了你一个1到100之间的数,请猜!
<%
int number=(int)(Math.random()*100)+1;
session.setAttribute("count",newInteger(0));
//count变量保存是猜的次数
session.setAttribute("save",newInteger(number));
//save变量保存产生的随机数
%>
<BR>
<P>输入你的所猜的数
<FORM action="result.jsp"method="post" name=form>
<INPUT type="text"name="boy" >
<INPUT TYPE="submit"value="送出"name="submit">
</FORM>
</FONT>
</BODY>
</HTML>
文件二://result.jsp
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><FONT Size=1>
<BR>
<%String str=request.getParameter("boy");
if(str==null)
{str="0";
}
int guessNumber=Integer.parseInt(str);
//guessNumber中保存了上一页面中表单中文本框中的提交值
Integer integer=(Integer)session.getAttribute("save");
int realnumber=integer.intValue();
//realnumber保存的是上一页面中产生的随机数
//将文本框提交的值与产生的随机数比较,分为三种情况:相同,大于,小于
//三种情况分别跳转到不同的页面,进一步处理
if(guessNumber==realnumber)
{int n=((Integer)session.getAttribute("count")).intValue();
n=n+1;
session.setAttribute("count",newInteger(n));
response.sendRedirect("success.jsp");
}
else if(guessNumber>realnumber)
{int n=((Integer)session.getAttribute("count")).intValue();
n=n+1;
session.setAttribute("count",newInteger(n));
response.sendRedirect("large.jsp");
}
elseif(guessNumber<realnumber)
{int n=((Integer)session.getAttribute("count")).intValue();
n=n+1;
session.setAttribute("count",newInteger(n));
response.sendRedirect("small.jsp");
}
%>
</FONT>
</BODY>
</HTML>
文件三://large.jsp
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><FONT Size=1>
<BR>
<P>所猜的数比实际的数大,请再猜:
<FORM action="result.jsp"method="get" name=form >
<INPUT type="text"name="boy" >
<INPUT TYPE="submit"value="送出"name="submit">
</FORM>
</FONT>
</BODY>
</HTML>
文件四://small.jsp
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><FONT Size=1>
<BR>
<P>所猜的数比实际的数小,请再猜:
<FORM action="result.jsp"method="post" name=form>
<INPUT type="text"name="boy" >
<INPUT TYPE="submit"value="送出"name="submit">
</FORM>
</FONT>
</BODY>
</HTML>
文件五://success.jsp
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><FONT Size=1>
<% intcount=((Integer)session.getAttribute("count")).intValue();
intnum=((Integer)session.getAttribute("save")).intValue();
long startTime=session.getCreationTime();
long endTime=session.getLastAccessedTime();
%>
<P>恭喜你,猜对了
<BR>
<P>您共猜了<%=count%>次
<P>用时<%=(endTime-startTime)/1000%>秒。
<P>这个随机数字就是<%=num%>
<P>您必须关掉浏览器才能获得新的数。
</FONT>
</BODY>
</HTML>
作业: //输入帐号并选择用户类型,若用户不是jacky,则停留在登录页面;否则的话,根据用户的不同类型显示不同的链接
//要求是三个页面:login.htm,check.jsp,success.jsp;success.jsp中显示欢迎jacky(来自session)。
application内置对象:
含义与作用:它代表着整个服务器中的所有用户;生命周期为服务器开启后到服务器关闭;
常用方法:
getAttribute(Stringname):返回由name指定的application属性值;
getAttriubteNames():返回所有application对象的属性名字;结果是一个枚举类型;
getInitParameter(Stringname):返回由name指定的application某个属性的初始值;
getServletInfo():返回当前版本的信息;
setAttribute(Stringname,Object object):设置name名字的application属性值为object;
实例:计算某用户是第多少个访问者
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<%!
synchronized void countPeople()
{ServletContext application=getServletContext();
//有的容器可能不支持直接使用application对象,可以使用getServletContext()方法初始化;
Integernumber=(Integer)application.getAttribute("Count");
//变量Count的生命周期为application
//服务器打开后第一个人第一次访问此页时,此时为null
if(number==null)
{ number=new Integer(1);
application.setAttribute("Count",number);
//若为null,则设置值为1
}
else
{ number=new Integer(number.intValue()+1);
//在原值的基础上加1后再存回去
application.setAttribute("Count",number);
}
}
%>
<%if(session.isNew())
{ countPeople();
IntegermyNumber=(Integer)application.getAttribute("Count");
session.setAttribute("MyCount",myNumber);
//将访问量存在session中,以使某特定用户可以在整个会话中获取自己是第多少个用户;
}
%>
<P><P>您是第
<%int a=((Integer)session.getAttribute("MyCount")).intValue();
%>
<%=a%>
个访问本站的客户。
</BODY>
</HTML>
JDBC:java DataBase Connectivity,利用它可以对数据库中的数据进行操作,比如:select,update,delete,insert等;
JDBC主要完成的三件事:
1。与数据库进行链接;
2。向数据库发送SQL语句;
3。处理数据库返回的结果;
数据库的驱动程序类型:
1。jdbc-odbc桥
2。部分java,部分本机驱动程序;
3。中间数据访问服务器;
4。纯java驱动程序
四者的区别,自行网上查找
两个相关的包:
1。java.sql:提供对数据访问的基本服务,如:链接,执行更新,事务处理等;
2。javax.sql:提供了数据访问的高级功能;比如:分布式事务等;
JDBC-ODBC数据处理的主要流程:
1。建立数据源;包括数据库的建立,以及ODBC的设置;
2。建立一个JDBC-ODBC桥接器,即加载桥接器驱动程序:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
说明:Class是java.lang中的一个类,它的静态方法forName()可以建立一个桥接器;建立桥接器有可能产生异常,
所以,标准写法为:
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundExceptione)
{}
3。连接到数据库:
Connectioncon=DriverManager.getConnection("jdbc:odbc:数据源名字","用户名","密码");
说明: 第一:要访问数据库,必须建立连接;
第二:Connection类是java.sql中的,用它建立一个连接对象;使用DriverManager的getConnection()静态方法
来实例化对象;
第三:若无用户名和密码,则相应处设为"","";通常Access没有帐号,其它数据库则有帐号;
第四:数据源名字来自于步骤1。中的设置;
如:连接到SQL server 中的pubs数据库,假设步骤1.中设置了数据源名叫myPubs
try{
Connectioncon=DriverManager.getConnection("jdbc:odbc:myPubs","sa","");
}
catch(SQLExceptione)
{}
4。建立SQL语句对象:
try{
Statementsql=con.createStatement();
}
说明:前面语句是创建了一个SQL语句对象;
5。返回查询结果集对象:
ResultSetrs=sql.executeQuery("select * from 表名");
说明:executeQuery有可能换成其它的方法;结果保存在一个ResultSet(结果集)对象中;
6。获取ResultSet中的数据:
相关方法有:next();getByte();getDouble();getDate();getFloat();getLong();getInt();getString()等;
7。关闭连接对象:
con.close();
实例:将student表中的所有记录以表格形式输出
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<!--首选必须导入此包-->
<HTML>
<BODY>
<%
//使用数据库的几个步骤
//首先:建立数据链接.
//实例化statement对象,con.createStatement()
//实例化ResultSet对象,sql.executeQuery("select *from ....")
%>
<% Connection con;
Statementsql;
ResultSetrs;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundExceptione){System.out.println(e);}
try{ con=DriverManager.getConnection("jdbc:odbc:sun2","","");
//第三,四个参数为帐号和密码.
sql=con.createStatement();///**************
rs=sql.executeQuery("SELECT * FROMstudents");
out.print("<Table Border>"); //输出表格
out.print("<TR>"); //以下八行输出表头
out.print("<THwidth=100>学号</TH>");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("<Thwidth=50>"+"出生日期");
out.print("</TR>");
while(rs.next()) //循环输出表中所有符合条件的记录
{ out.print("<TR>");
out.print("<TD>"+rs.getString(2)+"</TD>");
out.print("<TD>"+rs.getString(3)+"</TD>");
out.print("<TD>"+rs.getInt("数学成绩")+"</TD>");//getXXX()的参数是表中的字段名或者字段索引位置
out.print("<TD>"+rs.getInt("英语成绩")+"</TD>");
out.print("<TD>"+rs.getInt("物理成绩")+"</TD>");
out.print("<TD>"+rs.getDate("出生日期")+"</TD>");
out.print("</TR>");
}
out.print("</Table>");
con.close();
}
catch(SQLException e1){System.out.println(e1);}
%>
</BODY>
</HTML>
JDBC常见的API:
有:DriverManager,Connection,Statement,PreparedStatement,CallableStatement,ResultSet接口或者类。
DriverManager:
作用:常用于管理JDBC驱动程序;通过getConnection()方法来取得Connection对象的引用。
常见方法:
publicstatic synchronized Connection getConnection(String url,String user,Stringpassword)throws SQLException
//上面方法获得url对应的数据库的一个链接
publicstatic void setLoginTimeout(int seconds)
//上面方法设置登录时驱动程序等待的时间
Connection:
作用:通过DriverManager.getConnection()取得的;利用它可以创建Statement,PreparedStatement,CallableStatement等对象;
常见方法:
StatementcreateStatement()throws SQLException
//上面方法返回一个Statement对象
PreparedStatementpreparedStatement(String sql)throws SQLException
//上面方法返回一个PrepareStatement对象,并能把SQL语句提交到数据库进行预编译;
CallableStatementprepareCall(String sql)
//上面方法返回一个CallableStatement对象,该对象能够处理存储过程;
voidsetAutoCommit(Boolean autoCommit)throws SQLException
//上面方法设置事务的提交模式
voidcommit()throws SQLException
//上面方法进行当前业务开始以来所有改变;
voidrollback()throws SQLException
//上面方法放弃当前业务开始以前的所有改变;
Statement:
作用:向数据库提交SQL语句并返回相应结果;语句可以是SQL的查询,修改,插入等;
常见方法:
ResultSetexecuteQuery(String sql)throws SQLException
//上面方法执行一个查询语句将结果返回在ResultSet对象中;
intexecuteUpdate(String sql)throws SQlException
//上面方法执行一个修改或插入和删除的语句,并返回发生改变的记录数;
Booleanexecute(String sql)thows SQLException
//上面方法执行一个修改或插入和删除语句,返回的布尔值表示语句是否执行成功;
PreparedStatement:
作用:此接口继承了Statement接口;因为可以传递参数,所以常用于那些稍加变化就可以反复执行的SQL语句;
常见方法:
setString(索引,值)
setDouble(索引,值)
......
executeUpdate()执行上面的设定,更新记录
此对对象的创建是通过Connection对象的prepareStatement方法实现的,可以参见如下形式:
PreparedStatementpstmt=conn.prepareStatement("insert into stock values(?,?)");
pstmt.setString(1,"china");
pstmt.setDouble(2,33d);
pstmt.executeUpdate();
CallableStatement:
作用:继承PreparedStatement接口;可以执行存储过程;
常见方法:
同上
此对象的执行大致如下:
1.设有一个存储过程如下:
createprocedure MyProc @para1 varchar(20),@para2 int,@para3 datetime
asinsert into contact(userName,mobile,lastcontact)
values(@para1,@para2,@para3)
2.调用:
CallableStatementstmt=conn.prepareCall("{call MyProc(?,?,?)}");
stmt.setString(1,"XiaoMing");
stmt.setInt(2,123456);
stmt.setDate(3,newjava.sql.Date(new java.util.Date().getTime()));
stmt.executeUpdate();
3.说明:CallableStatement的创建是conn.prepareCall("call存储过程名(N个?号)");?号个数为存储过程的参数个数;
这些问号需要使用CallableStatement对象的setXXX()方法传递参数;最后调用executeUpdate()方法,实现更新记录;
ResultSet:
作用:包含了Statement对象产生的结果集;利用它可以访问相应的数据;
常见方法:
getXXXX();setXXX()见上课;
voidclose()throws SQLException
//上面方法释放ResultSet对象资源程
Booleanabsolute(int row)throws SQLException
//将结果集移动到指定的行;若取值为负数,则移动到倒数第N行。
ResultSetMetaDatagetMetaData()throws SQLEXception
//返回包含当前结果集说明的对象;这些说明有列号,列类型等属性;
publicboolean previous()
//将游标向上移动;当移到第一行之前时,返回false.
publicvoid beforeFirst()
//游标移动到结果集的初始位置,即第一行之前;
publicvoid afterLast()
//将游标移动结果集最后一行之后;
publicvoid first()
//将游标移到结果集的第一行
publicvoid last()
//将游标移到结果集的最后一行
publicboolean isAfterLast()
//判断游标是否在最后一行之后
publicboolean isBeforeFirst()
//判断游标是否在第一行之前
publicboolean isFirst()
//判断游标是否在第一行
publicboolean isLast()
//判断游标是否在最后一行
publicint getRow()
//取得当前游标所在的行号;若结果集没有行,则返回0.
游动查询:
说明:我们上节课学习的next()方法,只能顺序的查询;若要游动查询,则需使用下面方法:
StatementcreateStatement(int resultSetType, int resultSetConcurrency)
resultSetType取值为:
1.TYPE_FORWARD_ONLY
游标只能向下游动
2.TYPE_SCROLL_INSENSITIVE
游标可以上下游动,当数据库变化时,当前结果集不变。
3.TYPE_SCROLL_SENSITIVE
游标可以上下游动,当数据库变化时,当前结果集同步改变。
resultSetConcurrency)取值为:
1。CONCUR_READ_ONLY
不能用结果集更新数据库中的表
2。CONCUR_UPDATABLE
能用结果集更新数据库中的表
实例:游动查询
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODY>
<%
//使用rs对象的next()方法,只能顺序的移动.
//有时,需要前后移动;或显示指定的一条记录.
//则,需要一个可滚动的结果集.
//Statementsql=con.createStatement(int type,int concurrency)
//type:
//ResultSet.TYPE_FORWORD_ONLY只能向下游动
//ResultSet.TYPE_SCROLL_INSENSITIVE可以上下游动,但是数据库变化时,当前结果不变。
//ResultSet.TYPE_SCROLL_SENSITIVE可以上下游动,当数据库变化时,当前结果变化。
//concurrency
//ResultSet.CONCUR_READ_ONLY不能用于更新.
//ResultSet.CONCUR_UPDATETABLE可以用于更新.
%>
<% String name,number;
intmath,physics,english;
Connectioncon;
Statementsql;
ResultSetrs;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundExceptione){}
try{con=DriverManager.getConnection("jdbc:odbc:sun","","");
sql=
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
//返回可滚动的结果集:
rs=sql.executeQuery("SELECT * FROMstudents");
//将游标移动到最后一行:
rs.last();
//获取最后一行的行号:
int lownumber=rs.getRow();
out.print("该表共有"+lownumber+"条记录");
out.print("<BR>现在逆序输出记录:");
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
//为了逆序输出记录,需将游标移动到最后一行之后:
rs.afterLast();//还有beforeFirst()
while(rs.previous())//游标前移.还有first();last();
{out.print("<TR>");
number=rs.getString("学号");
out.print("<TD>"+number+"</TD>");
name=rs.getString("姓名");
out.print("<TD>"+name+"</TD>");
math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
english=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
physics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
out.print("</TR>") ;
}
out.print("</Table>");
out.print("单独输出第4条记录<BR>");
rs.absolute(4);
number=rs.getString(1);
out.print(number+",");
name=rs.getString(2);
out.print(name+",");
math=rs.getInt("数学成绩");
out.print(math+",");
english=rs.getInt("英语成绩");
out.print(english+",");
physics=rs.getInt("物理成绩");
out.print(physics+"。");
con.close();
}
catch(SQLException e1) {}
%>
</BODY>
</HTML>
实例:随机查询
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODY>
<% String xuehao,name;
intmath;
Connectioncon;
Statementsql;
ResultSetrs;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundExceptione){}
try{ con=DriverManager.getConnection("jdbc:odbc:sun","sa","");
sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
//返回可滚动的结果集:
rs=sql.executeQuery("SELECT * FROMstudents");
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("</TR>");
//将游标移动到最后一行:
rs.last();
//获取最后一行的行号:
int lownumber=rs.getRow();
//获取记录数:
intnumber=lownumber;
doublesum=0;
int抽取数目=3;
intold_i[]={0,0,0,0};
intk=抽取数目;
intj=0;
while(抽取数目>0)
{inti=(int)(Math.random()*number+1);//随机获取一个1到number之间的数。
boolean boo=false;
for(int m=0;m<old_i.length;m++) //查找该行是否已被取出。
{if(i==old_i[m])
boo=true;
}
if(boo) continue; //假如该行已被取出,结束本次循环,继续产生随机数。
rs.absolute(i); //游标移到这一行。
out.print("<TR>");
xuehao=rs.getString("学号"); //获取该行学号字段的值。
out.print("<TD>"+xuehao+"</TD>");
name=rs.getString("姓名"); //获取该行姓名字段的值。
out.print("<TD>"+name+"</TD>");
math=rs.getInt("数学成绩"); //获取改行数学成绩字段的值。
out.print("<TD>"+math+"</TD>");
out.print("</TR>") ;
sum=sum+math;
抽取数目--;
old_i[j]=i; //记录已取出的行号。
j++;
}
out.print("</Table>");
out.print("平均成绩是:"+sum/k);
con.close();
}
catch(SQLException e1) {}
%>
</BODY>
</HTML>
参数查询:
说明:即根据表单中用户的输入进行查询
实例一://要点:SQL语句中where语句的用法
文件一:提供两个表单,可以按姓名查询,也可以按分数查询
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<Fontsize=1>
<FORMaction="byname.jsp" Method="post">
<P>成绩查询
<P>输入姓名:
<Input type=text name="name">
<Input type=submit name="g"value="提交">
</Form>
<FORMaction="byscore.jsp" Method="post" >
<P>根据分数查询名单:<BR> 英语分数在
<Inputtype=text name="englishmin" value=0>
和
<Input type=textname="englishmax" value=100>
之间
<BR> 数学分数在
<Inputtype=text name="mathmin" value=0>
和
<Input type=text name="mathmax"value=100>
之间
<BR> <Input type=submit value="提交">
</Form>
</BODY>
</HTML>
文件二://byname.jsp要点: "SELECT * FROM studentsWHERE 姓名 = "+"'"+name+"'";name是文本框提交的值;
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODY>
<% //获取提交的姓名:
Stringname=request.getParameter("name");
if(name==null)
{name="";
}
byteb[]=name.getBytes("ISO-8859-1");
name=new String(b);
Connectioncon=null;
Statementsql=null;
ResultSetrs=null;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){}
try { con=DriverManager.getConnection("jdbc:odbc:sun","sa","");
sql=con.createStatement();
String condition="SELECT * FROM studentsWHERE 姓名 = "+"'"+name+"'";
rs=sql.executeQuery(condition);
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next())
{ out.print("<TR>");
out.print("<TD>"+rs.getString("学号")+"</TD>");
out.print("<TD>"+rs.getString("姓名")+"</TD>");
out.print("<TD>"+rs.getInt("数学成绩")+"</TD>");
out.print("<TD>"+rs.getInt("英语成绩")+"</TD>");
out.print("<TD>"+rs.getInt("物理成绩")+"</TD>");
out.print("</TR>") ;
}
out.print("</Table>");
con.close();
}
catch(SQLExceptione)
{ }
%>
</BODY>
</HTML>
文件三://byscore.jsp;要点:select * from 表名 where 英语成绩>22 and 英语成绩<33 and 数学成绩>22 and 数学成绩<100
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODY>
<% //获取提交的分数的最大值和最小值:
Stringenglishmax=request.getParameter("englishmax");
if(englishmax==null)
{englishmax="100";
}
Stringenglishmin=request.getParameter("englishmin");
if(englishmin==null)
{englishmin="0";
}
Stringmathmax=request.getParameter("mathmax");
if(mathmax==null)
{mathmax="100";
}
Stringmathmin=request.getParameter("mathmin");
if(mathmin==null)
{mathmin="0";
}
Connectioncon=null;
Statementsql=null;
ResultSetrs=null;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){}
try
{ con=DriverManager.getConnection("jdbc:odbc:sun","sa","");
sql=con.createStatement();
String eCondition="英语成绩 <= "+englishmax+" AND "+"英语成绩 >= "+englishmin;
String mCondition="数学成绩 <= "+mathmax+" AND "+"数学成绩 >= "+mathmin;
String condition="SELECT * FROMstudents WHERE "+mCondition+" and "+eCondition;
rs=sql.executeQuery(condition);
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next())
{ out.print("<TR>");
out.print("<TD>"+rs.getString("学号")+"</TD>");
out.print("<TD>"+rs.getString("姓名")+"</TD>");
out.print("<TD>"+rs.getInt("数学成绩")+"</TD>");
out.print("<TD>"+rs.getInt("英语成绩")+"</TD>");
out.print("<TD>"+rs.getInt("物理成绩")+"</TD>");
out.print("</TR>") ;
}
out.print("</Table>");
con.close();
}
catch(SQLException e)
{}
%>
</BODY>
</HTML>
实例二://要点:SQL语句中的order by语句
文件一://要点:提供表单三个单选按钮
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<P>查询成绩:
<Fontsize=1>
<FORMaction="byname1.jsp" method=post name=form>
<INPUT type="radio"name="R" value="姓名">按姓氏排序
<INPUT type="radio"name="R" value="数学成绩+英语成绩+物理成绩">按总分排序
<INPUT type="radio"name="R" value="英语成绩">按英语排序
<BR> <Input type=submit name="g"value="提交">
</Form>
</BODY>
</HTML>
文件二://要点:select * from 表名 order by 姓名
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODY>
<% //获取提交的排序方式:
Stringname=request.getParameter("R");
if(name==null)
{name="";}
byteb[]=name.getBytes("ISO-8859-1");
name=new String(b);
Stringnumber,xingming;
Connectioncon=null;
Statementsql=null;
ResultSetrs=null;
intmath,english,physics;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){}
try {con=DriverManager.getConnection("jdbc:odbc:sun","","");
sql=con.createStatement();
String condition="SELECT * FROM studentsORDER BY "+name;
rs=sql.executeQuery(condition);
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("<THwidth=50>"+"总成绩");
out.print("</TR>");
while(rs.next())
{ out.print("<TR>");
number=rs.getString("学号");
out.print("<TD>"+number+"</TD>");
xingming=rs.getString("姓名");
out.print("<TD>"+xingming+"</TD>");
math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
english=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
physics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
int total=math+english+physics;
out.print("<TH>"+total+"</TH>");
out.print("</TR>") ;
}
out.print("</Table>");
con.close();
}
catch(SQLExceptione)
{ }
%>
</BODY>
</HTML>
实例三://要点:通配符的使用
文件一://表单,提供一个文本框,将查询此文本框中输入的姓
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<P>查询成绩:
<Fontsize=1>
<P>输入学生的姓氏:
<BR><FORM action="byname2.jsp" method=post name=form>
<INPUT type="text"name="name" value="王">
<BR> <Input type=submit name="g"value="提交">
</Form>
</BODY>
</HTML>
文件二://要点select * from 表名where 姓名 like '毕%'
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODY>
<% //获取提交的姓氏:
Stringname=request.getParameter("name");
if(name==null)
{name="";
}
byteb[]=name.getBytes("ISO-8859-1");
name=new String(b);
Connectioncon=null;
Statementsql=null;
ResultSetrs=null;
intmath,english,physics;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){}
try{con=DriverManager.getConnection("jdbc:odbc:sun","sa","");
sql=con.createStatement();
String condition="SELECT * FROMstudents where 姓名 like'"+name+"n'" ;
rs=sql.executeQuery(condition);
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next())
{
out.print("<TR>");
out.print("<TD>"+rs.getString("学号")+"</TD>");
out.print("<TD>"+rs.getString("姓名")+"</TD>");
math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
english=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
physics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
out.print("</TR>") ;
}
out.print("</Table>");
con.close();
}
catch(SQLExceptione)
{ }
%>
</BODY>
</HTML>
将上面文件改成下面文件,一样通过,请自行分析:
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODY>
<% //获取提交的姓氏:
Stringname=request.getParameter("name");
if(name==null)
{name="";
}
byteb[]=name.getBytes("ISO-8859-1");
name=new String(b);
Stringnumber,xingming;
Connectioncon=null;
Statementsql=null;
ResultSetrs=null;
intmath,english,physics;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){}
try{con=DriverManager.getConnection("jdbc:odbc:sun","sa","");
sql=con.createStatement();
String condition="SELECT * FROMstudents" ;
rs=sql.executeQuery(condition);
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next()) //要点:循环每一条记录,符合条件者输出
{ number=rs.getString(2);
xingming=rs.getString(3);
if(xingming.startsWith(name)) //核心处
{ out.print("<TR>");
out.print("<TD >"+number+"</TD>");
out.print("<TD>"+xingming+"</TD>");
math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
english=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
physics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
out.print("</TR>") ;
}
}
out.print("</Table>");
con.close();
}
catch(SQLExceptione)
{ }
%>
</BODY>
</HTML>
小结:通过以上几个例子,说明,只要是标准的SQL语句中的select语句,就可以使用在rs.executeQuery()方法中.
所以,你想要实现什么样的功能,只要了解相应的select语句用法就可以;比如:top n;between and 等;
关于更新记录,插入记录及删除记录:
注意:需要使用Statement对象的executeUpdate()方法;而不是executeQuery()方法;后者用于执行select语句;
实例一://修改
文件一://表单,显示原始数据
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODYbgcolor=pink >
<FORMaction="newResult.jsp" method=post>
输入要修改成绩的同学的姓名:<BR>
<Inputtype="text" name="name">
<BR>输入新的数学成绩:
<Inputtype="text" name="math">
<BR>输入新的英语成绩:
<Inputtype="text" name="english">
<BR>输入新的物理成绩:
<Inputtype="text" name="physics">
<BR><Inputtype="submit" name="b" value="提交更新">
<P>数据库更新前的数据记录是:
<% String name,number;
intmath,physics,english;
Connectioncon;
Statementsql;
ResultSetrs;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundExceptione){}
try{con=DriverManager.getConnection("jdbc:odbc:sun","sa","");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROMstudents");
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next())
{ out.print("<TR>");
number=rs.getString("学号");
out.print("<TD>"+number+"</TD>");
name=rs.getString("姓名");
out.print("<TD>"+name+"</TD>");
math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
english=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
physics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
out.print("</TR>");
}
out.print("</Table>");
con.close();
}
catch(SQLException e1) {}
%>
</Form>
</BODY>
</HTML>
文件二://newResult.jsp
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODYbgcolor=pink ><Font size=1>
<% //获取提交的姓名:
Stringname=request.getParameter("name");
if(name==null)
{name="";
}
byte b[]=name.getBytes("ISO-8859-1");
name=new String(b);
System.out.println(name);
//获取提交的新的数学成绩:
StringnewMath=request.getParameter("math");
if(newMath==null || newMath=="")
{newMath="10";
System.out.println("newmath is null");
}
System.out.println(newMath);
//获取提交的新的英语成绩:
StringnewEnglish=request.getParameter("english");
if(newEnglish==null)
{newEnglish="10";
}
System.out.println(newEnglish);
//获取提交的新的物理成绩:
StringnewPhysics=request.getParameter("physics");
if(newPhysics==null)
{newPhysics="10";
}
Connectioncon=null;
Statementsql=null;
ResultSetrs=null;
Stringnumber,xingming;
intmath,english,physics;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){}
try{con=DriverManager.getConnection("jdbc:odbc:sun","","");
sql=con.createStatement();
String condition1="UPDATE students SET 数学成绩 = "+newMath+" WHERE 姓名="+"'"+name+"'";
String condition2="UPDATE students SET 英语成绩 = "+newEnglish+" WHERE 姓名="+"'"+name+"'";
String condition3= "UPDATE students SET物理成绩 = "+newPhysics+" WHERE 姓名="+"'"+name+"'" ;
//执行更新操作:
sql.executeUpdate(condition1);
sql.executeUpdate(condition2);
sql.executeUpdate(condition3);
//显示更新后的表中的记录:
%>
<P>更新后的表的记录:
<%
rs=sql.executeQuery("SELECT * FROMstudents");
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next())
{
out.print("<TR>");
number=rs.getString("学号");
out.print("<TD>"+number+"</TD>");
xingming=rs.getString("姓名");
out.print("<TD>"+xingming+"</TD>");
math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
english=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
physics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
out.print("</TR>");
}
out.print("</Table>");
con.close();
}
catch(SQLExceptione)
{ }
%>
</FONT>
</BODY>
</HTML>
实例二://插入记录
文件一:
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODYbgcolor=pink >
<P>添加新的记录到数据库:
<FORMaction="newDatabase.jsp" method=post>
同学学号:
<Inputtype="text" name="number">
<BR>同学姓名:
<Inputtype="text" name="name">
<BR>数学成绩:
<Inputtype="text" name="math">
<BR>英语成绩:
<Inputtype="text" name="english">
<BR>物理成绩:
<Inputtype="text" name="physics">
<BR><Inputtype="submit" name="b" value="提交添加">
<P>数据库添加记录前的数据记录是:
<% String name,number;
intmath,physics,english;
Connectioncon;
Statementsql;
ResultSetrs;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundExceptione){}
try{ con=DriverManager.getConnection("jdbc:odbc:sun","","");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROMstudents");
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next())
{ out.print("<TR>");
number=rs.getString("学号");
out.print("<TD>"+number+"</TD>");
name=rs.getString("姓名");
out.print("<TD>"+name+"</TD>");
math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
english=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
physics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
out.print("</TR>");
}
out.print("</Table>");
con.close();
}
catch(SQLException e1) {}
%>
</Form>
</BODY>
</HTML>
//文件二:newDatabase.jsp
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODYbgcolor=pink ><Font size=1>
<% //获取提交的学号:
Stringnumber=request.getParameter("number");
if(number==null)
{number="";
}
byteb[]=number.getBytes("ISO-8859-1");
number=new String(b);
//获取提交的姓名:
Stringname=request.getParameter("name");
if(name==null)
{name="";
}
bytec[]=name.getBytes("ISO-8859-1");
name=new String(c);
//获取提交的新的数学成绩:
Stringm=request.getParameter("math");
if(m==null)
{m="-100";}
//获取提交的新的英语成绩:
Stringe=request.getParameter("english");
if(e==null)
{e="-100";}
//获取提交的新的物理成绩:
Stringp=request.getParameter("physics");
if(p==null)
{p="-100";}
Connectioncon=null;
Statementsql=null;
ResultSetrs=null;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}
catch(ClassNotFoundException event){}
try{con=DriverManager.getConnection("jdbc:odbc:sun","","");
sql=con.createStatement();
String condition="INSERT INTO students(学号,姓名,数学成绩,英语成绩,物理成绩)VALUES"+"("+"'"+number+"','"+name+"',"+m+","+e+","+p+")";
// inser studentvalues('s232323','ss',7p,aa,44)
sql.executeUpdate(condition); //执行添加操作:
//显示添加新记录后表中的记录:
%>
<P>添加新记录后的表:
<%
rs=sql.executeQuery("SELECT * FROMstudents ORDER BY 学号 ");
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next())
{ out.print("<TR>");
Stringn=rs.getString("学号");
out.print("<TD>"+n+"</TD>");
Stringxingming=rs.getString("姓名");
out.print("<TD>"+xingming+"</TD>");
int math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
intenglish=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
intphysics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
out.print("</TR>");
}
out.print("</Table>");
con.close();
}
catch(SQLExceptionevent)
{ }
%>
</FONT>
</BODY>
</HTML>
实例三://删除记录
文件一:
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODYbgcolor=pink >
<Fontsize=1>
<P>删除记录:
<FORMaction="delete.jsp" method=post>
输入被删除记录的学号:
<Inputtype="text" name="number">
<BR>
<BR><Inputtype="submit" name="b" value="提交删除">
</FORM>
<P>数据库删除前的数据记录是:
<% String name,number;
intmath,physics,english;
Connectioncon;
Statementsql;
ResultSetrs;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundExceptione){}
try{con=DriverManager.getConnection("jdbc:odbc:sun","","");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROMstudents");
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next())
{ out.print("<TR>");
number=rs.getString(2);
out.print("<TD>"+number+"</TD>");
name=rs.getString(3);
out.print("<TD>"+name+"</TD>");
math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
english=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
physics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
out.print("</TR>");
}
out.print("</Table>");
con.close();
}
catch(SQLException e1) {}
%>
</Font>
</BODY>
</HTML>
文件二://delete.jsp
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODYbgcolor=pink ><Font size=1>
<% //获取提交的学号:
Stringnumber=request.getParameter("number");
if(number==null)
{number="";
}
byteb[]=number.getBytes("ISO-8859-1");
number=new String(b);
Connectioncon=null;
Statementsql=null;
ResultSetrs=null;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException event){}
try{con=DriverManager.getConnection("jdbc:odbc:sun","","");
sql=con.createStatement();
//删除操作:
String deleteAll="DELETE FROM students WHERE 学号"+" = "+"'"+number+"'";
sql.executeUpdate(deleteAll);
%>
<P>删除记录后的表:
<%
rs=sql.executeQuery("SELECT * FROMstudents ORDER BY 学号 ");
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
while(rs.next())
{ out.print("<TR>");
Stringn=rs.getString(2);
out.print("<TD>"+n+"</TD>");
Stringxingming=rs.getString(3);
out.print("<TD>"+xingming+"</TD>");
int math=rs.getInt("数学成绩");
out.print("<TD>"+math+"</TD>");
intenglish=rs.getInt("英语成绩");
out.print("<TD>"+english+"</TD>");
intphysics=rs.getInt("物理成绩");
out.print("<TD>"+physics+"</TD>");
out.print("</TR>");
}
out.print("</Table>");
con.close();
}
catch(SQLExceptionevent)
{out.print(""+event);
}
%>
</FONT>
</BODY>
</HTML>
分页显示记录:
假设总记录数为m,每页显示数量是n,那么总页数的公式为:
情况一:如果m除以n的余数不为零,总页数等于m除以n的商加1。
情况二:如果m除以n的除数为零,总页数等于m除以n的商。
所以:
总页数=(m%n)==0?(m/n):(m/n+1)
第p页的记录在结果集中的游标位置:
(p-1)*n+1
说明:因为第p页前有p-1个完整页,而每页显示n条,所以。。。。
实例:
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="java.sql.*" %>
<HTML>
<BODY>
<%! int pageSize=2; //每页显示的记录数。
int pageCount=0; //分页后的总页数。
%>
<%--客户通过表单提交欲要显示的页码数--%>
<FORMaction="" method=get >
输入页码数<Input Type=textname=showPage size=4 >
<Input Type=submit name=g value=提交>
</FORM>
<% Connection con;
Statementsql;
ResultSetrs;
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundExceptione){}
try{con=DriverManager.getConnection("jdbc:odbc:sun","","");
sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
//返回可滚动的结果集:
rs=sql.executeQuery("SELECT * FROMstudents");
//将游标移动到最后一行:
rs.last();
//获取最后一行的行号:
int lastRow=rs.getRow();
//计算分页后的总页数:
pageCount=(lastRow%pageSize==0)?(lastRow/pageSize):(lastRow/pageSize+1);
//当前显示的初始页数:
intshowPage=1;
//告知客户总页数:
%>
<P>共有<%=pageCount%>页
<BR>每页显示<%=pageSize%>条记录.
<% //获取客户想要显示的页数:
Stringinteger=request.getParameter("showPage");
if(integer==null)
{ integer="1";
}
try {showPage=Integer.parseInt(integer);
}
catch(NumberFormatException e)
{showPage=1;
}
if(showPage<=1)
{showPage=1;
}
if(showPage>=pageCount)
{showPage=pageCount;
}
%>
<BR>目前显示第<%=showPage%>页
<%//如果要显示第showPage页,那么游标应移到posion的值是:
int posion=(showPage-1)*pageSize+1;
rs.absolute(posion); // 设置游标的位置
out.print("<Table Border>");
out.print("<TR>");
out.print("<THwidth=100>"+"学号");
out.print("<THwidth=100>"+"姓名");
out.print("<THwidth=50>"+"数学成绩");
out.print("<THwidth=50>"+"英语成绩");
out.print("<THwidth=50>"+"物理成绩");
out.print("</TR>");
for (int i=1;i<=pageSize;i++)
{out.print("<TR>");
out.print("<TD>"+rs.getString("学号")+"</TD>");
out.print("<TD>"+rs.getString("姓名")+"</TD>");
out.print("<TD>"+rs.getInt("数学成绩")+"</TD>");
out.print("<TD>"+rs.getInt("英语成绩")+"</TD>");
out.print("<TD>"+rs.getInt("物理成绩")+"</TD>");
out.print("</TR>") ;
rs.next();
}
out.print("</Table>");
con.close();
}
catch(SQLException e1) {}
%>
</BODY>
</HTML>
课后作业:在上例基础上添加上一页,下一页,第一页,最后一页的链接;但第一页时无上一页,第一页链接;最后一页同理;
不使用Jdbc-Odbc桥接器,利用数据库商提供的驱动程序直接链接数据库:
问题一:驱动程序的获得,到sun的官方网站下载;
问题二:SQL Server 的三个驱动:msutil.jar;mssqlserver.jar;msbase.jar
Oracle的一个驱动:在oracle安装目录oracle/ora9i/jdbc/class12.zip,需将class12.zip改名为class12.jar
My SQL的一个驱动:mm.mysql-2.0.4-bin.jar
问题三:这些驱动放在哪儿,Tomcat能找到:放于Tomcat/common/lib下;或者放于站点的web-info/lib下
问题四:Class.forName(驱动),getConnection(URL,帐号,密码)不同数据库的分别替换如下:
==========================================JDBC-ODBC桥 ==========================================
driver(驱动) =sun.jdbc.odbc.JdbcOdbcDriver
url =jdbc:odbc:odbc数据源名
========================================== SQL==========================================
driver =com.microsoft.jdbc.sqlserver.SQLServerDriver
url =jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名
user =sa ▲主机名或者主机IP:127.0.0.1;1433是端口号
password = ""
==========================================Oracle ==========================================
driver =oracle.jdbc.driver.OracleDriver
url =jdbc:oracle:thin:@HostName:1521:数据库名
user =scott ▲主机名或者主机IP:127.0.0.1;1521为端口号
password = tiger
========================================== MySQL==========================================
driver =org.gjt.mm.mysql.Driver
url =jdbc:mysql://localhost/testDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1
//testDB为你的数据库名
利用Tomcat的连接池连接数据库:
了解:它是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、
使用和释放。若有并发请求,则进行排队;这种技术尽可能地重用内存资源,来节省内存,提高了服务效率。
使用步骤:
第一:修改tomcat/conf/server.xml,配置数据源;
第二:在程序中使用DataSourcedataSource=(DataSource)context.lookup("java:comp/env/数据源名");
实例演示步骤:
第一:设webapp下有一站点叫ch13;
第二:打开server.xml文件,在</Context>和</host>之间增加如下描述:
<Contextpath="/ch13" docBase="ch13" debug="0" reloadable="true"crossContext="true">
<Resourcename="jdbc/bn" auth="Container"type="javax.sql.DataSource"/>
<ResourceParamsname="jdbc/bn"> <----数据源名
<parameter>
<name>factory</name> ↓固定写法
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name> ↓指写驱动
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
<parameter>
<name>url</name> ↓数据库名
<value>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev</value>
</parameter>
<parameter> ↓提供访问数据库的名用户名和密码
<name>username</name>
<value>bn</value>
</parameter>
<parameter>
<name>password</name>
<value>bn</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>
第三:利用程序建立数据库的连接:
<!--测试数据源-->
<%@page contentType="text/html; charset=gb2312" %>
<%@page import="javax.naming.Context" %>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="java.sql.*"%>
<%
DataSource ds = null;
try{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
//从Context中lookup数据源。
ds =(DataSource)envCtx.lookup("jdbc/bn");
if(ds!=null)
{
out.println("已经获得DataSource!");
out.println("<br>");
Connectionconn = ds.getConnection();
Statementstmt=conn.createStatement();
ResultSetrst=stmt.executeQuery("select * from book");
out.println("以下是从数据库中读取出来的数据");
while(rst.next())
{
out.println("bookName:"+rst.getString("bookName"));
out.println("<br>");
}
}
else
out.println("连接失败!");
}
catch(Exceptionne)
{
out.println(ne);
}
%>
JavaBeans:
实质:就是java类。
理解:可以理解为“组件”。
好处:
第一:可以实现代码的重用性。
第二:易编写,易维护,易使用。
第三:可以在任何安装了java环境的平台上使用,不需要重新编译。
第四:避免了jsp与html混杂一起,可读性差等缺点。
JavaBeans的分类:
分为可视化和非可视化;我们在web中使用的常常是非可视化的。
/编写
Beans编写的要求:
1。如果成员变量是XXX,那么为获取和更改成员变量的值,则在类中使用方法:
getXxx():获取成员变量的值;
setXxx():修改成员变量的值;
2。对于boolean型的变量,可以使用isXxx()方法;
3。类中的方法的访问属性都必须是public的。
4。类如果有构造方法,则构造方法也必须是public的,并且不能有参数;
5。Bean通常都要放于某个包内;
一个Bean编写的例子:
packagecircle; //遵守通常放于包中
importjava.io.*;
publicclass Circle
{
int radius; //成员变量
public Circle() //构造不必有,有则须是public,且无参
{ radius=1;
}
public int getRadius() //获取成员变量的值的方法,须是public;且注意命名规则
{ return radius;
}
public void setRadius(int newRadius) //设置成员变量的值的方法
{radius=newRadius;
}
public double circleArea() //bean中可以包含普通方法
{return Math.PI*radius*radius;
}
public double circlLength()
{return 2.0*Math.PI*radius;
}
}
/编译,与存放
编译:同以前的java类编译方法相同;
存放位置:站点的web-inf/classes/包名;注意:存放的是类文件,源文件java文件则不需放于此
/jsp中的调用
第一:导入包
<%@page import="包名.类名"%>
或者<%@ page import="包名.*"%>
第二:使用jsp的useBean动作标签:
<jsp:useBeanid="给Bean起的名字"class="bean的完整包名.类名"scope="bean有效范围"></jsp:useBean>
或者<jsp:useBean id="给Bean起的名字" class="bean的完整包名.类名" scope="bean有效范围" />
说明:
1。当服务器执行useBean动作时,若发现pageContext对象中已经含有同id的bean,则分配一个对象给客户;
2。若没有找到,则新建一个名字为id的bean,并分配对象给客户;
3。scope取值如下:
page:bean仅在当前页面有效;
session:bean在整个session中有效;针对一个客户而言;
request:客户在网站中请求多个页面,这些页面中同名的bean有效;
application:所有客户共享此bean;直到服务器关闭;
第三:调用bean中的方法:
<%bean的id名.方法名()%>
代码如下:
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="circle.Circle"%>
<HTML>
<BODYbgcolor=cyan><Font size=1>
<jsp:useBean id="girl"class="circle.Circle" scope="page" >
</jsp:useBean>
<%--通过上述JSP标签,客户获得了一个作用域是page,名字是girl的beans--%>
<P>圆的半径是:
<%=girl.getRadius()%>
<P>圆的周长是:
<%=girl.circlLength()%>
<P>圆的面积是:
<%=girl.circleArea()%>
</BODY>
</HTML>
/
使用getProperty(),setProperty()动作修改和获取beans的属性:
setProperty()有三种方式:
第一种:
<jsp:setPropertyname="给beans起的名字"property="要设置的beans的属性"value="<%=表达式%>" />
或者 <jsp:setProperty name="给beans起的名字" property="要设置的beans的属性" value="常量" />
说明:上面value中的值会自动的转换成bean中成员变量的数据类型
实例:
packagestudent;
publicclass Student
{
Stringname=null;
longnumber;
doubleheight,weight;
publicString getName()
{
try{
byteb[]=name.getBytes("ISO-8859-1");
name=newString(b);
returnname;
}
catch(Exception e)
{
returnname;
}
}
publicvoid setName(String newName)
{
name=newName;
}
publiclong getNumber()
{
returnnumber;
}
publicvoid setNumber(long newNumber)
{
number=newNumber;
}
publicdouble getHeight()
{
returnheight;
}
publicvoid setHeight(double newHeight)
{
height=newHeight;
}
publicdouble getWeight()
{
return weight;
}
publicvoid setWeight(double newWeight)
{
weight=newWeight;
}
}
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="student.Student"%>
<%
//设置的属性值的数据类型必须与类中定义的类型一致。
//但若设置的属性值的数据类型是字符串,则可以自动转化为对应的类型。
%>
<HTML>
<BODYbgcolor=cyan><Font size=1>
<jsp:useBean id="zhang"class="student.Student" scope="page" >
</jsp:useBean>
<jsp:setProperty name= "zhang" property="name" value="张小三" />
<P>名字是:
<jsp:getProperty name= "zhang" property="name" />
<jsp:setProperty name= "zhang" property="number"value="1999001" />
<P>学号是:
<jsp:getProperty name= "zhang" property="number" />
<%double height=1.70;
%>
<jsp:setProperty name= "zhang" property="height"value="<%=height+0.05%>" />
<P>身高是:
<jsp:getProperty name= "zhang" property="height" />
米
<jsp:setProperty name= "zhang" property="weight"value="67.65" />
<P>体重是:
<jsp:getProperty name= "zhang" property="weight" />
公斤
</FONT>
</BODY>
</HTML>
setProperty()有三种方式:
第二种:(常用)
如果需要通过HTTP表单的参数值来设置beans的相应的属性的值,则要求:
第一:表单中的表单元素的名字必须与beans属性的名字相同;
第二:使用动作标签:<jsp:setProperty name="给beans起的名字" property="*" />
说明:
第一:上种是通过<jsp:setProprety name="给beans起的名字" property="属性" value="值">
中的value="值",决定相应的属性的值;而此种的值来自表单;
第二:beans属性的值对应表单中何元素,系统会自动按相同名字匹配;
实例:
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="student.Student"%>
<HTML>
<BODY><Font size=1>
<%
/*
表单的参数值用来设置beans的相应的属性的值.
要求,表单的名字必须与beans的属性的名字相同.
Jsp会自动将字符串转换为beans属性的类型.
<jsp:setPropertyname="beans's name" property="*" />
上面语句就实现了系统会自动根据表单中的名字来匹配beans的属性名.
*/
%>
<FORMaction="" Method="post" >
<P>输入学生的姓名:
<Inputtype=text name="name">
<P>输入学生的学号:
<Input type=textname="number">
<P>输入学生的身高:
<Input type=textname="height">
<P>输入学生的体重:
<Inputtype=text name="weight">
<Inputtype=submit value="提交">
</FORM>
<jsp:useBeanid="zhang" class="student.Student" scope="page">
</jsp:useBean>
<jsp:setProperty name= "zhang" property="*" />
<P>名字是:
<jsp:getProperty name= "zhang" property="name" />
<P>学号是:
<jsp:getProperty name= "zhang" property="number" />
<P>身高是:
<jsp:getProperty name= "zhang" property="height" />
米
<P>体重是:
<jsp:getProperty name= "zhang" property="weight" />
公斤
</FONT>
</BODY>
</HTML>
//
setProperty()有三种方式:
第三种:<jsp:setPropertyname="beans的名字" property="属性名"param="表单元素名" />
实例:
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="student.Student"%>
<HTML>
<BODYbgcolor=yellow><Font size=1>
<FORMaction="" Method="post" >
<P>输入学生的姓名:
<Inputtype=text name="name">
<P>输入学生的学号:
<Inputtype=text name="number1">
<P>输入学生的身高:
<Inputtype=text name="height">
<P>输入学生的体重:
<Inputtype=text name="wei">
<BR><Input type=submit value="提交">
</FORM>
<%
/*
可以使用value属性获取值.
可以使用property=*
可以使用param=value
此例与上例功能相同,只是不是自动匹配,而是使用param=某域控件名
*/
%>
<jsp:useBeanid="zhang" class="student.Student" scope="page">
</jsp:useBean>
<jsp:setProperty name= "zhang" property="name"param="name" />
<P>名字是:
<jsp:getProperty name= "zhang" property="name" />
<jsp:setProperty name= "zhang" property="number"param="number1" />
<P>学号是:
<jsp:getProperty name= "zhang" property="number" />
<%double height=1.70;%>
<jsp:setProperty name= "zhang" property="height"param="height" />
<P>身高是:
<jsp:getProperty name= "zhang" property="height" />
米
<jsp:setProperty name= "zhang" property="weight"param="wei" />
<P>体重是:
<jsp:getProperty name= "zhang" property="weight" />
公斤
</FONT>
</BODY>
</HTML>
//
实例要求:输入一个整数,求出小于这个数的所有素数:
packagetom.jiafei;
publicclass PrimNumber
{ intnumber; //用来接受用户所输入的整数
StringBuffer result; //用来包含所输入整数之前的所有素数
public PrimNumber()
{ result=new StringBuffer();
}
public void setNumber(int n)
{ number=n;
inti,j;
for( i=2;i<=number;i++) //找出number以内的素数。
{for(j=2;j<i;j++)
{if(i%j==0)
break;
}
if(j>=i)
result.append(""+i+"<BR>");
}
}
public int getNumber()
{return number;
}
public StringBuffer getResult()
{ return result;
}
}
文件二:
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="tom.jiafei.*" %>
<%
/*
如果有包的话,则必须在classes文件下创建相应的文件夹.
class文件要放于相应的目录下.
必须在文件头引入此包.
*/
%>
<HTML>
<BODYbgcolor=cyan><Font size=1>
<FORMaction="" Method="post" >
<P>输入一个正整数:
<Inputtype=text name="number">
<Inputtype=submit value="提交">
<jsp:useBean id="prim"class="tom.jiafei.PrimNumber" scope="page" >
</jsp:useBean>
<jsp:setProperty name= "prim" property="number"param="number" />
<P>小于
<jsp:getProperty name= "prim" property="number" />
这个数的全部素数是:
<BR> <jsp:getProperty name= "prim" property="result" />
</Font>
</BODY>
</HTML>
//
实例要求:输入三角形三条边,看看能不能形成一个三角形,并求出面积
packagetriangle;
publicclass Triangle
{
double sideA,sideB,sideC; //表示三条边,分别接受三个文本框的传值
double area; //面积
boolean triangle; //布尔型表示能否形成一个三角形
public void setSideA(double a)
{sideA=a;
}
public double getSideA()
{return sideA;
}
public void setSideB(double b)
{sideB=b;
}
public double getSideB()
{return sideB;
}
public void setSideC(double c)
{sideC=c;
}
public double getSideC()
{return sideC;
}
public double getArea() //返回面积
{ double p=(sideA+sideB+sideC)/2.0;
area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
return area;
}
public boolean isTriangle() //判断是否能形成三角形
{ if(sideA<sideB+sideC&&sideB<sideA+sideC&&sideC<sideA+sideB)
triangle=true;
else
triangle=false;
return triangle;
}
}
文件二:
<%@page contentType="text/html;charset=GB2312" %>
<%@page import="triangle.Triangle"%>
<HTML>
<BODY>
<FORMaction="" Method="post" >
<P>输入三角形的边A:
<Inputtype=text name="sideA" value=0>
<P>输入三角形的边B:
<Inputtype=text name="sideB" value=0>
<P>输入三角形的边C:
<Inputtype=text name="sideC" value=0>
<Inputtype=submit value="提交">
<P>你给出三角形的三边是:
<jsp:useBeanid="triangle" class="triangle.Triangle"scope="page" >
</jsp:useBean>
<jsp:setProperty name= "triangle" property="*" />
<BR>边A是:
<jsp:getProperty name= "triangle" property="sideA" />
<BR>边B是:
<jsp:getProperty name= "triangle" property="sideB" />
<BR>边C是:
<jsp:getProperty name= "triangle" property="sideC" />
<P>这三个边能构成一个三角形吗?
<jsp:getProperty name= "triangle" property="triangle" />
<P>面积是:
<jsp:getProperty name= "triangle" property="area" />
</Form>
</BODY>
</HTML>
//
课后作业:
作业一:显示访问量:页面上显示“你是第N个访客!~!~!”
作业二:猜数游戏:系统产生一个随机数;在文本框中不断输入数,直到猜对为止;能够最终显示产生的随机数和猜的次数;
servlet:
介绍:是在服务器端服务执行的小程序。一个servlet就是javax.servlet.HttpServlet类的子类;由servlet的服务器完成该子类的对 象,即初始化;
实质:和beans一样,都是java的类文件;
servlet的生命周期:
1。初始化:servlet第一次被请求时加载的,即创建一个servlet对象;是自动调用init方法来完成初始化工作的;
2。响应客户端的请求:调用service()方法;或者调用doGet(),doPost()方法;
3。消灭:当服务器关闭时,调用destroy()方法;
说明:
1。init()方法只被调用一次;当后续的客户请求servlet服务时,WEB服务器将自动启动一个新线程;
2。init()方法是HttpServlet类中的方法,可以重写这个方法;
publicvoid init(ServletConfig config)throws ServletException
3。调用init()方法时,会将一个ServletConfig类型的对象传递给init()方法;ServletConfig对象负责传递服务器设置的有关信息;
如果传递失败,则发生ServletException异常;
4。service()方法是HttpServlet类中的方法,可以在自定义的servlet中直接继承或者重写该方法;
public void service(HttpServletRequestrequest,HttpServletResponse response)throws ServletException,IOException
5。service()方法是在用户请求时自动调用;service()方法封装了用户的请求信息;所以可以处理用户的请求;
6。service()方法还可以对用户进行响应;
7。destroy()方法,是HttpServlet类中的方法;自定义的servlet可以直接继承该方法,一般不需要重写;
publicvoid destroy();
///
第一个servlet:
/编写:
importjava.io.*;
importjavax.servlet.*; //导入HttpServlet类的包
importjavax.servlet.http.*; //导入所需的包
publicclass Hello extends HttpServlet //自定义的servlet必须继承HttpServlet,继承前需用上面的导入
{
//重写HttpServlet的init()方法,进行初始化
publicvoid init(ServletConfig config) throws ServletException
{
super.init(config); //调用父类super的初始化方法,完成自己的初始化;
}
//重写service()方法,处理请求,并进行响应;
public void service(HttpServletRequestreqest,HttpServletResponse response) throws IOException
{//获得一个向客户发送数据的输出流:
PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。
out.println("<HTML><BODY>");
out.println("Simple servlet");
out.println("</body> </html>");
}
}
/编译:
准备:将tomcat\common\lib\servlet-api.jar拷贝到jdk\jre\lib\ext
说明: 因为jdk本身不具有servlet-api,则编译时找不到诸如HttpServlet类,所以不能编译;
部署:
1。将编译好的class文件放于web-inf\classes下,如果有包,还要放于相应的包下;
2。修改web.xml文件;此文件位于web-inf下;
<?xmlversion="1.0" encoding="ISO-8859-1"?>
<!DOCTYPEweb-app
PUBLIC "-//Sun Microsystems, Inc.//DTDWeb Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!--指定一个servlet的信息,包括类文件名,以及给servlet起的名,相当于useBean中的id名-->
<servlet>
<!--下面指定名字,找到这个名字,就找到了对应的serlvet的class文件-->
<servlet-name>Hello</servlet-name>
<!--下面指定类文件-->
<servlet-class>Hello</servlet-class>
</servlet>
<!--指定servlet的映射信息,即访问此servlet的url-->
<servlet-mapping>
<!--下面指定servlet名,此名必须在上面定义过,通过它找到对应的class-->
<servlet-name>Hello</servlet-name>
<!--下面指定访问上面name的servlet的URL-->
<url-pattern>/hello</url-pattern>
<!--/代表是站点的根止录-->
</servlet-mapping>
</web-app>
///访问:http://localhost:端口号/站名/serlet的url-pattern
OK
servlet获取表单提交数据:
实例一:
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan>
<P>输入一个数,servlet求这个数的平方根:
<FORMaction="/StoneJsp/StoneJsp/servlet/Sqrt" method=get>
<Input Type=text name=number>
<Input Type=submit value="提交">
</FORM>
<P>输入一个数,servlet求这个数的平方根:
<FORMaction="../../../StoneJsp/servlet/Sqrt" method=get>
<Input Type=text name=number>
<Input Type=submit value="提交">
</FORM>
<%
//要注意:
//网页中的地址/,都是相对于网址的,也就是相对于http://localhost:8888/
//也可以理解为是相对于Tomcat下的WebApp目录。
//但是:
//Web.xml文件中配置servlet时,是相对于本站的,也即相对于http://localhost:8888/你的站点
%>
<ahref="/StoneJsp/hello">链接到hello那个servlet</a>
</BODY>
</HTML>
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclass Sqrt extends HttpServlet
{ public void init(ServletConfig config)throws ServletException
{super.init(config);
}
public void service(HttpServletRequestrequest,HttpServletResponse response) throws IOException
{//获得一个向客户发送数据的输出流:
PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。
out.println("<HTML><BODY>");
Stringnumber=request.getParameter("number"); //获取客户提交的信息。
double n=0;
try{n=Double.parseDouble(number);
out.print("<BR>"+Math.sqrt(n));
}
catch(NumberFormatExceptione)
{ out.print("<H1>input numberletter please! </H1>");
}
out.println("</body></html>");
}
}
配置:
<servlet>
<servlet-name>sqrt</servlet-name>
<servlet-class>Sqrt</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sqrt</servlet-name>
<url-pattern>/StoneJsp/servlet/Sqrt</url-pattern>
</servlet-mapping>
小结:
第一:以前是表单提交的处理是由action属性指定一个jsp;现在可以指定为一个servlet;
第二:注意:web.xml配置中的url-pattern中的/和,jsp页中的/相对不同的目录;如果用相对路径..则参照当前网页的目录;
第三:servlet中也可以getParameter()方法获取提交信息;
doGet(),doPost()
实例二:
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><Font size=1>
<P>输入一个数,提交给servlet(Post方式):
<FORMaction="/StoneJsp/ComputerFactor" method=post>
<Input Type=text name=number>
<Input Type=submit value="提交">
</FORM>
<%
//注意上下表单的不同
//提交方式一个是get,一个是post
//servlet中用doGet和doPost分别处理
%>
<P>输入一个数,提交给servlet(Get方式):
<FORMaction="/StoneJsp/ComputerFactor" method=get>
<Input Type=text name=number>
<Input Type=submit value="提交">
</FORM>
</BODY>
</HTML>
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
public classComputerFactor extends HttpServlet
{
public void init(ServletConfig config) throwsServletException
{super.init(config);
}
public void doPost(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{ //获得一个向客户发送数据的输出流:
PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。
out.println("<HTML>");
out.println("<BODY>");
Stringnumber=request.getParameter("number"); //获取客户提交的信息。
double n=0;
try{n=Double.parseDouble(number);
out.println("<H1> factors of"+n+" :</H1>");
//求n的全部因数:
for(int i=1;i<=n;i++)
{ if(n%i==0)
out.println(i);
}
}
catch(NumberFormatExceptione)
{ out.print("<H1>input number letter please!</H1>");
}
}
public void doGet(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{
doPost(request,response);
}
}
配置:
<servlet>
<servlet-name>ComputerFactor</servlet-name>
<servlet-class>ComputerFactor</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ComputerFactor</servlet-name>
<url-pattern>/ComputerFactor</url-pattern>
</servlet-mapping>
小结:
第一:表单以post或者get方式提交,会自动执行servlet中的doPost()和doGet()方法;
第二:如果希望表单不论以什么方式提交,都能执行相同的响应;则在doGet()中调用doPost();反之亦然;
第三:注意:以超链接或者地址栏中直接请求servlet方式,是会自动执行doGet()方法;
/
实例三:doGet()与doPost()执行不同功能
<%@page contentType="text/html;charset=GB2312" %>
<HTML>
<BODYbgcolor=cyan><Font size=1>
<P>输入一个数,提交给servlet(Post方式):
<FORMaction="/StoneJsp/ComputerFactorandPrimNumber" method=post>
<Input Type=text name=number>
<Input Type=submit value="提交">
</FORM>
<P>输入一个数,提交给servlet(Get方式):
<FORMaction="/StoneJsp/ComputerFactorandPrimNumber" method=get>
<Input Type=text name=number>
<Input Type=submit value="提交">
</FORM>
</BODY>
</HTML>
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclass ComputerFactorandPrimNumber extends HttpServlet
{
public void init(ServletConfig config) throwsServletException
{super.init(config);
}
public void doPost(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{ //获得一个向客户发送数据的输出流:
PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。
out.println("<HTML>");
out.println("<BODY>");
Stringnumber=request.getParameter("number"); //获取客户提交的信息。
double n=0;
try{n=Double.parseDouble(number);
out.println("<H1> factors of"+n+" :</H1>");
//求n的全部因数:
for(int i=1;i<=n;i++)
{ if(n%i==0)
out.println(i);
}
}
catch(NumberFormatExceptione)
{ out.print("<H1>input numberletter please! </H1>");
}
}
public void doGet(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{ PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。
out.println("<HTML>");
out.println("<BODY>");
Stringnumber=request.getParameter("number"); //获取客户提交的信息。
double n=0;
try{n=Double.parseDouble(number);
out.println("<H1> Primnumbers less"+n+" :</H1>");
//求小于n的全部素数:
int j=1;
for(int i=1;i<n;i++)
{ for(j=2;j<i;j++)
{if(i%j==0)
break;
}
if(j>=i)
{out.println(i);
}
}
}
catch(NumberFormatExceptione)
{ out.print("<H1>input numberletter please! </H1>");
}
}
}
配置:
<servlet>
<servlet-name>ComputerFactorandPrimNumber</servlet-name>
<servlet-class>ComputerFactorandPrimNumber</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ComputerFactorandPrimNumber</servlet-name>
<url-pattern>/ComputerFactorandPrimNumber</url-pattern>
</servlet-mapping>
//
Servlet常用接口的使用
有如下几种分类:
1.servlet实现相关:定义了用于实现Servlet相关的类和方法;
2.servlet配置相关:通过ServletConfig接口实现;
3.Servlet异常相关:主要有ServletException,UnavailableException;
4.请求与响应相关:可以处理请求,并做出响应;
5.会话跟踪:即HttpSession;
6.servlet上下文:通过这个接口可以在多个WEB应用之间共享数据;
7.servlet协作:通过RequestDispatcher接口,进行页面的转发;
8.过滤:定义了请求响应过滤相关的API和接口;
9.其他类:比如:cookie,HttpUtils等;
-------------------------------
一:与实现相关主要有三个类和接口:
Servlet:它是所有Servlet必须直接或间接实现的接口,主要方法有:init();destroy();getServletInfo();getServletConfig();
service()
GenericServlet:是一个抽象类,对Servlet进行继承,并做了基本的实现;但service()方法是抽象方法,需其子类实现;
HttpServlet:它继承GenericServlet,提供Http协议功能;其子类需实现doGet()或doPost()等方法;
注意:我们的servlet通常都是要继承HttpServlet
二:Servlet配置相关:
相关接口:javax.servlet.ServletConfig;
主要方法:
getInitParameter(Stringname):返回特定名字的初始化参数;其参数来自web.xml中的配置;比如:
<servlet>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</servlet>
则,getInitParameter("encoding"),将返回"gb2312"字符串;
getInitParameterNames():返回所有初始化参数的名字;
getServletContext():返回上下文对象;
三:异常相关:
1.ServletException:它继承Exception,主要方法getRootCause()能返回异常的原因;
2.UnavailableException:它继承ServletException,当Servlet不可用时,就会产生此异常;
四:请求响应相关:
相关接口与类有:
ServletRequest HttpServletRequest 请求
ServletResponse HttpServletResponse 响应
ServetInputStream HttpServletInputStream 输入流
ServletOutputStream HttpServletOutputStream 输出流
ServletRequestWrapper HttpServletRequestWrapper 请求的实现
ServletResponseWrapper HttpServletResponseWrapper 响应的实现
说明:右边以Http开头的接口或者类都是左边的子类;
HttpServletRequest的重要方法:
1.getCookie()2.getSession()3.getParameter();4.getParameterValues()
HttpServletResponse的重要方法:
1.addCookie()2.encodeURL()3.sendRedirect()4.setContentType()5.setCharacterEncoding();
五:会话跟踪相关:
HttpSession接口
作用:通过它可以来识别一个客户
常用方法://方法的作用参见jsp内置对象中的session对象的方法
getCreationTime()
getId()
getLastAccessedTime()
getMaxInactiveInterval()
getValue()
getValueNames()
invalidate()
isNew()
putValue()
removeValue()
setMaxInactiveInterval()
六:servlet上下文
ServletContext接口
作用:session用来维扩同一个用户的相关状态;context可以用来维扩多个用户的状态;
常见方法:
getAttribute(Stringname):获得ServletContext中的名称为name的属性值;
getContext(Stringuripath):返回指定uripath的servlet上下文;
removeAttribute()
setAttribute()
七:servlet的协作
RequestDispatcher接口
作用:它可以把一个请求转发到另一个Servlet;
重要方法:
forward(ServletRequestrequest,ServletResponse response):将请求转发到另一个资源上,可以是:jsp,serlvet,HTML等;
include(参数同上):把服务器上另一资源包括到响应中;
八:过滤:
Filter接口,FilterChain接口,FilterConfig接口
作用:可以对请求进行统一编码,进行认证等;每个Filter完成一个特定的任务,多个Filter可以互相协同完成复杂任务;
Filter的方法://是Filter必须实现的接口;
init(FilterConfigfilterConfig):初始化;
doFilter(ServletRequestrequest,ServletResponse response,FilterChain chain):实现Filter的业务方法;
destroy():释放Filter资源;
FilterChain接口
作用:把过滤的任务在不同的Filter之间转移;
方法:
doFilter(ServletRequestrequest,ServletResponse response)
FilterConfig接口
作用:代表了Filter的配置;
方法:
getFilterName():返回Filter的名字;
getInitParameter(Stringname):获得名称为name的初始化参数;
getServletContext():返回这个Filter所在的Servlet上下文对象;
getInitParameterNames():返回配置中所有初始化参数的名字;
//
配置相关的实例:
packagecom.jspdev.ch7;
importjava.sql.*;
importjavax.sql.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.io.*;
importcom.microsoft.jdbc.sqlserver.SQLServerDriver;
importjava.sql.*;
publicclass JDBCServlet extends HttpServlet
{
/**
*连接数据库的属性.
*/
Stringdriver;
Stringurl;
Stringpassword;
Stringuser;
/**
*处理Get请求
*/
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throwsIOException, ServletException
{
response.setContentType("text/html;charset=gb2312");
PrintWriterout = response.getWriter();
try
{
Connectioncon=getConnection();
Statementstmt=con.createStatement();
ResultSetrst=stmt.executeQuery("select * from user_info");
while(rst.next())
{
out.println(rst.getString("userid"));
out.println("<br>");
}
rst.close();
stmt.close();
con.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
/**
*处理Post请求
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response)throwsIOException, ServletException
{
doGet(request,response);
}
/**
*获得初始化参数
*/
publicvoid init()throws ServletException
{
driver=getInitParameter("DRIVER");
password=getInitParameter("PASSWORD");
url=getInitParameter("URL");
user=getInitParameter("USER");
}
/**
*帮助方法,获得到数据库的连接
*/
privateConnection getConnection()
{
Connectioncon=null;
try
{
Class.forName(driver);
con= DriverManager.getConnection(url,user,password);
}
catch(Exceptione)
{
e.printStackTrace();
}
returncon;
}
}
-----web.xml中的部分配置:
<servlet>
<servlet-name>JDBCServlet</servlet-name>
<servlet-class>com.jspdev.ch7.JDBCServlet</servlet-class>
<init-param>
<param-name>DRIVER</param-name>
<param-value>com.microsoft.jdbc.sqlserver.SQLServerDriver</param-value>
</init-param>
<init-param>
<param-name>URL</param-name>
<param-value>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev</param-value>
</init-param>
<init-param>
<param-name>USER</param-name>
<param-value>bn</param-value>
</init-param>
<init-param>
<param-name>PASSWORD</param-name>
<param-value>bn</param-value>
</init-param>
</servlet>
会话相关实例:
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclass Boy extends HttpServlet
{ public void init(ServletConfig config) throwsServletException
{super.init(config);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throwsServletException,IOException
{ //获得一个向客户发送数据的输出流:
PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。
out.println("<HTML>");
out.println("<BODY>");
HttpSessionsession=request.getSession(true); //获取客户的会话对象
session.setAttribute("name","Zhoumin"); //设置属性
out.println(session.getId()); //获取会话的Id.
out.println("</BODY>");
out.println("</HTML>");
}
public void doGet(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{doPost(request,response);
}
}
文件二:
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclass Girl extends HttpServlet
{ public void init(ServletConfig config) throwsServletException
{super.init(config);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throwsServletException,IOException
{ //获得一个向客户发送数据的输出流:
PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。
out.println("<HTML>");
out.println("<BODY>");
out.println(session.getId()); //获取会话的Id.
Strings=(String)session.getAttribute("name"); //获取会话中存储的数据。
out.print("<BR>"+s);
out.println("</BODY>");
out.println("</HTML>");
}
public void doGet(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{doPost(request,response);
}
}
//
会话实例之二:猜数字游戏之servlet版
importjava.io.*;
importjava.util.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclass GetNumber extends HttpServlet
{ public void init(ServletConfig config) throwsServletException
{super.init(config);
}
public void doPost(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{ response.setContentType("text/html");
ServletOutputStreamout=response.getOutputStream();
out.print("A number between 1 and 100to you,guess it out please! ");
HttpSessionsession=request.getSession(true);
session.setAttribute("count",newInteger(0));
int number=(int)(Math.random()*100)+1; //获取一个随机数。
session.setAttribute("save",newInteger(number));
out.print("<FORM action=Result method=post name=form>");
out.print("<INPUT type=text name=boy>");
out.print("<INPUT type=submitvalue=Enter>");
out.print("</FORM>");
}
public void doGet(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{doPost(request,response);
}
}
importjava.io.*;
importjava.util.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclass Result extends HttpServlet
{public void init(ServletConfig config) throws ServletException
{super.init(config);
}
public void doPost(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{ response.setContentType("text/html");
ServletOutputStreamout=response.getOutputStream();
HttpSessionsession=request.getSession(true);
Stringstr=request.getParameter("boy");
if(str==null)
{str="0";
}
int guessNumber=Integer.parseInt(str);
Integer integer=(Integer)session.getAttribute("save");
int realnumber=integer.intValue();
if(guessNumber==realnumber)
{int n=((Integer)session.getAttribute("count")).intValue();
n=n+1;
session.setAttribute("count",newInteger(n));
response.sendRedirect("Success");
}
else if(guessNumber>realnumber)
{int n=((Integer)session.getAttribute("count")).intValue();
n=n+1;
session.setAttribute("count",newInteger(n));
response.sendRedirect("Larger");
}
elseif(guessNumber<realnumber)
{int n=((Integer)session.getAttribute("count")).intValue();
n=n+1;
session.setAttribute("count",newInteger(n));
response.sendRedirect("Smaller");
}
}
public void doGet(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{doPost(request,response);
}
}
importjava.io.*;
importjava.util.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclass Larger extends HttpServlet
{ public void init(ServletConfig config) throwsServletException
{super.init(config);
}
public void doPost(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{ response.setContentType("text/html");
ServletOutputStream out=response.getOutputStream();
out.print("Larger ,try again!");//所猜的数比实际的数大,请再猜。
out.print("<BR><FORMaction=Result method=postname=form>");
out.print("<INPUT type=text name=boy>");
out.print("<INPUT type=submitvalue=Enter>");
out.print("</FORM>");
}
public void doGet(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{doPost(request,response);
}
}
importjava.io.*;
importjava.util.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclass Smaller extends HttpServlet
{
public void init(ServletConfig config) throwsServletException
{super.init(config);
}
public void doPost(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{ response.setContentType("text/html");
ServletOutputStreamout=response.getOutputStream();
out.print("Smaller ,try again!");//所猜的数比实际的数小,请再猜。
out.print("<BR><FORMaction=Result method=post name=form>");
out.print("<INPUT type=text name=boy>");
out.print("<INPUT type=submitvalue=Enter>");
out.print("</FORM>");
}
public void doGet(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{doPost(request,response);
}
}
importjava.io.*;
importjava.util.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclass Success extends HttpServlet
{
public void init(ServletConfig config) throwsServletException
{super.init(config);
}
public void doPost(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{ response.setContentType("text/html");
ServletOutputStreamout=response.getOutputStream();
HttpSessionsession=request.getSession(true);
intcount=((Integer)session.getAttribute("count")).intValue();
intnum=((Integer)session.getAttribute("save")).intValue();
long startTime=session.getCreationTime();
long endTime=session.getLastAccessedTime();
long spendTime=(endTime-startTime)/1000;
out.println("Congratulatuon! You areright");
out.println("aferjust"+count+"tries") ;
out.println("youspend"+spendTime+"Seconds");
out.println("That Number is"+num);
}
public void doGet(HttpServletRequestrequest,HttpServletResponse response)
throwsServletException,IOException
{doPost(request,response);
}
}
WEB组件:
JavaBean组件,EJB组件,JSP标签,XML,web service,Servlet,JSP组件,等
-------------------------------------------------------------------------------------
WEB组件的三种关联关系:
1.请求转发:
将表单等请求信息转发给同一应用程序中的其他WEB组件进行处理.
Servlet的处理方式:
RequestDispatcherrd=request.getRequestDispatcher("某组件,比如:Hi.jsp");
rd.forward(request,response);
//重点理解:RequestDipatcher对象,及其forward方法.
JSP的处理方式:
<jsp:forwardpage="Hi.jsp" />
2.URL重定向:
重定向,即跳转到另一URL.
与请求转发的区别:
1.可以重定向到不是同一应用中的URL.而请求转发通常是跳转到同一应用的URL中.
2.重定向不携带HttpServletRequest信息,故不能进行数据处理,只是跳到另一URL;而请求转发可以.
处理方式:
response.sendRedirect("某URL,比如:http://www.sohu.com")
3.包含:
包含关系允许一个组件来自不同的组件的合成;
Servlet的处理方式:
RequestDispatcherrd;
rd=request.getRequestDispatcher("/header.jsp");
rd.include(request,response);
Jsp的处理方式:
<%@ include file="header.jsp" %>
------------------------------------------------------------------------------------------
WEB开发的两种模式:
1.jsp Model1,jsp+javaBean
2.jsp Model2,jsp+javaBean+servlet
MVC:Model-View-Controller,即:模型-视图-控制器.
说明:MVC是一种设计模式,它强制性地把应用程序的输入,处理和输出分开.
视图:用户看到并与之交互的界面.
模型:表示业务数据和业务逻辑.一个模型能为多个视图提供数据,从而提设防尖用的可重用性.
控制器:控制器能接爱用户的输入并调用模型和视图去完成用户的需求.当WEB用户单击WEB页面中的提交按钮来发送HTML表单时,控制器接收请求并调
用相应的模型组件去处理请求,然后调用相应的视图来显示模型返回的数据.
在模式二中:jsp为视图,javabean为模型,servlet为控制器
--------------------------------------------------------------------------------------------
Struts的机制:
Struts实质上就是在JSP Model2基础上实现的一个MVC框架。在Struts框架中,模型由实现业务逻辑的JavaBean或EJB组件构成,控制器是由ActionServlet和Action来实现,视图由一组JSP文件构成。
---------------------------
Struts的工作流程:
1.检索和用户请求相匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
2。如果ActionForm实例不存在,就创建一个ActionForm对象,把客户请求提交的表单数据保存到ActionForm对象中。
3。根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。
4。如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。
5。ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action.如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。
6。Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。
7。ActionForward对象指向的JSP组件生成动态网页,返回给客户。
说明:如果步骤4中,验证失败,则返回包含一个或多个ActionMessage的ActionError对象有,此时不再向下执行;ActionServlet将直接把请求转发给包含用户提交表单的JSP组件。
JSP:
<%=new java.util.Date()%> OR <%out.println(newjava.util.Date());%>
javascript:
<script language=javascript>
varmyTime=new Date();
year=myTime.getYear();
month=myTime.getMonth()+1;
date=myTime.getDate();
hour=myTime.getHours();
mins=myTime.getMinutes();
sec=myTime.getSeconds();
document.title=year+"ト・+month+"ヤツ"+date+"ネユ" /ヤレラマア・簑クマヤハセハアシ・
document.write(year+"ト・+month+"ヤツ"+date+"ネユ")/ヤレメウテ賁莎アシ・
window.status=year+"ト・+month+"ヤツ"+date+"ネユ" /ヤレラツマヤハセハアシ・
</script>
解决WEB开发中的中文问题
这段时间经常看到有人问到web开发中怎么中文总是?号。原因其实很简单,因为大家大多用的是tomcat服务器,而tomcat服务器的默认编码为 iso-8859-1(西欧字符)。就是因为iso-8859-1(西欧字符)编码造成了我们经常看到?号。关于iso-8859-1(西欧字符)更多知识请看《字节,字符和编码》这篇文章。
方法一:最简单也是用的最多的方法。
<%@ page language="java" pageEncoding="GBK" %>
或者<%@ page contenttype="text/html;charset=gbk";%>
或者<%request.setCharacterEncoding("gbk");%>,这里可以用gb2312或者gbk,只是gbk比gb2312支持跟多的字符。
这个方法用于jsp页面中的中文显示。
方法二:使用过滤器。
过滤器使用主要针对表单提交,插入数据库的数据都是?号。这也是应为tomcat不按request所指定的编码进行编码,还是自作主张的采用默认编码方式iso-8859-1编码。
编写一个SetCharacterEncodingFilter类。
importjava.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
String value=filterConfig.getInitParameter("ignore");
if(value==null)
this.ignore=true;
else if(value.equalsIgnoreCase("true"))
this.ignore=true;
else
this.ignore=false;
}
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
// TODO 自动生成方法存根
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
public void destroy() {
// TODO 自动生成方法存根
this.encoding = null;
this.filterConfig = null;
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
然后再web.xml加上
<!-- Set Character Encoding-->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.struts.common.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Set Character Encoding-->
使用过滤器的好处很多,特别是项目之中。
而且在使用国际化时就更有用了,只要在页面指定<%@ page language="java"pageEncoding="UTF-8" %>,服务器就会根据本地Locale来显示正确的字符集。
所以我特别推荐使用过滤器。
方法三:修改tomcat的server.xml文件中URIEncoding。
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="GBK"
>
</Connector>
这个方法主要针对从url中获取字符串的问题。
在tomcat5.0及以上版本,post和get方法在处理编码时有所不同。如果你在url中获取中文就会出现?号。但在tomcat4.1版本没有问题,因为tomcat4.1的post和get方法在处理编码时是一样的。