1、什么是jsp?
jsp的全称是java server pages。
2、为什么学习jsp技术?
jsp是sun官方为了解决服务器输出html页面这个难题而产生的技术。
以下是servlet程序输出一个简单的HTML页面。servlet输出HTML,不仅没有代码的提示,而且扩展上,维护上,都极其不方便。
public class HtmlServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//设置服务器的字符集,以及告诉客户端返回的数据类型,以及使用UTF-8查看页面
response.setContentType("text/html; charset=UTF-8");
//获取输出流
PrintWriter pWriter = response.getWriter();
pWriter.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
pWriter.write("<html>\r\n");
pWriter.write(" <head>\r\n");
pWriter.write(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
pWriter.write(" <title>Insert title here</title>\r\n");
pWriter.write(" </head>\r\n");
pWriter.write(" <body>\r\n");
pWriter.write(" this is the html's content!\r\n");
pWriter.write(" </body>\r\n");
pWriter.write("</html>\r\n");
}
}
jsp页面的访问和访问HTML页面是一样的。
如果在WebContent目录下
WebContent
page1.html = http://ip:port/工程名/资源名 = http://ip:port/工程名/page1.html
page2.html = http://ip:port/工程名/资源名 = http://ip:port/工程名/page2.html
jsp的本质是什么?
jsp页面本质上是一个servlet程序。
当我们第一次访问jsp页面的时候。在work目录下他创建出如下的内容。
一个是java源文件,另一个很明显是这个java源文件编译之后输出的.class字节码文件。
jsp翻译成为Servlet程序的源文件命名习惯是:
源文件 翻译之后名为
page.jsp page_jsp.java
abc.jsp abc_jsp.java
现在我们来看一下java源文件中的内容:
所以jsp本质上,也是一个Servlet程序。
从源码的_jspService方法中,我们不难发现。这个jsp(Servlet程序)其实也是在输出jsp页面中的html页面。
1.jsp的三种语法
page指令可以配置jsp页面的一些信息(配置)
a)jsp头部的page指令
i.language属性
告诉服务器。jsp翻译之后得到的是java源文件
ii.contentType属性
是设置response.setContentType方法中的内容。也就是设置服务器的字符集,以及设置客户端的字符集。
iii.pageEncoding属性
设置jsp页面文件本身的字符集。
iv.import属性
可以给jsp页面导入需要的类
v.autoFlush属性
设置是否自动刷新out缓冲区,默认值就是true.
vi.buffer属性
设置out缓冲区的大小。默认是8KB。
vii.errorPage属性
设置当jsp运行后产生错误,跳转的页面。
viii.isErrorPage属性
设置当前jsp页面是否是错误页面。如果设置为true,就启用Exception异常对象。默认是false
ix.session属性
设置当前jsp页面,访问的时候是否创建Session对象。默认是true。
x.extends属性
是给服务器厂商预留的字段。
page指定的属性值,一般都使用默认值即可。因为默认值,已经是官方最优的配置。
a) jsp中的三种脚本
i. 声明脚本(了解内容,很少用)
格式:
<%!
声明代码。
%>
1. 我们可以定义全局变量。
2. 定义static静态代码块
3. 定义方法
4. 定义内部类
i.表达式脚本(重要,常用)
格式:
<%=表达式 %>
1、表达式可以在jsp页面上进行输出某个值(或者内容)。
2、表达式脚本翻译之后会被翻译到_jspService方法中。
3、表达式脚本翻译之后是out.print进行输出。
4、由于表达式脚本翻译内容在_jspService方法中。所以在_jspService方法中的对象。都可以直接使用。
1.输出整型
2.输出浮点型
3.输出字符串
输出对象i. 代码脚本(使用最多,最重要)
格式:
<%
代码
%>
代码脚本跟表达式脚本一样。翻译之后。都会被翻译到_jspService方法中。
所以_jspService方法中的对象都可以直接使用。
在_jspService方法可以写的语句,都可以在代码脚本中编写.
1. 代码脚本----if 语句
2. 代码脚本----for 循环语句
3. 翻译后java文件中_jspService方法内的代码都可以写
a) jsp中的三种注释
i. html注释
<!-- html注释 -->
html注释在翻译的时候。会被翻译成为out.wrtie输出到客户端。
ii. java注释
单行 //
多行 /* 多行 */
java注释翻译之后,会原生不动的翻译成java源代码中。
iii. jsp注释
<%-- jsp 注释 --%>
jsp注释在翻译的时候,会被完全忽略掉。
比较有用:
request
pageContext
httpSession
application
out
1. jsp四大域对象
四个域对象从小到大的顺序,如下:
pageContext 当前jsp页面中
request 一次请求中
session 一个会话中(打开浏览器,请求服务器。不一直不关闭浏览器。那么会话一直存在。)
application 一个web工程
四个域对象使用优先顺序,从小到大。
先pageContext
再request
再session
最后application.
1. jsp中的out输出和response.getWriter输出的区别
它们都可以往客户端输出数据。
1、在jsp页面中,我们必须统一使用out进行输出。
out.write() write只能输出字符串
out.print() print可以输出任意内容(所有内容)
使用print可以输出任意的内容。
如果只是输出字符串的话,可以优先考虑write输出。
在jsp页面中,只使用out进行输出,并且使用out.print()
1. jsp的常用标签
a) jsp静态包含
<%@ include file="/xxx.jsp"%>
静态包含是把被包含的jsp的页面内容。原封不动的拷贝到包含的位置 进行输出。
静态只会把大的jsp页面(不包含被包含的jsp页面)翻译成为Servlet源文件。
b) jsp标签-动态包含
<jsp:include page="/xxx.jsp"></jsp:include>
1、动态包含把所有的jsp页面都翻译成为Servlet源文件,然后去执行它们的字节码程序。
2、动态包含还可以传递参数(属性)
静态包含,一般适合于去包含那些只有输出html页面的jsp内容。
而动态包含可以适用于那些在jsp页面中,包含有大量的java代码的jsp页面。或者是jsp页面中包含有一些耗时比较长的java代码的jsp页面。
jsp是为了解决Servlet输出html页面而产生的技术。所以jsp在整个JavaEE的开发中的定位就是用来输出html页面。
但是,jsp给我们提示很多的脚本功能。而这些脚本功能甚至可以实现java文件的功能。但是由于jsp本身在javaEE中定位的问题。
所以一般情况下。在jsp页面里不推荐编写大量与输出html无关的java代码。
所以一般情况下。我们都是使用静态包含。
a) jsp标签-转发
<%-- jsp的转发中的 / 也是表示到http://ip:port/工程名/ 映射到代码的WebContent目录--%>
<jsp:forward page="/context2.jsp"></jsp:forward>
转发的标签功能效果跟以下代码的功能一样
<%
request.getRequestDispatcher("/context2.jsp").forward(request, response);
%>
2. 静态包含和动态包含的区别
| 静态包含 | 动态包含 |
是否生成java文件 | 不生成 | 生成 |
service方法中的区别 | 拷贝包含的jsp页面的内容原封不动的输出 | 调用JspRuntimeLibrary.include实现包含 |
是否可以传递参数 | 不能传递参数 | 可以传递参数 |
编译次数 | 1 | 2 |
适用范围 | 适用于那些只有输出html页面内容的jsp | 可以包含那些在jsp页面中编写了大量java代码的jsp |
由于 jsp页面,在javaEE中的定位是用来输出html内容。所以一般情况下,都只是使用静态包含。