第四阶段模块一 Servlet & JSP
c/s架构的概念
- C/S架构(Client/Server,客户端/服务器模式),是一种比较早的软件体系结构,也是生活中很常见的结构。这种结构将需要处理的业务合理地分配到客户端和服务器端,客户端通常负责完成与用户的交互任务,服务器通常负责数据的管理。
- C/S架构的主要优点如下:
- 客户端的界面和功能可以很丰富。
- 应用服务器的负荷较轻。
- 响应速度较快。
- C/S架构的主要缺点如下:
- 适用面窄,用户群固定。
- 维护和升级的成本高,所有的客户端都需要更新版本。
B/S架构的概念
- B/S架构(Browser/Server,浏览器/服务器模式),是互联网兴起后的软件体系结构,该结构将系统功能实现的主要业务逻辑集中到服务器端,极少数业务逻辑在浏览器实现,浏览器通常负责完成与用户的交互任务,服务器通常负责数据的管理。
- B/S架构的主要优点如下:
- 无需安装客户端,只要有浏览器即可。
- 适用面广,用户群不固定。
- 通过权限控制实现多客户访问的目的,交互性较强。
- 维护和升级的成本低,无需更新所有客户端版本。
- B/S架构的主要缺点如下:
- 应用服务器的负荷较重。
- 浏览器的界面和功能想要达到客户端的丰富程度需要花费大量的成本。
- 在跨浏览器上不尽如人意,适配比较麻烦。
JavaWeb的概念
- Web本意为网页的含义,这里表示互联网上供外界访问的资源。
- 互联网上供外界访问的资源主要分为以下两种:
- 静态资源:主要指Web页面中供人们浏览的数据始终是不变。
- 动态资源:主要指Web页面中供人们浏览的数据由程序产生,不同时间点访问页面看到的内容各不相同。
- JavaWeb主要指使用Java语言进行动态Web资源开发技术的统称,是解决相关Web互联网领域的技术总和。
HTTP协议的概念
- HTTP协议(HyperText Transfer Protocol,超文本传输协议)是由W3C(万维网联盟)组织制定的一种应用层协议,是用来规范浏览器与Web服务器之间如何通讯的数据格式,主要涉及浏览器的发请求格式和服务器的响应格式。
- HTTP协议通常承载于TCP协议之上,而承载于TLS或SSL协议层之上的协议就是常说的HTTPS协议。
- HTTP默认的端口号为80,HTTPS默认的端口号为443。
HTTP请求格式
- 客户端发送一个HTTP请求到服务器的请求消息主要包括:请求行、请求头、空白行和请求体。
请求行用来说明请求类型和要访问的资源以及所使用的HTTP版本,格式如下:请求类型 请求的路径 协议的版本(1.1) 请求头是紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息,格式(key:value)如下:主机 请求长度 请求的浏览器相关信息 空白行就是请求头部的空行,即使后面的请求数据为空则必须有空行。 请求体也叫请求数据,可以添加任意的其他数据。
HTTP响应格式
通常情况下服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息,主要包括:响应行、响应头、空白行和响应体。 响应行用来说明HTTP协议版本号和状态码以及状态消息,格式如下:协议的版本(1.0 1.1) 状态码 (200 成功 404 路径错误 500 服务错误) 状态信息 响应头用来说明客户端要使用的一些附加信息,格式(key:value)。 空白行就是响应头部的空行,即使后面的请求数据为空则必须有空行。 响应体用来服务器返回给客户端的文本信息。
Tomcat服务器
- Tomcat本意为公猫的含义,最初是由Sun公司的软件架构师詹姆斯·邓肯·戴维森开发的,后来他帮助将其变为开源项目并由Sun公司贡献给Apache软件基金会。
- Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。
Tomcat启动乱码的处理方式
logging.properties文件修改为
java.util.logging.ConsoleHandler.encoding = GBK
配置文件
server.xml文件是服务器的主配置文件,可以设置端口号、设置域名或IP、默认加载的项目、请求编码等。<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />tomcat-users.xml文件用来配置管理Tomcat服务器的用户与权限 。<role rolename="manager-gui"/> <user username="admin" password="123456" roles="manager-gui"/>
Servlet的基本概念
- Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是Java语言编写的服务器端程序,换句话说,Servlet就是运行在服务器上的Java类。
- Servlet用来完成B/S架构下客户端请求的响应处理,也就是交互式地浏览和生成数据,生成动态Web内容。
Servlet的编程步骤
- 建立一个Java Web Application项目并配置Tomcat服务器。
- 自定义类实现Servlet接口或继承 HttpServlet类(推荐) 并重写service方法。
- 将自定义类的信息配置到 web.xml文件并启动项目,配置方式如下:
<!-- 配置Servlet --> <servlet> <!-- HelloServlet是Servlet类的别名 --> <servlet-name> HelloServlet </servlet-name> <!-- com.lagou.task01.HelloServlet是包含路径的真实的Servlet类名 --> <servlet-class> com.lagou.task01.HelloServlet </servlet-class> </servlet> <!-- 映射Servlet --> <servlet-mapping> <!-- HelloServlet是Servlet类的别名,与上述名称必须相同 --> <servlet-name> HelloServlet </servlet-name> <!-- /hello是供浏览器使用的地址 --> <url-pattern> /hello </url-pattern> </servlet-mapping>
- 在浏览器上访问的方式为:
http://localhost:8080/工程路径/url-pattern的内容
Servlet接口
- javax.servlet.GenericServlet类主要用于定义一个通用的、与协议无关的servlet,该类实现了Servlet接口。
- 若编写通用servlet,只需重写service抽象方法即可。
常用的方法
HttpServlet类
- javax.servlet.http.HttpServlet类是个抽象类并继承了GenericServlet类。
- 用于创建适用于网站的HTTP Servlet,该类的子类必须至少重写一个方法。
常用的方法
Servlet的声明周期
- 构造方法只被调用一次,当第一次请求Servlet时调用构造方法来创建Servlet的实例。
- init方法只被调用一次,当创建好Servlet实例后立即调用该方法实现Servlet的初始化。
- service方法被多次调用,每当有请求时都会调用service方法来用于请求的响应。
- destroy方法只被调用一次,当该Servlet实例所在的Web应用被卸载前调用该方法来释放当前占用的资源。
GET请求
发出GET请求的主要方式:(1)在浏览器输入URL按回车(2)点击<a>超链接(3)点击submit按钮,提交 <form method=“get”>表单GET请求特点:会将请求数据添加到请求URL地址的后面,只能提交少量的数据、不安全
POST请求
发出POST请求的方法如下:点击submit按钮,提交 <form method=“post”>表单POST请求的特点:请求数据添加到HTTP协议体中,可提交大量数据、安全性好
Servlet接口
- javax.servlet.ServletRequest接口主要用于向servlet提供客户端请求信息,可以从中获取到任何请求信息。
- Servlet容器创建一个ServletRequest对象,并将其作为参数传递给Servlet的service方法。
常用的方法
HttpServletRequest接口
- javax.servlet.http.HttpServletRequest接口是ServletRequest接口的子接口,主要用于提供HTTP请求信息的功能。
- 不同于表单数据,在发送HTTP请求时,HTTP请求头直接由浏览器设置。
- 可直接通过HttpServletRequest对象提供的一系列get方法获取请求头数据。
常用的方法
ServletResponse接口
- javax.servlet.ServletResponse接口用于定义一个对象来帮助Servlet向客户端发送响应。
- Servlet容器创建ServletResponse对象,并将其作为参数传递给servlet的service方法。
常用方法
HttpServletResponse接口
- javax.servlet.http.HttpServletResponse接口继承ServletResponse接口,以便在发送响应时提供特定于HTTP的功能。
常用的方法
// 继承HttpServlet public class HelloWorld extends HttpServlet { // 重写HttpServlet中的doGet方法 4 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 设置响应输出编码,避免中文乱码 response.setContentType("text/html;charset=utf-8"); // 获取响应输出流 PrintWriter out= response.getWriter(); // 利用输出流输出信息 out.println("<html><body> Hello world!</body></html>"); //关闭流 out.close(); } }
Servlet接收中文乱码
接收中文乱码的原因
浏览器在提交表单时,会对中文参数值进行自动编码。当Tomcat服务器接收到浏览器请求后自动解码,当编码与解码方式不一致时,就会导致乱码。
解决Post接收乱码
接收之前设置编码方式:request.setCharacterEncoding(“utf-8”)提示:必须在调用request.getParameter(“name”)之前设置
解决Get接收乱码
将接收到的中文乱码重新编码:// 接收到get请求的中文字符串String name = request.getParameter("name");// 将中文字符重新编码,默认编码为ISO-8859-1String userName = new String(name.getBytes(“ISO-8859-1”),“utf-8");
ServletConfig接口
配置方式
<!-- 在web.xml中配置ServletConfig初始化参数 --> <servlet> <servlet-name>actionservlet</servlet-name> <servlet-class>com.lagou.demo01.ActionServlet</servlet-class> <!-- 配置 Serlvet 的初始化参数 --> <init-param> <!-- 参数名 --> <param-name>config</param-name> <!-- 参数值 --> <param-value>struts.xml</param-value> </init-param> </servlet>s
常用的方法
ServletContext接口
- javax.servlet.ServletContext接口主要用于定义一组方法,Servlet使用这些方法与它的Servlet容器通信。
- 服务器容器在启动时会为每个项目创建唯一的一个ServletContext对象,用于实现多个Servlet之间的信息共享和通信。
- 在Servlet中通过this.getServletContext()方法可以获得ServletContext对象。
配置方式
<!--在web.xml中配置ServletContext初始化参数 --> <context-param> <param-name>username</param-name> <param-value>scott</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>tiger</param-value> </context-param>
常用的方法
Servlet+JDBC
为了方便重用和便于维护等目的,经常会采用DAO(Data Access Object)模式对数据库操作进行独立封装。
重定向
首先客户浏览器发送http请求,当web服务器接受后发送302状态码响应及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。
重定向的实现
实现重定向需要借助javax.servlet.http.HttpServletResponse接口中的以下方法:
重定向的原理
重定向的特点
- 重定向之后,浏览器地址栏的URL会发生改变。
- 重定向过程中会将前面Request对象销毁,然后创建一个新的Request对象。
- 重定向的URL可以是其它项目工程。
转发
一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续处理,转发的各个组件会共享Request和Response对象。
转发的实现
- 绑定数据到Request对象
- 获得转发器对象
- 转发操作
- 转发的特点
- 转发之后浏览器地址栏的URL不会发生改变。
- 转发过程中共享Request对象。
- 转发的URL不可以是其它项目工程。
重定向和转发比较
Servlet线程安全
- 服务器在收到请求之后,会启动一个线程来进行相应的请求处理。
- 默认情况下,服务器为每个Servlet只创建一个对象实例。当多个请求访问同一个Servlet时,会有多个线程访问同一个Servlet对象,此时就可能发生线程安全问题。
- 多线程并发逻辑,需要使用synchronized对代码加锁处理,但尽量避免使用。
状态管理
- Web程序基于HTTP协议通信,而HTTP协议是”无状态”的协议,一旦服务器响应完客户的请求之后,就断开连接,而同一个客户的下一次请求又会重新建立网络连接。
- 服务器程序有时是需要判断是否为同一个客户发出的请求,比如客户的多次选购商品。因此,有必要跟踪同一个客户发出的一系列请求。
- 把浏览器与服务器之间多次交互作为一个整体,将多次交互所涉及的数据保存下来,即状态管理。
- 多次交互的数据状态可以在客户端保存,也可以在服务器端保存。状态管理主要分为以下两类:
- 客户端管理:将状态保存在客户端。基于Cookie技术实现。
- 服务器管理:将状态保存在服务器端。基于Session技术实现。
Cookie技术
- Cookie本意为”饼干“的含义,在这里表示客户端以“名-值”形式进行保存的一种技术。
- 浏览器向服务器发送请求时,服务器将数据以Set-Cookie消息头的方式响应给浏览器,然后浏览器会将这些数据以文本文件的方式保存起来。
- 当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器。
Cookie相关方法
- 使用javax.servlet.http.Cookie类的构造方法实现Cookie的创建。
- 使用javax.servlet.http.HttpServletResponse接口的成员方法实现Cookie的添加。
- 使用javax.servlet.http.HttpServletRequest接口的成员方法实现Cookie对象的获取。
- 使用javax.servlet.http.Cookie类的构造方法实现Cookie对象中属性的获取和修改。
Cookie的生命周期
- 默认情况下,浏览器会将Cookie信息保存在内存中,只要浏览器关闭,Cookie信息就会消失。
如果希望关闭浏览器后Cookie信息仍有效,可以通过Cookie类的成员方法实现。
Cookie的路径问题
- 浏览器在访问服务器时,会比较Cookie的路径与请求路径是否匹配,只有匹配的Cookie才会发送给服务器。
- Cookie的默认路径等于添加这个Cookie信息时的组件路径,例如:/项目名/目录/add.do请求添加了一个Cookie信息,则该Cookie的路径是 /项目名/目录。
访问的请求地址必须符合Cookie的路径或者其子路径时,浏览器才会发送Cookie信息。
Cookie的特点
- Cookie技术不适合存储所有数据,程序员只用于存储少量、非敏感信息,原因如下:
- 将状态数据保存在浏览器端,不安全。
- 保存数据量有限制,大约4KB左右。
- 只能保存字符串信息。
- 可以通过浏览器设置为禁止使用。
Session技术
- Session本意为"会话"的含义,是用来维护一个客户端和服务器关联的一种技术。
- 浏览器访问服务器时,服务器会为每一个浏览器都在服务器端的内存中分配一个空间,用于创建一个Session对象,该对象有一个id属性且该值唯一,我们称为SessionId,并且服务器会将这个SessionId以Cookie方式发送给浏览器存储。
- 浏览器再次访问服务器时会将SessionId发送给服务器,服务器可以依据SessionId查找相对应的Session对象
Session相关方法
- 使用javax.servlet.http.HttpServletRequest接口的成员方法实现Session的获取。
- 使用javax.servlet.http.HttpSession接口的成员方法实现判断和获取。
- 使用javax.servlet.http.HttpSession接口的成员方法实现属性的管理。
Session的生命周期
- 为了节省服务器内存空间资源,服务器会将空闲时间过长的Session对象自动清除掉,服务器默认的超时限制一般是30分钟。
- 使用javax.servlet.http.HttpSession接口的成员方法实现失效实现的获取和设置。
- 可以配置web.xml文件修改失效时间。
<session-config> <session-timeout>30</session-timeout> </session-config>
Session的特点
- 数据比较安全。
- 能够保存的数据类型丰富,而Cookie只能保存字符串。
- 能够保存更多的数据,而Cookie大约保存4KB。
- 数据保存在服务器端会占用服务器的内存空间,如果存储信息过多、用户量过大,会严重影响服务器的性能。
JSP核心技术
- JSP是Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应, JSP文件命名为xxx.jsp。
- 与Servlet不同,JSP文件以HTML标记为主,然后内嵌Java代码段,用于处理动态内容。
JSP与Servlet的关系
JSP语法结构
- 声明区
- 程序代码区
- 表达式
- 注释
- 指令和动作
- 内置对象
声明区
- 基本语法:
<%! %>
- 说明:可以定义全局变量、方法、类。
<%! int i; public void setName(){… …} %>
程序代码区
- 基本语法:
<%程序代码区%>
- 说明:可以定义局部变量以及放入任何的Java程序代码。
<% int j; for (int k=0; k<10; k++) { … … } %>
表达式
- 基本语法:
<%=… …%>
- 说明:可以输出一个变量或一个具体内容,但=后面必须是字符串变量或者可以被转换成字符串的表达式。
- 注意:不需要以;结束,只有一行
<%=“hello world”%> <%=i+1%>
注释
格式:<!--… …--> HTML文件的注释,浏览器可以查看到<%--… …--%> JSP文件的注释,浏览器看不到<%//… …%> Java语言中的单行注释,浏览器看不到<%/*… …*/%> Java语言中的多行注释,浏览器看不到注释的内容不会被执行
指令和动作
- 指令格式:
<%@指令 属性=“属性值”%>
- 指令的属性可以设定多个。
- JSP常用指令有:page、taglib、include。
page指令
- page指令用于导包和设置一些页面属性,常用属性如下:
import 导入相应的包,惟一允许在同一文档中多次出现的属性contentType 设置Content-Type响应报头,标明即将发送到浏览器的文档类型pageEncoding 设置页面的编码language 指定页面使用的语言session 控制页面是否参与HTTP会话errorPage 处理当前页面中抛出但未被捕获的任何异常isErrorPage 当前页是否可以作为其他页面的错误处理页面
taglib指令
- taglib指令用来扩展JSP程序的标签元素,引入其他功能的标签库文件。
<!-- prefix属性用于指定库前缀 --> <!-- uri属性用于指定库的标识 --> <%@taglib uri=“tagLibary” prefix=“prefix”%>
include指令
include指令用于引入另一个个JSP程序或HTML文件等,格式如下:
<%@include file=“被包含的文件地址%>
- jsp:include动作用于引入另一个JSP程序或HTML文件等。
- 执行到include时,被include的文件才会被编译。
- 如果include的是jsp文件,那它不会被转换成Servlet文件。
<jsp:include page="URLSpec" flush="true"/> <jsp:include page="URLSpec" flush="true"> <jsp:param name="key" value="value"/> </jsp:include>
- include指令是在JSP程序的转换时期就将fifile属性所指定的程序内容嵌入再编译执行(静态包含)。
- include动作在转换时期是不会被编译的,只有在客户端请求时期被执行到才会被动态的编译载入(动态包含,推荐)。
<jsp:forward page="urlSpec" flush="true"/> <jsp:forward page="urlSpec"> <!-- 用于指定参数和其对应的值 --> <jsp:param name="key" value="value"/> </jsp:forward>
JSP内置对象
- 在JSP程序中有9个内置对象由容器为用户进行实例化,程序员可以不用定义就直接使用这些变量。
- 在JSP转换成Servlet后,会自动追加这些变量的定义,使用内置对象可以简化JSP的开发。
out内置对象
request内置对象

response内置对象
- response对象用于给客户端相应输出处理结果,它是HttpServletResponse接口的一个实例。
- 经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL。
session内置对象
- session对象表示浏览器和服务器之间的一次会话,一次会话可以包含多次请求,在多次请求之间可以借助session对象存储信息,它是HttpSession类型的一个实例。
- 该对象的属性值在一次会话范围中保存,保存在服务器端,只要不关闭浏览器,默认半个小时内都可以访问
- application对象是一个web程序的全局变量,它是ServletContext类型的一个实例。
- 在整个服务器上保存数据,所有用户共享。
- pageContext对象是PageContext类型的对象,可以使用这个对象来管理其他的隐含对象。
- 只在一个页面中保存数据。
- exception 对象是Throwable的实例,表示的是JSP的异常信息。
- 如果要使用它,必须将对应页面page指令的isErrorPage属性设置成true。
1 2 3 4 | < error-page > < exception-type >java.lang.Throwable</ exception-type > < location >/error.jsp</ location > </ error-page > |
- JavaBean 是使用 Java 语言开发的一个可重用的组件,在 JSP 开发中可以使用 JavaBean 减少重复代码,使整个 JSP 代码的开发更加简洁。
- JavaBean本质上就是Java类,通常要求如下:
- 属性:全部私有化,通过get和set方法进行访问。
- 方法:必须是public关键字修饰。
- 构造器 :必须有无参构造方法。
使用方式
- 使用jsp:useBean的方式创建javaBean实例
<jsp:useBean id=“对象名” scope=“保存范围 class=“包名.类名” /> 保存范围有:page|request|sessin|application,默认为page范围。
- 使用jsp:setProperty的方式设置javaBean的属性值
<jsp:setProperty name="对象名" property="属性名" value="属性值" param="参数名"/>
- 使用jsp:getProperty的方式获取javaBean的属性值
<jsp:getProperty name="对象名" property="属性名"/>
保存范围
- JavaBean的保存范围有page、request、session以及application,默认是page范围。
<% 内置对象.removeAttribute(“JavaBean的名字”); %>
MVC设计模式
- MVC是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了代码的可维护性。
- M:主要用于封装业务数据的JavaBean(Bean) 和 业务逻辑的JavaBean(Service)及访问数据库的DAO对象。
- V:主要负责数据收集 和 数据展现,通常由JSP文件完成。
- C:主要负责流程控制 和 页面跳转,通常由Servlet完成。
基本模型
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)