一、JAVA SE 和Java EE
Java SE (标准版) 是 Java 的核心基础,用于开发桌面应用、命令行工具等;而 Java EE (现 Jakarta EE) 是在 SE 基础上构建的企业级平台,提供大量开发、部署大型分布式网络应用(如 Web 服务、电子商务系统)所需的标准服务器端组件和API。
可以把 Java SE 想象成 一个功能齐全的厨房(基础核心 + 工具),能做出各种家常菜(桌面、工具软件)。
而 Java EE (Jakarta EE) 则是 专为大型连锁餐厅设计的整套厨房系统。它建立在 SE 厨房的基础上,额外提供了标准化的专业设备(如分布式通信、Web 服务、安全、事务管理、数据库连接池等),专门用于高效、安全地制作和供应(部署)大批量、复杂的菜品(企业级 Web 应用)。
总结来说:Java SE 是基础语言和运行时环境,Java EE 是针对构建复杂网络/企业应用的标准扩展平台。 你用 Java SE 也能写服务器应用(比如手机APP后端),但需要自己造很多轮子;而 Java EE 提供了现成的、标准化的企业级轮子。
二、Java EE和Servlet版本
Java EE指的是Java平台企业版(Java Platform Enterprise Edition),之前称为Java 2 Platform, Enterprise Edition(J2EE),2017 年的 9 月Oracle将Java EE 捐赠给 Eclipse 基金会,由于Oracle持有Java商标原因,Eclipse基金于2018年3月将Java EE更名为Jakarta EE。
| 平台版本 | 发布日期 | 规范 | Java SE支持 | 重要变化 |
|---|---|---|---|---|
| Jakarta EE 10 | 2022-09-13 | 10 | Java SE 17, Java SE 11 | 移除Servlet、Faces、CDI和EJB (Entity Beans和Embeddable Container)中的过时项,CDI-Build Time。 |
| Jakarta EE 9.1 | 2021-05-25 | 9.1 | Java SE 11, Java SE 8 | JDK 11支持 |
| Jakarta EE 9 | 2020-12-08 | 9 | Java SE 8 | API命名空间从javax移动到jakarta |
| Jakarta EE 8 | 2019-09-10 | 8 | Java SE 8 | 与Java EE 8完全兼容 |
| Java EE 8 | 2017-08-31 | JSR 366 | Java SE 8 | 基于CDI的安全性和HTTP/2 |
| Java EE 7 | 2013-05-28 | JSR 342 | Java SE 7 | WebSocket、JSON和HTML5支持 |
| Java EE 6 | 2009-12-10 | JSR 316 | Java SE 6 | CDI托管Bean和REST |
| Java EE 5 | 2006-05-11 | JSR 244 | Java SE 5 | Java注解 |
| J2EE 1.4 | 2003-11-11 | JSR 151 | J2SE 1.4 | WS-I可互操作的Web服务 |
| J2EE 1.3 | 2001-09-24 | JSR 58 | J2SE 1.3 | Java连接器架构 |
| J2EE 1.2 | 1999-12-17 | 1.2 | J2SE 1.2 | 最初的规范发布 |
| Servlet API版本 | 发布时间 | 规范 | 平台 | 重要变更 |
|---|---|---|---|---|
| Jakarta Servlet 6.0 | 2022年5月31日 | 6.0 | Jakarta EE 10 | 移除已弃用功能并实现请求的增强 |
| Jakarta Servlet 5.0 | 2020年10月9日 | 5.0 | Jakarta EE 9 | 将API从javax.servlet包移动到jakarta.servlet |
| Jakarta Servlet 4.0.3 | 2019年9月10日 | 4.0 | Jakarta EE 8 | 从”Java”商标更名为Jakarta |
| Java Servlet 4.0 | 2017年9月 | JSR 369 | Java EE 8 | HTTP/2 |
| Java Servlet 3.1 | 2013年5月 | JSR 340 | Java EE 7 | 非阻塞I/O、HTTP协议升级机制(WebSocket) |
| Java Servlet 3.0 | 2009年12月 | JSR 315 | Java EE 6, Java SE 6 | 可插拔性、易开发性、异步Servlet、安全性、文件上传 |
| Java Servlet 2.5 | 2005年9月 | JSR 154 | Java EE 5, Java SE 5 | 需要Java SE 5,支持注释 |
| Java Servlet 2.4 | 2003年11月 | JSR 154 | J2EE 1.4, J2SE 1.3 | web.xml使用XML Schema |
| Java Servlet 2.3 | 2001年8月 | JSR 53 | J2EE 1.3, J2SE 1.2 | 添加了过滤器 |
| Java Servlet 2.2 | 1999年8月 | JSR 902, JSR 903 | J2EE 1.2, J2SE 1.2 | 成为J2EE的一部分,在.war文件中引入了独立的Web应用程序 |
| Java Servlet 2.1 | 1998年11月 | 2.1a | 未指定 | 第一个正式规范,添加了RequestDispatcher、ServletContext |
| Java Servlet 2.0 | 1997年12月 | — | JDK 1.1 | 是1998年4月Java Servlet Development Kit 2.0的一部分 |
| Java Servlet 1.0 | 1996年12月 | — | 未指定 | 是1997年6月Java Servlet Development Kit(JSDK)1.0的一部分 |
由上表可知Java EE并不是Java SE的一部分(JDK不自带),Java EE的版本也不完全是对应了JDK版本,我们通常最为关注的是Java EE对应的Servlet版本。不同的Servlet版本有着不一样的特性,Servlet容器(如GlassFish/Tomcat/Jboss)也会限制部署的Servlet版本。Java流行的Spring MVC(基于Servlet机制实现)、Struts2(基于Filter机制实现)等Web框架也是基于不同的Java EE版本封装了各自的框架。
Servlet 3.0 规范、Servlet 3.1 规范、Servlet 4.0 规范
三、Servlet
Servlet是在 Java Web容器中运行的小程序,通常我们用Servlet来处理一些较为复杂的服务器端的业务逻辑。Servlet是Java EE的核心,也是所有的MVC框架的实现的根本!
3.1 基于Web.xml配置
Servlet3.0 之前的版本都需要在web.xml 中配置servlet标签,servlet标签是由servlet和servlet-mapping标签组成的,两者之间通过在servlet和servlet-mapping标签中同样的servlet-name名称来实现关联的。
3.2 Servlet的定义
定义一个 Servlet 很简单,只需要继承javax.servlet.http.HttpServlet类并重写doXXX(如doGet、doPost)方法或者service方法就可以了,其中需要注意的是重写HttpServlet类的service方法可以获取到上述七种Http请求方法的请求。
- javax.servlet.http.HttpServlet:
在写Servlet之前我们先了解下HttpServlet,javax.servlet.http.HttpServlet类继承于javax.servlet.GenericServlet,而GenericServlet又实现了javax.servlet.Servlet和javax.servlet.ServletConfig。javax.servlet.Servlet接口中只定义了servlet基础生命周期方法:init(初始化)、getServletConfig(配置)、service(服务)、destroy(销毁),而HttpServlet不仅实现了servlet的生命周期并通过封装service方法抽象出了doGet/doPost/doDelete/doHead/doPut/doOptions/doTrace方法用于处理来自客户端的不一样的请求方式,我们的Servlet只需要重写其中的请求方法或者重写service方法即可实现servlet请求处理。
- javax.servlet.http.HttpServlet类:
3.3 TestServlet示例代码
package com.anbai.sec.servlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Creator: yz
* Date: 2019/12/14
*/
// 如果使用注解方式请取消@WebServlet注释并注释掉web.xml中TestServlet相关配置
//@WebServlet(name = "TestServlet", urlPatterns = {"/TestServlet"})
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
out.println("Hello World~");
out.flush();
out.close();
}
}
请求TestServlet示例:
实操:
- 编写Servlet
package com.sxkstu; 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; @WebServlet(name = "TestServlet",urlPatterns = {"/TestServlet"}) public class TestServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello Servlet!"); out.flush(); out.close(); } }
- pom.xml配置
<dependencies> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>8.0.0</version> <scope>provided</scope> </dependency> </dependencies>
- src/main下创建webapp/WEB_INF/web.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"> <!-- 不需要声明你的 TestServlet,@WebServlet 注解会处理 --> <!-- 可选:设置全局编码 --> <request-character-encoding>UTF-8</request-character-encoding> <response-character-encoding>UTF-8</response-character-encoding> </web-app>这个配置适用于使用Java EE 8或Jakarta EE 8(仍使用javax包名)的项目。
- 安装tomcat并测试
1)下载与安装:
官网下载:https://tomcat.apache.org/download-90.cgi
选择 9.0.x 版本(与
javax.servlet兼容)【下载core类型的win64zip包】2)测试启动:
修改server.xml配置文件修改端口:
<!-- 找到以下内容,修改port属性 --> <Connector port="8086" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 进入bin目录,管理员cmd,执行
catalina.bat run3)乱码问题
修改Tomcat日志配置(推荐)
打开
conf/logging.properties文件修改所有控制台输出处理器的编码为GBK(或GB2312):
查找java.util.logging.ConsoleHandler.encoding,将其值改为GBK:
java.util.logging.ConsoleHandler.encoding = GBK保存后重启Tomcat
- IDEA配置tomcat
详解Tomcat下载安装以及IDEA配置Tomcat(2023最新)
https://blog.csdn.net/m0_48170265/article/details/129073985
⚠️:《选择“+”→“web” ,选择
web.xml和webRoot》这一步及之后的步骤没做,而是直接在配置tomcat的时候在Deployment选项卡下,选择Add Artifact → 选择war exploded。![]()
![]()
在IDEA中配置Tomcat服务器时,”Deployment”选项卡中的”Add Artifact → 选择war exploded”这一步的作用是:
将项目的Web应用以”展开的WAR目录”形式部署到Tomcat服务器上。具体作用和特点如下:
部署形式:
- war exploded:将Web应用以解压目录形式部署(即WAR文件解压后的目录结构)
- 对比项:war(部署为压缩的WAR包,每次修改需要重新打包)
核心优势:热更新(Hot Swap)
- 当你修改代码或资源文件(如JSP、HTML、CSS、JS)时,IDEA会自动同步到Tomcat部署目录(无需重启Tomcat)
- 对Java类文件的修改:可通过Tomcat配置实现”热部署”(如
reloadable="true")或使用IDEA的”Update Classes and Resources”功能目录结构:
your-project_war_exploded这个目录可以在项目架构的Artifacts处设置,设置Output directory即可。具体文件的位置在项目根目录下的
target文件夹下。$TOMCAT_BASE$\webapps\your-project_war_exploded ├── META-INF ├── WEB-INF │ ├── classes # 编译后的class文件(实时更新) │ ├── lib # 依赖库 │ └── web.xml # 部署描述符 ├── index.jsp # 静态资源 └── ...工作流程:
- 启动Tomcat时,IDEA会:
- 自动编译项目
- 将编译后的文件复制到
your-project_war_exploded目录- 启动Tomcat并从该目录加载应用
3.4 Servlet Web.xml配置
定义好了Servlet类以后我们需要在web.xml中配置servlet标签才能生效。
- 基于配置实现的Servlet:
3.5 Servlet 3.0 基于注解方式配置
- Servlet 3.0 特性
- 新增动态注册
Servlet、Filter和Listener的API(addServlet、addFilter、addListener)。 - 新增
@WebServlet、@WebFilter、@WebInitParam、@WebListener、@MultipartConfig注解。 - 文件上传支持,
request.getParts()。 非阻塞 IO,添加异步 IO。- 可插拔性(
web-fragment.xml、ServletContainerInitializer)。
- 基于注解的Servlet:
值得注意的是在 Servlet 3.0 之后( Tomcat7+)可以使用注解方式配置 Servlet 了,在任意的Java类添加javax.servlet.annotation.WebServlet注解即可。
基于注解的方式配置Servlet实质上是对基于web.xml方式配置的简化,极大的简化了Servlet的配置方式,但是也提升了对Servlet配置管理的难度,因为我们不得不去查找所有包含了@WebServlet注解的类来寻找Servlet的定义,而不再只是查看web.xml中的servlet标签配置。
四、Request & Response
在B/S架构中最重要的就是浏览器和服务器端交互,Java EE将其封装为请求和响应对象,即 request(HttpServletRequest) 和 response(HttpServletResponse)。
HttpServletRequest对象用于处理来自客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP 中的所有信息都封装在这个对象中,通过HttpServletRequest对象可以获取到客户端请求的所有信息。
HttpServletResponse对象用于响应客户端的请求,通过HttpServletResponse对象可以处理服务器端对客户端请求响应。
4.1 HttpServletRequest常用方法
| 方法 | 说明 |
|---|---|
| getParameter(String name) | 获取请求中的参数,该参数是由name指定的 |
| getParameterValues(String name) | 返回请求中的参数值,该参数值是由name指定的 |
| getRealPath(String path) | 获取Web资源目录 |
| getAttribute(String name) | 返回name指定的属性值 |
| getAttributeNames() | 返回当前请求的所有属性的名字集合 |
| getCookies() | 返回客户端发送的Cookie |
| getSession() | 获取session回话对象 |
| getInputStream() | 获取请求主题的输入流 |
| getReader() | 获取请求主体的数据流 |
| getMethod() | 获取发送请求的方式,如GET、POST |
| getParameterNames() | 获取请求中所有参数的名称 |
| getRemoteAddr() | 获取客户端的IP地址 |
| getRemoteHost() | 获取客户端名称 |
| getServerPath() | 获取请求的文件的路径 |
4.2 HttpServletResponse常用方法
| 方法 | 说明 |
|---|---|
| getWriter() | 获取响应打印流对象 |
| getOutputStream() | 获取响应流对象 |
| addCookie(Cookie cookie) | 将指定的Cookie加入到当前的响应中 |
| addHeader(String name,String value) | 将指定的名字和值加入到响应的头信息中 |
| sendError(int sc) | 使用指定状态码发送一个错误到客户端 |
| sendRedirect(String location) | 发送一个临时的响应到客户端 |
| setDateHeader(String name,long date) | 将给出的名字和日期设置响应的头部 |
| setHeader(String name,String value) | 将给出的名字和值设置响应的头部 |
| setStatus(int sc) | 给当前响应设置状态码 |
| setContentType(String ContentType) | 设置响应的MIME类型 |
参考
- https://www.javasec.org/ 【java安全】

