Servlet

Servlet简介

  • Servlet(Service+Applet)服务器小程序,主要用于生成动态的Web内容。
  • Servlet通常通过HTTP协议接收和响应来自Web客户端的请求。
  • Servlet实际上是一个接口

Servlet简单实现

  • 创建一个类:Myservlet 该文件目录为:D:\IdeaProjects\FirstServlet\src\servlet\MyServlet.java
  1. package servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.io.PrintWriter;
  9. //继承HttpServlet类
  10. public class MyServlet extends HttpServlet {
  11. @Override
  12. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. PrintWriter out = resp.getWriter();
  14. out.println("<h1 style='color:red'>"+"Hello Servlet"+"</h1>");
  15. }
  16. }
  • 在WEB-INF文件夹下对web.xml中配置Servlet映射
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <servlet>
  7. <servlet-name>myservlet</servlet-name>//类的别名
  8. <servlet-class>servlet.MyServlet</servlet-class>//该类的路径
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>myservlet</servlet-name>//类的别名
  12. <url-pattern>/myservlet</url-pattern>//请求该类对应的URL
  13. </servlet-mapping>
  14. </web-app>

实现原理:①当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径

  1. ②查找web.xml文件,是否有对应的<url-pattern>标签体内容。
  2. ③如果有,则在找到对应的<servlet-class>全类名
  3. tomcat会将字节码文件加载进内存,并且创建其对象
  4. ⑤调用其方法

创建Servlet的三种方法:

  • 实现Servlet接口

    1. *必须得实现接口中的抽象方法*
  • 继承GenericServlet类

  • 继承HttpServlet类

Servlet注解

每次创建Servlet类之后都要在WEB-INF文件夹下对web.xml中配置Servlet映射,但凡类较多的时候web.xml文件会因为配置Servlet显得文件过长可读性较差。而使用注解则不需要部署web.xml文件。

PS:tomcat7之前的版本是不支持注解的。这是Servlet3的特性,所以在创建项目时指定版本3.0以上。

格式: @WebServlet("资源路径") 在配置映射时,路径要加斜杠,不然会报错

  1. package servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.io.PrintWriter;
  9. @WebServlet("/myservlet") //此处为Servlet注解
  10. //继承HttpServlet类
  11. public class MyServlet extends HttpServlet {
  12. @Override
  13. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. PrintWriter out = resp.getWriter();
  15. out.println("<h1 style='color:red'>"+"Hello Servlet"+"</h1>");
  16. }
  17. }

Servlet生命周期

  1. **①加载Servlet类。**
  2. 类加载器负责加载servlet类。 Web容器接收到servlet的第一个请求时,将加载servlet类。
  3. **②创建Servlet实例。**
  4. 加载servlet类之后在第一次访问Servlet对应的URL时,tomcat会对该Servlet类创建对象,并执行构造函数。servlet实例在servlet生命周期中只创建一次。
  5. **③调用Servlet类的`init`方法。初始化**
  6. 在第一次创建Servlet时被调用,只调用一次,后续请求不再调用。用于一次性初始化。
  7. **④调用Servlet类的`service`方法。提供服务**
  8. 当对Servlet进行访问时,就会提供访问服务方法(如:`service()` `doGet()` `doPost()`)处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
  9. **⑤调用Servlet类的`destroy`方法。销毁**
  10. 从服务中删除servlet实例之前(关闭或重启tomcat),Web容器调用`destroy`方法。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收,释放资源。

启动时加载Servlet

启动时加载常用于系统的预处理

  1. web.xml使用<load-on-startup>设置启动时加载,所传递的值表示加载时的优先级,**若传递的为负值则系统第一个加载**

Servlet客户端 HTTP请求的结构

  • HTTP请求包含三部分:请求行、请求头、请求体

    • 请求行(请求方法、请求URL、HTTP协议及版本)

      如:POST /loginServlet HTTP/1.1

      关于请求方式:POST请求的请求参数在请求体中

      1. **GET请求的请求参数在请求行中,在URL之后**
    • 请求头

      1. Host: localhost:8080
      1. User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0
      2. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
      3. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

      Accept-Encoding: gzip, deflate

      Content-Type: application/x-www-form-urlencoded

      Content-Length: 30

      Connection: keep-alive

      Referer: http://localhost:8080/FirstServlet/login.html

      Cookie: JSESSIONID=131FD70E4649021B826F5654951687CF

      Upgrade-Insecure-Requests: 1

      User-Agent(用户环境,包括客户使用的操作系统及版本 CPU类型 浏览器版本等一些信息)

    • 请求体****(封装POST请求消息的请求参数)

      1. username=admin&password=123456

Servlet服务器 HTTP响应的结构

  • HTTP响应包含三部分:响应行、响应头、响应体

    • 响应行(报文协议及版本、状态码及状态描述)

      1. Http/1.1 200 OK
    • 响应头(一些辅助信息)

      1. Content-Typetext/html
      2. .......
    • 响应体(描述了浏览器要响应的信息)

HTTP常见状态码

状态码 错误描述
200 服务器处理成功
404 无法找到文件
500 内部服务器错误
403 服务器拒绝访问
301、302 请求重定向
400 无效的请求
401 未经过授权
503 服务器超负荷或停机维护,无法处理请求

ConteneType的作用

  • ConteneType决定浏览器以何种方式来处理响应体
类型 描述
text/plain 纯文本
text/html HTML文档
text/xml xml文档
application/x-msdownload 需要下载的资源

Servlet请求转发与响应重定向

Servlet请求转发

原理:输入一个正确的URL之后,会产生一个请求发送到Tomcat上,在Servlet_A处理完之后调用request.getRequestDispatcher().forward()方法之后,将HttpServletRequest对象原封不动的发送给Servlet_B,在Servlet_B处理完之后产生响应返回给客户端。

checkLogin.java

  1. package servlet_direct;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/direct/check")
  9. public class checkLogin extends HttpServlet {
  10. @Override
  11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12. System.out.println("用户登录成功!");
  13. req.getRequestDispatcher("/direct/index").forward(req,resp);//请求转发语句
  14. }
  15. }

indexServlet.java

  1. package servlet_direct;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/direct/index")
  9. public class indexServlet extends HttpServlet {
  10. @Override
  11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12. resp.getWriter().println("<h1>This is index page</h1>" );
  13. }
  14. }
  1. ②转发只能访问当前服务器下的资源
  2. ③转发是一次请求,可以使用request对象来共享数据

Servlet响应重定向

原理:输入一个正确的URL之后,会产生一个请求发送到Tomcat上,在Servlet_A处理完产生响应返回给客户端,客户端再产生新的请求跳转到新地址上,由Tomcat发送给Servlet_B处理完之后产生新的响应返回给客户端。

checkLogin.java

  1. package servlet_direct;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/direct/check")
  9. public class checkLogin extends HttpServlet {
  10. @Override
  11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12. System.out.println("用户登录成功!");
  13. resp.sendRedirect("/FirstServlet/direct/index");//响应重定向语句
  14. }
  15. }

indexServlet.java

  1. package servlet_direct;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/direct/index")
  9. public class indexServlet extends HttpServlet {
  10. @Override
  11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12. resp.getWriter().println("<h1>This is index page</h1>" );
  13. }
  14. }

请求转发和响应重定向比较

请求转发 响应重定向
转发地址栏路径不变 地址栏发生变化
只能访问当前服务器下的资源 可以访问其他站点(服务器)的资源
一次请求,可以使用request对象来共享数据 两次请求。不能使用request对象来共享数据

会话技术(Cookie和Session)

会话:客户端和服务器之间发生一系列的请求与响应的过程。(一方断开即会话结束)

作用:在一次会话的范围内的多次请求间,共享数据

**方式: **客户端会话技术:Cookie

  1. 服务器端会话技术:Session

Servlet Cookie

概念:客户端会话技术,将数据保存到客户端。当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息服务器向客户端发送Cookie时,会在HTTP响应头中增加Set-Cookie响应头信息,这些信息会保存在Cookie中。这样,当浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。

Cookie工作原理

当浏览器向服务器发送请求之后,服务器会创建一个Cookie对象,将数据保存在其中,然后把Cookie对象放在响应头(response.addCookie(cookie对象))发送给浏览器,浏览器接收响应后将Cookie保存在客户端;当浏览器再次访问服务器时,会把保存的Cookie放在请求头中一起发送给服务器,服务器从中获取Cookie(request.getCookie()),然后作出响应。

cookie_first.java

  1. package servlet_cookie;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. @WebServlet("/cookie_first")
  10. public class cookie_first extends HttpServlet {
  11. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12. //创建Cookie对象,存储相应数据
  13. Cookie cookie = new Cookie("name", "Jack");
  14. //将生成的cookie发送给浏览器
  15. response.addCookie(cookie);
  16. //设置持久化时间
  17. cookie.setMaxAge(60*2);//有效时间2分钟
  18. }
  19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. this.doPost(request, response);
  21. }
  22. }

cookie_second.java

  1. package servlet_cookie;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. @WebServlet("/cookie_second")
  10. public class cookie_second extends HttpServlet {
  11. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12. //服务器从中获取cookie
  13. Cookie[] cookies = request.getCookies();
  14. for (Cookie cookie : cookies) {
  15. response.getWriter().println(cookie.getName()+"="+cookie.getValue());
  16. }
  17. }
  18. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  19. this.doPost(request, response);
  20. }
  21. }

Servlet Session

概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。默认情况下session的有效时间为30分钟。

Session工作原理

客户端发送一个全新的请求给服务器,服务器就会创建一个Session对象,并且设置SessionId:178HA。然后Servlet会执行session.setAttribute("name","王小二");设置自定义属性,把数据封装在这个Session对象中,将Session对象保存在服务器中。之后会将SessionID连同响应回浏览器,浏览器就会把SessionId值存储在Cookie中。在下一次发送请求时,会携带SessionID:178HA给服务器。服务器会根据所获取的Session编号找到对应的Session对象,然后利用该Session对象把保存的数据取出来!

loginServlet.java

  1. package servlet_session;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. @WebServlet("/session/login")
  10. public class loginServlet extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. //创建Session对象
  14. HttpSession session = req.getSession();
  15. //设置自定义属性
  16. session.setAttribute("name","王小二");
  17. //获取SessionId
  18. System.out.println(session.getId());
  19. req.getRequestDispatcher("/session/index").forward(req,resp);
  20. }
  21. }

indexServlet.java

  1. package servlet_session;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. @WebServlet("/session/index")
  10. public class indexServlet extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. HttpSession session = req.getSession();
  14. System.out.println(session.getId());
  15. //获取自定义属性
  16. String name =(String)session.getAttribute("name");
  17. //设置响应编码格式
  18. resp.setContentType("text/html;charset=utf-8");
  19. resp.getWriter().println("当前登录用户为:"+name);
  20. }
  21. }

Post请求中文乱码

对于Tomcat8.X版本,默认Get请求发送中文就是UTF-8格式,无须转换。

而对于Post请求,通过调用setCharacterEncoding("UTF-8")来解决中文乱码问题。

关于Servlet小总结的更多相关文章

  1. 第一个servlet小程序

    第一个servlet小程序 com.fry.servlet.HelloServlet package com.fry.servlet; import javax.servlet.ServletExce ...

  2. IDEA使用技巧,如何在JSP中创建Servlet“小程序”

    步骤 1.新建一个java类,实现Servlet接口 2.实现接口中的抽象方法: 3.在web.xml文件中配置好servlet <web-app ......> <servlet& ...

  3. Servlet小总结

    Servlet Servlet(服务器端小程序)是使用Java语言编写的服务器端程序,像JSP一样,生成动态的Web页.Servlet主要运行在服务器端,并由服务器调用执行. Servlet处理的基本 ...

  4. servlet(2) - 利用MyEclipse新建一个servlet - 小易Java笔记

    1.Tomcat在MyEclipse中集成 ==> Window-preferences-MyEclipse-Servers-Tomcat-Tomcat 6.x-点击右侧的Browse,选择你的 ...

  5. 第一个servlet小例子

    1.sendForward.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&q ...

  6. Servlet小示例:jsp页面提交信息Servlet接收并打印输出

    该示例采用doPost方法提交表单,该示例一共包含两个文件. 一个是用来提交用户信息的表单userForm2.jsp,另一个是用来接收参数的Servlet. userForm2.jsp <%@ ...

  7. Servlet小知识点

    1. Sevlet是一个java类,供以其他程序调用,不能独立运行,需要Servlet引擎(Servlet容器)来管理和调度. 2. 服务器启动后,一般只会创建一个Servlet实例对象,init方法 ...

  8. 一个简单的servlet小程序

    servlet是不能单独运行的,他是运行在web服务器或应用服务器上的java程序,或者可以说是在servlet容器上运行的,我们经常使用到的tomcat就是一个servlet容器. 他是处理HTTP ...

  9. Servlet小总结(转)

    一,什么是Servlet? Servlet是一个Java编写的程序,此程序是基于Http协议的,在服务器端运行的(如tomcat), 是按照Servlet规范编写的一个Java类. 二,Servlet ...

随机推荐

  1. elasticsearch.yml 常用参数说明

    cluster.name: 指定node所属的cluster. node.name: 本机的hostname. node.master: 是否可以被选举为master节点.(true or false ...

  2. LFS Linux From Scratch 笔记(经验非教程)

    做了一个自己的DIY Linux系统.从编译每一行代码,建立每一个文件系统结构开始. 创造自己的GNU/Linux系统,不同于任何发行版.按照的教程是来自 linuxfromscratch.org 来 ...

  3. Python自学day-3

    一.集合     集合元素不会重复,而且是无序的.       定义集合: set_1 = {1,2,3,4,5}     set求交集(intersection): set1 = set([1,2, ...

  4. K8s集群部署(三)------ Node节点部署

    之前的docker和etcd已经部署好了,现在node节点要部署二个服务:kubelet.kube-proxy. 部署kubelet(Master 节点操作) 1.二进制包准备 [root@k8s-m ...

  5. [Vue 牛刀小试]:第十五章 - 传统开发模式下的 axios 使用入门

    一.前言 在没有接触 React.Angular.Vue 这类 MVVM 的前端框架之前,无法抛弃 Jquery 的重要理由,除了优秀的前端 DOM 元素操作性以外,能够非常便捷的发起 http 请求 ...

  6. Filebeat 7.1.1 安装及使用(连接ES)

    1. 下载 & 解压 # 下载 wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.1-linux- ...

  7. Flutter学习笔记(4)--Dart函数

    如需转载,请注明出处:Flutter学习笔记(4)--Dart函数 Dart是一个面向对象的语言,所以函数也是对象,函数属于Function对象,函数可以像参数一样传递给其他函数,这样便于做回调处理: ...

  8. django基础知识之HTML转义:

    HTML转义 Django对字符串进行自动HTML转义,如在模板中输出如下值: 视图代码: def index(request): return render(request, 'temtest/in ...

  9. 小白开学Asp.Net Core 《七》

    小白开学Asp.Net Core <七> — — 探究中间件(MiddleWare) 1.何为中间件? 中间件是组装到应用程序管道中以处理请求和响应的家伙,管道中的每个组件都要满足以下两个 ...

  10. hibernate中的dialect解释

    dialect就是“方言”,因为hibernate是要把Java对象转换成关系数据库来描述的,而关系数据库虽然有一些统一的标准,如SQL-92等,但是实际上各数据库如Oracle, MySQL, MS ...