Servlet
Servlet (java服务器小程序)是一个用 Java 编写的程序,此程序在服务器上运行以处理客户端请求。
Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。
- 特点
- 采用Java代码编写;
- 运行于服务器端;
- 跨平台
- 处理消息传递;
- 结构简洁设计轻巧;
- Servlet不适合处理复杂事务处理逻辑
- Servlet主要负责处理小型任务;
- 结构
Servlet可直接调用客户端访问请求,然后完成商业逻辑;
Servlet可以接收客户的GET或POST请求;
- 用户编写的Servlet需要从HttpServlet 继承;
- 在自定义的Servlet类内部重载doGet、doPost方法来处理客户端的GET/POST请求;
- doGet和doPost方法都有两个参数,分别为HttpServletRequest 类型和HttpServletResponse 类型;
- HttpServletRequest提供访问有关请求信息的方法。
- HttpServletResponse提供指定HTTP应答状态、应答头的方法、PrintWriter()方法。
- 注意定义doGet和doPost方法时的异常处理问题;
- doGet和doPost方法都有两个参数,分别为HttpServletRequest 类型和HttpServletResponse 类型;
- 必须导入java.io包、javax.Servlet包及javax.Servlet.http包;
- doGet和doPost这两个方法是由service()方法调用的,有时可能需要直接覆盖service()方法;
- Servlet的接口
- Servlet的框架是由两个java包组成:javax.Servlet和javax.Servlet.http
- javax.Servlet包中定义了所有的Servlet类都必须实现的接口和类。
- javax.Servlet.http包中定义了采用HTTP协议通信的HttpServlet类
- Servlet的框架的核心是:javax.Servlet.Servlet接口,所有的Servlet都必须实现这一接口.
Servlet接口!
Public interface Servlet {
Public abstract void destroy();
//释放Servlet所占用的全部资源(如:内存、线程等)
Public abstract ServletConfig getServletConfig();
//返回一个Servlet的设置对象,该对象包含了该Servlet的所有初始化参数和启动设置
Public abstract void init(ServletConfig) throws ServletException;
//初始化Servlet。
Public abstract void service(ServletRequest,ServletResponse)
throws ServletException IOException;
//执行一个来自客户端的请求
}
- HttpServlet类的方法
(1)service()
GenericServlet中的service() 方法
Public void service(ServletRequest request,ServletResponse response)
throws ServletException,IoException
HttpServlet中重写的service() 方法
Protected void service(HttpServletRequest request,HttpServletResponse response)
HttpServlet实现这个方法后就成为一个HTTP请求分发者。
service ()方法把请求代理给doXXX()方法。
(2)doXXX ()方法
方法doGet的格式如下:
protected void doGet ( HttpServletResquest request, HttpServletResponse response)
throws ServletException,IOException;
方法doPost的格式如下:
protected void doPost(HttpServletResquest request, HttpServletResponse response)
throws ServletException,IOException;
用来处理HTTP的POST请求,POST操作包含了必须通过此Servlet执行的请求中的数据。
4. Servlet的生命周期
Servlet的生命周期是服务器装载运行Servlet、接收来自客户端的多个请求并且返回数据给客户端、然后再删除移开Servlet的全过程。
(1) Servlet的初始化时期
当一个服务器装载Servlet时,它运行Servlet的 init() 方法。
public void init(ServletConfig config) throws ServletException
{
super.init(config); //一些初始化的操作,如数据库的连接
}
注意:
重载该方法时必须先调用super.init()。
init()方法不能反复调用,一旦调用就是重装载Servlet。
直到服务器调用destroy()方法卸载Servlet后才能再调用。
(2) Servlet的执行时期
Servlet调用service() 方法处理客户端的请求,并发回响应。
Servlet能同时运行多个service(),满足多线程安全(thread-safe)编程模式。
在Servlet执行期间,其最多的应用是处理客户端的请求并产生一个网页。
service(方法在上面已有所介绍)
(3) Servlet的结束时期
public void destroy()
{
//回收在init()中启用的资源,如关闭数据库的连接等
}
- JSP和Servlet
联系:
- 所有JSP文件在执行时都被转换成Servlet;JSP被转换成Servlet,再被编译为字节码文件,然后被装载入服务器执行。
- Servlet是JSP技术的基础,而且大型的Web应用程序开发需要Servlet和JSP配合才能完成。Servlet与JSP之间的交互为开发Web服务提供了优秀的解决方案。
区别:
- Servlet功能强大设计先进,但是输出HTML语句非常麻烦(out.print("< HTML>…</ HTML>"));JSP可以嵌套到HTML语句中,大大简化网页的设计和修改。
- JSP是HTML(或者XML)与Java代码结合的嵌套型语言;而Servlet则是纯Java类。
- JSP是以显示为中心的,它为Web显示开发人员提供了更加自然的开发模式。而Servlet不适宜开发显示内容改动频繁的页面,而在处理逻辑任务时,更多使用Servlet。
- JSP使人们把显示和逻辑分隔成为可能。Servlet没有将输出HTML语句和逻辑处理分离开。
- MVC三层结构:数据层、业务逻辑层和表示层。Servlet用来编写业务逻辑层;
JSP则主要是编写表示层而设计的;
-
JSP使用Servlet
<FORM>标签的ACTION属性中直接指定Servlet的URL地址;
通过<SERVLET>标签调用Servlet。
①在< FORM>标签中调用
<FORM METHOD="get" ACTION="/Servlet/myServlet">
……
</ FORM>
ACTION属性:用于调用 Servlet的 URL。
METHOD的属性:如果为 GET 方式则 Servlet必须使用 doGet() 方法。如果为 POST 方式则 必须使用 doPost()方法。
②在< SERVLET>标签中调用
<SERVLET NAME="myServlet" CODE="myServlet.class" CODEBASE="url" INITPARM1="value">
<PARAM NAME="parm1" VALUE="value">
</SERVLET>
NAME属性: Servlet的名称;
CODE属性: Servlet类名;
若仅有CODE,则创建NAME =CODE的Servlet实例;
若NAME和CODE都有,且NAME指定了一个现有 Servlet,则通常使用NAME中指定的Servlet;
CODEBASE是可选的,它指定了装入 Servlet的远程系统的URL。
INITPARM1是初始化参数名,value 是该参数的值。
可以指定多个“名称–值”对的集合。
利用 ServletConfig 对象(被传递到 Servlet的 init() 方法中)的 getInitParameterNames() 和 getInitParameter() 方法来查找参数名和参数值的字符串数组。
要获得有关用户的请求信息,可以使用 getParameterNames(),getParameter() 和 getParameterValues() 方法。
当使用 < SERVLET> 标签来调用 Servlet时,如同使用 < FORM> 标签一样,无需创建一个完整的 HTML 页面。
原始 HTML 页面中包含 < SERVLET> 和 < /SERVLET> 标签, Servlet将在这两个标签中被调用,且 Servlet的响应将覆盖这两个标签间的所有内容和标签本身。
-
Servlet访问JSP
getServletConfig().getServletContext().getRequestDispatcher ("/ServletUseJsp.jsp").forward(req,res);
-
Servlet程序与JSP不同,第一次访问时不能由服务器自动编译,同Java程序一样在运行前必须编译成 class 文件。
[例] 用Servlet完成在Web页面显示字符串“欢迎使用 Servlet!”
(1)编写WelCome.java程序
import java.io.*;
import javax.Servlet.*;
import javax.Servlet.http.*;
public class WelCome extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html; charset=gb2312");
PrintWriter out = response.getWriter();
out.println("<HTML><HEAD>");
out.println("<meta http-equiv=Content-Type content=text/html;
charset=gb2312>");
out.println("<TITLE>WelCome</TITLE></HEAD>");
out.println("<BODY>");
out.println("<FONT COLOR=red SIZE=4>欢迎使用 Servlet</FONT>");
out.println("</BODY></HTML>");
out.close();
} }
(2)生成字节码文件
(3)设置环境变量
(4)创建虚拟目录webapps
(5)设置class文件存放目录WEB-INF->web.xml->classes)
(6)修改web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd“ version="2.5">
<Servlet> //!!!
<Servlet-name>WelCome</Servlet-name>
<Servlet-class>WelCome</Servlet-class>
</Servlet>
<Servlet-mapping> //!!!
<Servlet-name>WelCome</Servlet-name>
<url-pattern>/WelCome</url-pattern>
</Servlet-mapping>
</web-app>
注意:Servlet2.5规范允许<url-pattern>子元素在<servlet-mapping>父元素中出现多次。
(7)运行WelCome
http://localhost:8080/myapp/WelCome
JavaBean
Java的Bean是一个可以复用的软件模型。
接口/抽象类
特点:
- JavaBean增强了现有代码的利用率。
- JavaBean提升了版本控制。
- JavaBean组件可以跨平台使用。
- JavaBean构成了JSP组件技术的核心。
- 在JSP中的JavaBean一般以不可见的组件为主。
- JavaBean是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象。
JavaBean有三个接口,可以独立进行开发。
- JavaBean的属性。
- 类的成员变量
- JavaBean的方法。
- 通常的Java方法,它可以从其他组件或在脚本环境中调用。
- JavaBean的事件。
- JavaBean与其他软件组件交流信息的主要方式是发送和接收事件
JavaBean的开发就是分别对它的三个接口进行开发的过程。
- JavaBean的属性
-
JavaBean的属性与面向对象语言中属性概念类似,但两者之间也存在区别。
- Java类中可以有公有(public)型成员变量,在类的外部可以直接存取这些成员变量;
- JavaBean的属性都是私有或保护(private or protected)型成员变量,从组件外部只能通过与该属性相关的一对访问方法(Accessor Method)来设置或读取属性的值。这对访问方法也被设置成为获取器(getter)和设置器(setter)。
-
JavaBean按照属性的不同作用分为4类:单值属性、索引属性、关联属性和限制属性。
① 单值属性(Simple属性)
单值属性的获取/设置方法的一般形式如下:get<PropertyName>() set<PropertyName>()
注意:布尔属性!
由于布尔值只有真假两个值;
JavaBean专门引入了布尔属性的获取器方法,即:
is<PropertyName>()
但布尔属性的设置方法仍为set< PropertyName>()形式。
② 索引属性(Indexed属性)
JavaBean API支持索引属性,这种属性与传统Java编程中的数组非常类似。
索引属性有两对访问方法:一对用于通过索引值获得和设置这个数组中的单一属性;另一对用于获得和设置整个属性数组。
③ 关联属性(Bound属性)
关联属性是指当该种属性值发生变化时,要通知其他的对象。
关联属性的值改变时就激活PropertyChange事件。
PropertyChange事件传递到其他的对象Bean,接收事件的JavaBean接着采取相应的动作。
public void addPropertyChangeListener(PropertyChangeListener l)
{ changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l)
{ changes.removePropertyChangeListener(l);
}
为开发工具所使用的
④ 限制属性(Constrained属性)
JavaBean的限制属性指属性值变化时,与这个属性已建立了某种连接的其他Java对象可否决属性值的改变。
限制属性的监听者通过抛出
PropertyVetoException来阻止该属性值的改变。
- JSP中使用JavaBean
法一:
<% carbean.CarBean myCar=new carbean.CarBean(); %>
法二:
<jsp:useBean id="myCar" class="carbean.CarBean" scope="application" />
(1)id="beanInstanceName"
表示JavaBean对象引用变量名,在JSP页面内声明为一个Java脚本变量。区分大小写,必须符合对标识符的Java命名规则。
(2)scope="page|request|session|application"
表示bean存在范围,可能值为以下4种:
page:对当前JSP页面有效,为默认值。
request:生命期和JSP程序中的request对象同步 。
session:在任意JSP页面或HTTP会话中的 Servlet执行期间有效。
application:在此Web应用中所有JSP页面或Servlet中有效。
JSP使用JavaBean经常用到以下3种标签:
<jsp:useBean>,<jsp:setProperty>和<jsp:getProperty>
注意:上述范围内的JavaBean均可使用pageContext变量的getAttribute()和setAttribute()方法访问。
在request,session或application范围内的JavaBean可以分别在Servlet中使用**ServletRequest,HttpSession和ServletContent类的getAttribute()和setAttribute()**方法访问。
< jsp:useBean>定位或创建JavaBean对象实例的过程怎样?
1、按照给定名字和范围试图定位一个JavaBean。
1.1、若JavaBean存在,将会在id所指的变量中储存这个JavaBean的引用。若JavaBean被指定类型则转化为相应的类型。
1.2、若JavaBean不存在,则会从指定的class实例化一个JavaBean组件,并在id所指的变量中储存这个JavaBean的引用。若class的名字代表的是一个模板,那么这个JavaBean被java.beans.Beans.instantiate实例化。
2、若< jsp:useBean>已经实例化了JavaBean,同时< jsp:useBean>与< /jsp:useBean>之间有代码,那么将会执行其中的代码。
-
< jsp:setProperty>标签用来设置已经实例化的Bean对象的属性。
<jsp:setProperty name = "JavaBean实例名" property = "*"/>或 <jsp:setProperty name = "JavaBean实例名" property = "JavaBean属性名" /> <jsp:setProperty name = "JavaBean实例名"
property = “JavaBean属性名” value = “BeanValue”/>
<jsp:setProperty name = "JavaBean实例名“
property = “propertyName” param = “request对象中的参数名”/> -
< jsp:getProperty>标签
负责检索JavaBean属性值。<jsp:getProperty name=" JavaBean实例名" property=“JavaBean属性名”/>