文章目录
- 程序架构
- Web服务器
- Tomcat
- JSP概述
- 主要特点
- 基本语法
- 综合示例
- 程序调试和排错
- 代码示例
程序架构
C/S(Client/Server,客户端/服务器)和 B/S(Browser/Server,浏览器/服务器)是两种常见的软件系统架构模式。它们各自有不同的特点和适用场景。
-
C/S 架构 (客户端/服务器)
在C/S架构中,应用程序被分成两部分:客户端程序和服务器端程序。客户端通常提供用户界面,负责与用户的交互,并处理一些本地的数据处理任务;而服务器端则主要负责数据的存储、检索以及处理复杂的业务逻辑。
-
B/S 架构 (浏览器/服务器)
B/S架构是一种特殊的C/S架构形式,这里的客户端指的是Web浏览器。用户通过浏览器访问网页来使用服务,所有的业务逻辑和数据处理都由服务器端完成,然后将结果返回给浏览器展示给用户。
B/S 架构采用 请求/响应模式 进行交互
Web服务器
Web服务器是一种软件或硬件设备,它通过HTTP(超文本传输协议)或其他网络协议来响应来自客户端的请求,并提供网页和其他网络资源。这些资源可以是HTML文件、图片、视频、文档等。Web服务器是构成万维网的基础之一。Web服务器的选择取决于多种因素,包括性能需求、成本预算、技术支持、安全性要求等。常见的Web服务器有Apache HTTP Server、Nginx、Microsoft IIS等。
常用的Web服务器以及它们的特点:
- Microsoft IIS (Internet Information Services)
- IIS是微软提供的一个功能强大的Web服务器,它支持HTTP、HTTPS、FTP等协议。
- 它与Windows操作系统紧密集成,并且提供了良好的.NET框架支持。
- IIS常用于托管ASP.NET应用程序。
- Apache HTTP Server
- Apache是最广泛使用的开源Web服务器之一,以其稳定性和灵活性著称。
- 它可以在多种操作系统上运行,包括Linux、Windows等。
- Apache支持广泛的模块扩展,允许定制以满足不同的需求。
- Nginx
- Nginx是一个高性能的Web服务器,也经常被用作反向代理服务器和负载均衡器。
- 它特别擅长处理静态内容以及高并发连接的情况。
- Nginx在性能优化方面表现出色,尤其是在资源有限的环境中。
- Oracle WebLogic Server
- WebLogic是由Oracle提供的一款全面的企业级应用服务器。
- 它支持Java EE标准,适合开发和部署大规模分布式企业应用。
- WebLogic除了作为Web服务器外,还提供了事务管理、消息传递等功能。
- IBM WebSphere Application Server
- WebSphere是IBM开发的一个企业级应用服务器。
- 它同样支持Java EE标准,并且集成了许多高级特性如安全性、集群支持等。
- WebSphere适用于大型企业的复杂业务环境。
Apache Tomcat 实际上并不是一个完整的Web服务器,而是一个Servlet容器,专门用来执行Java Servlets和JSP页面。Tomcat可以作为一个独立的应用服务器来使用,但通常它不会直接提供静态文件服务,而是配合像Apache或Nginx这样的Web服务器一起工作。
Tomcat
Apache Tomcat 是一个开源的、轻量级的Web服务器和Servlet容器,它实现了 Java Servlet 和 JavaServer Pages (JSP) 规范。Tomcat 由 Apache 软件基金会开发,并且是 Jakarta 项目的一部分。Tomcat 主要用于运行基于 Java 的 Web 应用程序,特别是那些使用 Servlet 和 JSP 技术的应用。
- Apache Tomcat® - Welcome!
Tomcat 目录结构
目录 | 说明 |
---|---|
/bin | 存放各种平台下用于启动和停止 Tomcat 的脚本文件 |
/conf | 存放 Tomcat 服务器的各种配置文件 |
/lib | 存放 Tomcat 服务器所需的各种JAR文件 |
/logs | 存放 Tomcat 的日志文件 |
/temp | Tomcat 运行时用于存放临时文件 |
/webapps | 当发布 Web 应用时,默认情况下会将 Web 应用的文件存放于此目录中 |
/work | Tomcat 把由 JSP 生成的 Servlet 放于此目录下 |
Tomcat 启动与停止:
1.将文件或项目放入 webapps 目录下
2.双击 bin\startup.bat 文件启动 tomcat
3.双击 bin\shutdown.bat 文件停止 tomcat
修改 Tomcat 默认端口号:/conf/server.xml
<Connector port="8888" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URLEncoding="utf-8"/>
修改项目初始化页面:/WEB-INF/web.xml
<welcome-file-list><welcome-file>hello.jsp</welcome-file>
</welcome-file-list>
在 IntelliJ IDEA 中配置一个 Web 项目并将其打包成 WAR 文件
第一步,将项目添加为 Web 项目:【File】-【Project Structure】-【Project Settings】-【Faces】-【Add】-【Web】
第二步,创建 WAR 包作为 Artifact:【File】-【Project Structure】-【Project Settings】-【Artifacts】-【Add】…
JSP概述
JSP(JavaServer Pages)是一种用于创建动态网页的技术,它允许开发者将静态HTML内容与Java代码混合编写。JSP页面在服务器端被编译成Servlet,并由Servlet容器(如Apache Tomcat)执行,最终生成HTML响应发送给客户端浏览器。JSP是Sun Microsystems(现在是Oracle Corporation的一部分)开发的一种技术,作为Java技术家族的一部分。
-
运行在服务器端的Java页面
-
使用HTML嵌套Java代码实现
工作原理
主要特点
嵌入式Java代码:
- 开发者可以直接在HTML中嵌入Java代码片段,这些代码可以处理业务逻辑、数据库交互等。
- 通过使用
<% %>
标签来包含Java代码块。
表达式语言 (EL):
- JSP支持一种简单的表达式语言,可以在页面上直接输出变量的值或执行简单的计算。
- 例如:
${user.name}
可以用来显示user
对象的name
属性。
标准标签库 (JSTL):
- JSTL提供了一组预定义的标签,使得在JSP页面中进行条件判断、循环遍历等操作变得更加容易。
- 例如,
<c:if>
,<c:forEach>
,<fmt:formatDate>
等标签。
模板化和重用:
- JSP支持包括自定义标签在内的多种机制,以实现页面元素的重用。
- 包括
<jsp:include>
指令和自定义标签库。
自动更新:
- 当JSP页面发生变化时,大多数Servlet容器会自动重新编译JSP文件,这有助于快速开发和调试。
内置对象:
- JSP提供了几个内置的对象,如
request
,response
,session
,out
,application
等,这些对象可以直接在JSP页面中使用,简化了对HTTP请求和响应的处理。
易于学习和使用:
- 对于熟悉HTML和基本Java知识的开发者来说,JSP相对容易上手。
- 它提供了一种直观的方式来构建动态Web应用。
基本语法
脚本元素:用于嵌入Java代码。
<% int a = 10;out.println(a);
%>
out 对象是 JSP 的内置对象,无需实例化即可使用。实现数据的输出显示
out 对象方法
- print:向页面输出显示
- println:向页面输出显示,在结尾处添加换行
声明:用于声明方法或成员变量。
<%!private int count = 0;public void incrementCount() {count++;}
%>
使用<%%>声明局部变量、使用<%!%>声明全局变量
表达式:用于输出数据到页面。
<%= "Hello, World!" %>
<%= "输出\"转义字符\""%>
<%= count %>
输出字符串和变量,注意后边不要加
;
JSP指令:影响整个JSP页面的行为。
page指令通过属性定义了JSP的特性,实现与JSP容器的通信
<%@ page language="属性值" import="属性值" contentType="属性值"%>
- language:指定JSP页面使用的脚本语言
- import:通过该属性来引用脚本语言中使用到的类文件
- contentType:用来指定页面的MIME类型,以及字符编码方式
<% // 设置页面内容类型 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 导入Java类 --%>
<%@ page import="java.util.Date"%>
动作元素:提供结构化的功能,比如转发请求、包含其他资源等。
<jsp:forward page="anotherPage.jsp"/>
<jsp:include page="header.jsp"/>
JSP注释:<%--JSP注释--%>
JSP脚本中注释:<%//单行注释%>
、<%/*多行注释*/%>
综合示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %><%// 声明并初始化局部变量int count = 42;
%><!DOCTYPE html>
<html>
<head><title>示例页面</title>
</head>
<body><h1>欢迎访问我们的网站</h1><p><%= "Hello, World!" %></p><p>当前的计数是: <%= count %></p>
</body>
</html>
JSP 执行过程
JSP(JavaServer Pages)的基本运行原理和过程可以概括为:
- 请求接收:Web服务器接收到对JSP页面的请求。
- 翻译:首次请求或JSP文件更新时,JSP容器将JSP文件翻译成一个Servlet源文件。
- 编译:Servlet源文件被编译成字节码(.class文件)。
- 初始化:Servlet被加载到内存并初始化。
- 服务:Servlet处理请求,执行业务逻辑,并生成响应内容。
- 响应:生成的HTML响应发送回客户端浏览器显示。
后续请求会直接使用已编译的Servlet来提高效率。
程序调试和排错
在Web应用程序开发和部署过程中,经常会遇到各种错误。404错误和500错误是两种常见的HTTP状态码,分别表示不同的问题:
404 错误 - Not Found(找不到访问的页面或资源)
常见原因:
- URL输入错误:用户输入的URL不正确,或者请求的资源路径不存在。
- 将页面放在WEB-INF下:
WEB-INF
目录下的资源是受保护的,不能直接通过URL访问。 - 外部启动Tomcat,未部署项目:Tomcat服务器已经启动,但没有将项目部署到服务器上,或者部署路径不正确。
- 文件或目录被删除或移动:请求的文件或目录已经被删除或移动到其他位置。
500 错误 - Internal Server Error(内部服务器错误)
常见原因:
- JSP页面代码有误:JSP页面中的Java代码或脚本元素有语法错误或其他编程错误。
- 页面无法显示:可能是由于配置问题、类路径问题、依赖库缺失等导致页面无法正常渲染。
- 未启动Tomcat:如果Tomcat服务器没有启动,任何请求都会失败,尽管这通常会导致连接超时而不是500错误。
web.xml
错误页面配置
<error-page><error-code>404</error-code><location>/error/404.html</location>
</error-page>
<error-page><error-code>500</error-code><location>/error/500.html</location>
</error-page>
除了404和500错误之外,还有一些其他常见的错误:
- 403 Forbidden:请求被服务器拒绝,可能是由于权限不足或资源被保护。
- 400 Bad Request:客户端发送的请求有误,可能是格式不正确或缺少必要的参数。
- 503 Service Unavailable:服务暂时不可用,可能是由于服务器过载或维护中。
- 502 Bad Gateway:作为网关或代理的服务器从上游服务器收到了无效的响应。
- 504 Gateway Timeout:作为网关或代理的服务器未能及时从上游服务器收到响应。
代码示例
从数据库中获取供应商列表,并将其显示在一个 HTML 表格中。
页面使用两种不同的方法实现:传统的 Java 脚本片段(<% %>
)和 JSTL 标签库(<c:forEach>
)。
- 传统 Java 脚本片段:直接在 JSP 页面中编写 Java 代码来遍历和显示数据。
- JSTL 标签:使用 JSTL 标签库中的
<c:forEach>
标签来遍历和显示数据。
<%@ page import="com.dao.SmbmsProviderDao" %>
<%@ page import="com.dao.impl.SmbmsProviderDaoImpl" %>
<%@ page import="java.util.List" %>
<%@ page import="com.pojo.SmbmsProvider" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>供应商信息</title></head><body><%// SmbmsProviderDao 和 SmbmsProvider 是已定义的类SmbmsProviderDao smbmsProviderDao = new SmbmsProviderDaoImpl();List<SmbmsProvider> smbmsProviderList = smbmsProviderDao.findAll();%><table border="1"><tr><th>ID</th><th>proCode</th><th>proName</th><th>proDesc</th></tr><% for(SmbmsProvider smbmsProvider : smbmsProviderList){ %><tr><td><%= smbmsProvider.getId()%></td><td><%= smbmsProvider.getProCode()%></td><td><%= smbmsProvider.getProName()%></td><td><%= smbmsProvider.getProDesc()%></td></tr><% } %></table></body>
</html>
导入 JAR 包
jstl.jar
、servlet-api.jar
和 jsp-api.jar
引入 JSTL 核心标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
将集合放入请求作用域
使得 <c:forEach>
标签能够通过EL表达式访问到集合
<%
SmbmsProviderDao smbmsProviderDao = new SmbmsProviderDaoImpl();
List<SmbmsProvider> smbmsProviderList = smbmsProviderDao.findAll();
request.setAttribute("smbmsProviderList", smbmsProviderList);
%>
显示数据(使用 JSTL 标签)
<c:forEach items="${smbmsProviderList}" var="provider" ><tr><td>${provider.id } </td><td>${provider.proCode } </td><td>${provider.proName } </td><td>${provider.proDesc } </td></tr>
</c:forEach>
<c:forEach>
标签
items="${smbmsProviderList}"
:指定要迭代的集合。var="provider"
:定义一个变量名,用于表示每次迭代中的当前元素。