《Web编程技术》学习笔记(六)

本文介绍了Servlet的基本概念,包括其特点、结构和生命周期,并详细解释了Servlet接口和HTTPServlet类的方法。此外,还对比了Servlet与JSP的区别和联系,以及如何在JSP中使用Servlet。最后,介绍了JavaBean的概念及其在JSP中的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Servlet 与 JavaBean

Servlet

Servlet (java服务器小程序)是一个用 Java 编写的程序,此程序在服务器上运行以处理客户端请求
Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。

  • 特点
    • 采用Java代码编写;
    • 运行于服务器端;
    • 跨平台
    • 处理消息传递;
    • 结构简洁设计轻巧;
    • Servlet不适合处理复杂事务处理逻辑
    • Servlet主要负责处理小型任务;
  1. 结构
    Servlet可直接调用客户端访问请求,然后完成商业逻辑;
    Servlet可以接收客户的GET或POST请求;
    在这里插入图片描述
  • 用户编写的Servlet需要从HttpServlet 继承;
  • 在自定义的Servlet类内部重载doGet、doPost方法来处理客户端的GET/POST请求;
    • doGet和doPost方法都有两个参数,分别为HttpServletRequest 类型和HttpServletResponse 类型;
      • HttpServletRequest提供访问有关请求信息的方法。
      • HttpServletResponse提供指定HTTP应答状态、应答头的方法、PrintWriter()方法。
    • 注意定义doGet和doPost方法时的异常处理问题;
  • 必须导入java.io包、javax.Servlet包及javax.Servlet.http包;
  • doGet和doPost这两个方法是由service()方法调用的,有时可能需要直接覆盖service()方法;
  1. 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;
//执行一个来自客户端的请求
}

  1. 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()中启用的资源,如关闭数据库的连接等
}

  1. 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则主要是编写表示层而设计的;
  1. 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的响应将覆盖这两个标签间的所有内容和标签本身。

  1. Servlet访问JSP

    getServletConfig().getServletContext().getRequestDispatcher
    	("/ServletUseJsp.jsp").forward(req,res);
    
  2. 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一般以不可见的组件为主。
  1. JavaBean是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象。
    JavaBean有三个接口,可以独立进行开发。
  • JavaBean的属性。
    • 类的成员变量
  • JavaBean的方法。
    • 通常的Java方法,它可以从其他组件或在脚本环境中调用。
  • JavaBean的事件。
    • JavaBean与其他软件组件交流信息的主要方式是发送和接收事件

JavaBean的开发就是分别对它的三个接口进行开发的过程。

  1. 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来阻止该属性值的改变。

  1. 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属性名”/>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值