了解Web容器(servlet+jsp+tomcat实战)

写在前面:在阅读这篇文章的时候,各位读者可以一边看一边思考,Web容器、tomcat、servlet、jsp之间究竟是什么关系。

一 Web容器

1.什么是web容器
容器,就是一个可以存放东西的物体。那么web容器可以简单理解为存放web程序的容器。 Web应用程序需要部署到Web容器中才能运行,两者都必须符合J2EE规范。web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,通过web容器,只需要按照它的规范写出功能逻辑,而网络连接管理,会话管理等功能都由容器实现,从而简化开发流程。比如JAVA中的Tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以有多个容器。

2.web容器包含什么

常见web容器:
WebLogic是美国bea公司出品的一个application server确切的说是一个基于j2ee架构的中间件。BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。属于收费软件,并且价格不菲。

WebSphere是 IBM 的集成软件平台。它包含了编写、运行和监视全天候的工业强度的随需应变 Web 应用程序和跨平台、跨产品解决方案所需要的整个中间件基础设施,如服务器、服务和工具。WebSphere 提供了可靠、灵活和健壮的集成软件。属于收费软件,并且价格不菲。

JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3.0的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。2006 年,Jboss 公司被 Redhat 公司收购。属于开源软件。

Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Web应用程序规范:
1)目录结构:Web应用程序的所有文件都包含在一个文件夹中,该文件夹包含WEB-INF子文件夹和META-INF子文件夹,WEB-INF文件夹包含classes文件夹和lib文件夹以及web.xml文件。

2)jar文件:放在WEB-INF/lib文件夹中了,提供所需的方法。

3)web.xml文件:整个web应用程序的描述文件,里面定义了Servlet,过滤器,监听器等信息。

4)其它资源文件:(HTML,CSS,JavaScript,JSP,图片等)放在与WEB-INF同一级目录下。(WEB-INF文件夹对于客户端是不可见的)
下文会对Tomcat以及其包含的servlet容器进行一个简单的介绍

tomcat配置

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。tomcat作为一种web容器,可以用来运行servlet文件。
在idea中配置tomcat教程可参考:
文字教程:https://www.cnblogs.com/weixinyu98/p/9822048.html
视频教程:https://www.bilibili.com/video/BV1BJ411L7NR
假如你已经下载安装了tomcat,并且已经配好路径,接下来在idea中
1,点击Run—Edit Configurations…
在这里插入图片描述
2.点击+号,选择到Tomcat Server
在这里插入图片描述
3.Name处可以写tomcat的版本,如tomcat-9.0.35,然后点击右侧configuration
在这里插入图片描述
在configuration中找到本地tomcat。
在这里插入图片描述
以及在liberties下导入jsp-api.jar和servlet-api.jar。一般来说会自动生成,如果没有的话请点击+号,选择tomcat文件夹内的lib文件夹,找到jsp-api.jar和servlet-api.jar,导入即可。
在这里插入图片描述
当配置正确时,Tomcat 可运行JSP 页面、Servlet和html。另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
与传统的桌面应用程序不同,Tomcat中的应用程序是一个WAR(Web Archive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便。
在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。
Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache.我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet.这种集成只需要修改一下Apache和Tomcat的配置文件即可。

二 servlet

1.什么是servlet

Servlet简介
Servlet是sun公司提供的一门用于开发动态web资源的技术,Servlet运行在Tomcat容器当中。
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口
2、把开发好的Java类部署到web服务器中
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet

Servlet的运行过程
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

servlet生命周期
1、加载和实例化
Servlet 的创建是指加载和实例化两个过程。Servlet容器在如下时刻加载和实例化一个Servlet:
(1)在服务器运行中,客户端首次向Servlet发出请求
(2)重新装入Servlet时
(3)在为Servlet配置了自动装入选项时,服务器在启动时会自动装入次Servlet
2、初始化
Servlet实例化后,Servlet容器将调用Servlet的 init方法来对Servlet实例进行初始化。在这一过程中,可以读取一些固定的数据、初始化JDBC的连接以及建立与其他资源的连接等操作。init方法的参数ServletConfig对象由Servlet容器创建并传递给Servlet,并在初始化后一直在内存中存在,直到Servlet被销毁。

如果初始化没有问题,Servlet 在Web容器中会处于服务可用状态。如果初始化失败,Servlet容器会从运行环境中清除掉该实例。当Servlet运行出现异常时,Servlet容器会使该实例变为服务不可用状态。

3、处理请求

服务器接收到客户端请求,会为该请求创建一个请求对象和一个响应对象并调用 service() 方法,service()方法再调用其他方法来处理请求。在Servlet 生命周期中,service()方法可能被多次调用。当多个客户端同时访问某个Servlet的service()方法时,服务器会为每个请求创建一个线程,这样可以并行处理多个请求,减少请求处理的等待时间,提高服务器的响应速度。但同时也要注意对同一对象的并发访问问题。

4、销毁

当Srvlet容器需要终止Servlet,它会先调用Servlet的destroy方法使其释放正在使用的资源。在Servlet容器调用destroy方法之前,必须让当前正在执行service()方法的任何线程完成执行,或者超过了服务器定义的时间限制。在destroy方法完成之后,Servlet容器必须释放Servlet实例以便于被垃圾回收
在使用servlet时,通常不需要重写servlet的初始化和销毁方法,而只需要对service修改即可。

2.servlet的使用
实现servlet接口
SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。其中最常用的是HttpServlet。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要重写doGet或doPost方法,而不要去重写service方法。

将servlet与jsp进行匹配
匹配也就是将jsp中的数据传输到servlet中,有两种方法。
1.通过注释
在servlet类前一行加上@WebServlet("/test")

@WebServlet("/test")
public class TestServlet extends HttpServlet {
}

2通过配置文件web.xml

主要有两个关键的地方,servlet-class写servlet完整类名,url-pattern写servlet名称,通常是自定,需要与jsp中传递的servlet名称相同。
xml配置

<?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>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>com.southwind.servlet.TestServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>

</web-app>

jsp测试代码
url-pattern与action的值相同

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Title</title>
  </head>
  <body>
    <form action="/test" method="post">
      姓名:<input type="text" name="name" />
      <input type="submit" value="提交" />
    </form>
  </body>
</html>

HttpServlet类中的主要方法及其描述

方法方法描述
service(HttpServletRequest req,HttpServletResponse resp)HttpServlet在实现Srvlet接口时,重写了service方法,该方法会自动判断用户的请求方式,若为Get请求则调用HttpServlet的doGet() 方法,若为POST请求,则调用doPost方法。
doGet(HttpServletRequest req,HttpServletResponse resp)此方法被本类service方法调用,用来处理一个 http get请求
doPost(HttpServletRequest req,HttpServletResponse resp)此方法被本类service方法调用,用来处理一个 http post请求。

3.Servlet之request和response
首先,如果指定一个类继承了servlet接口的话,那么需要操作的就是request和response。如果是继承了HttpServlet类,那么需要操作的就是req和resp。

HttpServletRequest常用方法
HttpServletRequest 对象:主要作用是用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是 HttpServletRequest 接口的实例化对象,表示该对象主要应用在 HTTP 协议上,该对象是由 Tomcat 封装好传递过来。

1、获得客户端方面的信息

	getRequestURL();方法返回客户端发出请求时的完整URL。

  getRequestURI();方法返回请求行中的资源名部分。

  getQueryString(); 方法返回请求行中的参数部分。

  getPathInfo();方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。

  getRemoteAddr();方法返回发出请求的客户机的IP地址。

  getRemoteHost();方法返回发出请求的客户机的完整主机名。

  getRemotePort();方法返回客户机所使用的网络端口号。

  getLocalAddr();方法返回WEB服务器的IP地址。
  
	getLocalName();方法返回WEB服务器的主机名。

2、获得客户端请求头文件(header)
请求头包含了发送请求方的某些信息,在requst中可以通过getHeader取出请求头中的值。

getHeader(string name);方法:String 
getHeaders(String name);方法:Enumeration 
getHeaderNames();方法

输入参数与输出值:

package com.southwind.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;

@WebServlet("/test")
public class TestServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码,处理乱码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        resp.getWriter().write("Accept: " + req.getHeader("Accept") +"<br/>");
        resp.getWriter().write("Host: " + req.getHeader("Host") +"<br/>");
        resp.getWriter().write("Referer : " + req.getHeader("Referer") +"<br/>");
        resp.getWriter().write("Accept-Language : " + req.getHeader("Accept-Language") +"<br/>");
        resp.getWriter().write("Accept-Encoding : " + req.getHeader("Accept-Encoding") +"<br/>");
        resp.getWriter().write("User-Agent : " + req.getHeader("User-Agent") +"<br/>");
        resp.getWriter().write("Connection : " + req.getHeader("Connection") +"<br/>");
        resp.getWriter().write("Cookie : " + req.getHeader("Cookie") +"<br/>");
		//resp.getWriter().write()是request的方法,作用是在页面上输出
    }   
}

在这里插入图片描述

3、转发

getRequestDispatcher(String url);

getRequestDispatcher有两个方法
1.void forward(ServletRequest request,ServletResponse response)

用来传递request的,可以一个Servlet接收request请求,另一个Servlet用这个request请求来产生response。request传递的请求,response是客户端返回的信息。forward要在response到达客户端之前调用,否则会出现异常。
转发通常使用getRequestDispatcher(url).forword(req,resp);

2.void include(ServletRequest request,ServletResponse response)
请求转发后,原先的Servlet还可以继续输出响应信息,转发到的Servlet对请求做出的响应将并入原先Servlet的响应对象中。

下图能更好的解释这两者的区别
在这里插入图片描述

4、其他常用方法


String getParameter(String name)	返回name指定参数的参数值
String[] getParameterValues(String name)	返回包含参数name的所有值的数组

void setAttribute(String,Object)	存储此请求中的属性
Object getAttribute(String name)	返回指定属性的属性值
要注意,setAttribute和getAttribute只有先set了才能get到。

String getContentType()	得到请求体的MIME类型
String getProtocol()	返回请求用的协议类型及版本号
String getServerName()	返回接受请求的服务器主机名
int getServerPort()	返回服务器接受此请求所用的端口号
String getCharacterEncoding()	返回字符编码方式
void setCharacterEncoding()	设置请求的字符编码方式 通常设置为UTF-8来处理页面显示中文乱码问题
int getContentLength()	返回请求体的长度(以字节数)
String getRemoteAddr()	返回发送此请求的客户端IP地址
String getRealPath(String path)	返回一虚拟路径的真实路径
String request.getContextPath()	返回上下文路径

测试输出
jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Title</title>
  </head>
  <body>
    <form action="/test" method="post">
      姓名:<input type="text" name="name" />
      <input type="submit" value="提交" />
    </form>
  </body>
</html>

servlet文件

package com.southwind.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;

@WebServlet("/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        System.out.println("name =" + req.getParameter("name"));//返回name指定参数的参数值
        req.setAttribute("name",req.getParameter("name"));//存储此请求中的属性
        System.out.println("req.getAttribute(name) =" + req.getAttribute("name"));//返回此请求中的属性
        System.out.println("req.getContentType() =" + req.getContentType());//得到请求体的MIME类型
        System.out.println("req.getProtocol() =" + req.getProtocol());//返回请求用的协议类型及版本号
        System.out.println("req.getServerName() =" + req.getServerName());//返回接受请求的服务器主机名
        System.out.println("req.getServerPort() =" + req.getServerPort());//返回服务器接受此请求所用的端口号
        System.out.println("req.getCharacterEncoding() =" + req.getCharacterEncoding());//返回字符编码方式
        System.out.println("req.getContentLength() =" + req.getContentLength());//返回请求体长度
        System.out.println("req.getRemoteAddr() =" + req.getRemoteAddr());//返回发送此请求的客户端IP地址
        System.out.println("req.getContextPath() =" + req.getContextPath());//返回上下文路径

    }
}

输入
在这里插入图片描述
输出
在这里插入图片描述
getContextPath为空主要是因为没有设置访问网址的context,可针对此博客https://blog.csdn.net/u014402533/article/details/82621853对idea配置进行修改,修改此配置对使用其他功能无影响。

httpservletResponse 常用方法

设置编码
response.setContentType(“text/html; charset=UTF-8”);
response.setCharacterEncoding(“UTF-8”);
这两种方式都需要在response.getWriter调用之前执行才能生效。

区别: response.setContentType(“text/html; charset=UTF-8”);
不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文

向客户端发送数据
getOutputStream(); 该方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。
getWriter(); 该方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文
1,getOutputStream()和getWriter()这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
2,getOutputStream()返回的字节输出流对象,类型为:ServletOutputStream,直接输出字节数组中的二进制数据。
3,getWriter()方法将Servlet引擎的数据缓冲区包装成P:rintWriter类型的字符输出流对象后返回,PrintWriter对象只能输出字符文本内容。

转发
resp.sendRedirect("/index.jsp"); 重定向,浏览器会跳转到所指定的网址

负责向客户端发送响应头
addDateHeader(String name ,long date) 该方法是设置只有一个值且值的类型为long类型的响应头,例如expies响应头,表示过期时间。
addHeader(String name,String value) 该方法是设置有多个值的响应头,参数name表示响应头名称,参数value表示响应头的值。
addIntHeader(String name,int value) 该方法是设置有多个值且值的类型为int类型的响应头。
setHeader(String name,String value) 该方法是设置只有一个值的响应头,参数name表示响应头名称,参数value表示响应头的值。
setDateHeader(String name,long value) 该方法是设置只有一个值且值的类型为long类型的响应头,例如expies响应头,表示过期时间。
setIntHeader(String name,int value) 该方法是设置只有一个值且值的类型为int类型的响应头,例如Content-Length响应头,该响应头是代表响应内容有多少字节数。

三 jsp

1.jsp是什么
JSP(全称JavaServer Pages),其本身就是servlet的简化,是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。jsp可以作为一个页面,和html最大的区别在于jsp可以嵌入并运行java代码,来实现某种动态功能。
简单来说,JSP其实还是一种对servlet的简化语言,所有的JSP页面最终都会被servlet容器编译成servlet类,而和servlet相比,JSP主要是方便进行动态html开发设计的,可以使用html以及jsp的一些标签语法。

2.jsp的使用
jsp普通的使用和html类似,都是通过标签在页面中显示内容,重点讲解jsp中如何嵌入Java程序。
html标签可参考HTML+JS+CSS+xml快速入门HTML 标签
1、jsp脚本

	<% Java代码>

2、jsp声明:定义jsp方法

	<%! 定义方法>

3、jsp表达式:在页面上输出变量

	<%= Java变量>

测试代码:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        System.out.println("Java代码");
        String name = "tom";
    %>

    name = <%=name%>

    <%!
        void hello(){
            System.out.println("Hello,这是定义java方法");
        }
    %>

    <% hello();%>
</body>
</html>

页面输出:
在这里插入图片描述

控制台输出:
在这里插入图片描述
JSP内置对象
在这里插入图片描述

常用指令
常用指令
可以用来设置jsp页面的属性。指令的形式如下:

<%@ 指令名 key="value" %>

常用的有三个指令,分别是page、include、taglib:

page指令

用于定义网页依赖属性,比如脚本语言、error页面、缓存需求等等;

比如我们设置当前页面的语言、编码格式、字符集、导入哪些类、是否使用session、设置错误页面、

<%@ page 
	language="java"
	contentType="text/html; charset=utf-8"
	errorPage="error.html"
	import="java.util.Date"
	session="true"
	pageEncoding="utf-8"
 %>

include指令
用来包含其他文件,执行时同时解析这个include进去的jsp文件。

<%@ include file="demo.jsp" %>

taglib指令

用来引入标签库的定义,比如要使用jstl标签库,都要使用tablib导入

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

注释

<%--
	out.println("this is comment");
	这部分内容不会出现在servlet中,也不会出现在html代码中
--%>

EL表达式
可以方便的取出四大对象作用域中保存的数据,若查询时不指定,那么会从page按作用域从小到大的顺序查询,直到application。

${person.name}  取值
<h1>${100*2}</h1>  简单计算
${pageScope.person.name} 在page作用域中查

JSP内置对象作用域
pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域

内置对象对应的作用域有效区域
pageContextpageScope在当前页面有效
requestrequestScope在一次请求内有效
sessionsessionScope一次会话中有效
applicationapplication Scope整个web应用有效

四 使用tomcat、servlet、jsp部署一个简单web应用

1.新建web工程
file-new-project,选中Web Application,点击next新建
在这里插入图片描述

2.jsp文件
实现功能:将jsp中的填写的表单数据取出,并展示在页面上


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form method="post" action="/formtest" >
        姓名:<input type="text" name="name" />
        年龄:<input type="text" name="age" />
        身高:<input type="text" name="high" />
        性别:男<input type="radio" name="sex" value="男" checked/><input type="radio" name="sex" value="girl"/>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

2.servlet文件
主要作用:通过req.getParameter获得对应的参数,在通过resp.getWriter()在页面上输出。

package com.southwind.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;

@WebServlet("/formtest")
public class DemoServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        String name = req.getParameter("name");
        String age = req.getParameter("age");
        String high = req.getParameter("high");
        String sex = req.getParameter("sex");

        resp.getWriter().println("姓名:"+name+" 年龄:"+age+" 身高:"+high+" 性别:"+sex);
    }
}

jsp页面:在这里插入图片描述

servlet处理结果:在这里插入图片描述

总结

回到开头,你是否对web容器、tomcat、servlet、jsp这三者的关系更加清晰了呢?
简单来说web容器包括了tomcat,而servlet需要在tomcat中运行,而jsp运行时会被编译成servlet,然后一起在tomcat中运行。


版权声明:本文为PANDORA_A原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。