【JSP】第一课:Servlet的基础学习

【JSP】第一课:Servlet的基础学习


学习要求:

本章内容:

  1. Servlet的相关概念;
  2. Servlet的创建及使用;
  3. Servlet在项目中的应用。

重点内容:

  1. 掌握Servlet的创建及使用;
  2. 掌握如何配置web.xml文件;
  3. 掌握Servlet在项目中的应用。

难点:Servlet在项目中的应用。


一、Servlet的介绍

Java中的Servlet是指运行的Web服务器上的程序,它可以:

  • 获取来自页面上的各种信息;
  • 将服务器上的各种信息发送到客户端;
  • 动态创建网页;
  • 将JSP页面中的页面标签与Java代码完全分离。

Servlet是在JSP之前就存在的运行在服务器端的一种Java技术,它是用Java语言编写的服务器端程序,具有独立于平台和协议的特效(可在多种系统平台和服务器平台j下运行)、功能强大、安全、可扩展和灵活等优点。Java语言能够实现的功能,Servlet基本上都可以实现(除图形页面)。Servlet主要用于处理HTTP请求,并将处理的结果传递给浏览器生成动态Web页面。

Servlet存在的缺陷:它不能将页面显示的代码和逻辑处理的代码进行有效的隔离。

在JSP中用到的Servlet通常都继承自javax.Servlet.HttpServlet类,在该类中实现了用来处理HTTP请求的大部分功能。


二、Servlet相关知识

Java中的Servlet是指运行在Web服务器上的程序,它可以:

  • 获取来自页面上的各种信息;
  • 将服务器上的各种信息发送到客户端;
  • 动态创建网页;
  • 将JSP页面中的页面标签与Java代码完全分离。

Servlet是Java中的类,可以在类中调用JSP的各种内置对象,它是Web页面与后台Java程序之间的中间件,通过它可以将用户页面上的各种信息传给后台处理程序,后台处理程序的处理结果也可以通过Servlet响应到客户端页面。如下图是描述Servlet在项目处理中的作用:

Servlet在项目处理中的作用

由图可知:Servlet在项目中实现对JSP项目的数据进行采集,传递给服务层处理,如果想要数据库支持,服务层将请求数据访问层dao,数据访问层dao对数据库进行操作,操作结束后将结果返回给数据访问层,数据访问层再将结果发送到服务层Service,服务层Service将执行结果告知Servlet,最后由Servlet传递给JSP页面,这样就完整地完成了一次“双工”的操作。


三、Servlet相关类

Servlet指的是HttpServlet类,它是抽象类,具有用来专门处理get数据请求的doGet方法和post数据请求的doPost方法。在实际使用过程中,可以对doGet方法或doPost方法进行重写操作。

  1. doGet方法语法定义格式:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
	String protocol = req.getProtocol();
	String msg = lStrings.getString("http.method_get_not_supported");
	if(protocol.endsWith("1.1")){
		resp.sendError(405, msg);
	}else{
		resp.sendError(400, msg);
	}
}
  1. doPost方法语法定义格式:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
	String protocol = req.getProtocol();
	String msg = lStrings.getString("http.method_get_not_supported");
	if(protocol.endsWith("1.1")){
		resp.sendError(405, msg);
	}else{
		resp.sendError(400, msg);
	}
}

3.1、重要知识点:

了解了如何去定义doGet方法和doPost方法后,那么就要知道Get请求与Post请求的区别!

Get请求与Post请求的区别:

Get请求发送的数据是会以?隔开,而?后面就是要发给服务器的数据,文本框的名称=文本框上的数据。当使用Get请求发送多个数据的时候,地址上多个数据之间是用&连接符拼接的。

补充:当项目成功运行后但没有显示对应的网址,要查看结果就要将访问地址写出来。

http:// IP地址(自己电脑上本地的IP地址是127.0.0.1或者localhost;如果要访问他人的电脑,就要使用相对应的IP地址【查看IP地址的方法——在黑窗口中输入ipconfig即可】;8080为tomcat的默认端口号;然后是项目名;最后是虚拟地址。)

Post请求发送数据是不会将数据明文显示在地址上;

登录功能不允许使用Get,浏览器发送高度保密的数据的时候,绝对不能使用Get请求。(因为这样会导致重要且保密的数据被他人知道)

Get请求只能发送少量的数据给服务端(get请求发生数据给Servlet时,地址上拼接数据的长度是有限的,1kb——512字符);

Post请求发送数据是不受限制的。

Post用于文件上传(一般使用post请求做向服务器上传数据);

Get用于下载数据(一般使用get请求做从服务器上获得数据,也可以使用get请求发生少量的数据,但是不建议使用get请求发送需要保证数据安全性的信息)。

注意:如果地址上出现?隔开并且后面携带看数据,那么就是一定是get请求;如果地址上没有携带数据,则不一定就是post请求。当浏览器没有明确区分使用get请求还是post请求的时候,默认使用get请求!(记住!)

3.2、重要知识点:

Servlet存在生命周期,在创建Servlet对象时,会调用其方法init,在Servlet运行期间,调用其方法service,Servlet销毁时调用其方法destory。如下所示:

浏览器第一次访问这个Servlet的时候,程序首先通过执行构造方法来创建Servlet对象;之后就想要调用init方法来使Servlet初始化(记住:init方法仅在实例化Servlet对象之后才能执行,并且该方法只能执行一次);然后为了实现响应客户端请求就想要调用service方法;最后Servlet销毁,JVM进行垃圾回收,只会调用一次destory方法,即Servlet生命周期结束时调用。

总结:Servlet只会被创建一次,并且也只会在第一次的时候初始化数据,不管浏览器访问Servlet多少次,访问执行的是同一个Servlet对象。(注:在同一个类中创建不同的对象的时候,使用对象中的变量是相互独立的;而同一个类中创建相同的对象的时候,执行的时候调用的是同一个变量。

3.3、Servlet类的描述:

Servlet(中文:服务小应用程序),它是一个接口,所以想要运用它就必须去实现它。Servlet主要用于提供Servlet功能操作的定义。

方法名参数返回类型功能说明
initServletConfig varl:配置参数voidServlet初始化
getServletConfigServletConfig获取Servlet配置对象
serviceServletRequest varl:request请求对象; ServletResponse var2:response响应对象void响应客户端请求
getServletInfoString获取Servlet相关信息
destroyvoidServlet对象销毁

四、Servlet类定义方式(重点)

开发Servlet有三种方式:

  1. 实现Servlet接口

语法格式:

package com.servlet.Review;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstReview implements Servlet{

	@Override
	public void destroy() {		//该方法是用来实现Servlet对象销毁
	}

	@Override
	public ServletConfig getServletConfig() {	//该方法是用来实现获取Servlet配置对象
		return null;
	}

	@Override
	public String getServletInfo() {	//该方法是用来实现获取Servlet相关信息
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {	//该方法是用来实现Servlet的初始化
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {	//该方法是用来实现响应客户端请求
	}

}

通过以上的代码可以知道,直接去实现Servlet接口是需要在子类中实现接口中的所有方法,这很麻烦。那么,如果只使用service方法,则可以使用第二种方法——通过继承GenericServlet类来实现。

  1. 继承GenericServlet

语法格式:

package com.servlet.ywk;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SecondServlet extends GenericServlet {

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("当前Servlet处于运行状态");
	}

}

可以发现,通过继承GenericServlet类的方式更加简单,只有实现父类中的service接口即可。GenericServlet抽象类中实现了Servlet的其他接口。

  1. 继承HttpServlet

    语法格式:

    package com.servlet.ywk;
    
    import javax.Servlet.http.HttpServlet;
    
    public class ServletTest extends HtppServlet{}
    

通过直接继承HttpServlet的方式比继承GenericServlet更加简单,HttpServlet父类已经全部实现了接口Servlet子类不再需要实现父类中的任何方法,但在实际使用HttpServlet继承方式时,一般子类都需要重写父类中的doGet方法或doPost方法。如果采用get数据交互方式,则重写doGet方法,而采用post数据交互方式则需要重写doPost方法。


五、基于Servlet用户登录

Servlet自定义业务类的创建及使用想要三个步骤:

在这里插入图片描述

由图可以知道Servlet类的定义及对象创建需要三个步骤:

  • 首先,根据三种不同的Servlet定义方式,选择一种定义Servlet类;
  • 其次,Servlet对象的创建不需要通过new实例化,而是通过Web项目中的web.xml文件进行配置的;
  • 最后,配置客户端请求的映射地址,同样在web.xml文件中的Servlet-mapping节点,其下有子节点Servlet-name和Servlet-url,分别表示Servlet对象名称和客户端映射地址。请注意:这里的Servlet-name值要与Servlet节点中的Servlet-name值一致,否则映射的地址无法找到Servlet处理程序。

Servlet中web.xml的配置参考格式:

<Servlet>
	<Servlet-name>Servlet对象名称</Servlet-name>
	<Servlet-class>Servlet类名称,含完整包名</Servlet-class>
</Servlet>
<Servlet-mapping>
	<Servlet-name>Servlet对象名称</Servlet-name>
	<url-pattern>虚拟地址</url-pattern>
</Servlet-mapping>

六、url-pattern详解

对于url-pattern这个子标签中的虚拟地址命名一共有三种方法:

  1. 完全匹配:书写形式——必须以“/”开始。例如:/abc等;
  2. 目录匹配(路径匹配):书写形式——必须以“/”开始,以“”结束。例如:/ * ,其中的表示的是零个或者若干个任意字符;
  3. 后缀名匹配:书写形式——必须以“”开始,以字符结束。例如:.do等。

注意:其优先级为——完全匹配 > 目录匹配 > 后缀名匹配。


七、load-on-startup详解

它是Servlet标签中的一个子标签,其作用是用来修改Servlet的初始化时机。

取值:

  1. 它的值必须是一个整数,表示Servlet被加载的先后顺序;
  2. 如果值为正整数或者0时,表示在应用启动时就加载并初始化Servlet。
  3. 当值为0或大于0时,表示web项目一发布就加载该Servlet并执行inti方法;
  4. 当是一个负数或者没有指定时,则指示容器在该Servlet被选择时才加载创建DispatcherServlet对象执行init方法;
  5. 正数的值越小,启动该servlet的优先级越高。

注:值越小,加载的优先级越高,就越先被加载,值相同时,容器就会自己选择顺序来加载。


八、Servlet中的Java注解

首先我们先稍微了解一下什么是Java注解!

1、概念

Java注解:说明程序的,给计算机看的。注解也叫元数据,是一种代码级别的说明,与类、接口、枚举在同一层次。它可以声明在包、类、字段、局部变量、方法参数等的前面,用来对这些元素进行说明、解释。

2、分类

2.1、按作用分类

  1. 编写文档:通过代码里标识的注解生成文档。如:生成doc文档;
  2. 代码分析:通过代码里标识的注解对代码进行分析。如:通过反射;
  3. 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查。如:@Overrider注解。

我们知道了三种Servlet类定义的方式,但是这些方式都是比较麻烦的。于是乎,就有一种更简便的方式去创建Servlet类(这也将是之后创建Servlet的常用方式,前面的都是过渡的)。

这种创建方式与使用HttpServlet的区别在于:多了个@WebServlet(urlPatterns = “/mmm”)并且不需要在web.xml中进行注册。这个便是Java注解,其中urlPatterns = "/mmm"等价于/mmm。很明显,这种创建方式明显简便多了!

代码如下(示例):

package com.servlet.MeServlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = "/one")
public class OneServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("servlet当前处于运行状态!");
    }
}


九、Servlet学习总结

  1. 我们需要知道Servlet是属于Java中的类,而不属于JSP中;
  2. 我们要学会如何去创建一个Servlet,同时也要知道Servlet中的五个方法分别代表的是什么;
  3. 理解并记住Servlet的生命周期;
  4. 学会如何配置web.xml配置文件,并且要掌握设置虚拟地址的三种方式——完全匹配 > 目录匹配 > 后缀名匹配。(优先级从大到小)
  5. 了解load-on-startup标签的使用和含义;
  6. 最后要掌握使用Java注解的方式来创建Servlet,同时知道什么是Java注解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值