[01] JSP的基本认识

1、什么是JSP

JSP,全称JavaServer Pages,是由Sun Microsystems公司倡导和许多公司参与共同建立的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。

什么意思?

在 [01] Servlet是什么 的文尾我曾经提到过,早期的网页都是静态的,也就是最普通的html形式,网页内容写了啥,就只能显示啥,为了能根据不同的情况生成不同内容的动态网页(比如不同用户的账户管理页面总不能都一样吧),由Servlet接下了重任,通过数不清的out.println()来输出html标签和内容,就像下面这样写代码:

  1. public class MyServlet extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. response.setContentType("text/html;charset=utf-8");
  5. PrintWriter out = response.getWriter();
  6. out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
  7. out.println("<HTML>");
  8. out.println(" <HEAD><TITLE>This is my Servlet</TITLE></HEAD>");
  9. out.println(" <BODY>");
  10. out.print(" This is ");
  11. out.print(this.getClass());
  12. out.println(", using the GET method");
  13. out.println(" </BODY>");
  14. for (int i = 0; i < 10; i++) {
  15. out.println("<font color=‘red‘>i=" + i + "</font><br>");
  16. }
  17. out.println("</HTML>");
  18. out.flush();
  19. out.close();
  20. }
  21. @Override
  22. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23. doGet(request, response);
  24. }
  25. }

显然太冗杂了,后来JSP出现,Servlet就卸任专心去做控制器了。那么JSP是什么呢?JSP在表面上看来就是 "HTML+Java代码" 的组合,其中HTML实现静态部分,Java代码实现动态部分。主要表现在于普通的html代码中,以<% %>形式来标记Java代码。

比如我想要生成一个1-3的多选框,我可以这些写我的JSP页面:

  1. <%@page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head><title>Simple jsp page</title></head>
  4. <body>
  5. <%
  6. for (int i = 1; i < 4; i++) {
  7. %>
  8. <input type="checkbox"> <%=i%> <br>
  9. <%
  10. }
  11. %>
  12. </body>
  13. </html>

而得到的效果如下图,这显然比你傻乎乎地写静态html好多了,因为这里的i是可变的,你也可以通过Java代码获取其他的数据进行展示。

在上述的代码中,我们可以看到,JSP中Java代码最基本的表达有两种方式:

<% Java代码 %> 脚本元素
<%= 输出表达式 %> 输出表达式  

2、JSP的本质和基本运行过程

为什么JSP可以做到执行Java代码呢?原因很简单,JSP在技术上来说,最终它的本质就是一个Servlet,你说它能不能执行Java代码?

那么它实际是由容器执行的(比如Tomcat),大致流程是这样:

  • 翻译:将JSP文件翻译成Java文件(存放在tomcat目录下的 /work/Catalina/localhost/)
  • 编译:将Java文件便宜成class文件
  • 实例化:由Tomcat创建JSP类的对象
  • 提供服务:由Tomcat调用JSP对象的_jspService方法,生成响应,返回给浏览器进行显示

我们试着写了两个JSP页面,一个是上述例中生成1-3多选框的代码,一个是空的JSP,并启动了tomcat,然后可以看到tomcat生成了如下文件:

我们先看空的JSP生成的java类中,即上图中testEmpty_jsp.java的_jspService()方法:

  1. public void _jspService(HttpServletRequest request, HttpServletResponse response)
  2. throws java.io.IOException, ServletException {
  3. PageContext pageContext = null;
  4. HttpSession session = null;
  5. ServletContext application = null;
  6. ServletConfig config = null;
  7. JspWriter out = null;
  8. Object page = this;
  9. JspWriter _jspx_out = null;
  10. PageContext _jspx_page_context = null;
  11. try {
  12. response.setContentType("text/html");
  13. pageContext = _jspxFactory.getPageContext(this, request, response,
  14. null, true, 8192, true);
  15. _jspx_page_context = pageContext;
  16. application = pageContext.getServletContext();
  17. config = pageContext.getServletConfig();
  18. session = pageContext.getSession();
  19. out = pageContext.getOut();
  20. _jspx_out = out;
  21. } catch (Throwable t) {
  22. if (!(t instanceof SkipPageException)) {
  23. out = _jspx_out;
  24. if (out != null && out.getBufferSize() != 0)
  25. try {
  26. out.clearBuffer();
  27. } catch (java.io.IOException e) {
  28. }
  29. if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
  30. }
  31. } finally {
  32. _jspxFactory.releasePageContext(_jspx_page_context);
  33. }
  34. }

可见,即便是空的JSP文件,也会翻译出java类,而且该类中已经有一些代码,且是“固定”的,也就是说,任何的JSP文件,最终翻译生成的类中,都有这些代码。

那么我们再看另一个写了内容的JSP文件,也就是我们举例用过的JSP,如下:

  1. <%@page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head><title>Simple jsp page</title></head>
  4. <body>
  5. <%
  6. for (int i = 1; i < 4; i++) {
  7. %>
  8. <input type="checkbox"> <%=i%> <br>
  9. <%
  10. }
  11. %>
  12. </body>
  13. </html>

它的java类中的_jspService()是这样的:

  1. public void _jspService(HttpServletRequest request, HttpServletResponse response)
  2. throws java.io.IOException, ServletException {
  3. PageContext pageContext = null;
  4. HttpSession session = null;
  5. ServletContext application = null;
  6. ServletConfig config = null;
  7. JspWriter out = null;
  8. Object page = this;
  9. JspWriter _jspx_out = null;
  10. PageContext _jspx_page_context = null;
  11. try {
  12. response.setContentType("text/html;charset=UTF-8");
  13. pageContext = _jspxFactory.getPageContext(this, request, response,
  14. null, true, 8192, true);
  15. _jspx_page_context = pageContext;
  16. application = pageContext.getServletContext();
  17. config = pageContext.getServletConfig();
  18. session = pageContext.getSession();
  19. out = pageContext.getOut();
  20. _jspx_out = out;
  21. out.write("\r\n");
  22. out.write("<html>\r\n");
  23. out.write("<head><title>Simple jsp page</title></head>\r\n");
  24. out.write("<body>\r\n");
  25. for (int i = 1; i < 4; i++) {
  26. out.write("\r\n");
  27. out.write(" <input type=\"checkbox\"> ");
  28. out.print(i);
  29. out.write(" <br>\r\n");
  30. }
  31. out.write("\r\n");
  32. out.write("</body>\r\n");
  33. out.write("</html>");
  34. } catch (Throwable t) {
  35. if (!(t instanceof SkipPageException)) {
  36. out = _jspx_out;
  37. if (out != null && out.getBufferSize() != 0)
  38. try {
  39. out.clearBuffer();
  40. } catch (java.io.IOException e) {
  41. }
  42. if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
  43. }
  44. } finally {
  45. _jspxFactory.releasePageContext(_jspx_page_context);
  46. }
  47. }

可以看到,JSP中的内容怎么来的?就是这里来的,这些代码插入到那些“固定代码”之后进行输出,包括了HTML和Java代码的执行。

所以,由此可以看出,JSP文件的究竟是怎么回事

  • JSP文件本质是一个Java类,这个类遵守Servlet的规范,所以也可以说JSP就是一个Servlet
  • JSP文件对应的Java类由容器翻译生成
  • JSP文件中的所有内容,会翻译到Java类中_jspService方法中,并放到"固定"代码之后
  • 我们写的JSP代码,无非就是Java类_jspService方法中方法体的一部分
时间: 2024-10-14 03:28:41

[01] JSP的基本认识的相关文章

01.JSP基础语法

一.JSP注释及scriptlet 1,  JSP注释 <!--这种风格的注释客户端可以看见--> <% //java中提供的单行注释,客户端无法看见 /*java中提供的多行注释,客户端也无法看见 */ %> <%--这种注释方法客户端也无法看见--%> 2,  scriptlet:表示脚本小程序,所有嵌入在html中的java程序必须用scriptlet标记,一共三种标记方式 <%%>,在此scriptlet中可以编写局部变量.执行语句 <%!%&

JSP的动态导入

<body> <!-- 动态引入 他们引入的相互独立的代码段 所以可以运行 代码段之间存在重复的变量 --> this is a test dy include 01 <jsp:include page="testdyinclude02.jsp?name=lisi"> <jsp:param value="insert" name="cmd"/> </jsp:include> </b

如何打开JSP

操作方法 01 jsp文件是嵌入式网页脚本,可以使用文本工具打开进行编辑.在jsp文件上点击鼠标右键. 02 选择计算机上的程序来打开文件. 03 点击更多应用. 04 下拉列表. 05 选择记事本程序. 06 打开jsp文件,查看内容. &

JavaBean和jsp的开发模型

1.实体类 1 package com.zdsofe.javaBean.work; 2 3 public class Student { 4 5 public String name; 6 public String sex; 7 public int age; 8 public String[] hobby; 9 public String hobbys; 10 11 public String[] getHobby() { 12 return hobby; 13 } 14 public vo

JSP语法学习笔记

1.修改JSP页面模版:找到MyEclips安装目录,搜索“Jsp.vtl”,找到该文件修改编码,以及一些不需要用到的代码. 2.查找项目生成的Servlet文件路径:查看当前项目父级目录搜索 .metadata -> .me_tcat ->work ->Catalina 即可在 子级目录找到servlet 翻译过后的代码. 3.JSP 页码全局异常页面配置,错误页码配置Page指令 IsErrorPage="true",则可获取异常信息WebRoot/Web-INF

Eclipse运行jsp文件或者web项目

前提:Eclipse(中文版)正常运行,java环境(jdk1.8版本)搭建完毕 1.在自己的电脑上下载(部署)好Tomcat PS: tomcat是符合java ee标准的最小的web server,它可以完成大部分的小型系统的开发,并且提供支持,tomcat最大的分水岭是tomcat4.1之后,而在tomcat5.5之后也发生了一些改变,到今天使用的tomcat9. ①在官网上 http://tomcat.apache.org/上下载Tomcat安装程序(这里我选择用exe程序来安装Tomc

1. EasyUI 对话框dialog

文章参考来源:http://www.cnblogs.com/xdp-gacl/p/4075079.html 感谢博主的分享,写得非常精细,我在这边给看过的做一个记录. 一.EasyUI下载 使用easyui开发者不需要编写复杂的javascript,也不需要对css样式有深入的了解,开发者需要了解的只有一些简单的html标签. EasyUI官方下载地址:http://www.jeasyui.com/download/index.php,目前最新的版本是:jQuery EasyUI 1.5 解压后

慕课网文件上传

servlet方式上传: UploadServlet.java 1 package com.imooc.servlet; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.RandomAccessFile; 8 9 import javax.servlet.RequestDi

EasyUI学习总结(一)——EasyUI入门

一.EasyUI下载 EasyUI官方下载地址:http://www.jeasyui.com/download/index.php,目前最新的版本是:jQuery EasyUI 1.4.1 下载完成之后,得到压缩包,解压后,得到一个[jquery-easyui-1.4.1]文件夹,里面有如下图所示的文件: 二.EasyUI入门 2.1.引入必要的js和css样式文件 要想在页面中使用EasyUI,那么首先要做的就是在页面中引入必要js和css样式文件,以在jsp文件中使用EasyUI为例,文件引