2023.10.23
使用纯粹Servlet开发web应用的缺陷
在Servlet当中编写HTML/CSS/JavaScript等前端代码:
-
java程序中编写前端代码,编写难度大。麻烦。
-
java程序中编写前端代码,显然程序的耦合度非常高。
-
java程序中编写前端代码,代码非常不美观。
-
java程序中编写前端代码,维护成本太高。(非常难于维护)
修改小小的一个前端代码,只要有改动,就需要重新编译java代码,生成新的class文件,打一个新的war包,重新发布。
JSP
JSP(Java Server Pages)是建立在Servlet规范之上的动态网页开发技术,其实质是一个简化的Servlet,在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用于实现网页中静态内容的显示,Java代码用于实现网页中动态内容的显示。
JSP是什么?
-
JSP实际上就是一个Servlet。
-
index_jsp 类继承 HttpJspBase,而HttpJspBase类继承的是HttpServlet。所以index_jsp类就是一个Servlet类。
-
jsp的生命周期和Servlet的生命周期完全相同。完全就是一个东西。没有任何区别。
-
jsp和servlet一样,都是单例的。(假单例)
-
JSP是java程序。(JSP本质还是一个Servlet)
-
Servlet是JavaEE的13个子规范之一,那么JSP也是JavaEE的13个子规范之一。
-
JSP是一套规范。所有的web容器/web服务器都是遵循这套规范的,都是按照这套规范进行的“翻译”
-
每一个web容器/web服务器都会内置一个JSP翻译引擎。
-
JSP的执行流程
- 客户端向服务器发送请求,访问JSP页面。
-
服务器接到请求后检索对应的JSP页面,如果该JSP页面是第一次被请求,那么服务器会将此页面中的静态数据(HTML文本)和动态数据(Java元素)全部转化为Java代码,使JSP文件转换成一个Servlet类文件。在转换过程中,服务器若发现JSP文件中存在语法错误,则会中断转换过程,并向客户端返回出错信息。
-
服务器将转换后的Servlet源代码编译成字节码文件(.class),对于Tomcat服务器而言,生成的字节码文件默认存放在Tomcat安装目录的work目录下。
-
编译后的字节码文件被加载到内存中执行,并根据用户的请求生成HTML格式的响应内容。
-
服务器将响应内容发送回客户端。
JSP基础语法
-
JSP中直接编写普通字符串:
-
翻译到service方法的out.write("这里")
-
-
<%%>
-
翻译到service方法体内部,里面是一条一条的java语句。
-
-
<%! %>
-
翻译到service方法之外。
-
-
<%= %>
-
翻译到service方法体内部,翻译为:out.print();
-
-
<%@page contentType="text/html;charset=UTF-8"%>
-
page指令,通过contentType属性用来设置响应的内容类型。
-
-
JSP的专业注释
-
<%-- JSP的专业注释,不会被翻译到java源代码当中。 --%>
-
只用JSP这一个技术,能不能开发web应用?
可以。因为JSP本质就是Servlet,在JSP的<%%>里面写的代码就是在service方法当中的,所以在<%%>当中完全可以编写JDBC代码,连接数据库,查询数据,也可以在这个方法当中编写业务逻辑代码,处理业务,都是可以的,所以使用单独的JSP开发web应用完全没问题。
But不建议。建议采用servlet + jsp的方式进行开发。这样都能将各自的优点发挥出来。JSP负责做数据展示。Servlet负责数据的收集。(JSP中编写的Java代码越少越好。)一定要职责分明。
JSP的指令
JSP的指令用于指导JSP的翻译引擎如何工作(指导当前的JSP翻译引擎如何翻译JSP文件)
指令包括:taglib指令、page指令...
关于page指令常用的属性:
<%@page session="true|false" %>
true表示启用JSP的内置对象session,表示一定启动session对象。没有session对象会创建。
如果没有设置,默认值就是session="true"
session="false" 表示不启动内置对象session。当前JSP页面中无法使用内置对象session。
<%@page contentType="text/json" %>
contentType属性用来设置响应的内容类型
但同时也可以设置字符集。
<%@page contentType="text/json;charset=UTF-8" %>
<%@page pageEncoding="UTF-8" %>
pageEncoding="UTF-8" 表示设置响应时采用的字符集。
<%@page import="java.util.List, java.util.Date, java.util.ArrayList" %>
<%@page import="java.util.*" %>
import语句,导包。
<%@page errorPage="/error.jsp" %>
当前页面出现异常之后,跳转到error.jsp页面。
errorPage属性用来指定出错之后的跳转位置。
<%@page isErrorPage="true" %>
表示启用JSP九大内置对象之一:exception
默认值是false。
-
JSP的九大内置对象
-
jakarta.servlet.jsp.PageContext pageContext 页面作用域
-
jakarta.servlet.http.HttpServletRequest request 请求作用域
-
jakarta.servlet.http.HttpSession session 会话作用域
-
jakarta.servlet.ServletContext application 应用作用域
-
pageContext < request < session < application
-
以上四个作用域都有:setAttribute、getAttribute、removeAttribute方法。
-
以上作用域的使用原则:尽可能使用小的域。
-
-
java.lang.Throwable exception
-
jakarta.servlet.ServletConfig config
-
java.lang.Object page (其实是this,当前的servlet对象)
-
jakarta.servlet.jsp.JspWriter out (负责输出)
-
jakarta.servlet.http.HttpServletResponse response (负责响应)
-