java之web笔记

1.Servlet技术

1.1 JavaWeb概述

  • 在Sun的Java Servlet规范中,对Java Web应用作了这样定义:“JavaWeb应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。

  • Java Web应用中可以包含如下内容: Servlet JSP 实用类-------ORM 静态文档如HTML、图片等 描述Web应用的信息(web.xml)

1.2 Servelt与Servlet容器

1.2.1 Serlet容器概念

  • Servlet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的生命周期,以及管理它们的共享数据。

  • Servlet容器也称为JavaWeb应用容器,或者Servlet/JSP容器。

  • 目前最流行的Servlet容器软件括:

    Tomcat Resin J2EE服务器(如WebLogic)中也提供了内置的Servlet容器

1.2.2 tomcat简介

Tomcat是一个免费的开放源代码的Servlet容器,它是 Apache软件基金会的一个顶级项目,由Apache,Sun和其他一些公司及个人共同开发而成。由于有了Sun 的参与与支持,最新的Servlet 和JSP规范总是能在Tomcat中的到体现。

(1)Tomcat目录结构

(2) 运行tomcat

  • 配置java_home或者jre_home

  • 双击bin目录下的startup.bat文件

  • 在地址栏中输入http://localhost:8080/

(3) 关闭Tomcat&配置Tomcat的端口号

  • 双击bin目录下的shutdown.bat文件关闭Tomcat服务器

  • 修改 Tomcat默认的端口号:

    打开conf目录下的server.xml文件

    修改端口号

(4) tomcat的管理程序

  • Tomcat提供了一个管理程序:manager,用于部署到 Tomcat服务器中的web应用程序

  • 要访问manager web应用程序,需要添加具有管理员权限的账号,编辑conf目录下的tomcat-users.xml文件,添加manager角色,设置用户名和密码。

1.2.3 web程序结构

  • 一个 web应用程序是由一组Servlet,HTML页面,类,以及其它的资源组成的运行在web服务器上的完整的应用程序,以一种结构化的有层次的目录形式存在。

  • 组成 web应用程序的这些文件要部署在相应的目录层次中,根目录代表整个web应用程序的”根”。

  • 通常将web应用程序的目录放在webapps目录下,在webapps目录下的每一个子目录都是一个独立的web应用程序,子目录的名字就是web应用程序的名字,也就是 web应用程序的“根”。用户通过web应用程序的”根”来访问web应用程序中的资源。

Servlet规范中定义了web 应用程序的目录层次:

  • WEB-INF目录下的classes和lib目录都可以存放Java的类文件,在Servlet容器运行时,Web应用程序的类加载器将首先加载classes目录下的,其次才是lib目录下的类。如果这两个目录下存在同名的类,起作用的将是classes目录下的类

  • WEB-INF是一个特殊的目录(所有字母都要大写)。这个目录并不属于Web应用程序可以访问的上下文路径的一部分,对客户端来说,这个目录是不可见的。但该目录下的内容对于Servlet代码是可见的

1.2.4 Servlet简介

  • Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。

  • Servlet可完成如下功能:

(1)创建并返回基于客户请求的动态HTML页面。 (2)创建可嵌入到现有HTML页面中的部分HTML 页面(HTML 片段)。 (3)与其它服务器资源(如数据库或基于Java的应用程序)进行通信。

1.2.5 Servlet容器响应客户请求的过程

映射关系

映射细节介绍

  • 同一个Servlet可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的注册名。

  • 在Servlet映射到的URL中也可以使用通配符,但是只能有两种固定的格式:一种格式是“扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

<servlet-mapping>
<senslet-nane>AnyNane</serwlet-nane>
<url-pattern>*,doc</ur1-pattern>
</servlet-mapping>
<Serlet-mapping>
<sgrvlet-nane>AayNane</serwlet-nane>
<url-pattern>/action/*</url-pattern>
</seowlet-mapping>

1.2.6 ServletConfig接口

  • Servlet在有些情况下可能需要访问Servlet容器或借助Servlet容器访问外部的资源,所以, Serlvet引擎需要将表示Servlet容器的对象传递给Servlet。另外,在web.xml文件中为某个Servlet设置的友好名称和初始化参数等信息也需要传递给该Servlet

  • Servlet引擎将代表Servlet容器的对象(ServletContext)和Servlet的配置参数信息一并封装到一个称ServletConfig的对象中,并在初始化Servlet实例对象时传递给该Servlet。

  • ServletConfig接口则用于定义ServletConfig对象需要对外提供的方法,以便在Servlet程序中可以调用这些方法来获取有关信息。

  • Servlet引擎调用Servlet的实例对象的init(ServletConfig config)方法将ServletConfig对象传递给Servlet,Servlet.getServletConfig()方法必须返回init(ServletConfig config)方法传递进来的这个ServletConfig对象的引用。

1.2.7 ServletConfig接口的方法

  • getlnitParameterNames

  • getInitParameter

  • getServletName

  • getServletContext

1.2.8 ServletContext接口

  • Servlet引擎为每个WEB应用程序都创建一个对应ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用SelrvletConfig.getServletContext方法可以返回ServletContext对象的引用。

  • 由干一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以,ServletContext对象被称之为application对象(Web应用程序对象)。

  • 功能:

1.获取WEB应用程序的初始化参数

2.记录日志

3.application域范围的属性

4.访问资源文件

5.获取虚拟路径所映射的本地路径

6.WEB应用程序之间的访问

7.ServletContext的其他方法

1、获取WEB应用程序的初始化参数:

  • 为WEB应用程序设置初始化参数的好处在于不需要修改Servlet源程序,就可以改变一些参数信息。

  • ServletContext.getInitParameterNames方法用于返回一个包含WEB应用程序的所有初始化参数名称的Enumeration集合对象。ServletContext.getInitParameter方法用于返回某个指定名称的初始化参数值。

  • 在web.xml文件的根元素中增加子元素,如下所示:

<context-paran>
<paran-name>campanyNane</param-name>
<param-value>lanpbrother</param-value>
</context-paran>

2、获取虚拟路径所映射的本地路径

getRealPath(String path)方法:用于返回某个虚拟路径所映射的本地文件系统路径

1.2.9 HTTP

  • WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。

  • HTTP是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。

  • HTTP协议的版本HTTP/1.0、HTTP/1.1、HTTP-NG

1、HTTP的会话方式

四个步骤:

2、游览器访问多图网页的过程

3、HTTP请求消息 请求消息的结构:一个请求行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。

4、使用GET和POST方式传递参数

  • 在URL地址后面可以附加一些参数

    举例: http://www.it315.org/servlet/ParamsServlet?param1=abc&param2=xyz

  • GET方式

    举例:GET /servlet/ParamsServlet?param1=abc&param2=xyz HTTP/1.1

    特点:传送的数据量是有限制的,一般限制在1KB以下。

  • POST方式 举例:

    POST /servlet/ParamsServlet HTTP/1.1 Host: Content-Type: application/x.-www-form-urlencoded Content-Length: 28 param1=abc&param2=xyz 特点:(1)传送的数据量要比GET方式传送的数据量大得多。(2)相对get数据传输安全

1.2.10 HttpServletRequest简介

  • Servlet API中定义的ServletRequest接口类用于封装请求消息。

  • HttpServletRequest是专用于HTTP协议的ServletRequest子接口,它用于封装 HTTP请求消息。

  • 在service()方法内部调用HttpServletRequest对象的各种方法来获取请求消息。

1、获取请求行的相关信息

  • HTTP请求消息的请求行包括请求方式、资源路径和HTTP协议版本:

  • GET /lampbrother/servlet/RequestURl?param1=a&param2=b HTTP/1.1

  • getMethod:返回HTTP请求消息中的请求方式。

  • getRequestURI:返回请求行中的资源名部分。

  • getQueryString:返回请求行中的参数部分。

  • getProtocol:返回请求行中的协议名和版本。

  • getContextPath:返回请求资源所属于的WEB应用程序的路径。

  • getPathInfo:返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。

  • getPathTranslated:返回URL中的额外路径信息所对应的资源的真实路径。

  • getServletPath方法: Servlet的名称或Servlet所映射的路径。

2、获取网络链接信息

  • getRemoteAddr方法返回发出请求的客户机的IP地址,其格式为“192.168.0.3”这种形式的字符文本。(*)

  • getRemoteHost方法返回发出请求的客户机的完整主机名,即“pc1.atguigu.com”这种格式。

  • getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号。

  • getLocalAddr方法返回WEB服务器上接收当前请求的网络接口的IP地址。

  • getLocalName方法返回WEB服务器上接收当前请求的网络接口的IP地址所对应的主机名。

  • getLocalPort方法返回WEB服务器上接收当前请求的网络接口的端口号。

  • getServerName方法返回当前请求所指向的主机名。

  • getServerPort方法返回当前请求所连接的服务器端口号。

  • getScheme方法返回请求的协议名,例如http.https或ftp。

  • getRequestURL方法返回客户端发出请求时的完整URL。

3、获取请求头信息

  • getHeader方法

  • getHeaders方法

  • getHeaderNames方法

  • getIntHeader方法

  • getDateHeader方法

  • getContentType方法

  • getContentLength方法

  • getCharacterEncoding方法

4、获取请求参数

  • getParameter方法

  • getParameterValues方法

  • getParameterNames方法

  • getParameterMap方法

5、请求域属性

  • 存储在ServletRequest对象中的对象称之为请求域属性,属于同一个请求的多个处理模块之间可以通过请求域属性来传递对象数据。

  • 与请求域属性相关的方法:

    setAttribute方法

    getAttribute方法

    removeAttribute方法

    getAttributeNames方法

1.2.11 HttpServletResponse简介

Servlet API中定义的ServletResponse接口类用于创建响应消息。 HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息。

1.2.12 重定向与转发

1、RequestDispatcher接口

RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源调用的资源(例如,Servlet、HTML文件、JSP文件等),并可以通过其中的方法将客户端的请求转发给所包装的资源。

RequestDispatcher接口中定义了两个方法:forward方法和include方法。

forward和include方法接收的两个参数必须是传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象,或者是对它们进行了包装的 ServletRequestWrapper或ServletResponseWrapper对象。

获取RequestDispatcher对象的方法: ServletContext.getRequestDispatcher(参数只能是以“/”开头的路径)ServletContext.getNamedDispatcher ServletRequest.getRequestDispatcher(参数可以是不以“/”开头的路径)

2 JSP技术介绍

2.1 定义

  • JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

  • JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

  • JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

  • JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

2.2 JSP使用原因

JSP程序与CGI程序有着相似的功能,但和CGI程序相比,JSP程序有如下优势:

  • 性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。

  • 服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本。

  • JSP 基于Java Servlet APl,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等。

  • JSP页面可以与处理业务逻辑的Servlet一起使用,这种模式被Java servlet模板引擎所支持。

  • JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用。

2.3 优势

  • 与ASP相比:JSP有两大优势。首先,动态部分用Java编写,而不是VB或其他MS专用语言,所以更加强大与易用。第二点就是JSP易于移植到非MS平台上。

  • 与纯Servlet相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。

  • 与SSI相比:SSI无法使用表单数据、无法进行数据库链接。

  • 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。

  • 与静态HTML相比:静态HTML不包含动态信息。

2.4 JSP/Servlet环境搭建

2.4.1下载安装tomcat

Apache Tomcat® - Apache Tomcat 8 Software Downloads

2.4.2 开启tomcat

注意目录名不能有中文和空格。目录介绍如下:

  • bin:二进制执行文件。里面最常用的文件是startup.bat,如果是Linux或Mac系统启动文件为startup.sh。

  • conf:配置目录。里面最核心的文件是server.xml。可以在里面改端口号等。默认端口号是8080,也就是说,此端口号不能被其他应用程序占用。

  • lib:库文件。tomcat运行时需要的jar包所在的目录 logs:日志

  • temp:临时产生的文件,即缓存

  • webapps: web的应用程序。web应用放置到此目录下浏览器可以直接访问

  • work:编译以后的class文件。

接着我们可以双击startup.bat启动Tomcat,弹出如下界面:

思考:乱码问题如何解决?

乱码出现的集中情况:

数据库结构字段及内容,idea项目或文件,前端页面乱码,tomcat解析乱码

启动成功页面如下

项目运行的流程

2.4.3 编写并访问JSP

<%@ page contentType="text/html;charset=UTF-8" %>
<%out.print("祝大家节日快乐 : 祝各位薪资翻倍,前途似锦!!!");
​
%>

将页面放在webapps/ROOT

接着在游览器中访问地址http://127.0.0.1:8080/test.jsp,输出结果如下

2.4.4 创建Servlet实例

2.5 JSP结构

  1. 脚本元素(Scripting Elements):在JSP页面中,可以通过脚本元素插入Java代码。主要包括以下三种类型:

    • 声明(Declaration):用于声明一个或多个变量或方法,这些变量或方法可以在整个JSP页面中使用。

    • 表达式(Expression):将Java表达式的值直接输出到HTML页面中。

    • 脚本段(Scriptlet):插入一段可执行的Java代码。

案例1:

<%-- 声明变量 --%>
<%! String message = "Hello, JSP!"; %>
​
<%-- 表达式 --%>
<p>Message: <%= message %></p>
​
<%-- 脚本段 --%>
<%int a = 10;int b = 20;int sum = a + b;
%>
<p>Sum: <%= sum %></p>
  1. 指令元素(Directive Elements):用于控制JSP页面的行为。主要包括以下三种类型:

    • page指令:用于设置整个JSP页面的属性,如导入类库、设置错误处理等。

    • include指令:将其他文件的内容包含到当前JSP页面中。

    • taglib指令:定义一个自定义标签库,以便在JSP页面中使用自定义标签。

案例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="header.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  1. 动作元素(Action Elements):用于执行特定的任务,如请求转发、包含其他资源等。动作元素以"jsp:"为前缀。

案例:

<jsp:forward page="target.jsp" />
<jsp:include page="footer.jsp" />
  1. 注释(Comments):用于在JSP页面中添加注释,以提高代码的可读性和可维护性。JSP支持两种类型的注释:HTML注释和JSP注释。

案例:

<!-- HTML注释 -->
<%-- JSP注释 --%>

2.6 JSP生命周期

JSP生命周期是指从创建JSP页面到销毁JSP页面的整个过程。在这个过程中,JSP容器会调用一系列的方法来处理JSP页面。JSP生命周期主要包括以下几个阶段:

  1. 初始化(Initialization):当JSP页面被第一次请求时,JSP容器会调用_jspInit()方法对JSP页面进行初始化。

案例:

<%!public void _jspInit() {System.out.println("JSP页面初始化");}
%>
  1. 解析(Parsing):JSP容器会将JSP页面中的脚本元素、指令元素和动作元素解析成对应的Java代码。

  2. 编译(Compilation):JSP容器将解析后的Java代码编译成字节码文件(.class文件)。

  3. 加载(Loading):JSP容器加载编译后的字节码文件到内存中,并创建一个JSP页面对象。

  4. 请求处理(Request Processing):当用户请求JSP页面时,JSP容器会调用_jspService()方法处理请求。在这个阶段,JSP容器会执行脚本元素中的Java代码,并将生成的HTML内容发送给客户端。

案例:

<%!public void _jspService(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("JSP页面处理请求");}
%>
  1. 销毁(Destruction):当JSP页面被销毁时,JSP容器会调用_jspDestroy()方法释放资源。

案例:

<%!public void _jspDestroy() {System.out.println("JSP页面销毁");}
%>

2.7 JSP语法

JSP(JavaServer Pages)是一种基于Java技术的Web动态页面技术。它允许开发者在HTML页面中嵌入Java代码,从而实现页面的动态生成。下面是关于JSP语法的详细笔记以及代码片段:

2.7.1 JSP表达式

JSP表达式用于将Java表达式的值直接输出到HTML页面中。表达式以"<%= %>"为前缀和后缀。

案例:

<%int a = 10;int b = 20;int sum = a + b;
%>
<p>Sum: <%= sum %></p>

2.7.2 JSP注释

JSP支持两种类型的注释:HTML注释和JSP注释。

案例代码:

<!-- HTML注释 -->
<%-- JSP注释 --%>

2.7. 3 JSP行为

JSP行为是一种特殊的JSP元素,用于执行特定的任务,如请求转发、包含其他资源等。行为以"jsp:"为前缀。

案例代码:

<jsp:forward page="target.jsp" />
<jsp:include page="footer.jsp" />

2.7.4 JSP隐含对象

JSP隐含对象是在JSP页面中自动创建的对象,可以直接使用,无需手动创建。主要包括以下九个对象:

  • request:HttpServletRequest对象,用于获取客户端请求的信息。

  • response:HttpServletResponse对象,用于向客户端发送响应。

  • pageContext:PageContext对象,用于获取JSP页面的上下文信息。

  • session:HttpSession对象,用于在多个请求之间保存会话信息。

  • application:ServletContext对象,用于在整个Web应用中共享数据。

  • out:JspWriter对象,用于向客户端发送HTML输出。

  • config:ServletConfig对象,用于获取Servlet的配置信息。

  • page:Object对象,表示当前JSP页面实例。

  • exception:Throwable对象,用于处理JSP页面中的异常。

案例:

<%String requestURI = request.getRequestURI();String sessionID = session.getId();String contextPath = application.getContextPath();
%>
<p>Request URI: <%= requestURI %></p>
<p>Session ID: <%= sessionID %></p>
<p>Context Path: <%= contextPath %></p>

2.7.5 控制语句

JSP支持Java中的控制语句,如if、switch、for等。

案例:

<%int score = 85;
%>
<% if (score >= 90) { %><p>优秀</p>
<% } else if (score >= 80) { %><p>良好</p>
<% } else { %><p>需要努力</p>
<% } %>

2.7.6 循环语句

JSP支持Java中的循环语句,如for、while、do-while等。

案例:

<%String[] fruits = {"苹果", "香蕉", "橙子"};
%>
<% for (String fruit : fruits) { %><p>水果:<%= fruit %></p>
<% } %>

2.7.7 JSP运算符

JSP支持Java中的运算符,如算术运算符、比较运算符、逻辑运算符等。

案例:

<%int a = 10;int b = 20;int c = a + b;boolean isEqual = a == b;
%>
<p>Sum: <%= c %></p>
<p>Is equal: <%= isEqual %></p>

2.7.8 JSP字面量

JSP支持Java中的字面量,如整数、浮点数、字符串、布尔值等。

案例:

<%int intValue = 42;double doubleValue = 3.14;String stringValue = "Hello, JSP!";boolean booleanValue = true;
%>
<p>Integer: <%= intValue %></p>
<p>Double: <%= doubleValue %></p>
<p>String: <%= stringValue %></p>
<p>Boolean: <%= booleanValue %></p>

2.8 JSP指令

JSP(JavaServer Pages)指令是用于为JSP页面提供全局信息的。这些指令在JSP页面加载时由JSP容器(如Tomcat)处理,并影响整个页面的处理。以下是JSP指令的详细笔记以及一些案例代码。

2.8.1 JSP指令的类型

JSP定义了三种指令:

  1. page:定义页面依赖的属性,如脚本语言、错误页面、缓存需求等。

  2. include:在当前页面中包含其他文件。

  3. taglib:定义在页面中使用的标签库。

2.8.2 JSP page指令

page指令是最常用的指令,它定义了与页面相关的各种属性。

<%@ page   language="java"   contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%>
  • language:指定脚本语言,默认为Java。

  • contentType:指定响应的MIME类型和字符编码。

  • pageEncoding:指定JSP文件的字符编码。

其他常用的属性还有:

  • import:导入Java类。

  • session:指定页面是否参与HTTP会话,默认为true。

  • isELIgnored:指定是否忽略表达式语言(EL),默认为false。

2.8.3 JSP include指令

include指令用于在当前页面中包含其他文件。这可以是静态文件(如HTML或JSP)或动态文件(如Servlet)。

<%@ include file="header.jsp" %>

上面的代码将在当前位置包含header.jsp文件的内容。

2.8.4 JSP taglib指令

taglib指令用于定义在JSP页面中使用的标签库。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

上面的代码导入了JSTL核心标签库,并使用c作为前缀。

2.8.5 案例代码

案例1:使用page指令

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
<!DOCTYPE html>  
<html>  
<head>  <meta charset="UTF-8">  <title>Page Directive Example</title>  
</head>  
<body>  <h1>Welcome to JSP Page!</h1>  
</body>  
</html>

案例2:使用include指令

假设我们有一个header.jsp文件:

<!DOCTYPE html>  
<html>  
<head>  <meta charset="UTF-8">  <title><%= pageContext.getAttribute("title") %></title>  
</head>  
<body>

和一个index.jsp文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>  
<%@ page import="java.util.Date" %>  
<%@ include file="header.jsp" %>  
<h1>Welcome to Index Page!</h1>  
<% pageContext.setAttribute("title", "Index Page Title"); %>  
<p>Current Date: <%= new Date() %></p>  
</body>  
</html>

注意:在上面的例子中,title属性是在包含header.jsp之后设置的,但header.jsp在渲染时仍然可以访问它,因为pageContext对象在包含的文件之间共享。

案例3:使用taglib指令

使用JSTL核心标签库:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>  
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
<!DOCTYPE html>  
<html>  
<head>  <meta charset="UTF-8">  <title>Taglib Directive Example</title>  
</head>  
<body>  <h1>Welcome to JSTL Example!</h1>  <c:out value="Hello, JSTL!" />  
</body>  
</html>

3 MAC介绍

  • MVC是Model-View-Controller的简称,即模型-视图-控制器。是一种设计模式,它把应用程序分成三个核心模块:模型、视图、控制器,它们各自处理自己的任务。

  • 模型是应用程序的主体部分,模型表示业务数据和业务逻辑。一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以提高了代码的可重用性。

  • 视图是用户看到并与之交互的界面,视图向用户显示相关的数据、接受用户的输入、不进行任何实际的业务处理。

  • 控制器接受用户的输入并调用模型和视图去完成用户的需求。控制器接收请求并决定调用哪个模型组件去处理请求,然后决定调用哪个视图来显示模型处理返回的数据

4 过滤器(Filter)介绍

4.1 过滤器(Filter)概念

过滤器是Java Web开发中的一个重要组件,用于在请求到达目标资源(如Servlet、JSP或HTML文件)之前或之后执行某些操作。过滤器可以拦截请求和响应,以便对它们进行查看或修改。它们通常用于执行诸如日志记录、身份验证、授权、编码转换、数据压缩等任务。

4.2 Filter接口

Filter接口是Java Servlet API的一部分,用于定义过滤器的行为。要创建一个过滤器,你需要实现Filter接口,并覆写以下三个方法:

  • init(FilterConfig filterConfig): 在过滤器实例化后调用,用于初始化过滤器的状态。

  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 对请求和响应执行实际的过滤操作。此方法需要调用FilterChaindoFilter方法来确保请求到达目标资源,除非你确定要阻止请求。

  • destroy(): 在过滤器被销毁之前调用,用于释放资源。

4.2.1 FilterConfig接口

FilterConfig接口用于向过滤器提供配置信息。这些信息在Web应用程序的部署描述符(web.xml)中设置。当init方法被调用时,FilterConfig对象会传递给过滤器。你可以使用FilterConfig来获取初始化参数、过滤器名称和ServletContext对象。

4.2.2 FilterChain接口

FilterChain接口表示过滤器链中的一组过滤器。当请求/响应到达过滤器时,doFilter方法被调用,并且过滤器可以选择继续处理链(通过调用chain.doFilter(request, response)),或者阻止请求(不调用chain.doFilter)。

4.3 案例

以下是一个简单的过滤器示例,用于记录请求的URL:

import javax.servlet.*;  
import javax.servlet.http.HttpServletRequest;  
import java.io.IOException;  public class LoggingFilter implements Filter {  @Override  public void init(FilterConfig filterConfig) throws ServletException {  // 初始化代码(如果有)  System.out.println("LoggingFilter initialized.");  }  @Override  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  throws IOException, ServletException {  HttpServletRequest httpRequest = (HttpServletRequest) request;  // 记录请求的URL  String requestURI = httpRequest.getRequestURI();  System.out.println("Request URI: " + requestURI);  // 继续处理过滤器链  chain.doFilter(request, response);  }  @Override  public void destroy() {  // 销毁代码(如果有)  System.out.println("LoggingFilter destroyed.");  }  
}

web.xml中配置该过滤器:

<filter>  <filter-name>LoggingFilter</filter-name>  <filter-class>com.example.LoggingFilter</filter-class>  
</filter>  
<filter-mapping>  <filter-name>LoggingFilter</filter-name>  <url-pattern>/*</url-pattern> <!-- 拦截所有请求 -->  
</filter-mapping>

现在,每当有请求到达Web应用程序时,LoggingFilter都会记录请求的URL,然后继续处理过滤器链。

5 文件上传

文件上传是Web开发中常见的功能,它允许用户通过Web表单选择并发送文件到服务器。以下是文件上传的详细说明。

5.1 Enctype属性

在HTML表单中,为了支持文件上传,enctype属性必须设置为multipart/form-data。这是因为普通的application/x-www-form-urlencoded编码类型不支持文件数据。

示例:

<form action="upload" method="post" enctype="multipart/form-data">  <input type="file" name="fileToUpload" id="fileToUpload">  <input type="submit" value="Upload Image" name="submit">  
</form>

5.2 Commons-fileupload组件

commons-fileupload是Apache Commons项目的一部分,它提供了一个简单的API来处理multipart/form-data类型的请求,使得在Servlet中处理文件上传变得容易。

5.3 上传基本原理

  1. 用户在客户端选择一个或多个文件。

  2. 客户端通过HTTP POST请求将文件发送到服务器。

  3. 服务器使用commons-fileupload组件来解析这个请求,并将文件数据保存到服务器的某个位置。

  4. 服务器可能还需要执行一些额外的操作,如验证文件类型、大小等。

  5. 服务器完成处理后,将结果返回给客户端。

5.4 Commons-fileupload组件API

commons-fileupload的主要API包括:

  • ServletFileUpload:这个类是处理文件上传的入口点。它提供了parseRequest方法来解析HTTP请求,并返回一个List对象,每个FileItem代表一个表单字段(可能是文件字段,也可能是普通字段)。

  • FileItem:这个类代表一个表单字段。你可以使用它的isFormField方法来判断它是否是一个文件字段,如果是,则可以使用getInputStream方法获取文件数据,并使用getName方法获取文件名(包括路径)。

5.5 案例代码

以下是一个使用Commons FileUpload处理文件上传的Servlet示例:

import org.apache.commons.fileupload.FileItem;  
import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
import org.apache.commons.fileupload.servlet.ServletFileUpload;  import javax.servlet.ServletException;  
import javax.servlet.annotation.MultipartConfig;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.File;  
import java.io.IOException;  
import java.util.List;  @WebServlet("/upload")  
@MultipartConfig  
public class FileUploadServlet extends HttpServlet {  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  if (!ServletFileUpload.isMultipartContent(request)) {  throw new ServletException("Content type is not multipart/form-data");  }  DiskFileItemFactory factory = new DiskFileItemFactory();  ServletFileUpload upload = new ServletFileUpload(factory);  try {  List<FileItem> items = upload.parseRequest(request);  for (FileItem item : items) {  if (!item.isFormField()) {  String fileName = new File(item.getName()).getName();  String filePath = "/path/to/save/" + fileName;  File storeFile = new File(filePath);  item.write(storeFile);  response.getWriter().println("File Uploaded Successfully! " + fileName);  }  }  } catch (Exception e) {  request.setAttribute("message", "File Upload Failed due to " + e);  request.getRequestDispatcher("error.jsp").forward(request, response);  }  }  
}

6 文件的下载

  • 情景:在一些网络系统中,需要隐藏下载文件的真实地址,或者下载的文件需要一个程序来动态的确定后在传送给客户端

  • 方案:利用程序编码实现下载 可以增加安全访问控制,只对经过授权认证的用户提供下载可以从任意位置提供下载的数据

利用程序实现下载需要设置2个报头: 1、Web服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或HTML文件,而是一个要保存到本地的下载文件。设置Content-Type的值为:application/x-msdownload 2、Web服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置Content-Disposition 报头。该报头指定了接收程序处理数据内容的方式,在HTTP应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在attachment后面还可以指定filename参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。在设置Content-Dispostion之前一定要指定Content-Type.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能AI摄像头项目

项目概要 硬件说明&#xff1a;易百纳rv1126 38板&#xff0c;易百纳GC2053摄像头&#xff0c;拓展版&#xff08;自绘&#xff09;&#xff0c;屏幕驱动板&#xff08;自绘&#xff09;&#xff0c;3.1inch mipi屏&#xff0c;FT5316触摸屏 开发环境 硬件分析 开发环境及sd…

语音识别---节拍器

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

深度神经网络中的不确定性研究综述

A.单一确定性方法 对于确定性神经网络&#xff0c;参数是确定的&#xff0c;每次向前传递的重复都会产生相同的结果。对于不确定性量化的单一确定性网络方法&#xff0c;我们总结了在确定性网络中基于单一正向传递计算预测y *的不确定性的所有方法。在文献中&#xff0c;可以找…

Scratch编程v3.29.1少儿编程工具

软件介绍 SCRATCH是一款由麻省理工学院&#xff08;MIT&#xff09;媒体实验室开发的图形化编程语言和集成开发环境&#xff08;IDE&#xff09;。它的目标是让编程变得有趣、直观且易学&#xff0c;尤其是针对儿童和青少年群体。通过SCRATCH&#xff0c;用户可以通过拖放代码…

Al加码,引爆“躺平式”旅游 | 最新快讯

旅游业正迎来新的技术浪潮。 文&#xff5c;锌刻度&#xff0c;作者&#xff5c;孟会缘&#xff0c;编辑&#xff5c;李季 今年的五一&#xff0c;“微度假”“微旅行”纷纷出圈。 相较于三亚、云南等老牌旅游大热门&#xff0c;人们开始寻找一些不用“人挤人”的小众旅行目的…

第一天学习(GPT)

1.图片和语义是如何映射的&#xff1f; **Dalle2&#xff1a;**首先会对图片和语义进行预训练&#xff0c;将二者向量存储起来&#xff0c;然后将语义的vector向量转成图片的向量&#xff0c;然后基于这个图片往回反向映射&#xff08;Diffusion&#xff09;——>根据这段描…

Ps 中 曲线和色阶的区别在哪里?

【官方解释】 在Photoshop中&#xff0c;曲线&#xff08;Curves&#xff09;和色阶&#xff08;Levels&#xff09;是两种调整图像色调和对比度的工具&#xff0c;它们有一些相似之处&#xff0c;但也有一些重要的区别。 调整方式: 曲线&#xff08;Curves&#xff09;&…

激发创新活力,泸州老窖锻造人才“铁军”(内附长江酒道短评)

执笔 | 姜 姜 编辑 | 古利特 刚刚站上300亿元新台阶&#xff0c;泸州老窖再次传来喜讯。 <<<左右滑动查看更多>>> 4月28日&#xff0c;四川省庆祝“五一”国际劳动节大会在成都召开。泸州老窖股份有限公司工业4.0项目秘书长赵丙坤、泸州老窖酿酒有限责任公…

测试环境搭建:JDK+Tomcat+Mysql+Redis

基础的测试环境搭建&#xff1a; LAMPLinux(CentOS、ubuntu、redhat)ApacheMysqlPHP LTMJLinux(CentOS、ubuntu、redhat)TomcatMysql(Oracle)RedisJava 真实的测试环境搭建&#xff1a;&#xff08;企业真实的运维&#xff09; 基于SpringBoot&#xff08;SpringCloud分布式微…

SpringMVC响应数据

三、SpringMVC响应数据 3.1 handler方法分析 理解handler方法的作用和组成&#xff1a; /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为handler* TODO: handler需要使用RequestMapping/GetMapping系列,声明路径,在HandlerMapping中注册,供DS查找!* TODO: ha…

d3dcompiler_47.dll缺失怎么修复?,修复d3dcompiler_47.dll文件缺失的详细教程

d3dcompiler_47.dll缺失怎么修复&#xff1f;遇到这样的问题是不是不知道怎么办&#xff1f;如果你不知道该怎么办&#xff0c;那么小编这篇文章将教大家如何去解决d3dcompiler_47.dll文件缺失。 方法1&#xff1a;下载并安装d3dcompiler_47.dll文件 当出现找不到d3dcompiler_…

5月6号作业

申请该结构体数组&#xff0c;容量为5&#xff0c;初始化5个学生的信息 使用fprintf将数组中的5个学生信息&#xff0c;保存到文件中去 下一次程序运行的时候&#xff0c;使用fscanf&#xff0c;将文件中的5个学生信息&#xff0c;写入(加载)到数组中去&#xff0c;并直接输出学…

MySQL基础_5.多表查询

文章目录 一、多表连接1.1、笛卡尔积&#xff08;或交叉连接&#xff09; 二、多表查询&#xff08;SQL99语法&#xff09;2.1、内连接(INNER JOIN)2.2、内连接(INNER JOIN) 一、多表连接 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 …

视频号是资本创造的伪风口?还是互联网的真机遇?

我是王路飞。 都说视频号是在模仿抖音。 短视频、直播&#xff0c;甚至是视频号小店&#xff0c;都在模仿。 所以很多人认为&#xff0c;视频号不过是资本创造的伪风口罢了&#xff0c;谈不上是下一个互联网风口所在。 到底是伪风口&#xff1f;还是互联网的真机遇&#xf…

WinForm DataGridView 垂直滑动条显示异常

WinForm DataGridView的垂直滑动条不正常显示&#xff0c;当总行高超过控件高度&#xff08;控件高度为227及以下不会出现该问题&#xff09;时&#xff0c;右下角会出现一个灰框&#xff0c;因为表格控件位处TabControl下&#xff0c;当切换其他选项卡后再切回来时&#xff0c…

超分辨率重建——BSRN网络训练自己数据集并推理测试(详细图文教程)

目录 一、BSRN网络总结二、源码包准备三、环境准备3.1 报错KeyError: "No object named BSRN found in arch registry!"3.2 安装basicsr源码包3.3 参考环境 四、数据集准备五、训练5.1 配置文件参数修改5.2 启动训练5.2.1 命令方式训练5.2.2 配置Configuration方式训…

python+barcode快速生成条形码(电商测试小工具)

背景 需要测试自助收银机&#xff0c;每次都要在线生成条码&#xff0c;而且生成次数还有限制 需求 满足自定义条形码&#xff0c;可以生成条形码图片 方案 python 3.8以上 barcode 1.0.4 python-barcode 0.15.1 代码 用于生成Code128条形码…

基于Springboot的校园志愿者管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园志愿者管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

LangChain框架学习总结

目录 一、简介 二、概念 三、组件具体介绍 3.1 Models 3.1.1 LLMs 3.1.2 Chat Models 3.1.3 Text Embedding Modesl 3.1.4 总结 3.2 Prompts 3.2.1 LLM Prompt Template 3.2.1.1 自定义PromptTemplate 3.2.1.2 partial PromptTemplate 3.2.1.3 序列化PromptTemplat…

网页html版面分析-- BeauifulSoup(python 文档解析提取)

介绍 BeauifulSoup 是一个可以从HTML或XML 文件中提取数据的python库&#xff1b;它能通过转换器实现惯用的文档导航、查找、修改文档的方式。 BeauifulSoup是一个基于re开发的解析库&#xff0c;可以提供一些强大的解析功能&#xff1b;使用BeauifulSoup 能够提高提取数据的效…