Servlet基础

本文介绍了Java Servlet的基础知识,包括Servlet的概念、架构、任务,以及Tomcat服务器的使用。详细讲解了Servlet的生命周期,从创建到销毁的过程,并探讨了Servlet在实际应用中的部署和项目结构。此外,还涵盖了Servlet的编写,如处理GET/POST请求,读取表单数据,设置HTTP响应头部,使用过滤器和异常处理,以及Cookie和Session的管理。内容全面,适合初学者入门学习。
摘要由CSDN通过智能技术生成

参考教程:菜鸟教程

目录

Servlet基础概念

Servlet

Servlet 架构

Servlet 任务

Tomcat

导入jar包

Servlet 生命周期

Servlet部署/IDEA创建Web项目

JSP与HTML与Servlet

Servlet项目包结构

Servlet 实例

Servlet编写

Servlet与Get/Post

读取表单数据

Http获取请求头部信息

Http设置响应头部信息

Http设置头部状态码

过滤器Filter

异常处理

Cookie处理

Session会话

访问数据库

网页重定向

网页访问量计数器

Servlet 自动刷新页面


Servlet基础概念

Servlet

Java Servlet 是运行在 Web 服务器或应用服务器上的程序(注意,Servlet是这样一类程序的总称),它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类。

Servlet 可以使用 javax.servlet 和 javax.servlet.http 包创建,它是 Java 企业版的标准组成部分,Java 企业版是支持大型开发项目的 Java 类库的扩展版本,这些类实现 Java Servlet 和 JSP 规范

Servlet 架构

Servlet æ¶æ

Servlet 任务

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

Tomcat

Apache Tomcat 是一款实现 Java Servlet 和 JavaServer Pages 技术的开源软件,可以作为测试 Servlet 的独立服务器,而且可以集成到 Apache Web 服务器。

下载完Tomcat之后,进入目录

\bin\startup.bat   执行脚本启动服务器
\bin\shutdown.bat     关闭服务器

导入jar包

通常需要手动在项目中导入apache-tomcat\lib\servlet-api.jar以使用javax.servlet.*

如果使用Maven等工具创建项目,需要在pom.xml(配置文件)中手动添加依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

Servlet 生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,由 JVM 的垃圾回收器进行垃圾回收。

init() 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。

service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以不用对 service() 方法做任何动作,只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

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

Servlet çå½å¨æ

 在这里,Servlet是一个统称,表明是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类。Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.http.HttpServlet,并实现 Servlet 接口的抽象类专门用来处理 HTTP 请求。

Servlet部署/IDEA创建Web项目

默认情况下,Servlet 应用程序位于路径 <Tomcat-installation-directory>/webapps/ROOT 下,且类文件放在 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes 中。

并要对<Tomcat-installation-directory>/webapps/ROOT/WEB-INF/ 的 web.xml 文件进行相应的配置。这种修改很麻烦,通常创建Web项目更方便。

使用IDEA+maven创建Web项目,IDEA要使用企业版,否则无法开发web项目

贴一片教程:|---传送门---|,这教程虽然很啰嗦,但大体上差不多

JSP与HTML与Servlet

简单的说jsp是Servlet的简化版,html的复杂版,一般来说,Servlet用于处理数据,用在控制层,jsp用在视图层。

参考:魔法门传送

Servlet项目包结构

涉及到 WEB-INF 子目录的 Web 应用程序结构是所有的 Java web 应用程序的标准,并由 Servlet API 规范指定。给定一个顶级目录名 myapp,目录结构如下所示:

/myapp
    /images
    /WEB-INF
        /classes
        /lib

WEB-INF 子目录中包含应用程序的部署描述符,名为 web.xml。所有的 HTML 文件都位于顶级目录 myapp 下。

WEB-INF/classes 目录包含了所有的 Servlet 类和其他类文件,类文件所在的目录结构与他们的包名称匹配。例如,如果有一个完全合格的类名称 com.myorg.MyServlet,那么这个 Servlet 类必须位于以下目录中:

/myapp/WEB-INF/classes/com/myorg/MyServlet.class

Servlet 实例

package study;

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.io.PrintWriter;

/**
 * 扩展HttpServlet,位于apache-tomcat/lib/下的servlet-api.jar里
 */

public class HelloWorld extends HttpServlet {
    private String message;

    @Override
    public void init() throws SecurityException{
        message="Hello World";
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");//设置响应报文格式
        PrintWriter out=response.getWriter();//获取写入流
        out.println("<h1>"+message+"</h1>");//将浏览器作为终端进行标准打印
    }

    public void  destory(){

    }
}

然后需要在webapp/WEB_INF/下的web.xml进行相应配置

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<!--web的响应控制都要在web.xml中进行相关的配置-->
<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--设置servlet,name代表ID,class为对应的类,mapping表示映射,由ID映射对应的所访问的url路径-->
  <!--url-pattern-name-class-->
  <servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>study.HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>


</web-app>

由以上过程我们可以看到,每一个页面对应一个Servlet,是一个对HttpServlet进行了相应扩展的class,也就是我们自己写的Servlet,在Servlet里定义一系列行为,最基本的包括init():初始化;service:重写doGet()/doPost()等由request设置对应的response;destory():断开连接后的工作,写好Servlet,要在web.xml下进行相应的配置,每一个class有对应的name,每一个name要对应相应的url-pattern,也就是访问页面时的url。

Servlet编写

Servlet与Get/Post

前端页面与服务器交互响应通过一些定义好的方法进行说明,如get/post等。

GET 方法向页面请求发送已编码的用户信息。页面和已编码的信息中间用 ? 字符分隔,如下所示:

http://www.test.com/hello?key1=value1&key2=value2

GET 方法是默认的从浏览器向 Web 服务器传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中。

POST方法也是向服务器传输数据,但是是作为单独的消息发送,与Get功能一样

servlet通过doGet()方法处理get请求,doPost()方法处理post()请求

可以调用 request.getParameter() 方法来获取表单参数的值。

中间Servlet:

package study;

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.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * 响应Get方法,request通过get传递参数值,由getParameter()方法获取表单参数值,并进行解析返回response
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID=1L;//序列化ID
    private static Map<String,String> storge=new HashMap<>();

    public HelloForm(){
        super();
        storge.put("1","LSL-test");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        response.setContentType("text/html;charset=UTF-8");
        String id=request.getParameter("id");//由getParameter()方法获取表单参数值

        PrintWriter out=response.getWriter();
        out.println("" +
                "<html>" +
                "    <head>" +
                "        <title>使用Get由id获取name</title>" +
                "    </head>" +
                "    <body>" +
                "        id="+id+
                "        name="+storge.get(id) +
                "    </body>" +
                "</html>");
    }
}

前端简单页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>lsl-使用Get由id获取name</title>
</head>
<body>
<!--form表示表单,action对应访问路径,method对应方法
    input表示输入,name是提交的name,value为提交的输入内容,submit对应的value是显示的内容
     点击提交时响应action,因为已经设置method为get,所以request自动将id=1发送过去-->
<form action="$项目名称(部署的war_exploded名称)/HelloForm" method="get">
    id:<input type="text" name="id"/>
    <input type="submit" value="提交">
</form>
</body>
</html>

使用注解@WebServlet("/XXX")与配置web.xml效果一样,但需注意访问路径

可以看到,get方法是默认的request的方法,通过get发送数据,可以直接通过url?key=value&..这样的形式,但前提是你必须知道相应的key到底是什么,也可以前端自己设置,进行表单提交,Servlet进行处理后返回对应的response。

读取表单数据

web的核心是访问资源与数据通信,访问资源包括浏览与下载,浏览html页面,下载相应资源。数据通信就是与服务器进行交互,给予服务器数据返回响应,后台如何读取数据呢,Servlet提供三个最基本方法。

在这之前,前端的表单的展现形式是标签<form>,标签包含多个字标签,<name>就是表单选项的name。

<form action="/java_servlet_jsp_war_exploded/ReadParams" method="post" target="_blank">
    <input type="checkbox" name="maths" checked="checked" /> 数学
    <input type="checkbox" name="physics"  /> 物理
    <input type="checkbox" name="chemistry" checked="checked" /> 化学
    <input type="submit" value="选择学科" />
</form>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值