JSP基础知识

来源:互联网 发布:javascript下载 编辑:程序博客网 时间:2024/05/06 00:49

JSP、Tomcat的一些基础知识


 

JSP的执行原理

 

当服务器上的一个JSP 页面被第一次请求执行时,服务器上的JSP 引擎首先将JSP页面文件转译成一个Servlet java文件,再将这个java 文件编译生成字节码文件,然后通过执行字节码文件响应客户的请求,而当这个JSP 页面再次被请求执行时,JSP 引擎将直接执行这个字节码文件来响应客户。

 

Tomcat几个环境变量

 

变量名:JAVA_HOME,变量值:C:/jdk1.3。

变量名:TOMCAT_HOME,变量值:D:/tomcat/Jakarta-tomcat-4.0。

变量名:CLASSPATH,变量值:C:/jdk1.3/jre/lib/rt.jar;.;。

变量名:PATH,变量值:C:/jdk1.3/bin

 

Tomcat配置文件

 

Server.xml //配置端口号、默认路径等全局参数

 

JavaBean规范

 

按着Sun 公司的定义,JavaBeans 是一个可重复使用的软件组件。实际上JavaBeans是一种Java 类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称beans。

getXxx():用来获取属性xxx。

setXxx():用来修改属性xxx.。

对于 boolean 类型的成员变量,即布尔逻辑类型的属性,允许使用"is"代替上面的"get"和"set"

 

 

JSP代码和常用指令标签


 

JSP页面中的几种代码类型

 

1、JSP Java程序片:<% java code ... %>

在程序中声明的变量的生命周期只局限于当前request。

2、JSP页面中显示一个变量/表达式的值:<%=sum %>

3、JSP注释:<!-- 注释内容 -->

4、定义在JSP整个生命周期内有效的变量:

<%! double a[]=new double[3];

String answer=null;

%>

在一个JSP中定义一个变量默认不是多线程安全的,为了处理多个连接同时请求一个JSP的多线程安全问题,必须给方法加上Synchronized属性。

5、JSP指令标签

 

JSP指令标签

 

1、page指令

用来定义整个JSP 页面的一些属性和这些属性的值。

<%@ page 属性1= "属性1 的值" 属性2= "属性2 的值" ......%>

如:

<%@ page contentType="text/html;charset=GB2312" import="java.util.*" %>

contentType定义JSP 页面响应的MIME(Multipurpose Internet Mail Extention) 类型和JSP 页面字符的编码。

 

2、静态和动态include标签

<%@ include file= "文件的名字" %>

该指令标签的作用是在JSP 页面出现该指令的位置处,静态插入一个文件。

 

<jsp:include page= "文件的名字"/>

该动作标签告诉JSP 页面动态包含一个文件,即JSP 页面运行时才将文件加入。与静态插入文件的include 指令标签不同,当JSP 引擎把JSP 页面转译成Java 文件时,不把JSP 页面中动作指令include 所包含的文件与原JSP 页面合并一个新的JSP 页面。

 

3、指定参数标签

<jsp:param name= "名字" value= "指定给param 的值">

param标签以"名字-值"对的形式为其它标签提供附加信息,这个标签与jsp:include、jsp:forward、jsp:plugin标签一起使用。获取参数的值由JSP 的内置对象request 调用getParameter方法完成。

 

如:

<jsp:forward page="come.jsp" >

<jsp:param name="number" value="<%=i%>" />

</jsp:forward>

 

4、嵌入applet小程序

jsp:plugin嵌入applet小程序。

 

5、引用JavaBean标签

引用JavaBean:

<jsp:useBean id= "给bean起的名字" class= "创建beans的类" scope= "bean有效范围">

Scope的取值可以是page、request、session、application。

 

引用JavaBean的属性(隐藏调用getXXX方法)

<HTML>

圆的周长是:

<jsp:getProperty name= "beans 的名字" property= "beans 的属性" />

</HTML>

 

设置JavaBean的属性(隐藏调用setXXX方法)

方法一:

<jsp:setProperty name= "beans 的名字" property= "beans 的属性" value="<%=expression%>" />

 

方法二:

通过HTTP 表单的参数的值来设置beans 的相应属性的值,要求表单参数名字必须与beans 属性的名字相同,JSP引擎会自动将字符串转换为beans 属性的类型。

<jsp:setProperty name= "beans的名字" property="*" />

需要注意的是,只有提交了和该beans 相对应的表单后,该指令标签才被执行。

 

方法三:

通过request 的参数的值来设置beans 的相应属性的值,要求request参数名字必须与beans 属性的名字相同,JSP引擎会自动将request 获取的字符串数据类型转换为beans 相应的属性的类型。

<jsp:setProperty name= "beans 的名字" property=" 属性名" param= "参数名"/>

需要注意的是,只有提交了和该beans 相对应的表单后,该指令标签才被执行。

 

 

HTML表单的提交


 

HTML提交表单的方法

GET 方法用来获取名为hello.htm 的网页。其它请求方法包括POST,HEAD,DELETE,TRACE及PUT 方法等。

Get 方法和post 方法的主要区别是:使用get 方法提交的信息会在提交的过程中显示在浏览器的地址栏中,而post 方法提交的信息不会显示在地址栏中。提交手段包括:通过文本框、列表、文本区等。

 

HTML表单和控件的形式和提交方式

 

<input type= "text"

<input type= "radio"

<input type= "checkbox"

<input type= "password"

<INPUT TYPE="submit"

<input type= "reset" >

 

<Selection>

<Option>

<Option>

... ...

</Selection>

 

<TextArea> 标记在表单中指定一个能输入多行文本的文本区域。

112

<TextArea name= "ilovethisgame" Rows= "4" Cols= "20" >

</TextArea>

 

request 对象可以使用getParameter(String s) 方法获取该表单通过text 提交的信息,比如:request.getParameter("boy");

一个提交的表单的例子:

<FORM action="tree.jsp" method=post name=form>

<INPUT type="text" name="boy">

<INPUT TYPE="submit" value="Enter" name="submit">

</FORM>

 

当用request 对象获取客户提交的汉字字符时,会出现乱码问题,所以对含有汉字字符的信息必须进行特殊的处理方式。首先,将获取的字符串用ISO-8859-1 进行编码,并将编码存放到一个字节数组中,然后再将这个数组转化为字符串对象即可。如下列所示:

String str=request.getParameter("girl");

byte b[]=str.getBytes( "ISO-8859-1");

str=new String(b);

通过上述过程,提交的任何信息(无论是汉字字符或西欧字符)都能正确的显示。

 

 

JSP 的内置对象


 

JSP常用内置对象有:request、response、session、application、out。 

 

request 对象的主要方法

 

1. getProtocol() 获取客户向服务器提交信息所使用的通信协议,比如http/1.1等。

2. getServletPath() 获取客户请求的JSP 页面文件的目录。

3. getContentLength() 获取客户提交的整个信息的长度。

4. getMethod() 获取客户提交信息的方式,比如:post 或get.

5. getHeader(String s) 获取HTTP 头文件中由参数s指定的头名字的值,一般来说s参数可取的头名有:accept、 referer 、 accept-language 、content-type、accept-encoding、 user-agent 、host、 content-length 、 connection 、cookie 等,比如,s 取值user-agent将获取客户的浏览器的版本号等信息。

6. getHeaderNames() 获取头名字的一个枚举

7. getHeaders(String s) 获取头文件中指定头名字的全部值的一个枚举

8. getRemoteAddr() 获取客户的IP 地址。

9. getRemoteHost() 获取客户机的名称(如果获取不到,就获取IP 地址)。

10. getServerName() 获取服务器的名称。

11. getServerPort() 获取服务器的端口号。

12. getParameterNames() 获取客户提交的信息体部分中name 参数值的一个枚

举。

 

Response对象的主要方法 

 

1、setContentType

由于page 指令只能为contentType 指定一个值,来决定响应的MIME 类型,如果想动态的改变这个属性的值来响应客户,就需要使用response 对象的setContentType(String s)方法来改变contentType的属性值:

 

2、sendRedirect

可以使用 response 的sendRedirect(URL url) 方法实现客户的重定向。

 

3、setStatus

我们一般不需要修改状态行,在出现问题时,服务器会自动响应,发送相应的状态代码。我们也可以使用response 对象的setStatus(int n) 方法来增加状态行的内容。例如返回HTTP 404的资源不可用错误。

 

当一个客户首次访问服务器上的一个JSP 页面时,JSP 引擎产生一个secssion 对象,这个session 对象调用相应的方法可以存储客户在访问各个页面期间提交的各种信息,如session id。

 

session 对象的主要方法

 

(1) public void setAttribute(String key ,Object obj)

session对象类似于散列表,session对象可以调用该方法将参数Object指定的对象obj添加到session 对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加的对象被清除。

(2) public Object getAttibue(String key)

获取session 对象含有的关键字是key 的对象。由于任何对象都可以添加到session 对象中,因此用该方法取回对象时,应强制转化为原来的类型。

(3) public Enumeration getAttributeName()

session对象调用该方法产生一个枚举对象,该枚举对象使用nextElemets()遍历session对象所含有的全部对象。

(4) public long getCreationTime()

session 对象调用该方法可以获取该对象创建的时间,单位是毫秒(从1970 年7 月1日午夜起至该对象创建时刻所走过的毫秒数)。

(5) public long getLastAccessedTime()

获取当前session 对象最后一次被操作的时间,单位是毫秒。

(6) public int getMaxInactiveIterval()

获取session 对象的生存时间。

(7) public void setMaxInactiveIterval(int n)

设置session 对象的生存时间(单位是秒)

(8) public void removeAttribue(String key)

从当前session 对象中删除关键字是key 的对象。

(9) public String getId()

获取session 对象的编号。

(10) invalidate

使得session 无效。

 

application 对象的主要方法

 

(1) public void setAttribute(String key ,Object obj)

application 对象可以调用该方法将参数Object 指定的对象 obj 添加到application对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加对象被清除。

(2) public Object getAttibue(String key)

获取application 对象含有的关键字是key 的对象。由于任何对象都可以添加到application对象中,因此用该方法取回对象时,应强制转化为原来的类型。

(3) public Enumeration getAttributeNames()

application 对象调用该方法产生一个枚举对象,该枚举对象使用nextElemets()遍历application对象所含有的全部对象。

(4) public void removeAttribue(String key)

从当前application 对象中删除关键字是key 的对象。

(5) public String getServletInfo()

获取Servlet 编译器的当前版本的信息。

 

Out对象的主要方法

 

out对象可调用如下的方法用于各种数据的输出,例如:

out.print(Boolean),out.println(boolean) :用于输出一个布尔值。

out.print(char),out.println(char) :输出一个字符。

out.print(double),out.println(double) :输出一个双精度的浮点数。

out.print(fload),out.println(float) :用于输出一个单精度的浮点数。

out.print(long),out.println(long) :输出一个长整型数据。

out.print(String),out.println(String) :输出一个字符串对象的内容。

out.newLine() :输出一个换行符

out.flush() :输出缓冲区里的内容

out.close() :关闭流

 

 

JDBC的使用示例


 

Connection con = DriverManager.getConnection("jdbc:odbc: 数据源名字","loginname", "password ");

try {Statement sql=con.createStatement();}

catch(SQLException e ){}

ResultSet rs=sql.executeQuery("SELECT * FROM 成绩表");

 

 

Servlet的主要接口


 

extends HttpServlet

public void init(ServletConfig config) throws ServletException

//注意request和response参数。

public void service(HttpServletRequest request HttpServletResponse response)

public destroy()

 

HttpServlet 除了init、service、destroy 方法外,该类还有两个很重要的方法:doGet和doPost,用来处理客户的请求并作出响应。

 

当服务器引擎第一次接受到一个servlet 请求时,会使用init方法初始化一个servlet,以后每当服务器再接受到一个servlet 请求时,就会产生一个新线程,并在这个线程中调用service 方法检查HTTP 请求类型(Get 、Post 等),并在service 方法中根据用户的请求方式,对应地再调用doGet 或doPost 方法。因此,在servlet 类中,我们不必重写service方法来响应客户,直接继承service方法即可。我们可以在servlet类中重写doPost或doGet方法来响应用户的请求,这样可以增加响应的灵活性,并降低服务器的负担。

 

 

自定义JSP TAG


 

一个tag就是一个普通的java类,它惟一特别之处是它必须继承TagSupport或者 BodyTagSupport类。

 

JSTL,即Java Standard Tag Library ,是Java标准标记库。

 

实现一个JSP自定义TAG的步骤:

以实现<abc:tagWithNoBody attribute="value"/>为例:

 

1、创建标记处理程序类

实现一个类,继承TagSupport或者BodyTagSupport,如果要实现嵌套TAG,必须继承BodyTagSupport,否则继承TagSupport就可以了。

 

继承TagSupport要实现doStartTag和doEndTag方法,实现setProperty方法。在doStartTag中,调用pageContext.getRequest()获取request对象,调用JSPWriter out = pageContext.getOut(); out.print(xxx);输出HTML。

如果Tag中有属性,要实现SetProperty函数。

 

继承BodyTagSupport需要实现BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();

 

他们执行顺序如下:

doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()

 

doStartTag() 方法可返回EVAL_BODY_INCLUDE或SKIP_BODY。

- 如果返回EVAL_BODY_INCLUDE 则继续执行;

- 如果返回SKIP_BODY 则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,而直接执行doEndTag()方法。

 

setBodyContent() 方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。 标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG , SKIP_BODY ,EVAL_PAGE 或 SKIP_PAGE 。

- 如果返回EVAL_BODY_TAG 则会再次设置标签体内容,直到返回SKIP_BODY;

- 如果返回EVAL_PAGE 则标签体执行完后会继续执行JSP页面中接下来的部分;

- 如果返回SKIP_PAGE ,则JSP页面的后续内容将不再执行。

 

2、创建标记库描述符(TLD)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib>
<tlibversion>1.0</tlibversion>
<info>A simple tag library</info>
<tag>
<name>displayDate</name>
<tagclass>myTags.DateTag</tagclass>
<bodycontent>empty</bodycontent>
<info>Display Date</info>
</tag>
</taglib>

 

3、注册TAG

将类放到classes目录下,将TLD放到WEB-INFO目录下,使 TLD 文件和处理程序类可访问。

将下面的定义加入web.xml中,引用标记库。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<Web-app>
<taglib>
<taglib-uri>myTags</taglib-uri>
<taglib-location>/WEB-INF/lib/DateTagLib.tld</taglib-location>
</taglib>
</Web-app>

 

4、在 JSP 页面中使用标记

静态引用:<%@ taglib uri="myTags" prefix="abc" %>

动态引用:<%@ taglib uri="/WEB-INF/lib/DateTagLib.tld" prefix="abc" %>

使用方法同普通的HMTL TAG。

 

5、重载BodyTagSupport类的方法

 

 

Struts的简单配置步骤 


 

1、导入Struts包

2、在web.xml中按URL文件类型加入Struts的FileDispatcher

3、创建一个action类,实现ActionSupport接口,实现execute方法和getValue方法。

4、创建一个JSP,用以显示action对应的结果页面。

5、在struts.xml中配置action、class、JSP的对应关系。