Servlet从入门到精通(超级详细!)

目录
  • 概述
  • 入门案例
    • 创建Servlet程序
    • 注解方式配置Servlet程序
    • 配置文件方式配置Servlet程序(提供web.xml)
    • 测试
  • Servlet的继承结构
  • Servlet的生命周期
    • init() 方法
    • service() 方法
    • doGet() 方法
    • doPost() 方法
    • destroy() 方法
  • Request
    • 概述
    • 测试
    • 请求转发
  • Response
    • 概述
    • 测试
    • 重定向
  • 扩展:在web工程里使用Servlet程序 在IDEA里创建一个web工程
  • 扩展案例
  • 总结

概述

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成 动态Web内容。这个过程为:

1,客户端发送请求至服务器端

2,服务器将请求信息发送至 Servlet

3,Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求

4,服务器将响应返回给客户端

Servlet 看起来像是通常的 Java 程序。Servlet 需要导入特定的属于 Java Servlet API 的包。

Servlet有三种实现方式:实现Servlet接口, 继承抽象类GenericServlet, 继承HttpServlet

入门案例

创建Servlet程序

选中src-右键-New-Create New Servlet-输入Servlet类的名字和包名-ok

package cn.tedu.test;
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 = "MyServlet")
public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向浏览器响应指定内容
        response.getWriter().write("hello servlet");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);//调用doPost()
    }
}

注解方式配置Servlet程序

1,直接在Servlet类上加一个注解就可以了

//Servlet程序想要别浏览器访问,使用@WebServlet规定了浏览器的访问方式
@WebServlet("/hello/Servlet1")

2,打开浏览器直接访问这个Servlet就可以了

http://localhost:8080/hello/Servlet1

配置文件方式配置Servlet程序(提供web.xml)

在Servlet3.0版本中,被@WebServlet注解代替,如:@WebServlet("/myservlet")括号中,就可以规定访问方式

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--这是Servlet程序的核心配置文件,IDEA不会自动帮我们配置,只能自己来配置的,主要是规定浏览器的访问方式-->
    <servlet>
        <servlet-name>myservlet</servlet-name>
        <!--Servlet类的全路径-->
        <servlet-class>cn.tedu.test.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myservlet</servlet-name>
        <!--规定了浏览器的访问方式-->
        <url-pattern>/myservlet</url-pattern>
    </servlet-mapping>
</web-app>

测试

你写个HTML网页测试也可以的

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<form action="http://localhost:8080/cgbservletjava01_war_exploded/a/b/x" method="post">
			<input type="text" name="username">
			<br>
			<input type="submit" value="提交">
		</form>
	</body>
</html>

Servlet的继承结构

Servlet的生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 重要阶段遵循的过程:

1,初始化阶段 调用init()方法

2,响应客户请求阶段 调用service()方法

3,终止阶段 调用destroy()方法

最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

init() 方法

init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

service() 方法

它是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。

service() 方法会检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法,service() 方法由容器调用,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

doGet() 和 doPost() 方法是每次服务请求中最常用的方法。

doGet() 方法

GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。

doPost() 方法

POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

destroy() 方法

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

Request

概述

Request对象用来解析请求参数,当浏览器访问服务器时,携带着一些请求参数,可以通过Servlet提供的Request对象提供的API来解析请求参数
请求对象有两个:

ServletRequest
httpServletRequest

常用的方法:

getParameter("参数名")--根据参数名获取参数的值
getParameterValues()--获取到所有参数的值并存入数组
setCharacterEncoding()--设置请求的字符编码方式
getCharacterEncoding()--返回字符编码方式
setAttribute(String,Object)    存储此请求中的属性
getAttribute(String name)    返回指定属性的属性值

测试

前端HTML程序

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>

		<a href="http://localhost:8080/cgbservletjava01_war_exploded/FormServlet?name=张三&addr=北京">点我提交get数据</a>

		<form action="http://localhost:8080/cgbservletjava01_war_exploded/FormServlet" method="post">
			用户名:
			<input type="text" name="username">
			<br />
			爱好:
			<input type="checkbox" name="hobby" value="篮球"/>篮球
			<input type="checkbox" name="hobby" value="足球"/>足球
			<input type="checkbox" name="hobby" value="乒乓球"/>乒乓球
			<br />
			<input type="submit" value="提交">
		</form>
	</body>
</html>

后端java程序

package cn.tedu.req;

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;
import java.util.Arrays;

@WebServlet(name = "FormServlet")
public class FormServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //请求参数中,包含中文时,post必须配置
//        request.setCharacterEncoding("utf-8");
        //获取请求参数
        //方式1:根据参数名获取一个值
        String name = request.getParameter("username");
        System.out.println("name = " + name);
        //方式2:根据参数名获取所有值,并返回数组
        String[] likes = request.getParameterValues("hobby");
        System.out.println("hobby = " + Arrays.toString(likes));
        //给浏览器做出响应
        response.getWriter().print("dopost..success!");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String addr = request.getParameter("addr");
        System.out.println("doget..."+name+addr);
    }
}

请求转发

概述

请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中的某一个资源时,该资源将请求转交给另外一个资源进行处理的过程,就叫做请求转发,具有以下特点:

1,请求转发整个过程是一次请求、一次响应

2,请求转发前后,浏览器地址栏地址不会发生变化(浏览器–访问–>A–转发–>B,地址栏地址始终指向A的地址)

3,请求转发前后的request对象是同一个

4,转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发

5,使用代码: request.getRequestDispatcher(访问目的资源的路径).forward(request,response);

6,也可以使用 setAttribute()/getAttribute()来验证

测试过程

Response

概述

Response是代表Http响应信息的对象,其中将会封装服务器要发送给浏览器的响应信息,将response对象作为参数传递给service方法,在service方法处理请求的过程中,可以将要发送给浏览器的数据,先写入response对象中,在service方法执行完后,服务器负责从response对象中获取到响应信息,再按照http响应信息的格式组织成响应消息,发送给浏览器。

常用的方法:

setContentType("参数名")--设置响应的字符编码方式
sendRedirect()--完成重定向
getOutputStream()--获取字节输出流
getWriter()--获取字符输出流
setHeader("Access-Control-Allow-Origin", "*"); --专门用来解决跨域问题

测试

package cn.tedu.resp;

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 = "RespServlet")
public class RespServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //响应数据中包含中文,会乱码,用以下代码指定编码,缓冲字符输出流内部有一个缓冲区,这个缓冲区的默认字符集是ISO-8859-1
        response.setContentType("text/html;charset=utf-8");
        //给浏览器响应数据
        response.getWriter().write("你好123");
    }
}

重定向

概述

当浏览器向服务器发送请求访问某一个资源A时,资源A在响应时通知浏览器需要再进一步请求才能获取到对应的资源,浏览器再次向服务器发送请求访问资源B,最终是由资源B响应浏览器要获取的数据,这个过程叫做重定向,具有以下特点:

1,重定向前后是两次请求、两次响应

2,重定向前后,浏览器地址栏地址会发生变化(因为两次请求都是通过浏览器发起,浏览器知道这个跳转过程,因此地址栏地址会发生变化)。

3,重定向前后的request对象不是同一个 (因此重定向前后是两次请求,服务器根据两次请求会创建两个request对象,因此request对象不是同一个)

4,重定向前后的两个资源可以来自不同的Web应用,甚至可以是来自不同的虚拟主机或者服务器。

5,使用代码: response.sendRedirect(“重定向到资源的路径”);

测试

观察,一开始是访问A资源,服务器内部重定向后,地址栏已经变成了B资源的访问方式了.是两次请求两次响应

package cn.tedu.resp;

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 = "RedirectServlet")
public class RedirectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //重定向的地址,可以随意设置,不是必须在同一工程中
 //response.sendRedirect("http://localhost:8080/cgbservletjava01_war_exploded/RespServlet");
        response.sendRedirect("https://www.baidu.com/");
    }
}

扩展:在web工程里使用Servlet程序 在IDEA里创建一个web工程

File-New-Project-选Java Enterprise并勾选右侧的Web Application-next-输入工程名称-Finish

整理web工程目录结构

修改资源输出位置

修改jar包存放位置

配置Tomcat服务器

略,详情见Tomcat服务器的内容

扩展案例

创建前端网页

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>

		<script src="https://unpkg.com/vue/dist/vue.js"></script>
		<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
		<script src="https://unpkg.com/element-ui/lib/index.js"></script>
		<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
	</head>
	<body>
		<div id="app">
			<el-button type="danger" @click="get()">点我</el-button>

			<el-input v-model="name"></el-input>
			<el-input v-model="id"></el-input>
		</div>
		<script>
			new Vue({
				el:"#app",
				data(){
					return{
						name:'',
						id:''
					}
				},
				methods:{
					get(){
						// axios.get("http://localhost:8080/axios/t3?id=10&name=jack").then(
						axios.get("http://localhost:8080/axios/t3",{
							params:{
								id:10,
								name:'jack'
							}
						}).then(
							a=>{
								console.log(a);
								console.log(a.data);
								this.id=a.data.id;
								this.name=a.data.name;
							}
						)
					}
				}
			})
		</script>
	</body>
</html>

创建Servlet程序

package cn.tedu.cgb2110boot03.test;

import com.alibaba.fastjson.JSON;

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("/axios/t3")
public class ServletT3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(111);
                response.setHeader("Access-Control-Allow-Origin", "*");
        String id = request.getParameter("id");
        String name = request.getParameter("name");
//        {"id":"10","name":"jack"}
//        "{\"id\":\"10\",\"name\":\"jack\"}"
        String json="{\"id\":\""+id+"\",\"name\":\""+name+"\"}";
        response.getWriter().write(json);
    }
}

总结

到此这篇关于Servlet从入门到精通的文章就介绍到这了,更多相关Servlet入门内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Servlet第一个项目的发布(入门)

    创建发布web项目 具体步骤: 1.在开发工具中创建一个dynamic web project helloword 2.在webContent中创建index.html文件 3.发布web应用到服务器,发布应用有两种方式: 方式1:手动发布 (开发期间极少使用,项目向生产环境发布时使用) 将workspace中web项目下WebContent目录中的文件复制到服务器webapps目录下,并在此目录 中创建新的helloword根目录. 方式2:自动发布 自动将web应用发布到web服务器下,需要

  • javaWeb使用servlet搭建服务器入门

    百度百科说法: Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容. 通俗讲法: 是运行在服务器端的一小段Java程序,接受和响应从客户端发送的请求 作用: 处理客户端请求,并且对请求做出响应 编写一个serclet步骤 1.编写一个类 继承自HttpServlet 重写doGet和doPost方法 2.编写配置文件(web.xml) 先注册后绑定 3.访问

  • 详解Servlet入门级设置(超详细 IDEA2020版)

    第一次用IntelliJ IDEA写java代码,之前都是用eclipse,但eclipse太老了. 下面为兄弟们奉上IntelliJ IDEA创建Servlet方法,写这个的目的也是因为很多视频教程还在用2017版的IDEA(并不是针对大家用老版本,只是吐槽一下版本更新迭代),所以把我走过的坑和弯路直接告诉兄弟们,为大家节省点宝贵的时间. 说一下现在创建Servlet或者是web和之前的主要区别,之前是直接创建,现在是先要创建java项目 然后通过添加支持框架变成Servlet或者web项目

  • Servlet从入门到精通(超级详细!)

    目录 概述 入门案例 创建Servlet程序 注解方式配置Servlet程序 配置文件方式配置Servlet程序(提供web.xml) 测试 Servlet的继承结构 Servlet的生命周期 init() 方法 service() 方法 doGet() 方法 doPost() 方法 destroy() 方法 Request 概述 测试 请求转发 Response 概述 测试 重定向 扩展:在web工程里使用Servlet程序 在IDEA里创建一个web工程 扩展案例 总结 概述 Servlet

  • Mybatis实战教程之入门到精通(经典)

    什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 ses

  • for 语句从入门到精通

    for语句从入门到精通 一 前言 二 for语句的基本用法 三 for /f 含变量延迟 四 for /r 五 for /d 六 for /l 一.前言 在批处理中,for是最为强大的命令语句,它的出现,使得解析文本内容.遍历文件路径.数值递增/递减等操作成为可能:配合if.call.goto等流程控制语句,更是可以实现脚本复杂的自动化.智能化操作:合理使用for语句,还能使代码大为简化,免除各位编写大量重复语句之苦.而能否熟练使用for语句,已经成为衡量一个人批处理水平高低最主要的标准. 在这

  • Java 异常处理小结,从入门到精通

    内置异常和Throwable核心方法 Java内置异常可查异常(必须要在方法里面捕获或者抛出) ClassNoFoundException 应⽤程序试图加载类,找不到对应的类 IllegalAccessException 拒绝访问⼀个类的时候 NoSuchFieldExcetion 请求的变量不存在 NoSuchMethodException ⽅法不存在 不可查异常 ArrayIndexOutOfBoundsException 数组索引越界 ClassCastException 强制失败抛出异常

  • java多线程从入门到精通看这篇就够了

    目录 一.认识线程及线程的创建 1.线程的概念 2.线程的特性 3.线程的创建方式 <1>继承Thread类 <2>实现Runnable接口 <3>实现Callable接口 二.线程的常用方法 1.构造方法和属性的获取方法 2.常用方法 <1>run()和start() <2>interrupt()方法 <3>join方法 <4>获取当前线程的引用currentThread();方法 <5>休眠当前线程slee

  • idea构建web项目的超级详细教程

    目录 1.idea构建web项目 1.新建一个空项目 2.新建java模块,名为webDemo1 3.选择webDemo1右键,选择Add Framework Support 4.在WEB-INF下新建文件夹classes和lib 5.打开项目结构(Project Structure) 6.项目配置 7.模块配置 8.Facets配置,这里制定了web目录不是一个普通的文件夹,而是web项目 9. 配置Artifacts 10. 添加Tomcat 11.配置Deployment. 12.添加项目

  • Rust语言从入门到精通系列之Iterator迭代器深入详解

    目录 迭代器的基本概念 迭代器是什么? Iterator trait Animal示例 迭代器的常见用法 map方法 filter方法 enumerate方法 flat_map方法 zip方法 fold方法 结论 在Rust语言中,迭代器(Iterator)是一种极为重要的数据类型,它们用于遍历集合中的元素.Rust中的大多数集合类型都可转换为一个迭代器,使它们可以进行遍历,这包括数组.向量.哈希表等. 使用迭代器可以让代码更加简洁优雅,并且可以支持一些强大的操作,例如过滤.映射和折叠等. 在本

  • PSPad从入门到精通(PSPad Inside)[

    From:http://www.blog.edu.cn/user2/jashy/archives/2006/1264853.shtml PSPad从入门到精通(PSPad Inside) ------------------------------- PSPad什么意思? 一款优秀的编辑器,宣传一般是很差劲的.PSPad也是如此.基本找不到关于PSPad含义的表述, 也很少有人问.一个中国的网友猜测, 可能是Programmer'S Pad.如若真的如此, 这种用法只有在非英语国家才可能有,也只

  • 一份超级详细的Vue-cli3.0使用教程【推荐】

    主要内容: 零配置启动/打包一个 .vue 文件 详细的搭建过程 重点推荐:使用图形化界面创建/管理/运行项目 安装: 卸载旧版本: 如果你事先已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先卸载它: npm uninstall vue-cli -g Node版本要求: 3.x需要在 Node.js 8.9或更高版本(推荐8.11.0+),点击这里可以安装node 大多数人都安装过了node,使用下面的命令行 查询你的node版本 : node -v 如果你的版本不够,可

  • 基于logback 实现springboot超级详细的日志配置

    前言 java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日志框架就能够用 slj4f 调用).其中性能最高的应该使 logback 了,而且 springboot 默认使用的也是 logback 日志,所以本篇将会详细的讲解 logback 的日志配置方案. 本篇主要内容如下: •logback 配置文件的构成 •如何将日志输出到文件 •如何按时间,按大小切分日志 •如何将让一个日志文件中只有

随机推荐