【JavaWeb】JSP 系列——关于 JSP、JSP 的基础语法、利用 Servlet+JSP 改造项目、JSP 指令、JSP 九大内置对象
JSP
01 关于 JSP
1.1 我的第一个 JSP 程序:
在 WEB-INF 目录之外创建一个 index.jsp 文件,然后这个文件中没有任何内容。
将上面的项目部署之后,启动服务器,打开浏览器,访问以下地址:
http://localhost:8080/jsp/index.jsp 展现在大家面前的是一个空白。
实际上访问以上的这个:index.jsp,底层执行的是:index_jsp.class 这个 java 程序。
这个 index.jsp 会被 tomcat 翻译生成 index_jsp.java 文件,然后 tomcat 服务器又会将 index_jsp.java 编译生成 index_jsp.class 文件
访问 index.jsp,实际上执行的是 index_jsp.class 中的方法。
1.2 JSP 的本质
index.jsp 访问的时候,会自动翻译生成 index_jsp.java,会自动编译生成 index_jsp.class,那么 index_jsp 这就是一个类。
index_jsp 类继承 HttpJspBase,而 HttpJspBase 类继承的是 HttpServlet。所以 index_jsp 类就是一个 Servlet 类。
jsp 的生命周期和 Servlet 的生命周期完全相同。完全就是一个东西。没有任何区别。
jsp 和 servlet 一样,都是单例的。(假单例。)JSP 实际上就是一个 Servlet。
1.3 jsp 文件第一次访问的时候为什么比较慢?
为什么大部分的运维人员在给客户演示项目的时候,为什么提前先把所有的 jsp 文件先访问一遍。
第一次比较麻烦:
要把 jsp 文件翻译生成 java 源文件
java 源文件要编译生成 class 字节码文件
然后通过 class 去创建 servlet 对象
然后调用 servlet 对象的 init 方法
最后调用 servlet 对象的 service 方法。
第二次就比较快了,为什么?
因为第二次直接调用单例 servlet 对象的 service 方法即可。
1.4 JSP 是什么?
JSP 是 java 程序。(JSP 本质还是一个 Servlet)
JSP 是:JavaServer Pages 的缩写。(基于 Java 语言实现的服务器端的页面。)
Servlet 是 JavaEE 的 13 个子规范之一,那么 JSP 也是 JavaEE 的 13 个子规范之一。
JSP 是一套规范。所有的 web 容器/web 服务器都是遵循这套规范的,都是按照这套规范进行的“翻译”
每一个 web 容器/web 服务器都会内置一个 JSP 翻译引擎。
对 JSP 进行错误调试的时候,还是要直接打开 JSP 文件对应的 java 文件,检查 java 代码。
开发 JSP 的最高境界:眼前是 JSP 代码,但是脑袋中呈现的是 java 代码。
1.6 JSP 和 Servlet 的区别
职责不同:
Servlet 的职责是什么:收集数据。(Servlet 的强项是逻辑处理,业务处理,然后链接数据库,获取/收集数据。)
JSP 的职责是什么:展示数据。(JSP 的强项是做数据的展示)
02 JSP 的基础语法
2.1 在 jsp 文件中直接编写文字,都会自动被翻译到哪里?
翻译到 servlet 类的 service 方法的 out.write("翻译到这里"),直接翻译到双引号里,被 java 程序当做普通字符串打印输出到浏览器。
在 JSP 中编写的 HTML CSS JS 代码,这些代码对于 JSP 来说只是一个普通的字符串。但是 JSP 把这个普通的字符串一旦输出到浏览器,浏览器就会对 HTML CSS JS 进行解释执行。展现一个效果。
2.2 JSP 的 page 指令,解决响应时的中文乱码问题:
通过 page 指令来设置响应的内容类型,在内容类型的最后面添加:charset=UTF-8
<%@page contentType="text/html;charset=UTF-8"%>,表示响应的内容类型是 text/html,采用的字符集 UTF-8
<%@page import="java.util.List,java.util.ArrayList"%>
2.2 怎么在 JSP 中编写 Java 程序:
2.2.1 <% java 语句; %>(java 语句的输出)
在这个符号当中编写的被视为 java 程序,被翻译到 Servlet 类的 service 方法内部。
这里你要细心点,你要思考,在<% %>这个符号里面写 java 代码的时候,你要时时刻刻的记住你正在“方法体”当中写代码,方法体中可以写什么,不可以写什么,你心里是否明白呢?
在 service 方法当中编写的代码是有顺序的,方法体当中的代码要遵循自上而下的顺序依次逐行执行。
service 方法当中不能写静态代码块,不能写方法,不能定义成员变量。。。。。。
在同一个 JSP 当中 <%%> 这个符号可以出现多个。
2.2.2 <%! %>
在这个符号当中编写的 java 程序会自动翻译到 service 方法之外。
这个语法很少用,为什么?不建议使用,因为在 service 方法外面写静态变量和实例变量,都会存在线程安全问题,因为 JSP 就是 servlet,servlet 是单例的,多线程并发的环境下,这个静态变量和实例变量一旦有修改操作,必然会存在线程安全问题。
2.2.3 <%= %> (表达式和变量的输出)
怎么向浏览器上输出一个 java 变量。
<% String name = “jack”; out.write("name = " + name); %>
注意:以上代码中的 out 是 JSP 的九大内置对象之一。可以直接拿来用。当然,必须只能在 service 方法内部使用。
如果向浏览器上输出的内容中没有“java 代码”,例如输出的字符串是一个固定的字符串,可以直接在 jsp 中编写,不需要写到<%%> 这里。
如果输出的内容中含有“java 代码”,这个时候可以使用以下语法格式:
<%= %> 注意:在=的后面编写要输出的内容。
<%= %> 这个符号会被翻译到哪里?最终翻译成什么?
翻译成了这个 java 代码: out.print();
翻译到 service 方法当中了。
什么时候使用<%=%> 输出呢?输出的内容中含有 java 的变量,输出的内容是一个动态的内容,不是一个死的字符串。如果输出的是一个固定的字符串,直接在 JSP 文件中编写即可。
2.3 在 JSP 中如何编写 JSP 的专业注释
<%--JSP 的专业注释,不会被翻译到 java 源代码当中。--%>
2.4 JSP 基础语法总结:
JSP 中直接编写普通字符串
翻译到 service 方法的 out.write("这里")
<%%>
翻译到 service 方法体内部,里面是一条一条的 java 语句。
<%! %>
翻译到 service 方法之外。
<%= %>
翻译到 service 方法体内部,翻译为:out.print();
<%@page contentType="text/html;charset=UTF-8"%>
page 指令,通过 contentType 属性用来设置响应的内容类型。
print 能输出各种类型,但 write 只能输出字符串
03 使用 Servlet + JSP 完成 oa 项目的改造。
使用 Servlet 处理业务,收集数据。 使用 JSP 展示数据。
将之前原型中的 html 文件,全部修改为 jsp,然后在 jsp 文件头部添加 page 指令(指定 contentType 防止中文乱码),将所有的 JSP 直接拷贝到 web 目录下。
完成所有页面的正常流转。(页面仍然能够正常的跳转。修改超链接的请求路径。)
<%=request.getContextPath() %> 在 JSP 中动态的获取应用的根路径。
Servlet 中连接数据库,查询所有的部门,遍历结果集。
遍历结果集的过程中,取出部门编号、部门名、位置等信息,封装成 java 对象。
将 java 对象存放到 List 集合中。
将 List 集合存储到 request 域当中。
转发 forward 到 jsp。
在 JSP 中:
从 request 域当中取出 List 集合。
遍历 List 集合,取出每个部门对象。动态生成 tr。
思考一个问题:如果我只用 JSP 这一个技术,能不能开发 web 应用?
当然可以使用 JSP 来完成所有的功能。因为 JSP 就是 Servlet,在 JSP 的<%%>里面写的代码就是在 service 方法当中的,所以在<%%>当中完全可以编写 JDBC 代码,连接数据库,查询数据,也可以在这个方法当中编写业务逻辑代码,处理业务,都是可以的,所以使用单独的 JSP 开发 web 应用完全没问题。
虽然 JSP 一个技术就可以完成 web 应用,但是不建议,还是建议采用 servlet + jsp 的方式进行开发。这样都能将各自的优点发挥出来。JSP 就是做数据展示。Servlet 就是做数据的收集。(JSP 中编写的 Java 代码越少越好。)一定要职责分明。
JSP 文件的扩展名必须是 xxx.jsp 吗?
jsp 文件的扩展名是可以配置的。不是固定的。
在 CATALINA_HOME/conf/web.xml,在这个文件当中配置 jsp 文件的扩展名。
版权声明: 本文为 InfoQ 作者【胖虎不秃头】的原创文章。
原文链接:【http://xie.infoq.cn/article/a3503b5e269ba1f0b7713687c】。文章转载请联系作者。
评论