Servlet从入门到精通

news2024/11/18 8:42:47

概述:

Servlet(Server Applet)是Java Server的简称,称为小服务程序或服务网连接器,用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 

import javax.serclet.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 HttpsServlet{

protected void doPost(HttpServletRequest request,HttpServletRwsponse response) throws ServletException,IOExceptikon{

//向浏览器响应指定内容

response.getWriter()write("hello servlet");

}

protected void doGet(HttpServletRequest requset,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(“/muyservlet”)括号中,就可以规定访问方式。

<?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>package后边的到类名</servlet-calss>

</servlet>

<servlet-mapping>

<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为OPST的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对象中获取到响应信息,再按照http响应信息的格式组织成响应消息,发送给浏览器。

常用的方法。

setContentType(“参数名”)--设置响应的字符编码方式

sendRedirect()--完成重定向

getOutputStream()--获取字节输出流

getWriter()--获取字符输出流

setHeader(“Access-Control-Allow-Orgin”,"*");--专门用来解决跨域问题

测试

package

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@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");

//给浏览器响应数据

resopnse。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 Appliocation-next-输入工程名称-Finish,

整理web工程目录结构

修改资源输出位置 

 修改jar包存放位置

 

 配置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);
    }
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】线程同步(互斥锁和读写锁)

概念 线程同步是指多个线程之间协调和管理彼此的执行顺序&#xff0c;以避免竞态条件和不确定的结果。线程同步的目的是确保共享资源的正确访问和保护临界区的完整性。 作用 避免竞态条件&#xff1a;当多个线程同时访问和修改共享资源时&#xff0c;可能会导致竞态条件的发生…

初创企业办公室租赁现状

概述&#xff1a; 随着创业生态的不断发展&#xff0c;越来越多的初创企业开始涌现。租赁办公室是初创企业成立和运营的必要条件之一&#xff0c;然而&#xff0c;由于各种原因&#xff0c;租赁办公室对于初创企业来说仍然存在一些挑战和难点。本文将探讨初创企业租赁办公室的…

功能测试的技术

目录 前言&#xff1a; 1) 基于最终用户/系统测试 2) 等价测试 3) 边界值测试 4) 基于决策的测试 5) 备用流量测试 6) 临时测试 前言&#xff1a; 功能测试是软件测试中最常见的一种测试类型&#xff0c;它旨在验证系统的功能是否符合设计要求和预期行为。在进行功能测…

a==1a==2a==3 与 a===1a===2a===3如何实现?

前言 首先&#xff0c;我们来看个demo let a {value: 1,toString() {// console.log("toString")return this.value;} }看一下输出结果&#xff1a; console.log(a 1 && a 2 && a 3) // falseconsole.log(a 1 && a 2 && a …

PHP 旅游信息管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 旅游信息管理系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为PHP APACHE&#xff0c;数据库 为mysql5.0&#xff0c;使用php语言开发。 …

nerf-studio初体验

前言 整个安装过程非常简单&#xff0c;运行得也很丝滑&#xff0c;最大的难点在于中文资料太少&#xff0c;英文看得头痛。本文也是参考了许多链接&#xff0c;有些链接比我写得详细多了&#xff0c;各位选择性看吧 安装 安装过程参考github链接&#xff0c;按顺序一步一步…

使用 ZBrush 和 Substance 3D中创建逼真的露西(p2)

今天瑞云渲染小编给带来了Rafael Benedicto 分享的 Lucy 项目背后工作流程&#xff0c;解释了头发是如何设置的&#xff0c;并回顾了在 Substance 3D Painter 中完成的纹理化过程。篇幅较长&#xff0c;分上下两篇来阐述幕后花絮。接下来接着讲述Lucy项目的纹理和渲染方面内容。…

PS 设置图片背景透明

找魔棒工具&#xff1a;编辑-工具栏。可设置w改为Z。&#xff08;方便使用&#xff09; 魔棒工具选择背景&#xff08;w&#xff09; 删除即可 如果我们导入的是“智能对象”&#xff0c;使用左侧的“矩形选区”删除框选区域的时候&#xff0c;就会弹出“无法完成请求&#…

pytorch量化库使用(1)

量化简介 量化是指以低于浮点精度的位宽执行计算和存储张量的技术。量化模型以降低的精度而不是全精度&#xff08;浮点&#xff09;值对张量执行部分或全部运算。这允许更紧凑的模型表示以及在许多硬件平台上使用高性能矢量化操作。与典型的 FP32 模型相比&#xff0c;PyTorc…

OnlyOffice7.3.2.8 和 7.3.3.40 Docker魔改版搭建教程

写在前面&#xff1a; 搭建项目所需环境只需查看此篇文档即可&#xff0c;中间有不清楚的地方评论即可&#xff0c;看到会回复&#xff01; ⼀ 、安装docker&#xff1a; 具体步骤请参照docker官网: https://docs.docker.com/get-docker/ 注&#xff1a; 不同操作系统安装方…

今天分享:配音软件哪个好

在数字化时代&#xff0c;视频内容的需求愈发增长。越来越多的人们创作和分享各种类型的视频&#xff0c;而其中一个重要的元素是声音。然而&#xff0c;有时候我们可能面临着一种情况&#xff1a;我们拍摄了一段令人惊艳的视频&#xff0c;但缺乏适合的配音或原声录音。这时&a…

人工智能时代,前端如何抓住机会

自从 2022 年底 OpenAI 推出了 ChatGPT3.5 后&#xff0c;GPT 的活跃用户数快速突破一亿&#xff0c;打破了互联网应用发展的历史记录。ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;它可以理解人类的自然语言&#xff0c;模拟人类的语言和思维方式&#xff0c;与人类…

介绍几款在线编程工具(Python)

阅读原文 有时候个人电脑不在身边&#xff0c;又需要处理一些工作&#xff0c;这时候可能需要在朋友的电脑或者公用电脑上操作数据。又或者要将自己写的代码以 notebook 的形式分享给 co-worker&#xff0c;这时就需要用到以下总结的几个直接在浏览器里进行 Python 编程的工具。…

怎么学习数据库连接与操作? - 易智编译EaseEditing

学习数据库连接与操作可以按照以下步骤进行&#xff1a; 理解数据库基础知识&#xff1a; 在学习数据库连接与操作之前&#xff0c;首先要了解数据库的基本概念、组成部分和工作原理。 学习关系型数据库和非关系型数据库的区别&#xff0c;了解常见的数据库管理系统&#xff…

为何及如何使用数据结构提升算法效率和问题解决能力?

数据结构是计算机科学中的一个重要概念&#xff0c;它是一种组织和存储数据的方式。数据结构提供了一种在计算机程序中有效地组织和操作数据的方法。 数据结构的主要目的是解决问题和优化算法。它们帮助我们在计算机内存中存储和组织数据&#xff0c;以便能够高效地访问和操作这…

Flink 自定义源算子之 读取MySQL

1、功能说明&#xff1a; 在Flink 自定义源算子中封装jdbc来读取MySQL中的数据 2、代码示例 Flink版本说明&#xff1a;flink_1.13.0、scala_2.12 自定义Source算子&#xff0c;这里我们继承RichParallelSourceFunction&#xff0c;因为要使用open方法来初始化数据库连接对…

Egg.js阿里JS后端框架,可以放心用。

目录 一、快速开始 二、尝试创建一个controll,修改路由&#xff0c;然后检查测试单元。 一、快速开始 npm install -g yarn yarn create egg --typesimple cd egg yarn install yarn devhttp://127.0.0.1:7001 二、尝试创建一个controll,修改路由&#xff0c;然后检查测试单…

PDF怎么转图片?PDF转图片的方法分享!​

PDF怎么转图片呢&#xff1f;相信很多人都会觉得PDF的非常的好用&#xff0c;小编也是被身边很多朋友推荐过后用了这个软件。但很多人在使用的时候有疑问&#xff0c;比如说PDF如何转图片&#xff1f;这难倒不少人&#xff0c;那么今天这篇文章就带你解析PDF怎么转图片&#xf…

LiangGaRy-学习笔记-Day25

1、Apache web相关 1.1、curl命令 作用&#xff1a;用来与服务器之间传输数据的工具 官网&#xff1a;https://curl.se支持很多种协议 语法&#xff1a;curl选项网址 选项&#xff1a; -A&#xff1a;设置代理给服务器-I&#xff08;大写i&#xff09;&#xff1a;输出返…

Spring Boot 中的 WebMvc 是什么,原理,如何使用

Spring Boot 中的 WebMvc 是什么&#xff0c;原理&#xff0c;如何使用 介绍 在 Spring Boot 中&#xff0c;WebMvc 是非常重要的一个模块。它提供了一系列用于处理 Web 请求的组件和工具。在本文中&#xff0c;我们将介绍 Spring Boot 中的 WebMvc 是什么&#xff0c;其原理…