一、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 run
3)乱码问题
修改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安全】