Servlet
程序员文章站
2022-03-11 21:56:29
...
1.1 Servlet的基本概述:
- Servlet运行在服务端(Tomcat服务器)的java小程序,是Sun公司提供的一套规范,用来处理客户端请求、响应给浏览器的动态web资源技术。但Servlet的实质就是java程序,只不过Servlet程序实现了Servlet的接口而已,通过java的API动态的向客户端输出内容。
- 任何类只要实现了Servlet接口,都可以称作为Servlet。
1.1.1 Servlet与普通的java程序的区别:
- 普通的java类需要有main方法才可以运行,Servlet程序是由Tomcat服务器调用的,不需要main方法。
- 普通的java类不能接收用户的请求数据与响应数据给浏览器,Servlet可以接收用户的请求数据并且可以向浏览器输出数据。
1.2 Servlet2.5实现HelloWorld的例子:
- 如果需要实现一个Servlet,那么只需要编写一个类实现Servlet的接口即可,任何类只要实现了Servlet的接口,都可以被称作为Servlet的程序。
步骤:
- 1.先创建一个web的module。
- 2.项目的目录结构介绍:
- 3.在src目录下创建Servlet程序。自定义一个类实现Servlet接口,并且要实现Servlet接口的所有方法。
- 4.那你的业务逻辑编写在Service方法内部,其它方法留空即可。
package com.sunny.web;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
/*
request:代表了用户的请求,用户的所有请求信息都封装到该对象中。
response:代表了服务器给浏览器的响应信息。
*/
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//需求:向浏览器输出:您好,Servlet
//解决向浏览器输出中文乱码的问题
servletResponse.setContentType("text/html;charset=utf-8");
//通过response得到向浏览器输出的字符流对象
PrintWriter out = servletResponse.getWriter();
//使用流向浏览器输出数据
out.write("helloworld");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- 5.在web.xml文件上配置Servlet与URL的映射路径。
<?xml version="1.0" encoding="UTF-8"?>
<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>
<!--给Servlet起一个别名-->
<servlet-name>demo01</servlet-name>
<!--Servlet的完整路径 Servlet的完整路径=包名+类名-->
<servlet-class>com.sunny.web.ServletDemo</servlet-class>
</servlet>
<!--配置Servlet的映射信息-->
<servlet-mapping>
<servlet-name>demo01</servlet-name>
<!--配置Servlet的映射路径,映射路径一定要以“/”开头-->
<url-pattern>/aaa</url-pattern>
</servlet-mapping>
</web-app>
- 6.让Tomcat关联模块(工程),部署项目。
- 7.启动Tomcat服务器,并访问。
2.1 Servlet3.0实现HelloWorld的例子
2.1.1 Servlet2.5与3.0的区别:
- Servlet3.0相较于Servlet2.5:新增了一些注解,简化了javaWeb代码开发,可以省略web.xml配置文件,支持异步处理(多线程技术)支持可插性特性(书写的代码编译后生产的class文件可以直接部署到其它项目的,自动加载执行)
2.1.2 代码实现Servlet3.0步骤:(注解配置Servlet)
- 步骤:1.创建web工程,选择JavaEE规范7及以上。
- 2.自定义一个类实现Servlet接口,并且实现Servlet接口的所有方法。
- 3.把自己业务逻辑编写在Srvice方法中。
- 4.使用webServlet注解配置Servlet的映射路径。
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
/*
配置Servlet的映射路径
name就相当于Servlet-name别名,如果只有urlpattern存在的时候,可以省略urlpattern不写。
*/
@WebServlet(name = "demo",urlPatterns = "/abc")
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
PrintWriter out = servletResponse.getWriter();
out.write("helloworld");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
5.部署项目
6.启动Tomcat服务器,并访问
6.启动Tomcat服务器并访问
3.1Servlet的生命周期(在现实开发中基本上不会用到,面试题)
3.1.1 与Servlet生命周期相关的方法:
方法 | 作用 | 运行次数 |
构造方法 | 在对象实例化的时候执行 | 1次 |
|
Servlet被创建的时候调用 | 1次 |
|
每次客户端请求都会执行 | n次 |
|
在服务器关闭的时候 | 1次 |
3.1.2 Servlet的运行过程:
- 浏览器发送请求,tomcat接收到请求的地址。通过请求地址找到访问哪个项目,通过最后/day27_02,找项目中所有的Servlet
- 通过反射读取每个Servlet中的注解值,匹配到/cicle,找到了需要访问的servlet。
- 通过反射实例化这个Servlet对象
- 创建request和response对象
- 并且调用service方法,将request和response对象传递进来。
- 执行servlet中的代码
- 将响应的信息封装成response对象返回到浏览器,在浏览器上显示出来。
package com.sunny.lifecicle;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/cicle")
public class CycleServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("servlet对象创建了,init方法被调用了");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("用户请求过来了,调用了service方法");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("servlet对象被销毁了,destory方法被调用了");
}
}
- init在Servlet创建的时候调用,Servlet对象是在第一次访问的时候创建。(只会调用一次)
- 每次用户的请求过来的时候都会调用service方法。(n次)
- 重新部署项目或是重启服务器的时候会调用destory方法。
面试题目:创建一个Servlet,该Servlet被访问了2次,请问init方法被调用了多少次,service方法被调用了多少次?
servlet的设计是采用单例设计模式,Servlet对象在内存中只有一个对象,所以不管你访问了Servlet多少次,都只会调用1次init方法。
1.init方法被调用了1次。
2.service方法被调用了2次。
- Servlet运行原理的要点:
- Servlet对象由Tomcat服务器创建的。
- request,response也是由Tomcat服务器创建的,而且request代表了请求信息,response代表了响应信息。
- service方法也是由Tomcat服务器调用的。
4.1Servlet的继承体系
4.1.1 Servlet继续体系的目的:
- 当创建Servlet 程序的时候,需要实现Servlet的接口,实现Servlet接口的时候需要把Servlet接口的所有方法都实现,但是我们只需要使用Service方法,所以创建的时候比较麻烦。
4.1.2 Servlet继承体系:
- Servlet接口。
- GenericServlet 该类实现了Servlet接口了。
- HTTPServlet对于get方式提交数据的时候调用了doGet方法,对于post方式提交的时候会调用doPost方法。
4.1.3 GenericServlet代码演示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h3>=======get方式提交======</h3>
<form action="/ServletTest04/test01" method="get">
用户名:<input type="text" name="userName"/>
<input type="submit" value="提交"/>
</form>
<h3>=======post方式提交======</h3>
<form action="/ServletTest04/test01" method="post">
用户名:<input type="text" name="userName"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/test01")
public class ServletDemo02 extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
/* //解决中文乱码问题
response.setContentType("text/html;charset=utf-8");
//获取输出流
PrintWriter out = response.getWriter();
//向浏览器输出
out.write("hello,GenericServlet");*/
System.out.println("service方法被调用了...");
}
}
- 现象:不管是浏览器使用的get方式提交的数据还是post方式提交的数据,都会调用service方法处理。
- 弊端:在实际开发的过程中有时候我们对于get与post的提交数据是有着不同的处理方式,比如:提交的数据是中文,如果需要解决中文乱码问题,那么get与post的解决方式就不一样。
4.1.4 使用HTTPServlet创建:
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(name = "ServletDemo03")
public class ServletDemo03 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost方法被调用了...");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet方法被调用了...");
}
}
5.1 修改Servlet的模板:
推荐阅读
-
聊聊在Servlet中怎么上传文件
-
Java Servlet 运行原理分析
-
Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】
-
jsp内置对象pageContext如何在Servlet中获取值?
-
Servlet转发到JSP页面出现路径问题怎么办?
-
CGI和servlet运行方式本质的区别是什么?PHP和Java在Web开发的原理有哪些本质不同?
-
php有没有像jsp里头的servlet处理机制?这样处理又有什么好处
-
servlet执行update报错ORA-12518
-
快速建立Servlet和JSP的运行、调试和编译环境
-
解决无法解析javax.servlet的方法