JSP是什么
程序员文章站
2022-07-10 19:08:20
一.JSP简介:JSP(全称JavaServer Pages),JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。简单来说:JSP是一个模版引擎,它简化了开发,封装了servlet响应html标签的繁琐代码。JSP技术以Java语言作为脚本语...
一.JSP简介:
- JSP(全称JavaServer Pages),JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
- 简单来说:JSP是一个模版引擎,它简化了开发,封装了servlet响应html标签的繁琐代码。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP就是一种特殊的servlet.
二.tomcat响应jsp给客户端的原理
tomcat服务器与客户端是两个不同的程序,端口号也不一样,服务器响应请求之后发送数据到客户端只能通过response对象去处理。response对象是servlet中方法的参数。
服务器自动做了一些事情:
- 为每个jsp生成一个servlet(对应的java文件,并把java文件编译为字节码文件)
- 在生成的servlet中会有一个response对象,默默的用response.getWriter().write(“html标签”)方法生成html标签。
证明上述说法:
如下图的jsp文件:
服务器会在tomcat目录下的work/Catalina/localhost/ROOT/org/apache/jsp/中生成.java文件(本人使用mac):
查看index_jsp.java文件部分代码:
out.write("deployer-howto.html\">Deployer</a></li>\n");
out.write(" </ul>\n");
out.write(" </div>\n");
out.write(" </div>\n");
out.write(" <div class=\"col20\">\n");
out.write(" <div class=\"container\">\n");
out.write(" <h4>Get Involved</h4>\n");
out.write(" <ul>\n");
out.write(" <li><a href=\"");
out.write((String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", String.class, (PageContext)_jspx_page_context, null));
out.write("getinvolved.html\">Overview</a></li>\n");
out.write(" <li><a href=\"");
out.write((String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", String.class, (PageContext)_jspx_page_context, null));
out.write("source.html\">Source Repositories</a></li>\n");
out.write(" <li><a href=\"");
out.write((String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", String.class, (PageContext)_jspx_page_context, null));
out.write("lists.html\">Mailing Lists</a></li>\n");
out.write(" <li><a href=\"https://wiki.apache.org/tomcat/FrontPage\">Wiki</a></li>\n");
out.write(" </ul>\n");
out.write(" </div>\n");
out.write(" </div>\n");
out.write(" <div class=\"col20\">\n");
out.write(" <div class=\"container\">\n");
out.write(" <h4>Miscellaneous</h4>\n");
out.write(" <ul>\n");
out.write(" <li><a href=\"");
out.write((String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", String.class, (PageContext)_jspx_page_context, null));
out.write("contact.html\">Contact</a></li>\n");
out.write(" <li><a href=\"");
out.write((String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", String.class, (PageContext)_jspx_page_context, null));
可以看到部分代码段中有很多地方使用write方法向客户端传输html标签。
证毕
三.JSP三大指令
- page 用于声明jsp : jsp=html+page指令
- contentType=“text/html;charset=UTF-8” 指定jsp文件的mime类型和字符集
- import=“java.util.*” 为jsp的脚本中的Java代码去导包
- errorPage=“500.jsp” 如果当前页面发生异常,就跳转到500.jsp中
- isErrorPage=“true” 承认自己是不是错误处理页面,如果为true就可以使用exception内置对象
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
- taglib 用于导入外部资源标签库,jstl
- 静态包含 – 两个jsp之间使用静态包含,会被tomcat服务器编译成一个servlet,可以实现脚本互通
<%@ include file = "a.jsp" %>
- include 静态包含,一个jsp页面可以包含另一个jsp页面
- 引入外部标签库,通常用于引入jstl标签
四.九个内置对象
1.域对象(4个)
- pageContext
- request
- session
- application
//最小的域对象,仅限于当前页面
pageContext.setAttribute("name","李白");
//request域对象,使用范围限于转发之间的页面
request.setAttribute("name","韩信");
//session域对象,范围是一次会话,浏览器或服务器不关闭称为一次会话,该工程下的任何jsp页面都可以取到
session.setAttribute("name","孙尚香");
//application域对象,范围最大,只要服务器不关,那么存的值一直有效
application.setAttribute("name","马可波罗");
2.其它对象
- response
- out
- page
- exception
- config
五.JSP发展史和mvc
JavaWeb发展史
- 只有servlet,如果响应动态资源,必须使用response.writer()去输出大量的标签
- jsp出生和繁荣,完全依赖jsp,省略了servlet,优点:便于开发,缺点:耦合度高,代码非常不清晰
- mvc模式,jsp和servlet共存,jsp中只有少量的java代码,主要还是用于页面展示,核心功能放在servlet中
MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
- m:model 模型层,泛指service层,dao层和javaBean实体类
- v:view 视图层,使用jsp展示数据
- c:controller 控制层,使用servlet处理请求和响应
本文地址:https://blog.csdn.net/MrYushiwen/article/details/107582536