【java】JSP --- 动态网页开发技术
1. 什么是JSP?
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
2. 为什么使用JSP?
JSP程序与CGI程序有着相似的功能,但和CGI程序相比,JSP程序有如下优势:
性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。
服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本。
JSP 基于Java Servlet API,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等。
JSP页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被Java servlet 模板引擎所支持。
最后,JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用。
3. JSP的原理
- jsp其实是一种特殊的Servlet
- 当jsp页面第一次被访问时,服务器会把jsp编译成java文件
- 然后再把java编译成.class
- 然后创建该类对象
- 最后调用它的service()方法
- 第二次请求同一jsp时,直接调用service()方法。
4. JSP的优势
- 与ASP相比:JSP有两大优势。首先,动态部分用Java编写,而不是VB或其他MS专用语言,所以更加强大与易用。第二点就是JSP易于移植到非MS平台上。
- 与纯 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
与SSI相比:SSI无法使用表单数据、无法进行数据库链接。 - 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
- 与静态HTML相比:静态HTML不包含动态信息。
5. JSP的脚本
1. <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
6. JSP的三大指令
6.1 page
- 配置JSP页面
pageEncoding和contentType:
* pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!
在服务器要把jsp编译成.java时需要使用pageEncoding!
* contentType:它表示添加一个响应头:Content-Type!等同与
response.setContentType(“text/html;charset=utf-8”);
* import:导包!可以出现多次
errorPage和isErrorPage:
* errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,由errorPage来指定
* isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!
而且这个页面可以使用9大内置对象中的exception!
autoFlush和buffer
* autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!
默认为true,如果为false,那么在缓冲区满时抛出异常!
* buffer:指定缓冲区大小,默认为8kb,通常不需要修改!
* isELIgnored:是否忽略el表达式,默认值为false,不忽略,即支持!
* language:指定当前jsp编译后的语言类型,默认值为java。
* info:信息!
* isThreadSafe:当前的jsp是否支持并发访问!
* session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象!
* extends:让jsp生成的servlet去继承该属性指定的类!
6.2 include
-
与RequestDispatcher的include()方法的功能相似!
-
<%@include%> 它是在jsp编译成java文件时完成的!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
-
RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并了!
-
作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立jsp,而我们只需要处理变化的页面。
<%@include file="top.jsp"%>
6.3 taglib
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix:指定标签库在本页面中的前缀!由我们自己来起名称!相当于一个别名
uri: 指定标签库的位置!
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 前缀的用法<c:if>
7. JSP的九大内置对象
对象名 真实类型 作用
* pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象
* request HttpServletRequest 一次请求访问的多个资源(转发)
* session HttpSession 一次会话的多个请求间,
即HttpSession类的对象,
不是每个JSP页面中都可以使用,
如果在某个JSP页面中设置
<%@page session=”false”%>,
说明这个页面不能使用session。
* application ServletContext 所有用户间共享数据
* response HttpServletResponse 响应对象
* page Object 当前页面(Servlet)的对象 this
* out JspWriter 输出对象,数据输出到页面上,
类似于response.getWriter(),
用来向客户端发送文本数据;
* config ServletConfig Servlet的配置对象
* exception Throwable 异常对象,只有在错误页面中可以使用这个对象;
- pageContext的作用
Servlet中有三大域,而JSP中有四大域!
ServletContext:整个应用程序
session:整个会话(一个会话中只有一个用户)
request:一个请求链!
pageContext:一个jsp页面!这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据!
域对象
代理其他域:pageContext.setAttribute(“xxx”, “XXX”, PageContext.SESSION_SCOPE);
全域查找:pageContext.findAttribute(“xxx”);从小到大,依赖查找!
获取其他8个内置对象:
8. JSP的动作标签
- 动作标签是由tomcat(服务器)来解释执行!而html标签由浏览器来执行!
8.1 include
例如:<jsp:include page=“xxx”/>,用来包含指定的页面。
-
假如有两个jsp. 分别为a.jsp和b.jsp,他们分别编码成Servlet,然后在执行Servlet时才会执行包含过程。这也是include指令与include标签的区别。
-
注意:<jsp:include page="<%=myfile%>">,这是可以的!因为include指令是在执行时才完成的包含,在执行时已经可以确定myfile这个变量的值。
-
该标签内部使用的是RequestDispatcher.include()方法完成的包含
8.2 forward
例如:<jsp:forward page=“xxx”/>,用来转发到指定页面
例如在a.jsp中存在如下内容:<jsp:fowrad page=“b.jsp”/>
a.jsp中的内容不会显示在浏览器上,而只是显示b.jsp的内容。而且在<jsp:forwad >标签下面的内容不会被执行。
8.3 param
<jsp:param>操作被用来以“名-值”对的形式为其他标签提供附加信息。
它和<jsp:include>、<jsp:forward>、<jsp:plugin>一起使用,方法如下:
<jsp:param name=”paramName” value=”paramValue”/>
其中,name为与属性相关联的关键词,value为属性的值。
- 用来像其他页面传递信息。
例如:
<jsp:include page="come.jsp">//加载come.jsp
<jsp:param name="number" value="<%=i%>" />//传递参数
</jsp:include>
8.4 其他
语法 | 描述 |
---|---|
jsp:include | 用于在当前页面中包含静态或动态资源 |
jsp:useBean | 寻找和初始化一个JavaBean组件 |
jsp:setProperty | 设置 JavaBean组件的值 |
jsp:getProperty | 将 JavaBean组件的值插入到 output中 |
jsp:forward | 从一个JSP文件向另一个文件传递一个包含用户请求的request对象 |
jsp:plugin | 用于在生成的HTML页面中包含Applet和JavaBean对象 |
jsp:element | 动态创建一个XML元素 |
jsp:attribute | 定义动态创建的XML元素的属性 |
jsp:body | 定义动态创建的XML元素的主体 |
jsp:text | 用于封装模板数据 |
9. JSP的注释
语法 | 描述 |
---|---|
<%-- 注释 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
<!-- 注释 --> | HTML注释,通过浏览器查看网页源代码时可以看见注释内容 |
<\% | 代表静态 <%常量 |
%\> | 代表静态 %> 常量 |
\' | 在属性中使用的单引号 |
\" | 在属性中使用的双引号 |