JSP

  • you can click link to there quickly.

简介:

JSP(Java Server Pages,即:Java服务器页面),是一种跨平台的动态网页技术标准,由Sun Microsystems公司倡导、多家公司参与建立。它在HTML文件中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

1、为什么要学习jsp 技术

1.1、什么是jsp?

JSP(全称Java Server Pages)是由Sun 公司专门为了解决动态生成HTML 文档的技术。

1.2、Servlet 程序输出html 页面。

较为复杂麻烦。

1)Servlet 输入html 页面的程序代码:
package com.atguigu.servlet;
import java.io.IOException;
import java.io.Writer;
“玩转”Java 系列
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HtmlServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 设置返回的数据内容的数据类型和编码
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
Writer writer = response.getWriter();
//输出页面内容!
writer.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"
\"http://www.w3.org/TR/html4/loose.dtd\">");
writer.write("<html>");
writer.write("<head>");
writer.write("<meta http-equiv=\"Content-Type\" content=\"text/html;
charset=UTF-8\">");
writer.write("<title>Insert title here</title>");
writer.write("</head>");
writer.write("<body>");
writer.write("这是由Servlet 程序输出的html 页面内容!");
writer.write("</body></html>");
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {

上面的代码我们不难发现。通过Servlet 输出简单的html 页面信息都非常不方便。
那我们要输出一个复杂页面的时候,就更加的困难,而且不利于页面的维护和调试。
所以sun 公司推出一种叫做jsp 的动态页面技术帮助我们实现对页面的输出繁锁工作。

jsp 页面的访问千万不能像HTML 页面一样。托到浏览器中。只能通过浏览器访问Tomcat 服务器再访问jsp 页面。

1.3、如何创建一个jsp 动态页面程序

1)选中WebContent 目录,右键创建一个jsp 文件

1、jsp 页面是一个类似于html 的一个页面。jsp 直接存放到WebContent 目录下,和html 一样
访问jsp 的时候,也和访问html 一样

2、jsp 的默认编码集是iso-8859-1 修改jsp 的默认编码为UTF-8

2、jsp 的运行原理(要求知道)

jsp 的本质,其实是一个Servlet 程序。
我们打开index_jsp.java 文件查看里面的内容:
发现,生成的类继承于HttpJspBase 类。这是一个jsp 文件生成Servlet 程序要继承的基类!!!

小结

从生成的文件我们不难发现一个规则。
a.jsp 翻译成java 文件后的全名是a_jsp.java 文件
b.jsp 翻译成java 文件后的全名是b_jsp.java 文件
那么当我们访问一个xxx.jsp 文件后翻译成java 文件的全名是xxx_jsp.java 文件
xxx_jsp.java 文件是一个Servlet 程序。原来jsp 中的html 内容都被翻译到Servlet 类的service 方法中原样输出。

4、jsp 的语法(重点掌握)

“玩转”Java 系列

4.1、jsp 文件头部声明介绍(page 指令介绍)

<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8” %>
这是jsp 文件的头声明。表示这是jsp 页面。

language 属性值只能是java。表示翻译的得到的是java 语言的
contentType 属性设置响应头contentType 的内容
pageEncoding 属性设置当前jsp 页面的编码
import 属性给当前jsp 页面导入需要使用的类包
autoFlush 属性设置是否自动刷新out 的缓冲区,默认为true
buffer 属性设置out 的缓冲区大小。默认为8KB
errorPage 属性设置当前jsp 发生错误后,需要跳转到哪个页面去显示错误信息
isErrorPage 属性设置当前jsp 页面是否是错误页面。是的话,就可以使用exception 异常对象
session 属性设置当前jsp 页面是否获取session 对象,默认为true
extends 属性给服务器厂商预留的jsp 默认翻译的servlet 继承于什么类

4.2、jsp 中的三种脚本介绍

1)第一种,声明脚本:

声明脚本格式如下:
<%!
java 代码
%>
在声明脚本块中,我们可以干4 件事情
1.我们可以定义全局变量。
2.定义static 静态代码块
3.定义方法
4.定义内部类
几乎可以写在类的内部写的代码,都可以通过声明脚本来实现

2)第二种,表达式脚本(***重点,使用很多):

表达式脚本格式如下:
<%=表达式%>
表达式脚本用于向页面输出内容。
表达式脚本翻译到Servlet 程序的service 方法中以out.print() 打印输出
out 是jsp 的一个内置对象,用于生成html 的源代码
注意:表达式不要以分号结尾,否则会报错
表达式脚本可以输出任意类型。
比如:
1.输出整型
2.输出浮点型
3.输出字符串
4.输出对象

3)第三种,代码脚本(*****重点,使用最多):

代码脚本如下:
<% java 代码%>
代码脚本里可以书写任意的java 语句。
代码脚本的内容都会被翻译到service 方法中。
所以service 方法中可以写的java 代码,都可以书写到代码脚本中

4.3、jsp 中的注释:

// 单行java 注释
/*
多行java 代码注释
*/
单行注释和多行注释能在翻译后的java 源代码中看见。
<%-- jsp 注释–%>
jsp 注释在翻译的时候会直接被忽略掉

html 的注释会被翻译到java 代码中输出到html 页面中查看

5、jsp 九大内置对象

我们打开翻译后的java 文件。查看_jspService 方法。

那么jsp 中九大内置对象分别是:
request 对象请求对象,可以获取请求信息
response 对象响应对象。可以设置响应信息
pageContext 对象当前页面上下文对象。可以在当前上下文保存属性信息
session 对象会话对象。可以获取会话信息。
exception 对象异常对象只有在jsp 页面的page 指令中设置isErrorPage="true" 的时候才会存在
application 对象ServletContext 对象实例,可以获取整个工程的一些信息。
config 对象ServletConfig 对象实例,可以获取Servlet 的配置信息
out 对象输出流。
page 对象表示当前Servlet 对象实例(无用,用它不如使用this 对象)。
九大内置对象,都是我们可以在【代码脚本】中或【表达式脚本】中直接使用的对
象。

6、jsp 四大域对象

四大域对象经常用来保存数据信息。
pageContext 可以保存数据在同一个jsp 页面中使用
request 可以保存数据在同一个request 对象中使用。经常用于在转发的时候传递数据
session 可以保存在一个会话中使用
application(ServletContext) 就是ServletContext 对象
四个作用域的测试代码:
新建两个jsp 页面。分别取名叫:context1.jsp,context2.jsp

1)context1.jsp 的页面代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这是context1 页面<br/>
<%
//设置page 域的数据
pageContext.setAttribute("key", "pageContext-value");
//设置request 域的数据
request.setAttribute("key", "request-value");
//设置session 域的数据
session.setAttribute("key", "session-value");
//设置application 域的数据
application.setAttribute("key", "application-value");
%>
<%-- 测试当前页面作用域--%>
<%=pageContext.getAttribute("key") %><br/>
<%=request.getAttribute("key") %><br/>
<%=session.getAttribute("key") %><br/>
<%=application.getAttribute("key") %><br/>
<%
// 测试request 作用域
// request.getRequestDispatcher("/context2.jsp").forward(request, response);
%>
</body>
</html>

2)context2.jsp 的页面代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这是context2 页面<br/>
<%=pageContext.getAttribute("key") %><br/>
<%=request.getAttribute("key") %><br/>
<%=session.getAttribute("key") %><br/>
<%=application.getAttribute("key") %><br/>
</body>
</html>

测试pageContext 作用域步骤:
直接访问context1.jsp 文件
测试request 作用域步骤:
1.在context1.jsp 文件中添加转发到context2.jsp(有数据)
2.直接访问context2.jsp 文件(没有数据)
测试session 作用域步骤:
1.访问完context1.jsp 文件
2.关闭浏览器。但是要保持服务器一直开着
3.打开浏览器,直接访问context2.jsp 文件
测试application 作用域步骤
1.访问完context1.jsp 文件,然后关闭浏览器
2.停止服务器。再启动服务器。
3.打开浏览器访问context2.jsp 文件

7.jsp 中的out 输出和response.getWriter 输出的区别

response 中表示响应,我们经常用于设置返回给客户端的内容(输出)
out 也是给用户做输出使用的。

由于jsp 翻译之后,底层源代码都是使用out 来进行输出,所以一般情况下。我们在jsp 页面中统一使用out 来进行输出。避免打乱页面输出内容的顺序。
out.write() 输出字符串没有问题
out.print() 输出任意数据都没有问题(都转换成为字符串后调用的write 输出)
深入源码,浅出结论:在jsp 页面中,可以统一使用out.print()来进行输出

8、jsp 的常用标签(重点****)

<%-- 静态包含–%>
<%-- 动态包含–%>
<%-- 转发–%>

1)静态包含–很常用

<%@ include file="" %>
静态包含是把包含的页面内容原封装不动的输出到包含的位置。

2)动态包含–很少用

<jsp:include page=""></jsp:include>
动态包含会把包含的jsp 页面单独翻译成servlet 文件,然后在执行到时候再调用翻译的servlet 程序。并把
计算的结果返回。
动态包含是在执行的时候,才会加载。所以叫动态包含。

底层原理: out缓冲区,都加载到request缓冲区然后就一起加载 打印出来了。

3)页面转发–常用

<jsp:forward page=""></jsp:forward>
<jsp:forward 转发功能相当于
request.getRequestDispatcher("/xxxx.jsp").forward(request, response);的功能。

含有大量java 在这里需要补充说明一点:我们在工作中,几乎都是使用静态包含。理由很简单。因为jsp 页面虽然可以写java 代码,做其他的功能操作。但是由于jsp 在开发过程中被定位为专门用来展示页面的技术。也就是说。jsp 页面中,基本上只有html,css,js。还有一些简单的EL,表达式脚本等输出语句。所以我们都使用静态包含。

·

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐