为了满足开发多层体系结构的企业级应用的需求,在早期的JavaSE基础上,针对企业级应用的各种需求提出了JavaEE。其实JavaEE是一种结构和一套标准,是中间件体系结构标准,可以简化和规划化分布式多层企业应用的开发和部署。
Java EE的13种核心技术有JDBC、JNDI、EJB、RMI、JSP、Java Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail和JAF
JavaEE应用基础
JavaEE三层架构自上而下将系统分为表示层、逻辑层、持久层。
1、表示层由处理用户交互的客户端组件及其容器所组成
2、业务逻辑层由解决业务问题的组件组成
3、数据层由一个或多个数据库组成,并可包含存储过程。
这种三层架构,在处理客户端的请求时,使客户端不用进行复杂的数据库处理;透明地为客户端执行许多工作,如查询数据库、执行业务规则和连接现有的应用程序;并且能够帮助开发人员创建适用于企业的大型分布式应用程序。
网络应用系统模型
请求-响应模型是网络应用系统中最常见的模型。在这种模型中,一个客户端,如一个Web浏览器向服务器发送一个请求,服务器处理这个请求并返回一个响应。这个过程是同步的,意味着客户端需要等待服务器的响应。这种模型的优点是简单和易于理解,但在处理大量并发请求时可能会导致性能问题。
另外还有观察者模型也被称为发布-订阅模型。在这种模型中,有一个或多个发布者,通常是一个事件或消息源,和多个订阅者就是对这些事件或消息感兴趣的观察者。当发布者发生了一个事件或生成了一个消息,所有订阅的观察者都会收到通知。这个过程是异步的,意味着观察者可以在发布者的事件或消息处理过程中进行其他操作。这种模型的优点是能够处理大量并发事件或消息,但需要谨慎处理避免消息丢失或处理错误。
Servlet技术
servlet是运行在Web服务器中的小型Java程序,即服务器端的小应用程序。servlet通常通过HTTP超文本传输协议接收和响应来自Web客户端的请求。
- 用于扩展服务器功能的服务器端组件技术
- 直接或者间接实现javax.servlet.Servlet接口的类
servlet实例是由web服务器tomcat创建的,它是单例多线程的。单例是指servlet的实例只有一个,多线程是指每次客户端的请求,web服务器都会从线程池中分配一个工作线程去执行servlet的service()方法
Servlet特点
1、高效。支持缓存和多线程
2、方便。Servlet提供了大量的实用工具例程,如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。
3、功能强大。以Java API作为后盾
4、可移植性好。 用Java语言编写,在服务器端运行
编程方法
安装web服务器软件,推荐免费开源的tomcat。服务器在应用中充当了服务端代理的作用,用于简化采用http协议进行数据传输的通信细节。使开发人员不需要了解通信细节则可以进行服务器端编程。
常见的安装目录:
bin用于存放可执行的文件。后缀为bat的批处理文件用于windows系统,后缀为sh的批处理文件用于Linux系统
startup.bat用于启动服务器,shutdown.bat用于停止服务器
conf用于存放配置文件
server.xml配置文件
连接子配置<Connector port="8080请求端口号" protocol="HTTP/1.1所支持的协议和对应的版本号" connectionTimeout="20000连接请求超时配置,单位毫秒" redirectPort="8443如果使用https协议重定向到8443端口" />
虚拟主机配置<Host name="localhost主机名称" appBase="webapps默认部署应用的目录" unpackWARs="true支持自动解压缩" autoDeploy="true支持自动部署">
lib用于存放所共享使用的jar包库文件
logs用于存放系统日志
webapps用于存放在服务器中部署的应用
work工作目录,是服务器运行时存放class文件的位置
在IDEA中的常规开发方式
推荐使用maven开发
如果使用Tomcat10则遵循的是JavaEE9规范,即jakarta.servlet-api
1、添加依赖:需要考虑使用哪个版本的JavaEE
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yan</groupId>
<artifactId>_0328</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 默认采用的打包方式为jar,web应用对应的打包方式为war-->
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.12.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>
2、实现Servlet接口定义对应的Servlet组件
//Servlet并没有程序的执行起始点main方法,Servlet服务器端小程序是服务器进行创建并调用
public class HelloServlet implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
//service方法用于处理客户端请求,并针对客户端请求生成html的响应文档。服务器隐藏具体的http协议通信细节,会将客户端提供的数据封装在ServletRequest对象中,服务器生成的响应需要写入到ServletResponse对象中
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//设置响应内容类型,MIME多用途互联网邮件扩展协议
servletResponse.setContentType("text/html;charset=utf-8");
PrintWriter out = servletResponse.getWriter();
out.println("<!DOCTYPE html>\n" +
"<html lang=\"en\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
" <title>Document</title>\n" +
"</head><body><h2>你好!三脚猫</h2></body></html>");
out.flush();
out.close();
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
3、添加配置,将Servlet组件和一个请求地址建立对应关系
注意所创建的目录名称和位置
web.xml是当前web应用的核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<!-- 用于将Servlet类和一个名称建立对应关系,注意名称不能重复 -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.yan.HelloServlet</servlet-class>
</servlet>
<!-- 将一个名称和一个请求地址建立对应关系 -->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello.do</url-pattern>
</servlet-mapping>
</web-app>
4、使用IDEA进行应用打包
自动在项目目录中生成target目录,其中包含生成的war文件。将war文件拷贝到tomcat的webapps目录下,由于生成的war文件名称过长,所以修改名称为test.war。然后在cmd中输入命令startup.bat启动服务器
5、打开浏览器输入网址localhost:8080/test/hello.do
Tomcat和Jetty
Tomcat和Jetty都提供一个快速、灵活、可嵌入的Web服务器和Servlet容器,使Java开发人员能够轻松构建高性能的Web应用程序。
Tomcat 和 Jetty 都是作为一个 Servlet 引擎应用的比较广泛,虽然Jetty正成长为一个优秀的 Servlet 引擎,但是目前的 Tomcat 的地位仍然难以撼动。相比较来看,它们都有各自的优点与缺点。Tomcat 经过长时间的发展,它已经广泛的被市场接受和认可,相对 Jetty 来说 Tomcat 还是比较稳定和成熟,尤其在企业级应用方面,Tomcat 仍然是第一选择。但是随着 Jetty 的发展,Jetty 的市场份额也在不断提高,至于原因就要归功与 Jetty 的很多优点了,而这些优点也是因为 Jetty 在技术上的优势体现出来的。
在Maven开发中tomcat提供的插件只有到Tomcat7,所以只能支持较低版本的JavaEE,可以考虑开发时使用Jetty插件,最终部署时可以不部署在Jetty中