servlet的学习与理解

1. 什么是Servlet

Servlet 是一种用 Java 编写的服务器端程序,主要用于处理用户请求、修改数据、并生成动态的网页内容。简单来说,Servlet 就是一个 Java 类,它实现了 Servlet 接口,并运行在支持 Java 的应用服务器中,比如 Tomcat。

通常,Servlet 用来扩展 Web 服务器的功能,让它可以处理用户通过网页发送的请求,比如浏览器发送的 HTTP 请求。它的工作过程大致如下:

  1. 客户端请求:用户在浏览器中操作,比如点击一个链接或提交一个表单,这个操作会生成一个请求并发送到服务器。

  2. 服务器调用 Servlet:服务器接收到请求后,会启动并调用对应的 Servlet 程序。Servlet 会根据用户的请求内容(比如请求的 URL 和参数),进行一些逻辑处理,比如从数据库获取数据或进行计算等。

  3. Servlet 生成响应:Servlet 处理完请求后,会生成一个响应内容(通常是 HTML 页面),并将这个内容传回服务器。

  4. 服务器返回响应:服务器最终将 Servlet 生成的响应内容返回给客户端,用户就可以在浏览器中看到结果了。

所以,Servlet 就像是一个在服务器端跑的“小程序”,专门用来响应用户请求并生成动态的网页内容。它的存在让网页可以根据用户的不同操作展示不同的内容,而不是每次都只显示静态的固定内容。

public class LoginServlet 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 {

//处理get/post请求的方法
}

@Override

 

public String getServletInfo() { return null;

}

@Override

public void destroy() {
//销毁的方法

}
}

  1. web.xml文档中配置映射关系 XML中配置好这个Servlet的映射关系:

<servlet>

<servlet-name>自定义名称</servlet-name>

<servlet-class>处理请求的类的完整路径</servlet-class>
</servlet>

<servlet-mapping><!-- mapping 表示映射 -->
<servlet-name>自定义名称</servlet-name>
<url-pattern>请求名</url-pattern>

</servlet-mapping>

标签的执行顺序:

请求过来以后->web.xml->servlet-mapping标签中的url-pattern标签中的内容和请求名
进行匹配->匹配成功后找对应的servlet-mapping标签中的servlet-name->

去servlet标签中找和上一个servlet-name相同的name->去找servlet标签中 servlet-class中处理类的完整路径

启动tomcat,在浏览器输入http://localhost:8080/工程名/访问服务器的路径

Servlet 是 Java Web 开发中用于处理客户端请求(通常是 HTTP 请求)并生成动态响应的服务器端程序。其工作原理可以简单分为几个主要步骤,涉及请求的接收、处理和响应。以下是 Servlet 的工作原理详细解释:

Servlet 工作原理

  1. 客户端请求
    • 用户通过浏览器(或其他客户端)发送请求到服务器。这通常是通过点击一个链接、提交一个表单或直接在浏览器地址栏输入 URL 发出的请求。
  2. 服务器接收请求
    • Web 服务器(如 Tomcat、Jetty)接收到客户端的请求,并根据请求的 URL 路径将请求分发给对应的 Servlet 处理程序。
  3. Servlet 容器的作用
    • Servlet 运行在一个 Servlet 容器(如 Tomcat)的环境中。容器负责管理 Servlet 的生命周期,包括创建、初始化、处理请求和销毁。
    • 当服务器启动时,Servlet 容器会加载并实例化 Servlet 类。在第一次请求到达时,容器会调用 init() 方法初始化 Servlet。
  4. 调用 Service 方法

    • 容器在接收到请求后,会调用 Servlet 的 service() 方法。service() 方法根据请求的类型(GET、POST 等)进一步调用相应的处理方法,例如:
      • doGet() 处理 GET 请求。
      • doPost() 处理 POST 请求。
      • doPut() 处理 PUT 请求,等等。
  5. Servlet 处理请求
    • Servlet 处理请求的核心逻辑包括读取请求数据(如参数、头信息)、执行业务逻辑(如数据库操作、计算等),并生成响应内容(通常是 HTML、JSON、XML 等)。
    • 响应数据通过 HttpServletResponse 对象输出到客户端。
  6. 生成并返回响应
    • Servlet 生成响应后,通过响应对象(如 PrintWriter)将内容写回给客户端。
    • Web 服务器将响应结果传送回客户端,用户在浏览器中看到结果。
  7. Servlet 生命周期管理
    • Servlet 容器会在适当的时候调用 destroy() 方法来销毁 Servlet 实例(例如服务器关闭时)。这个过程用于释放资源并进行清理工作。

总结

  • 生命周期管理:Servlet 容器负责管理 Servlet 的整个生命周期,包括加载、实例化、初始化、处理请求和销毁。

  • 请求分发与处理:客户端请求到达服务器后,Servlet 容器根据请求路径分发给对应的 Servlet,通过 service() 方法处理请求。

  • 动态响应生成:Servlet 通过重写特定的方法(如 doGet()doPost())来处理不同类型的请求,并动态生成响应内容返回给客户端。

Servlet 的这种请求-响应模型,使得它能够高效地处理 Web 应用中的动态内容生成需求。

2.生命周期

ervlet 的生命周期是指一个 Servlet 从创建到销毁的整个过程。这个过程由 Servlet 容器(例如 Tomcat)来管理,主要包含以下几个简单易懂的步骤:

1. 加载与实例化

  • 当服务器启动或者第一次有请求访问这个 Servlet 时,Servlet 容器会加载 Servlet 类。
  • 容器会创建这个 Servlet 的一个实例。这个过程只发生一次,所以一个 Servlet 实例可以处理多个请求。

2. 初始化 (init 方法)

  • 在 Servlet 实例创建之后,容器会调用 Servlet 的 init() 方法。
  • 这个方法用于初始化 Servlet,比如读取配置参数、连接数据库等。这一步也是只执行一次。
  • init() 方法是一个准备阶段,让 Servlet 具备处理请求的能力。

3. 处理请求 (service 方法)

  • 每当有请求到达时,容器会调用 service() 方法来处理请求。
  • service() 方法会根据请求类型(GET、POST 等)自动调用对应的处理方法,例如:
    • 调用 doGet() 处理 GET 请求。
    • 调用 doPost() 处理 POST 请求。
  • 这个步骤会被多次调用,因为每次有请求来时都要执行。

4. 销毁 (destroy 方法)

  • 当服务器关闭或者需要释放资源时,容器会调用 Servlet 的 destroy() 方法。
  • destroy() 方法用于清理资源,比如关闭数据库连接、释放内存等。
  • 这个方法在 Servlet 生命周期的最后阶段被调用,并且只执行一次。

总结

  • 加载:第一次请求时,Servlet 被加载并实例化。
  • 初始化init() 方法被调用一次,用于初始化。
  • 处理请求:每次请求时,service() 方法被调用,通过它再调用 doGet()doPost() 等方法。
  • 销毁:当不再需要时,destroy() 方法被调用,清理资源。

Servlet 的生命周期简单来说,就是:创建 -> 初始化 -> 处理请求 -> 销毁。每一步都是为了确保 Servlet 能够有效地响应客户端的请求,并在不需要时释放资源。

3.客户端如何发送数据给服务器

方式1:通过表单 get/post提交

方式2:通过a标签发送数据(get提交)

<a href="请求名?key=value&key=value&key=value..."> 示例:

<a href="/login?a=10&name=abc&pass=123">

这里的key值=表单元素的控件名,value=表单中控件的value属性值

注:第一个参数使用?拼接,之后的参数使用&拼接,获取数据还是通过

String name=request.getParameter("name");

方式3:通过地址栏直接拼接-get请求

方式4:js提交数据-get请求
location.href="目标请求?key=value&key=value"

注:方式2/3都属于get提交方式,表单提交可以使用getpost提交方式

补充3:getpost的区别

1、GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码 格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。

POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的 传输数据。

因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。

2、传输数据的大小

在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特 定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。

对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数 据大小进行限制,ApacheIIS都有各自的配置。

3、安全性

POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全, 上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都 会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的 用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击

4.响应

在Service API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封 HTTP响应消息。 HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应 消息体的方法。

常用方法:

void addCookie(Cookie var1);//给这个响应添加一个cookie

void sendRedirect(String var1) ;//发送一条响应码,将浏览器跳转到指定的位置

PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

setContentType() 设置响应内容的类型

重定向和转发的对比

重定向:response.sendRedirect()

转发:request.getRequestDispatcher("../success.jsp").forward(request,response);

它们的异同点

相同点:

都用来跳转页面

不同点:

a.重定向时地址栏会改变,request中存储的数据会丢失.转发时地址栏显示的是请求页面的地址,reques
数据可以保存。

b.转发属于一次请求一次响应,重定向属于两次请求(地址栏修改了两次)两次响应。 补充:使用out对象往页面中输出jshtml,cssout.print("<script type='text/javascript'>alert('登录失 ');location='../login.jsp'</script>");

注:就算使用js跳转页面,也会丢失request中的数据

5. 会话

request存的值只能在单次请求中保存,保存的数据不能跨页面,当重定向时,request存的值会丢失session的数据可以在多个页面中共享,即使重定向页面,数据不会丢失 session中可以包含nrequest

会话的概念:

从打开浏览器到关闭浏览器,期间访问服务器就称为一次会话 常用方法:

void setAttribute(String key,Object value) key/value的形式保存对象值,将数据存储在服务器端 Object getAttribute(String key) 通过key获取对象值

void invalidate() 设置session对象失效

String getId() 获取sessionid,当第一次登录成功后,session会产生一个唯一的id,浏览器之后访问时如
果发现id值还是之前id,那么说明 当前访问的属于同一个会话

void setMaxInactiveInterval(int interval) 设定session的非活动时间 示例:

方式1: session.setMaxInactiveInterval(10*60);//设置有效时间为10分钟

方式2:修改web.xml

<session-config>

<session-timeout>10</session-timeout>//单位:分钟
</session-config>

int getMaxInactiveInterval() 获取session的有效非活动时间(以秒为单位),默认的有效时间:30分钟 void removeAttribute(String key)

从session中删除指定名称(key)所对应的对象 

session失效的方式

(1)invalidate() 2removeAttribute("key") 3)直接关闭浏览器。

6.获得初始化参数

request.setCharacterEncoding("utf-8");代码的耦合度太高,不便于后期维护修改。所以可以通过初始化参 数实现

1.实现方式:

(1web.xml中先定义初始化参数

<servlet>

<servlet-name></servlet-name>
<servlet-class></servlet-class>
<init-param>

<param-name>encoding</param-name>
<param-value>utf-8</param-value>

</init-param>
</servlet>

(2)servlet中获得初始化参数,重写init()方法

public void init(ServletConfig config) throws ServletException {

           super.init(config);

// 调用父类的 init 方法

注意:这种方式的初始化参数仅限于当前servlet中使用。


2.全局初始化参数


(1)定义,context-param是和servlet标签同级别

<context-param>

<param-name>bianma</param-name>

<param-value>utf-8</param-value>
</context-param>

获得数据

@Override // 请求->init()->service()->doget/dopost->destory();

public void init(ServletConfig config) throws ServletExceptio

{

bianhao=config.getServletContext().getInitParameter("bianma");

}

7.servlet3.0

Servlet 3.0 是 Java Servlet 规范的一个重要版本,引入了一些新的特性和改进,使得开发 Web 应用更加简单和灵活。Servlet 3.0 的主要目标是简化配置、增强注解支持和改进异步处理。以下是 Servlet 3.0 的一些关键特性,用简单易懂的语言来介绍:

1. 注解支持,简化配置

在 Servlet 3.0 之前,所有的 Servlet、过滤器和监听器的配置都必须通过 web.xml 文件来完成,这样做配置非常繁琐。Servlet 3.0 引入了注解,极大地简化了这些配置:

@WebServlet:用来定义 Servlet,替代 web.xml 中的 <servlet><servlet-mapping>

public class HelloServlet extends HttpServlet { @Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws IOException

{

response.getWriter().println("Hello, Servlet 3.0!");

}

}

@WebFilter@WebListener:用于定义过滤器和监听器,同样可以通过注解直接配置。

2. 异步处理

Servlet 3.0 支持异步请求处理,这个特性非常适用于长时间运行的任务,比如调用外部服务、进行复杂计算等,而不会阻塞主线程,提高了服务器的响应效率。

  • 使用 @WebServlet(asyncSupported = true) 启用异步支持。

  • doGetdoPost 方法中启动异步处理:

    @WebServlet(value = "/async", asyncSupported = true)
    public class AsyncServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) {
            AsyncContext asyncContext = request.startAsync();
            asyncContext.start(() -> {
                try {
                    Thread.sleep(2000); // 模拟长时间任务
                    response.getWriter().println("Async Response");
                    asyncContext.complete(); // 完成异步处理
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
    }
    
    

3. 动态注册 Servlet、过滤器和监听器

Servlet 3.0 引入了动态注册 API,可以在运行时动态注册 Servlet、过滤器和监听器,而不是在部署时静态定义。

  • 使用 ServletContextaddServlet() 方法动态添加 Servlet。

public class MyAppInitializer implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        ServletRegistration.Dynamic myServlet = context.addServlet("myServlet", new MyServlet());
        myServlet.addMapping("/dynamic");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 清理工作
    }
}
 

4. 文件上传支持

Servlet 3.0 引入了对文件上传的内置支持,通过 @MultipartConfig 注解或在 web.xml 中进行配置。

  • 在 Servlet 中处理文件上传变得更加简单:

@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part filePart = request.getPart("file"); // 获取上传的文件
        String fileName = filePart.getSubmittedFileName();
        filePart.write("upload/" + fileName); // 保存文件
        response.getWriter().println("File uploaded successfully!");
    }
}
总结

  • 简化配置:通过注解减少 XML 配置文件的繁琐操作。
  • 异步处理:提升长时间请求的处理能力,提高服务器效率。
  • 动态注册:允许在运行时灵活注册组件。
  • 文件上传支持:内置对文件上传的支持,开发更方便。

Servlet 3.0 的这些改进,使得开发 Java Web 应用更加简单、高效和灵活

属性

类型

是否必须

说明

asyncSupported

boolean

指定Servlet是否支持异步操作模式

displayName

String

指定Servlet显示名称

initParams

webInitParam[]

配置初始化参数

loadOnStartup

int

标记容器是否在应用启动时就加载这个 Servlet,等价于配置文件中的标签

name

String

指定Servlet名称

urlPatterns/value

String[]

这两个属性作用相同,指定Servlet处理的url

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值