a)继承HttpServlet(servlet包定义了实现了Servlet接口的两个抽象类,GenericServlet及其子类HttpServlet——一般Servlet程序都继承自这两个类并实现。)
b)service()方法由servlet容器调用,还有一些其他方法,详情查看API文档对于Servlet接口的描述。
c)传入service()的两个参数,顾名思义,request表示来自客户的请求,可以从中获取请求参数;response用于响应客户请求——详情请查看对应接口的API文档,在此我也不一一解释了。
(3)Servlet程序的执行。
a)下载、安装配置Tomcat4.0,设置环境变量。
b)编译MyServlet.java,得到MyServlet.class并将其置于tomcat目录下webapps\examples\WEB-INF\classes文件夹下。
注意:若编译时提示无法找到包javax.servlet.*和javax.servlet.http.*,设置环境变量CLASSPATH,将Tomcat目录下的common\lib\servlet.jar包含进去则可。
c)执行Tomcat目录下bin\startup.bat启动服务器
d)打开浏览器,访问http://127.0.0.1:8080/examples/MyServlet
4.JSP元素
JSP文件由下述5种元素组合而成,后缀名为.jsp
(1)HTML标记。就按照HTML标记那样用吧...
<html>
<body>HelloWorld</body>
</html>
(2)指令,用于发送消息给JSP容器,设置页面环境。
格式:<%@xxx ddd="gggg"%>
@page
language:java ——指定语言
contentType:text/html;charset=ISO-8859-1|... ——指定输出数据的MIME类型。
extends: ——指定JSP转换为servlet后所要继承的父类,其值必须是一个合法的类名
import: ——需要导入的包,用逗号分隔。
session:true|false ——是否参与会话(是否可以使用隐含对象session)
buffer:8kb|none|... ——设置隐含对象out的缓冲区大小
autoFlush:true|false ——是否自动刷新
isThreadSafe:true|false ——是否线程安全(是否允许一个page处理多个请求)
info: ——指定一个描述该页面的字符串,可以通过调用page.getServletInfo()返回。
errorPage: ——指定对应的线程处理界面
isErrorPage:true|false ——当前页面能否作为错误处理页面
@include file="URL" :编译时导入所包含的资源。
@taglib :指定一个标记库,用于拓展标准的jsp标记集。
<%@page contentType = "text/html;charset=GB2312"%> <!--设置页面格式及编码-->
(3)scriptlet,由一系列标准java代码的组成。
格式:<%XXXX%>
XXXX为标准的java代码。
特殊的情况是<%=object%>,表示向客户端输出object
<%
out.println("Hello , I am the first.");
%>
<%="Hello,I am the second."%>
<!--上述两条语句作用类似-->
(4)JSP动作,封装有特殊功能的JSP标记。
格式:<jsp:XXXX sss="dddd"></jsp:XXXX>
共有属性:id: ——用于唯一标识action
scope:page|request|session|application ——用于标识action生命周期
jsp:include ——将静态或动态页面插入到当前页面
page:url ——必须是本地url
flush:true|false ——执行include动作后是否刷新缓冲区
jsp:param ——指定发送给资源的请求参数
name: ——参数名
value: ——参数值
jsp:forward ——中止当前页面动作并将请求转发到另一资源
page:url ——页面地址
jsp:plugin ——将java组件插入JSP页面
type:applet|javabean ——指定插件的类型
code: ——指定将执行的java类文件名称,基于codebase
codebase:url ——指定java类文件路径
name: ——指定bean或applet的名称
archive: ——指定可能用到的java类文件的路径,多个路径用逗号隔开
align,height,width,hspace,vspace: ——显示格式
jreversion: ——指定运行组件所需的jre版本
nspluginurl: ——指定Netscape Navigator浏览器下载插件的地址
iepluginurl: ——指定ie浏览器下载插件的地址
javabean动作 见 7.javabean的创建及使用
更多jsp动作请读者们自行查阅更专业的文档呢。
<jsp:useBean id="testBean" class="test.TestBean"/>
<!--使用一个javabean-->
(5)标记库,程序员可以创建一系列定制的标记。
——使用方式似乎和HTML标记挺类似的..
——暂时还没有接触到,日后整理
——欢迎指教
5.JSP版的HelloWorld
(1)编写源文件:HelloWorld.jsp
<%@page contentType="text/html;charset=GB2312"%>
<%@page import="java.util.*"%>
<html>
<title>JavaScriptProgram</title>
<body>
Now is: <%=new Date()+"<br>"%>
<%="<h1>HelloWorld!</h1>"%>
</body>
<html>
(2)将HelloWorld.jsp放至tomcat目录下webapps\examples\下。
(3)执行Tomcat目录下bin\startup.bat启动服务器
(4)打开浏览器,访问http://127.0.0.1:8080/examples/HelloWorld.jsp
6.jsp隐含对象
每个JSP都有很多的隐含对象,可以直接调用它们的方法来实现各种神奇的功能哟~~
(1)作用域:不同的隐含对象具有不同的作用域。
a)页面:对象只存在于定义它的页面当中。
b)请求:存在于请求区间。
c)会话:存在于客户的整个浏览会话区间。
d)应用程序:存在于jsp容器,任何JSP都可以使用哟~
(2)常用隐含对象:
a) HttpServletRequest request ——请求作用域,表示客户端请求的对象
void setCharacterEncoding("GBK") : 设置传递参数所用字符编码
String getParameter("XXX") : 获取名为XXX的请求参数的值
b) HttpSession session ——会话作用域,表示与客户端请求关联的会话
c) ServletContext application ——应用程序作用域,用于获取运行环境的相关信息
下面的全是页面作用域
d) page ——表示当前JSP实例的this引用,代表当前页面
e) HttpServletResponse response ——表示对客户端的响应
void setCharacterEncoding("GBK") : 设置传递参数所用字符编码
void setContentType("text/html;character=GBK") : 设置解析页面类型及所用字符编码
f) pageContext :通过该对象访问其他隐含对象,获取属性
g) JspWriter out ——代表用于向客户端传送请求处理结果的输出流
h) config :表示JSP的配置选项
i) exception :表示传递给JSP页面的异常
详细信息请自行查阅相关文档。
7.javabean的创建及使用
(1)什么是javabean?
javabean就是一种特殊的java类...(观众:废话!...) - -...
据说javabean分为两种,一种是有用户界面的,另一种是负责事务处理的。
对于前者,在这里暂不研究吧。我们主要讨论的是后者。
负责事物处理的javabean,总而言之可以通过使用它来方便的实现 各式各样的通讯 。
——欢迎大神提供更详细、更准确的说明...
(2)javabean和普通类的编写区别。
a)提供一个无参的public构造函数
b)对于任何一个需要引用的javabean属性XXX,必须提供public的setXXX()方法和getXXX()方法来设置和获得它的值。
(3)javabean的使用。
a)创建javabean的实例。
jsp动作:
jsp:usebean
id: ——指定javabean的标记名,供其他标记使用
scope: ——指定javabean的作用域
class: ——指定javabean的完全合法的类名,包括包名
beanName: ——指定javabean的实例名,默认与id相同
type:Type ——将创建的javabean的实例转化为该类型
猜测:
<jsp:usebean id="testBeanID" scope="page" class="Class" beanName="testBean" type="Type"></jsp:usebean>
在内存中就相当于:Type testBean = new Class();
b)设置javabean实例的变量
jsp动作:
jsp:setProperty
name: ——和创建实例时的id值相同
property: ——需要设置的实例的属性名,可以用*表示匹配所有属性
value: ——需要设置的值,与param不共存,不设置的话则使用param的值。
param: ——需要使用的来自客户端的请求参数名,与value属性不共存,默认与property相同。
也可以使用scriptlet来进行设置,不过不推荐。
c)输出javabean实例变量的值
jsp动作:
jsp:getProperty
name: ——和创建时的id值相同
property: ——需要获取的实例的属性名
同样,可以使用scriptlet来输出。
d)其他
——貌似没有提供其他使用javabean的jsp标记。——有待考证。
——要使用更多javabean的功能,那么同志们就使用scriptlet来试试吧。
——欢迎指教。
(4)使用javabean的jsp实例。
a)编写一个javabean——TestBean.java
package com.mypaj;
public class TestBean{
private int a;
public TestBean(){
this.a=10;
}
public int getNumber(){
return this.a;
}
public void setNumber(int a){
this.a=a;
}
public void addNumber(){
this.a++;
}
}
b)编写beanTest.jsp
<%@page contentType="text/html;charset=GB2312" language="java"%>
<html>
<title>TestJSP</title>
<body>
<jsp:useBean id="testBean" scope="page" class="com.mypaj.TestBean"/>
<h1><%=testBean.getNumber()%></h1>
<jsp:setProperty name="testBean" property="number" value="50"/>
<%
testBean.addNumber();
%>
<h1><jsp:getProperty name="testBean" property="number"/><h1>
</body>
</html>
c)编译TestBean.java,把得到的com文件夹及其子目录复制到tomcat目录下webapps\examples\WEB-INF\classes文件夹下
d)将beanTest.jsp文件放至tomcat目录下webapps\examples文件夹下
e)执行Tomcat目录下bin\startup.bat启动服务器
f)打开浏览器,访问http://127.0.0.1:8080/examples/beanTest.jsp
(5)对于jsp:setProperty动作与jsp:getProperty的讨论。
可以从上述的例子看出,TestBean的实例中的变量名和jsp中setProperty与getProperty动作中的property的值没有半毛钱关系,倒是和调用的方法名似乎有关。
事实上,当我们把get和set动作中property属性值设置为首字母大写后,浏览器会提示找不到方法。
于是个人认为,这两个动作的执行方式是:
a)取property属性值,并将首字母改为大写,如"number"会改为"Number"——(大概是 首字符编码值 = 首字符编码值 - 大小写字母编码差值)
b)对于setProperty动作和getProperty动作,前者直接调用在上述值之前加上"set"后对应方法名的方法,即 set + Number = setNumber()....而后者则对应调用getNumber()并向客户端输出。
——好吧,实际调用原理也许不像上面说的那么奇葩...但是对于使用者来说这样理解大概会比较直观...
读者可以做更多的试验——欢迎指教。
8.其他注意事项
(1)JSP的请求/响应机制、生命周期和servlet的相同。可以在其中定义jspInit()方法和jspDestroy()方法供JSP容器调用(调用时间类似于servlet的init()和destroy()方法)。
(2)更高版本的Tomcat服务器执行servlet或jsp可能需要更复杂的配置,请读者自行查阅资料。
(3)注释,可以在scriptlet之外使用html注释(客户浏览器可见)
<!--注释内容-->
或JSP风格注释(客户浏览器不可见)
<%--注释内容--%>
也可以在scriptlet内部使用java标准注释(客户浏览器不可见)。
以上。
欢迎读者指正批评。