文章目录
Web 前端 - JSP
概述
JSP 页面由 HTML 代码和嵌入其中的 Java 代码所组成。服务器在页面被客户端所请求后对页面中的 Java 代码进行处理,然后将生成的 HTML 页面返回给客户端的浏览器。
JSP 全称 Java Server Pages,Java 服务器页面,是一种动态网页开发技术,使用 JSP 标签(<% Java代码块 %>)在传统静态页面 HTML 网页中插入 Java 代码块,运行在单例多线程环境下。
JSP 是一种 Java servlet,主要用于实现 Java Web 应用程序的用户界面部分。其本质就是 Servlet,即 JSP 是专门用于进行数据展示的 Servlet。
Servlet VS JSP :功能类似但实现方式不同。JSP 通常在大量的 HTML 代码中嵌入少量的 Java 代码,而 servlets 全部由 Java 写成并且生成 HTML。
JSP 通过网页表单获取用户输入数据、访问数据库以及其他数据源,然后动态地创建网页。
JSP 的优势:
- 与静态 HTML 相比,HTML 不包含动态信息。
- 与纯 Servlet 相比,JSP 可以很方便地编写或者修改 HTML 网页,不用去面对大量地输出语句(print)。
- 与 JavaScript 相比,虽然 JavaScript 可以在客户端动态生成 HTML ,但是很难与服务器交互,因此不能提供复杂的服务。
JSP 的编译:
- Servlet 容器内置 JSP 翻译引擎,先将 JSP 文件翻译为 Servlet 的 Java 文件;
- Servlet 容器再将 Java 文件编译为字节码文件。
JSP 的生命周期:理解 JSP 底层功能的关键是要理解它遵守的生命周期
- 编译阶段:servlet 容器编译 servlet 源文件,生成 servlet 类
- 初始化阶段:加载与 JSP 对应的 servlet 类,创建其实例,并调用其初始化方法
- 执行阶段:调用与 JSP 对应的 servlet 实例的服务方法
- 销毁阶段:调用与 JSP 对应的 servlet 实例的销毁方法,然后销毁servlet 实例
JSP 无法实现前后端分离,所以后续不再使用,被 JS(JavaScript)和 Ajax 取代!
JSP 处理过程
Web 服务器是如何使用 JSP 来创建网页的:
- 用户浏览器发送 HTTP 请求给服务器;
- Web服务器识别出这是一个对 JSP 网页的请求,并将请求传递给 JSP 引擎(通过 URL 或 .jsp 文件来完成);
- JSP 引擎从磁盘中载入 JSP 文件,然后将其转化为 Servlet ,这种转化只是简单地将所有模板本文改用 print() 语句,并将所有地 JSP 元素转化为 Java 代码;
- JSP 引擎将 Servlet 编译成为可执行类,并将原始请求传递给 servlet 引擎;
- Web服务器地某组件将会调用 servlet 引擎,然后载入并执行 servlet 类,在执行过程中,servlet 产生 HTML 格式输出,并将其内嵌于 HTTP response 中上交给 Web 服务器;
- Web 服务器以静态 HTML 网页地形式将 HTTP response 返回到用户浏览器中;
- 最终Web浏览器处理 HTTP response 中动态产生的 HTML 网页,就好像在处理静态页面一样。
JSP 语法
-
脚本:<% java code segment %>
可以包含任意的 Java 语句、变量、方法或表达式。
注意:任何文本、HTML 标签、JSP 元素必须写在脚本程序(<% %>)的外部。
JSP 脚本(Java语句块)被 JSP 翻译引擎翻译到 Servlet 的 service() 中。
-
声明:<%! declaration ; ……%>
用于声明后面要用到的变量、方法等,不常用。
JSP 声明语句块被 JSP 翻译引擎翻译到 Servlet 的类中。
-
JSP 表达式:<%=表达式%> 等价于 <% out.println(表达式);%>
一个 JSP 表达式中包含的脚本语言表达式,先被转换为 String ,然后再插入到表达式出现的地方。
注意:表达式元素中可以包含任何符合 Java 语言规范的表达式,但是不能使用分号来结束表达式。
JSP 表达式被 JSP 翻译引擎翻译到 Servlet 的标准输出流中。
-
注释:隐形的注释(查看源码时不可见):<%- - 注释 - -%>
显示的注释(查看源码时可见):<!- - - ->,JSP 翻译引擎将注释翻译到 Servlet 的 out.write() 中。
-
JSP 指令:<%@ directive attribute=“value” %>
用来设置与整个 JSP 页面相关的属性,并没有任何可见输出。
Web 后端 - Servlet
概述
-
Servlet 是基于 Java 技术的 web 组件,是连接 web 服务器和服务端 Java 程序的协议,是一种通信规范。
Servlet 用于生成动态内容,根据客户端提交的请求,调用服务器端相关 Java 代码来完成对请求的处理和运算。
客户端通过 Servlet 容器实现请求/应答模型与 Servlet 交互。
像其他基于 Java 的组件一样,Servlet 也是基于平台无关的 Java 类格式,被编译为与平台无关的字节码。
Servlet 是 Java EE 平台的一部分。
Servlet 的设计模式是单例模式。
-
Servlet接口:Java Servlet API 的核心抽象。目前有 GenericServlet 和 HttpServlet 这两个类实现了该接口,大多数情况下,开发者只需要继承 HttpServlet 去实现自己的 Servlet。
-
Servlet容器:web server 或 application server 的一部分,提供基于请求 / 响应模型的网络服务,解码基于 MIME (设定某种扩展名的文件用一种应用程序来打开的方式类型)请求,格式化基于 MIME 的响应,也包含管理 Servlet 生命周期。
-
Servlet生命周期:三个阶段 – Init、Service、Destroy
Servlet 对象的创建:执行无参构造器,首次请求时执行,只能执行一次。
- Servlet 对象的初始化:执行 init(),首次请求时执行,只能执行一次。
- Servlet 对象的服务执行:执行 service(),每次请求时执行,可以执行多次。
- Servlet 对象的销毁:执行 destroy(),应用停止时执行,只能执行一次。
-
如何创建一个 Servlet 类(就 eclipse 而言)
- 创建一个 Dynamic Web Project,勾选 Generate web.xml…
- 项目必须加入 ServerRuntime,并配置好 Servlet 容器,build path
- 写一个类继承 HttpServlet,并实现 doGet 或 doPost 方法
- 在项目的 web.xml 中配置 Servlet 映射
02-Servlet 核心
-
接收请求参数
-
请求参数是以 Map 集合的形式接受的,该 Map 集合为 Map<String,String[]>
-
相关方法:
方法名 作用 getParameter(String name) 获取指定参数 name 的值 getParameterValues(String name) 获取指定参数 name 的所有值 getParameterMap() 获取存放请求参数的 Map getParameterNames() 获取所有请求参数的名称
-
-
域属性空间
-
一次请求对应一个请求对象
-
一个请求对象对应一个域属性空间(域属性空间不共享)
-
域属性(成员属性)空间范围的对比:
域属性空间名 空间范围 HttpServletRequest 请求范围,可完成**跨 Servlet **共享数据(Servlet 必须在同一请求中) HttpSession 会话范围,可完成跨请求共享数据 ServletContext / Application 应用范围,可完成跨会话共享数据 -
域属性空间的使用原则:在不影响功能的基础上优先使用小范围的域属性空间。
-
域属性空间的相关方法:
方法名 作用 getAttribute(String name) 获取请求中指定的域属性 getAttributeNames() 获取请求中所有的域属性名称 setAttribute(String name,String value) 设置请求中指定的域属性 removeAttribute(String name,String value) 删除请求中指定的域属性 -
其他方法整理:
方法名 作用 StringBuffer getRequestURL() 获取请求的 URL,即绝对路径(从请求协议开始) String getRequestURI() 获取请求的 URI,即相对路径(从项目名称开始) String getContextPath() 获取当前 web 应用的根路径 String getServletPath() 获取请求路径与匹配路径的精确部分 String getPathInfo() 获取请求路径与匹配路径的非精确部分 String getMethod() 获取请求的提交方式 String getRemoteAddr() 获取客户端 IP
-
03- doGet 和 doPost 方法
-
Get 方式:
-
获取请求参数:
request.getParameter(parameterName);
-
响应请求:向客户端返回内容
response.getWriter().write(parameterValue);
-
-
Post 方式:
- request.getParameter(parameterName);
- request.getAttribute(parameterName, parameterValue);
04-前后端分离
利用 Ajax 与 Servlet 进行 JSON 格式数据交互,实现前后端分离。前端使用 HTML ,其中大部分使用 JavaScript 、Ajax,后端使用 Servlet 。
Servlet 就是用 Java 编写服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态的 Web 内容。
Servlet 运行在支持 Java 语言地应用服务器(Tomcat)中,理论上讲 Servlet 可以响应任何类型的请求,但是绝大部分情况下 Servlet 只用来扩展基于 HTML 协议的 Web 服务器。
在 Java 中新建 Servlet 类,继承自 HttpServlet ,并且重写 doGet 方法处理 get 请求,重写 doPost 方法处理 post 请求。
Servlet 中通过 write 方法:
PrintWriter out = response.getWriter();
out.write();
输出数据到前端, 前端使用 responseText 接收数据。
通过 println 方法
out.println() ;
输出页面。
05-Filter 过滤器的使用
-
Filter 是 Java 的组件,允许运行过程中改变进入资源的请求和资源返回的响应中的有效负载和 header 信息。
Filter 是一种代码重用的技术,通常不产生响应,不像 Servlet 一样对请求做出响应,而是修改或调整到资源的请求,或者修改调整来自资源的响应。
Filter 可以作用于动态或静态内容。
-
供开发者使用的 Filter 功能:
- 在执行请求前访问资源
- 在执行请求前处理资源的请求
- 用请求对象的自定义版本包装请求,对请求的 header 和数据进行修改
- 用响应对象的自定义版本包装响应,对响应的 header 和数据进行修改
- 拦截资源调用之后的再调用
- 作用在 Servlet,一组 Servlet 或静态内容上的0个、1个或多个拦截器按指定顺序执行
-
Filter 用处:常用功能是拦截非法访问和进行编码转换(一般使用UTF-8)
- 验证
- 日志记录和审计
- 图像转换
- 数据压缩
- 加密
- 词法(Tokenizing)
- 触发资源访问时间
- 缓存
06-Listener 监听器的使用
- 应用事件监听器是实现一个或多个 Servlet 时间监听器接口的类,更好地控制 servletContext、HttpSession、ServletRequest 的生命周期。
- 常用 Listener:
- Servlet 事件监听器支持在 ServletContext、HttpSession 和S ervletRequest 状态改变时进行事件通知。
- ServletContextListener:用来管理应用的资源或 JVM 级别持有的状态。
- HttpSessionListener:用来管理从相同客户端或用户进入 web 应用的一系列请求关联的状态或资源。
- ServletRequestListener:用来管理整个 Servlet 请求的生命周期状态。
- AsyncListener:用来管理异步事件,例如超时和完成异步处理。
07-请求转发(分派请求)—RequestDispatcher 接口
-
请求转发与重定向不同,它会把请求直接转发给另一个 Servlet 处理,或者在 response 中包含另一个 servlet 的输出。RequestDispatcher 接口提供了一种机制来实现这种功能。
-
获取:ServletContext 中包含了两个方法获取 RequestDispatcher:
- getRequestDispatcher
- getNameDispatcher
如:RequestDispatcher disp=getServletContext().getRequestDispatcher(“contextpath”);
同样,对于 request 对象也能获取 RequestDispatcher 对象:
RequestDispatcher disp=request.getRequestDispatcher(“contextpath”);
-
RequestDispatcher 的两个方法:
-
include():用于引用另外一个 servlet 或其他资源一起输出到客户端,表示当前请求已经结束,对客户端进行响应,标准输出流已经开启。
使用 include() 的 Servlet 可以提供对客户端的响应。
-
forward():将当前的请求转交给另一个 servlet 或 jsp 来处理,本身的输出被覆盖,表示当前请求尚未结束,标准输出流尚未开启。
- 使用 include() 的 Servlet不可以提供对客户端的响应。
-
-
RequestDispatcher.forward() VS Response.sendRedirect():
- forward 是由跳转页面直接在服务器端将上下文交付给目标页面,有目标页面来显示内容。
- sendRedirect 是将页面的地址发给客户端,然后由客户端通过跳转指令重新请求目标页面。
-
请求转发和重定向都是请求跳转的两种方式
请求转发 | 重定向 |
---|---|
服务器内跳转 | 服务器外跳转 |
一次请求一次响应 | 多次请求多次响应 |
直接获取数据 | 通过重定向的路径获取数据 |
地址栏显示用户提交的请求路径 | 重定向的路径(防止表单重复提交) |
请求的跳转范围限定于本应用 | 请求的跳转范围不限定于本应用 |
- 当出现以下几种情况时,优先选择使用重定向:
- 需要跳转到其他应用
- 处理表单数据的 Servlet 需要跳转到其他 Servlet
- Servlet 消耗大量服务器资源