Servlet服务最全入门笔记(包含案例)

Servlet入门案例(一)认识Servlet 大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。麻烦帮忙转发一下这篇文章+关注我《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!麻烦帮忙转发一下这篇文章+关注我[外链图片转存中…(img-7LAJiKFD-1713382499503)] 阅读详情

Servlet

一、Http协议

1.1、概念

Hypertext Transfer Protocol,HTTP超⽂本传输协议,是⼀个简单的请求-响应协议。

规定了客户端和服务器之间 传输数据的⼀种格式

HTTP底层协议:TCP 协议

TCP 的特点:⾯向连接,保证可靠性

TCP三次握⼿,因为HTTP是基于TCP协议的,所有也可以认为是HTTP的三次握⼿:

第⼀次握⼿:客户端向服务端发送⼀个请求消息,服务端收到信息后知道⾃⼰与客户端是可以连接成功的;

第⼆次握⼿:此时客户端并不知道服务端是否已经接收到了它的请求,所以服务端接收到消息后要向客户端做出响应,客户端得到服务端的反馈后,才确定⾃⼰与服务端是可以连接上的。

第三次握⼿:客户端确认与服务器建⽴连接后,才开始向服务器端发送数据。

1.2、特点

基于TCP/IP的⾼级协议

默认端⼝号:80

基于请求/响应模型:⼀次请求对应⼀次响应

特点:

1、简单快速。客户端向服务器请求服务时,只需要传送请求⽅法和路径。

2、灵活。HTTP协议允许传送任意格式的数据。正在传输的类型由,content-type标明。

3、⽆连接。就是每个请求都建⽴⼀个连接,请求处理完毕并发送⾄客户端之后就断开连接。这样明显有其缺点,就是在需要连续发送请求时,需要为每⼀个请求单独的再次建⽴连接,很浪费时间和资源。于是在HTTP协议1.1版本之后引⼊了可持续连接,也就是再每⼀个请求处理完毕后,它不会⽴刻就断开连接,⽽是再等待⼀段时间,如果在此期间⼜有新的请求过来,那么等待时间刷新,如果没有,则等待时间完毕后,连接关闭。

4、⽆状态。是指协议对于每次请求的处理没有记忆能⼒,它不知道之前是否已经访问过,不保留访问痕迹。主要⽬的是为了保证数据传输的安全性。

1.3、传输数据的特点

1.3.1、请求

请求分为三部分:

请求⾏ : 请求⾏中,我们可以通过request对象的相应⽅法获取到⽐如协议名、服务名、端⼝号、项⽬名称、请求⽅式、参数列表等信息。

请求头 : 请求头是当前对⽤户发送的数据的描述信息。请求头信息在请求的时候不需要程序员⼿动添加,是浏览器发送的时候已经处理好的。

请求体 : 请求体就是请求中携带的数据,也就是我们需要获取的参数。

1.3.2、响应

响应分为三部分:

响应⾏ : 响应⾏中包含协议和版本

响应头 : 服务器想要告诉浏览器 的⼀些信息。写法格式:头名称:值

响应体 : 服务器响应给浏览器的源码信息和状态码

​ 1xx -信息,服务器收到请求,需要请求者继续执⾏操作

​ 2xx -成功,操作被成功接收并处理

​ 3xx -重定向,需要进⼀步的操作以完成请求

4xx -客户端错误,请求包含语法错误或⽆法完成请求

5xx -服务器错误,服务器在处理请求的过程中发⽣了错误

二、Servlet详解

2.1、概念

servlet 是运⾏在 Web 服务器中的⼩型 Java 程序。servlet 通常通过 HTTP(超⽂本传输协议)接收和响应来⾃ Web 客户端的请求

在这里插入图片描述

简单理解:

​ 我们之前讲的JDBC技术是⽤来实现Java语⾔和数据库之间的连接技术,⽽现在⼜涉及到Java和HTML进⾏连接,此时可以由HTML做前台,java做后台进⾏连接,这时候就需要⼀个中间件(Servlet)。

2.2、使用

2.2.1、准备工作

需求:写⼀个HTML⻚⾯将⼀个表单中的账号和密码传递到java类中并打印输出到控制台。

在这里插入图片描述

2.2.2、编写步骤

编写步骤:

1、创建HTML⻚⾯并设计⼀个表单

2、创建⼀个普通类, 并继承HTTPServlet抽象类, 并重写Service⽅法

3、在web.xml⽂件中注册servlet, 作为前后台连接的中间件

4、 修改前台表单中action的请求地址

5、 通过浏览器输⼊对应的地址来访问测试

2.2.3、实现方式

1、创建HTML⻚⾯并设计⼀个表单

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body>
<!-- 设计⼀个⻚⾯, 并设计表单 /项⽬名/访问地址 -->
<form action="" method="post">
 <p>
 账号: <input type="text" name="username" id="username">
 </p>
 <p>
 密码: <input type="password" name="password" id="password">
 </p>
 <p>
 <input type="submit" value="登录">
 </p>
</form>
</body>
</html>

2、创建⼀个普通类, 并继承HTTPServlet抽象类, 并重写Service⽅法

public class LoginServlet extends HttpServlet {
//并重写Service⽅法
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
 String username = request.getParameter("username");
 String password = request.getParameter("password");
 System.out.println("账号为: " + username + " ==> 密码为: " + password);
}}

3、 在web.xml⽂件中注册servlet, 作为前后台连接的中间件

<?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_3_0.xsd"
 version="3.0">
<!--注册servlet-->
<servlet>
 <servlet-name>login</servlet-name><!--servlet名称-->
 <servlet-class>com.ujiuye.servlet.LoginServlet</servlet-class><!--全路径-->
</servlet>
<!--映射路径/虚拟路径-->
<servlet-mapping>
 <servlet-name>login</servlet-name><!--servlet名称-->
 <url-pattern>/login</url-pattern><!--访问路径, 以 / 开头-->
</servlet-mapping>
</web-app

4、修改前台表单中action的请求地址

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body>
<!-- 设计⼀个⻚⾯, 并设计表单 /项⽬名/访问地址 -->
<form action="login" method="post">
 <p>
 账号: <input type="text" name="username" id="username">
 </p>
 <p>
 密码: <input type="password" name="password" id="password">
 </p>
 <p>
 <input type="submit" value="登录">
 </p>
</form>
</body>
</html>

5、通过浏览器输⼊对应的地址来访问测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XOXFvF2y-1649953986845)(E:\Java资料\笔记整理\JavaWeb\笔记\总结整理\Servlet.assets\image-20220413003707411.png)]

在这里插入图片描述

2.3、实现过程

实现过程:

① 当服务器接收到客户端浏览器的请求后,先解析请求的url路径,获取访问Servelt的资源路径

② 查找项⽬的web.xml,根据资源路径匹配web.xml中的 中的

③ 如果没有匹配到报 404 如果匹配到了 根据中的

④ 再去匹配 中的 如果没有匹配到 404

⑤ 如果匹配到了执⾏ 中的 从⽽以反射的⽅式访问到指定的Servlet,调⽤其⽅法

2.4、生命周期

servlet⽣命周期:从创建到销毁的全过程。共分为三个阶段:

1、初始化

2、使⽤(提供服务)

3、销毁

1、 编写Servlet

package com.ujiuye.servlet;
import javax.servlet.*;
import java.io.IOException;
public class LifeCycleServlet implements Servlet {
//初始化
@Override
public void init(ServletConfig servletConfig) throws ServletException {
 System.out.println("servlet初始化了...");
}
@Override
public ServletConfig getServletConfig() {
 return null; }
//服务
@Override
public void service(ServletRequest request, ServletResponse response) throws
ServletException, IOException {
 System.out.println("servlet中的service⽅法执⾏了....");
}
@Override
public String getServletInfo() {
 return null; }
//销毁
@Override
public void destroy() {
 System.out.println("servlet销毁了...");
}}
  1. 配置Servlet
<?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_3_0.xsd"
 version="3.0">
<!--注册servlet-->
<servlet>
 <servlet-name>lifeCycle</servlet-name><!--servlet名称-->
 <servlet-class>com.ujiuye.servlet.LifeCycleServlet</servlet-class><!--全路径-->
</servlet>
<!--映射路径/虚拟路径-->
<servlet-mapping>
 <servlet-name>lifeCycle</servlet-name><!--servlet名称-->
 <url-pattern>/lifeCycle</url-pattern><!--访问路径, 以 / 开头-->
</servlet-mapping>
</web-app>

3、测试观察:

当我们启动tomcat服务器时,观察控制台并⽆打印消息,表示Servlet默认情况下在启动服务器时并未被创建。在浏览器地址栏中直接输⼊MyServlet的虚拟访问地址:http://localhost:8080/day10_servlet/lifeCycle 此时观察控制台打印输出初始化与服务的相关信息,当多次访问该地址,发现服务⽅法被多次调⽤执⾏。

在这里插入图片描述

在这里插入图片描述

通过以上案例发现Servlet默认情况下是在第⼀次访问时被创建并初始化的,为了减少内存的压⼒,我们可否改变它的创建时机呢?

答案是肯定的。我们可以在web.xml⽂件中进⾏配置,使得Servlet在服务器启动时直接创建并初始化。load-on-startup节点必须写在servlet节点的内部,且作为最后⼀个节点。取值必须是整数,如果是⼤于等于0的整数表示在服务器启动时就被创建并初始化,如果有多个Servlet设置了load-on-startup节点的值,那么值越⼩越优先执⾏;如果是负数则表示第⼀次被访问时创建并初始化,也就是默认情况,可以省略不写。

在这里插入图片描述

2.5、进化史

Servlet也是由复杂难⽤、功能单⼀,逐步发展到⽬前的操作简单,功能强⼤的。Servlet的发展史,完全就是⼀部⼈类由猿⼈的进化史。

2.5.1、第一阶段

在这里插入图片描述

案例:

package com.ujiuye.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ApeManStageServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
 return null; 
}
@Override
public void service(ServletRequest request, ServletResponse response) throws
ServletException, IOException {
}
@Override
public String getServletInfo() {
 return null; }
@Override
public void destroy() {
}
}    
2.5.2、第二阶段

在这里插入图片描述

package com.ujiuye.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class AncientSocialStageServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws
ServletException, IOException {
}}
2.5.3、第三阶段

在这里插入图片描述

package com.ujiuye.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ModernityStage extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}}
2.6、注解使用Servlet
2.6.1、介绍

Java 注解(Annotation)⼜称 Java 标注,是 JDK1.5 引⼊的新特性。其主要作⽤是简化复杂的编码⼯作。Java 语⾔中的类、⽅法、变量、参数和包等都可以被标注,被标注的元素就具有了⼀些特定的功能。

Servlet的注解(@WebServlet)是Servlet3.0及以上版本⽀持的,主要⽬的是简化web.xml配置。

2.6.2、实现
package com.ujiuye.servlet;
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;
/*此注解配置相当于web.xml⽂件中url-pattern设置的访问路径*/
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
 System.out.println("注解版Servlet更加简明");
}}
2.6.3、注意事项

1、 ⼀个Servlet的配置可以使⽤注解,也可以使⽤web.xml⽂件,但⼆者不能共存,只能任选其⼀,否则会报错。

2、为什么可以执⾏servlet?

Servlet被实例化了

3、 谁实例化的servlet?

tomcat(servlet容器)实例化的Servlet

4、servlet什么时候实例化的?

第⼀次访问servlet的时候实例化的

5、Servlet被实例化了⼏次?

只被实例化⼀次

6、访问路径 ⼀个servlet可以指定多少个访问路径?

可以指定多个访问路径

2.7、多元化路径

问题 : ⼀个Servlet是否可以配置多个访问路径? 答案是可以的

url-pattern配置⽅式共有三种:

1、完全路径匹配(⼀层路径/指定多层路径) :以 / 开始

例如: /hello , /hello1, /aa/hello2

2、⽬录匹配(多种路径都可以访问 排除已经指定的路径) :以 / 开始 需要以 * 结束.

例如: /(所有), /aaa/ (aaa⽬录下的所有), /aaa/bbb/*

3、 扩展名匹配(后缀名) :不能以 / 开始 以 * 开始的.

例如: *.do , .action 注意: 错误的写法 : /.do

案例

<?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_3_0.xsd"
 version="3.0">
 <!--注册servlet-->
<servlet>
 <servlet-name>hello</servlet-name><!--servlet名称-->
 <servlet-class>com.ujiuye.servlet.HelloServlet</servlet-class><!--全路径-->
</servlet>
<!--映射路径/虚拟路径-->
<servlet-mapping>
 <servlet-name>hello</servlet-name><!--servlet名称-->
 <url-pattern>/hello</url-pattern><!--访问路径, 以 / 开头-->
 <!-- ⽬录匹配 -->
 <url-pattern>/aa/bb/cc</url-pattern>
 <url-pattern>/aa/bb/cc/dd/*</url-pattern>
 <!-- 扩展名匹配 -->
 <url-pattern>*.do</url-pattern>
 <url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>

三、Servlet处理请求

3.1、介绍

Servlet处理请求是由核⼼⽅法中的request参数处理,处理响应是由核⼼⽅法的response参数处理。

request:定义⼀个向servlet提供客户端请求信息的对象。servlet容器创建⼀个ServletRequest对象,并将其作为参数传递给servlet的服务⽅法。

3.2、作用

接收客户端的请求,获取请求中的信息。除了可以获取请求中携带的数据之外,还可以获取⽐如主机地址、端⼝、请求⽅式、项⽬名称等⼀系列信息。

请求分类:

请求⾏、请求头、请求体。

3.3、体系

ServletRequest 接⼝

↑继承

HttpServletRequest ⼦接⼝

↑ 实现

org.apache.catalina.connector.RequestFacade 实现类

3.4、使用

3.4.1、获取请求行数据
// 1、获取请求信息
        //================= 1.1、 获取请求行信息
        String scheme = request.getScheme();
        System.out.println("协议名:"+scheme);

        String serverName = request.getServerName();
        System.out.println("服务名:"+serverName);

        int serverPort = request.getServerPort();
        System.out.println("端口号:"+serverPort);

        String contextPath = request.getContextPath();
        System.out.println("项目名:"+contextPath);

        String method = request.getMethod();
        System.out.println("请求方式:"+method);

        String queryString = request.getQueryString();
        System.out.println("参数字符串:" + queryString);

        String requestURI = request.getRequestURI();
        System.out.println("项⽬名+具体地址:" + requestURI);

        StringBuffer requestURL = request.getRequestURL();
        System.out.println("获取请求的URL:" + requestURL);

        String servletPath = request.getServletPath();
        System.out.println("获取请求的URL:" + servletPath);

3.4.2、获取请求头数据
@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //获取请求体信息
        String username = request.getParameter("username");
        String pswd = request.getParameter("pswd");
        //        System.out.println(username+"=="+pswd);
        String[] hobbys = request.getParameterValues("hobbys");
        System.out.println(username+"==="+pswd+"==="+hobbys);

        // 获取所有的名字,然后遍历
        Enumeration<String> names = request.getParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            String[] parameterValues = request.getParameterValues(name);
            System.out.println(name+":\t"+ Arrays.toString(parameterValues));
        }
        System.out.println("======================================================");

        // 获取所有的name 和 对应的 value 封装到集合中
        Map<String, String[]> map = request.getParameterMap();
        for (Map.Entry<String, String[]> entry : map.entrySet()) {
            System.out.println(entry.getKey()+"-----"+Arrays.toString(entry.getValue()));
        }
    }
3.4.3、获取请求正文数据

① get⽅式提交 将数据拼接在url后⾯

http://IP地址:端⼝号/项⽬名/⽂件名?name=xiaoming&password=123

② post⽅式提交

使⽤form表单

③ 常⽤⽅法

1、request.getParameter(“name值”); 获取⼀个name值对应单个数据

2、 request.getParameterValues(“name值”); 获取⼀个name值对应多个数据

3、 request.getParameterNames(); 获取所有的name值

4、request.getParameterMap(); 获取所有信息 放⼊map中

④ 将form数据封装到实体类对象中

BeanUtils ⼯具类

BeanUtils.populate(bean,map);

⑤ 其他⽅法

1、getContextPath() ; 获取当前访问的项⽬名

2、getCookies(); 获取浏览器请求时携带的cookie

3、 getMethod() ; 获取请求⽅式

4、getSession(); 获取session对象

5、request.setCharacterEncoding(“UTF-8”); 设置请求编码

3.4.4、转发

① 理解

⼀种在服务器内部资源跳转的⽅式。浏览器请求ServletA资源时,ServletA资源不⾜或者没有资源,ServletA请求其他的资源然后响应给浏览器,这个过程叫转发;

② 实现

request.getRequestDispatcher("转发路径").forward/include(request, response);

③ 场景

借钱:

1、 全部直接借

2、 ⼀部分⾃⼰的钱 ⼀部分找别⼈借

3、全部找别⼈借

④ 特点:

1、 转发发⽣在服务器内部

2、转发的过程中url地址不变 浏览器不知道

3、转发可以访问到 WEB-INF 中的资源

4、转发的路径是当前项⽬下 因此转发不可以访问项⽬以外的资源

5、 转发的路径⼀般是相对路径

6、转发发⽣⼀次请求中

⑤ 作⽤

实现Servlet与⻚⾯的跳转

在这里插入图片描述

四、Servlet处理响应

4.1、介绍

response:定义⼀个对象来帮助servlet向客户端发送响应。servlet容器创建⼀个ServletResponse对象,并将其作为参数传递给servlet的服务⽅法。

4.2、作用

针对⻚⾯发送的请求做出数据响应,向⻚⾯输出信息,包括⽂本、图⽚、视频等。

响应分类:

响应⾏、响应头、响应体。

4.3、体系

ServletResponse 接⼝

↑继承

HttpServletResponse ⼦接⼝

↑ 实现

org.apache.catalina.connector.ResponseFacade 实现类

4.4、使用

4.4.1、设置响应行

设置响应⾏:响应⾏中包含协议和状态码

可以通过response.sendError(sc, msg)来设置状态信息,但⼀般不会⼿动设置,仅⽤来做测试。

 // ============== 3.1 响应行信息 ==============

        try {
            int i = 10/0;
        } catch (Exception e) {
            response.sendError(500, "除数不能为零呀!");
        }
4.4.2 、设置响应头

设置响应头信息可以通过以下两种⽅法:

response.setHeader(“Content-Type”, “text/html;charset=utf-8”);

response.addHeader(“Content-Type”, “text/html;charset=utf-8”);

⼆者的区别:

response.setHeader(String name, String value);⼀个关键字对应⼀个值,如果设置了多个值,则

会覆盖。

response.addHeader(String name, String value);⼀个关键字可以对应多个值

在实际开发中,同⼀个响应头信息只会对应⼀个值,所以在使⽤时⼀般没什么区别。

// =============== 3.2 响应头信息 服务器告诉浏览器做什么 ===============
        response.setHeader("xxx", "heihei");
        response.setContentType("text/html; charset=utf-8");
4.4.3、 设置响应体

响应的数据就是响应体。响应对象response在返回数据、响应数据的时候,会将⼀些HTML、text、流数据等信息通过响应主体返回给⻚⾯,⽽响应体绝⼤多数都是⽂本类型。

响应数据需要通过流来进⾏数据传输,⽽response⾃带的流有两个:

response.getWriter() ==> PrintWriter 输出⽂本信息

response.getOutputStream ==> ServletOutputStream 输出字节信息,⽐如图⽚、⾳频、视频

需要注意:这两个流不能同时存在。

// =============== 3.3 响应正文信息 ==============
        // 3.3.1 响应文本信息
        PrintWriter writer = response.getWriter();
        writer.print("<h2>hello, I am Tomcat!</h2>");

响应流下载案例

// 3.3.2 响应流信息 (图片下载的案例)
        // 文件 从服务器  通过浏览器 下载到磁盘
        // 1. 读取文件到内存中
        // 根据web目录下的相对路径  获取真实路径
        String realPath = request.getServletContext().getRealPath("img/slj.jpeg");
        // System.out.println("真实路径:"+realPath);
        FileInputStream fis = new FileInputStream(realPath);

        // 2. 告诉浏览器该文件要下载
        response.setHeader("Content-disposition", "attachment; filename=slj.jpeg");

        // 3. 写出到客户端(响应流)
        ServletOutputStream sos = response.getOutputStream();

        byte[] buff = new byte[1024*2];

        int len = 0;
        while((len=fis.read(buff))!=-1){
            sos.flush();
            sos.write(buff, 0, len);
        }
        // 4. 关流
        sos.close();
        fis.close();
4.4.4、重定向

① 理解

重定向是客户端⾏为,当客户端浏览器向AServlet发送⼀个请求,经过处理后向客户端做出响应,这个响应就是向服务器再次发送新的请求,去请求BServlet,⽽这个新请求的地址将为浏览器做出第⼆次响应,此时浏览器地址栏会发⽣改变,由于⼀次请求/响应结束后,request对象会⾃动销毁,所以两次请求的request对象并⾮同⼀个,所以两次请求域中的数据信息不会共享。由此可⻅,重定向是做了两次请求和响应。

② 实现

response.sendRedirect("重定向地址");

③ 场景

借钱:

不借,但告诉你谁有钱并指定地址

④ 特点

1、 重定向发⽣在浏览器和服务器之间

2、重定向的过程url地址发⽣变化

3、重定向发⽣⾄少两次请求中

4、 重定向访问不到WEB-INF的资源第5节:域对象

5、重定向可以访问当前应⽤外的资源

6、 重定向⼀般使⽤绝对路径

⑤ 作⽤

实现Servlet与⻚⾯的跳转

在这里插入图片描述

五、域对象

5.1、理解

可以共享的对象 提供给servlet之间数据共享 作⽤于服务器

5.2、分类

1、ServletContext 最⼤的共享域 作⽤范围整个项⽬

2、 session 作⽤范围⼀次会话

3、 request 作⽤范围⼀次请求

5.3、使用

1、给共享域中放值 setAttribute(“string”,“object”);

2、获取共享域的值 getAttribute(“string”);

3、删除共享域的值 removeAttribute(“string”);

示例:


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 域对象中保存数据
        ServletContext servletContext = request.getServletContext();
        servletContext.setAttribute("sc", "最大域对象中的数据");

        HttpSession session = request.getSession();
        session.setAttribute("se", "一次会话中数据共享");

        request.setAttribute("req", "一次请求中数据共享");

        request.getRequestDispatcher("getYuObj").forward(request, response);
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 获取域对象中数据
        ServletContext servletContext = request.getServletContext();
        String sc = (String) servletContext.getAttribute("sc");
        System.out.println("sc中的数据:"+sc);

        HttpSession session = request.getSession();
        String se = (String) session.getAttribute("se");
        System.out.println("session中的数据:"+se);

        String req = (String) request.getAttribute("req");
        System.out.println("request中的数据:"+req);
    }

session = request.getSession();
session.setAttribute(“se”, “一次会话中数据共享”);

    request.setAttribute("req", "一次请求中数据共享");

    request.getRequestDispatcher("getYuObj").forward(request, response);
}

```java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 获取域对象中数据
        ServletContext servletContext = request.getServletContext();
        String sc = (String) servletContext.getAttribute("sc");
        System.out.println("sc中的数据:"+sc);

        HttpSession session = request.getSession();
        String se = (String) session.getAttribute("se");
        System.out.println("session中的数据:"+se);

        String req = (String) request.getAttribute("req");
        System.out.println("request中的数据:"+req);
    }
Servlet的详细教程 文章目录一、Servlet的简介二、Servlet的入门案例三、创建Servlet的三种方式3.1实现Servlet接口的方式3.2继承GenericServlet抽象类的方式3.3继承HttpServlet的方式四、Servlet注解和配置文件的写法4.1配置文件的写法4.2注解的写法五、Servlet的生命周期六、Servlet获取前端请求的参数七、通过前端发送数据到servlet,然后存入到数据库八、中文乱码的解决方案九、重定向和转发【重要】9.1重定向9.2转发十、URL匹配规则十一、Servlet 阅读详情

相关推荐

Servlet项目教学(附实例代码)

使用Vue+ElementUI充当前端界面,使用Servlet+JDBC+Mysql提供数据管理控制.后端统一向前端返回JSON格式的数据.

m0_47946173的博客 1468

html页面打印+区域,实现web网页指定区域打印的三种方法

通过本教程可以实现,将印web网页指定区域的内容,本教程将提供三种方法实现。方法一:打印网页指定区域HTML在需要打印的内容//页面上的内容大小调整可以css调整或容器包容打印容器内的内容就可以了JSfunctiondoPrint(){bdhtml=window.document.body.innerHTML;sprnstr="";eprnstr="";prnhtml=bdhtml.sub...

weixin_42509396的博客 5266

Servlet从入门到精通

文章目录一,Servlet--1,概述--2,准备工作在IDEA里创建一个web工程整理web工程目录结构修改资源输出位置修改jar包存放位置配置Tomcat服务器--3,入门案例思路创建Servlet程序配置web.xml文件测试--4,Servlet的继承结构标题 一,Servlet –1,概述 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成 动态

cgblpx的博客 1万+

JavaWeb 怎么在servlet向页面输出Html元素?

【代码】JavaWeb 怎么在servlet向页面输出Html元素?

qq_51980838的博客 1484

VCSA的vmware-updatemgr服务无法启动和vSAN界面报“certificate chain is not trusted and thumbprint doesn‘t match”处理

"Unable to update CM service info"和"Server certificate chain is not trusted and thumbprint doesn't match"问题处理

jetliu05的博客 1882

UE5垃圾回收优化实战:定位GC卡顿与内存泄漏

垃圾回收(GC)是Unreal Engine 5中保障UObject内存安全的核心机制,其基于引用图的标记-清除原理决定了性能高度依赖引用结构合理性。当GC频繁触发或单次耗时突增,往往映射出蓝图强引用冗余、C++根对象管理失控或资源生命周期设计缺陷等底层问题。技术价值在于降低主线程阻塞、稳定60帧体验、抑制内存异常增长;典型应用场景包括关卡切换卡顿、UI打开后持续GC、打包后内存不释放等。本文聚焦UE5特有的Full GC模式、UObject生命周期约束及GC触发时机不可见性,提供从蓝图变量规范、TSoft

weixin_31995251的博客 362

servlet原理+流程图+简单实现案例(javaweb)

servlet原理+流程图+简单实现案例(javaweb) 1.servlet原理(转载) 容器负责根据请求的信息找到对应的Servlet,传递Request和Response参数,调用Servlet的service方法,完成请求的响应。 Servlet 的运行模式是一个典型的“握手型的交互式”运行模式。所谓“握手型的交互式”就是两个模块为了交换数据通常都会准备一个交易场景,这个场景一直跟随个这个交易过程直到这个交易完成为止。这个交易场景的初始化是根据这次交易对象指定的参数来定制的,这些指定参数通常就会是一

weixin_51687691的博客 1422

别再瞎试了!用Python+正交设计,5分钟搞定你的多因素实验方案

本文介绍了如何利用Python和正交设计高效优化多因素实验方案。正交设计通过精心设计的正交表,用最少的实验次数覆盖所有因素的水平组合,显著提升实验效率。文章详细讲解了正交设计的核心优势、Python实现工具链、实验实施与数据分析方法,以及高级技巧与常见问题解决方案,帮助读者快速掌握这一强大的实验优化技术。

weixin_42526087的博客 331

Servlet入门学习笔记-Servlet技术

Servlet入门教程,如何使用Servley搭建第一个程序

weixin_52937170的博客 1614

openstack卷分离异常问题处理

对于 2023-05-10 之后的所有 OpenStack 版本,需要将Nova 配置为向 Cinder 发送服务令牌,然后 Cinder 接收该令牌。cinder.conf处添加service_token_role配置。1.修改nova的config文件添加如下配置。确定service role 是否存在。有关详细信息,请参阅。重启nova cinder 服务。nova-compute日志。cinder-api日志。

weixin_43391291的博客 474

望获实时Linux与国产芯片协同:打造LinuxCNC数控机床的全栈国产化方案

本文探讨了如何通过望获实时Linux与飞腾、龙芯等国产芯片的深度协同,为LinuxCNC数控机床打造全栈国产化方案。望获实时Linux通过中断隔离等核心技术,提供亚微秒级确定性响应,解决了传统Linux系统实时性不足的痛点,使LinuxCNC得以稳定驱动高精度机床。该方案实现了从硬件、操作系统到应用软件的全栈自主可控,为工业控制领域提供了高性能、可定制的国产化选择。

weixin_29291069的博客 647

【Servlet】Servlet入门

概念:server applet,即:运行在服务器端的小程序Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。将来我们定义一个类,实现Servlet接口,复写方法,tomcat就可以识别这个类,我们就称它为一个ServletServlet用大白话来说,就像是一个在Web服务器上运行的Java小程序,它专门用来处理来自浏览器或其他客户端的请求,并根据这些请求动态生成响应内容。

qq_39921135的博客 1476

UE4 专用服务器搭建(UE4.27为例)

专用服务器、DS服务器

mimo134的博客 2773

Servlet入门案例

Servlet入门案例 文章目录Servlet入门案例Servlet:官方的定义 运行在服务器的小程序Servlet:是一个接口Servlet步骤定义一个Java类实现Servlet接口重写Servlet中的方法配置Servlet 在Web配置映射 一定要加/ 不加报错配置TOMCAT等访问 Servlet:官方的定义 运行在服务器的小程序 Servlet:是一个接口 Servlet 1. 创建一个web项目 2. 定义一个Java类实现Servlet接口 3. 重写Servlet中的方法 4.

cx9977的博客 237

《HiVT: Hierarchical Vector Transformer for Multi-Agent Motion Prediction》论文阅读之HiVT

目录摘要1.介绍2.相关工作3.方法3.1. 总体框架3.2 场景表示 3.3 分层向量Transformer3.3.1 局部编码器3.3.2 全局交互模块3.3.3 多模态未来解码器3.4 训练4.实验4.1 实验设置4.2 消融研究 4.3. 结果5.结论 准确预测周围交通参与者的未来运动对于自动驾驶车辆的安全至关重要。最近,矢量化方法由于能够捕捉交通场景中的复杂交互而在运动预测领域占据主导地位。然而,现有的方法忽略了问题的对称性并且受到昂贵的计算成本的影响,面临着在不牺牲预测性能的情况

Gavinmiaoc的博客 3337

QGis软件 —— 5、QGis增加线,并对线进行绘制、旋转、缩放、移动等基本操作

QGis软件 —— 5、QGis增加线,并对线进行绘制、旋转、缩放、移动等基本操作

8239

Servlet技术快速入门笔记

Servlet技术快速学习

qq_23347275的博客 1171

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Servlet入门

Servlet 是运行在Web服务器中的小型java程序,是Java提供的一门动态web资源开发技术。通常通过HTTP协议接收和响应来自于客户端的请求。Servlet 是JavaEE规范之一,其实就是一个接口(定义Servlet需实现Servlet接口或继承HttpServlet),并由web服务器运行Servlet。

weixin_75199610的博客 1800

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Servlet入门 Servlet生命周期 Servlet体系结构

Servlet (server applet) 是运行在服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范;从代码层面上来讲Servlet就是一个接口狭义的Servlet是指Java语言编写的一个接口。广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet作用:用来接收和处理客户端请求、响应给浏览器的动态资源。

2401_86102746的博客 1407

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《Java Servlet编程》笔记(Servlet简介)

         在校图书馆偶看到《JAVA SERVLET编程》(OREILLY)如获至宝,遂借之,转而续借,决心把它好好的看一下。于是便有以下的学习笔记。        这本书共有二十章,分别从现在SERVLET的应用的不同方面对SERVLET的编程进行了讲解,是不一本不错的好书。在下边的笔记里,分别对这二十章进行总结。Java Servlet? VS CGI ===========

null 2093

javaweb——servlet简单登录案例

用户登录案例需求: 1.编写login.html登录页面 username & password 两个输入框 2.登录成功跳转到Success.html展示:登录成功!用户名,欢迎您 3.登录失败跳转到loginServlet编写内部逻辑以及简单用户数据 编写loginservlet package servlet; import javax.servlet.ServletException; import j...

ZhaFi人 4140

Servlet入门笔记

servlet applet 概念:运行在服务器端的小程序 Servlet 就是一个接口 定义了java类被浏览器访问到(tomcat识别)的规则 将来我们自定义一个类,实现servlet接口 ,复写方法。 *Servlet 快速入门 1、创建javaee项目 2、 动态资源: 逻辑性 — java代码 java类:依赖于服务器才能运行 tomcat执行它 需要遵守一定的规则(接口),才能被tomcat识别 如何实现web端对java类的访问? 在web.xml中配置如下: de

qq_41229707的博客 311

Servlet入门必备知识

什么是Servlet 1、servlet是javaEE规范之一。规范就是接口 2、servlet就是javaweb三大组件之一。三大组件分别是:servlet程序、Filter过滤器、Listenter监听器。 3、servlet是运行在服务器上的一个java小程序,它可以接受客服端发送过来得请求,并响应数据给客服端。 ...

weixin_60719453的博客 2355

Servlet入门小案例

案例一:tomcat9、jdk1.8  1.eclipse创建web项目   1)创建一个Dynamic web project,名字为Servlet_hjh   2)在src下创建一个包,为com.hjh.day0306   3)在包下创建一个servlet类,为MyServlet   4)在WEB-INF目录下,创建一个web.xml文文件    2.MySer...

bangluoo351772的博客 350
上一篇: (Tomcat服务器的安装与搭建)Web服务器的理解与应用
下一篇: JSP 新手入门理解教程(附带案例)
皮卡丘不断更
博客等级 码龄5年 111粉丝 141原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡丘不断更

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值