【JSP】第一课:Servlet的基础学习
文章目录
学习要求:
本章内容:
- Servlet的相关概念;
- Servlet的创建及使用;
- Servlet在项目中的应用。
重点内容:
- 掌握Servlet的创建及使用;
- 掌握如何配置web.xml文件;
- 掌握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在项目中实现对JSP项目的数据进行采集,传递给服务层处理,如果想要数据库支持,服务层将请求数据访问层dao,数据访问层dao对数据库进行操作,操作结束后将结果返回给数据访问层,数据访问层再将结果发送到服务层Service,服务层Service将执行结果告知Servlet,最后由Servlet传递给JSP页面,这样就完整地完成了一次“双工”的操作。
三、Servlet相关类
Servlet指的是HttpServlet类,它是抽象类,具有用来专门处理get数据请求的doGet方法和post数据请求的doPost方法。在实际使用过程中,可以对doGet方法或doPost方法进行重写操作。
- 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);
}
}
- 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功能操作的定义。
方法名 | 参数 | 返回类型 | 功能说明 |
---|---|---|---|
init | ServletConfig varl:配置参数 | void | Servlet初始化 |
getServletConfig | 无 | ServletConfig | 获取Servlet配置对象 |
service | ServletRequest varl:request请求对象; ServletResponse var2:response响应对象 | void | 响应客户端请求 |
getServletInfo | 无 | String | 获取Servlet相关信息 |
destroy | 无 | void | Servlet对象销毁 |
四、Servlet类定义方式(重点)
开发Servlet有三种方式:
- 实现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类来实现。
- 继承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的其他接口。
-
继承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这个子标签中的虚拟地址命名一共有三种方法:
- 完全匹配:书写形式——必须以“/”开始。例如:/abc等;
- 目录匹配(路径匹配):书写形式——必须以“/”开始,以“”结束。例如:/ * ,其中的表示的是零个或者若干个任意字符;
- 后缀名匹配:书写形式——必须以“”开始,以字符结束。例如:.do等。
注意:其优先级为——完全匹配 > 目录匹配 > 后缀名匹配。
七、load-on-startup详解
它是Servlet标签中的一个子标签,其作用是用来修改Servlet的初始化时机。
取值:
- 它的值必须是一个整数,表示Servlet被加载的先后顺序;
- 如果值为正整数或者0时,表示在应用启动时就加载并初始化Servlet。
- 当值为0或大于0时,表示web项目一发布就加载该Servlet并执行inti方法;
- 当是一个负数或者没有指定时,则指示容器在该Servlet被选择时才加载创建DispatcherServlet对象执行init方法;
- 正数的值越小,启动该servlet的优先级越高。
注:值越小,加载的优先级越高,就越先被加载,值相同时,容器就会自己选择顺序来加载。
八、Servlet中的Java注解
首先我们先稍微了解一下什么是Java注解!
1、概念
Java注解:说明程序的,给计算机看的。注解也叫元数据,是一种代码级别的说明,与类、接口、枚举在同一层次。它可以声明在包、类、字段、局部变量、方法参数等的前面,用来对这些元素进行说明、解释。
2、分类
2.1、按作用分类
- 编写文档:通过代码里标识的注解生成文档。如:生成doc文档;
- 代码分析:通过代码里标识的注解对代码进行分析。如:通过反射;
- 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查。如:@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学习总结
- 我们需要知道Servlet是属于Java中的类,而不属于JSP中;
- 我们要学会如何去创建一个Servlet,同时也要知道Servlet中的五个方法分别代表的是什么;
- 理解并记住Servlet的生命周期;
- 学会如何配置web.xml配置文件,并且要掌握设置虚拟地址的三种方式——完全匹配 > 目录匹配 > 后缀名匹配。(优先级从大到小)
- 了解load-on-startup标签的使用和含义;
- 最后要掌握使用Java注解的方式来创建Servlet,同时知道什么是Java注解。