程序架构

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服务器以及它们的特点:

  1. Microsoft IIS (Internet Information Services)
    • IIS是微软提供的一个功能强大的Web服务器,它支持HTTP、HTTPS、FTP等协议。
    • 它与Windows操作系统紧密集成,并且提供了良好的.NET框架支持。
    • IIS常用于托管ASP.NET应用程序。
  2. Apache HTTP Server
    • Apache是最广泛使用的开源Web服务器之一,以其稳定性和灵活性著称。
    • 它可以在多种操作系统上运行,包括Linux、Windows等。
    • Apache支持广泛的模块扩展,允许定制以满足不同的需求。
  3. Nginx
    • Nginx是一个高性能的Web服务器,也经常被用作反向代理服务器和负载均衡器。
    • 它特别擅长处理静态内容以及高并发连接的情况。
    • Nginx在性能优化方面表现出色,尤其是在资源有限的环境中。
  4. Oracle WebLogic Server
    • WebLogic是由Oracle提供的一款全面的企业级应用服务器。
    • 它支持Java EE标准,适合开发和部署大规模分布式企业应用。
    • WebLogic除了作为Web服务器外,还提供了事务管理、消息传递等功能。
  5. 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 技术的应用。

Tomcat 目录结构

目录说明
/bin存放各种平台下用于启动和停止 Tomcat 的脚本文件
/conf存放 Tomcat 服务器的各种配置文件
/lib存放 Tomcat 服务器所需的各种JAR文件
/logs存放 Tomcat 的日志文件
/tempTomcat 运行时用于存放临时文件
/webapps当发布 Web 应用时,默认情况下会将 Web 应用的文件存放于此目录中
/workTomcat 把由 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)的基本运行原理和过程可以概括为:

  1. 请求接收:Web服务器接收到对JSP页面的请求。
  2. 翻译:首次请求或JSP文件更新时,JSP容器将JSP文件翻译成一个Servlet源文件。
  3. 编译:Servlet源文件被编译成字节码(.class文件)。
  4. 初始化:Servlet被加载到内存并初始化。
  5. 服务:Servlet处理请求,执行业务逻辑,并生成响应内容。
  6. 响应:生成的HTML响应发送回客户端浏览器显示。

后续请求会直接使用已编译的Servlet来提高效率。

程序调试和排错

在Web应用程序开发和部署过程中,经常会遇到各种错误。404错误和500错误是两种常见的HTTP状态码,分别表示不同的问题:

404 错误 - Not Found(找不到访问的页面或资源)

常见原因:

  1. URL输入错误:用户输入的URL不正确,或者请求的资源路径不存在。
  2. 将页面放在WEB-INF下:WEB-INF目录下的资源是受保护的,不能直接通过URL访问。
  3. 外部启动Tomcat,未部署项目:Tomcat服务器已经启动,但没有将项目部署到服务器上,或者部署路径不正确。
  4. 文件或目录被删除或移动:请求的文件或目录已经被删除或移动到其他位置。

500 错误 - Internal Server Error(内部服务器错误)

常见原因:

  1. JSP页面代码有误:JSP页面中的Java代码或脚本元素有语法错误或其他编程错误。
  2. 页面无法显示:可能是由于配置问题、类路径问题、依赖库缺失等导致页面无法正常渲染。
  3. 未启动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.jarservlet-api.jarjsp-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":定义一个变量名,用于表示每次迭代中的当前元素。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部