当前位置:   article > 正文

【Java.Web】JSP —— HTML, Servlet,JSP比较, JSP基础_jsp servlet html

jsp servlet html

HTML V.S. Servlet V.S. JSP

静态HTML文件,Servlet和JSP都能向客户端返回HTML页面。

静态HTML文件

当浏览器请求访问http://localhost:8080/base-webapp/index.html时,Web服务器会读取本地文件系统中的index.html文件中的数据,把它作为请求正文发送给浏览器:


html文件事先已经存在于文件系统中,每次客户端请求访问该文件,客户端得到的都是同样的内容。


Servlet动态生成HTML页面

使用Servlet可以动态生成HTML文档:


但是开发人员必须编写JAVA程序代码的方式来生成HTML文档(通过PrintWriter对象来一行一行打印HTML文档的内容),编程工作繁琐。


JSP动态生成HTML页面

静态HTML文件和Servlet各有优缺点,JSP吸取两者的优点并摒弃二者的缺点。

在传统的HTML文件(*.htm, *.html)中加入Java程序片段和JSP标记,就构成了JSP文件。


JSP基础

一个简单的例子

在base-webapp中添加一个jsp文件:


  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. <title>JSP Example</title>
  8. </head>
  9. <body>
  10. Hello <%= request.getParameter("username") %>
  11. </body>
  12. </html>


在浏览器中访问如下URL:

http://localhost:8080/base-webapp/jsp/example.jsp?username=jsp user

浏览器页面如下:


JSP基础

JSP文件的翻译和编译

浏览器请求访问jsp文件,当servlet容器接收到客户端请求访问特定JSP文件请求的时候,容器按照以下流程来处理客户请求:

  • 查找JSP文件对应的Servlet,如果已经存在,就调用它的服务方法
  • 如果与JSP文件对应的Servlet类还不存在,就解析文件系统中的JSP文件,把它翻译成Servlet源文件,接着把Servlet源文件编译成Servlet类,然后再初始化并运行Servlet

在一般情况下,把JSP文件翻译成Servlet源文件并编译Servlet源文件的过程仅在客户端首次调用JSP文件时发生:


在Web应用处于运行时的情况下,如果原始的JSP文件被更新,多数Servlet容器能检测到所做的更新,继而自动生成新的Servlet源文件并进行编译,然后再运行所生成的Servlet。


JSP生成的Servlet源文件及class文件 —— tomcat

tomcat把JSP生成的Servlet源文件和类文件放于<tomcat安装目录>/work目录下,可手工删除文件。


查看work目录下,example.jsp文件对应的Servlet源文件和类文件分别为:



JSP类的继承体系

查看生成的Servlet类文件:example_jsp.java(最后)


与JSP文件对应的Servlet类继承了org.apache.jasper.runtime.HttpJspBase类,HttpJspBase类由Tomcat提供,它实现了JSP API中的javax.servlet.jsp.HttpJspPage接口,该接口继承了javax.servlet.jsp.JspPage接口,而JspPage接口又继承了Servlet API中的javax.servlet.Servlet接口:



从Servlet容器处理JSP的过程可以看出,JSP虽然形式上想HTML文件,但其本质上是Servlet。JSP可以访问Servlet API中的接口和类,此外,JSP还可以访问JSP API中的接口和类,JSP API主要位于javax.servlet.jsp包中。


  1. package org.apache.jsp.jsp;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import javax.servlet.jsp.*;
  5. public final class example_jsp extends org.apache.jasper.runtime.HttpJspBase
  6. implements org.apache.jasper.runtime.JspSourceDependent {
  7. private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
  8. private static java.util.List _jspx_dependants;
  9. private javax.el.ExpressionFactory _el_expressionfactory;
  10. private org.apache.AnnotationProcessor _jsp_annotationprocessor;
  11. public Object getDependants() {
  12. return _jspx_dependants;
  13. }
  14. public void _jspInit() {
  15. _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
  16. _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
  17. }
  18. public void _jspDestroy() {
  19. }
  20. public void _jspService(HttpServletRequest request, HttpServletResponse response)
  21. throws java.io.IOException, ServletException {
  22. PageContext pageContext = null;
  23. HttpSession session = null;
  24. ServletContext application = null;
  25. ServletConfig config = null;
  26. JspWriter out = null;
  27. Object page = this;
  28. JspWriter _jspx_out = null;
  29. PageContext _jspx_page_context = null;
  30. try {
  31. response.setContentType("text/html; charset=utf-8");
  32. pageContext = _jspxFactory.getPageContext(this, request, response,
  33. null, true, 8192, true);
  34. _jspx_page_context = pageContext;
  35. application = pageContext.getServletContext();
  36. config = pageContext.getServletConfig();
  37. session = pageContext.getSession();
  38. out = pageContext.getOut();
  39. _jspx_out = out;
  40. out.write("\n");
  41. out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
  42. out.write("<html>\n");
  43. out.write("<head>\n");
  44. out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n");
  45. out.write("<title>JSP Example</title>\n");
  46. out.write("</head>\n");
  47. out.write("<body>\n");
  48. out.write(" Hello ");
  49. out.print( request.getParameter("username") );
  50. out.write("\n");
  51. out.write("</body>\n");
  52. out.write("</html>");
  53. } catch (Throwable t) {
  54. if (!(t instanceof SkipPageException)){
  55. out = _jspx_out;
  56. if (out != null && out.getBufferSize() != 0)
  57. try { out.clearBuffer(); } catch (java.io.IOException e) {}
  58. if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
  59. else log(t.getMessage(), t);
  60. }
  61. } finally {
  62. _jspxFactory.releasePageContext(_jspx_page_context);
  63. }
  64. }
  65. }


JSP的使用

通常,JSP负责动态生成HTML文档,而业务逻辑由其他可重用的组件,如JavaBean或其他Java程序来实现,JSP通过Java程序片段来访问这些业务组件:







声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/140034
推荐阅读
相关标签
  

闽ICP备14008679号