一、起源
jsp(Java Server Pages),Java服务端页面,SUN公司定义的一种用于开发动态web资源的技术。
在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。
如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。
对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。
为了弥补Servlet的缺陷,SUN公司在Servlet的基础上推出了JSP(Java Server Pages)技术作为解决方案。
不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
其原因为,程序的数据通常要美化后再输出:
让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。
因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做
二、语法
jsp的本质就是servlet
它和HTML页面不同,jsp页面除了可以写标签,还可以在<% %>之间书写Java代码。使用<%= %> 用于向页面输出指定内容。
比如:
后端获取到数据后,向页面传递
request.setAttribute(“list”,list);
request.getRequestDispatcher("/index.jsp").forward(request,responce);
在index.jsp页面获取数据:
<%=request.getAttribute(“list”)%>
三、Page指令
page(用于配置页面信息)
(1)contentType:设置响应体的类型和字符集,相当于responce.setContentType()的参数值
(2)language:只有一个取值Java,比较鸡肋
(3)import:和Java源代码一样,用于导包导类,比如下面的例子
(4)errorPage:当前页面发生异常时,会跳转到的页面
(5)isErrorPage:标识当前页面是否是错误页面,取值为true时,可以使用内置对象exception;
(6)pageEncoding:设置当前jsp文件的字符集
(7)autoFlush:设置当out输出流缓冲区满了之后,是否自动刷新缓冲区,也就是说,缓冲区满了之后,会把缓冲区数据写出来再往进放数据。默认是true。
(8)buffer:设置out缓冲区的大小,默认是8kb
(9)session:设置访问当前jsp页面,是否会创建HttpSession对象,默认是true
(10)设置jsp翻译出来的Java类默认继承谁
四、静态包含和动态包含
1、静态包含
静态包含的特点:
- 被包含的jsp页面不会被翻译
- 被包含的页面代码拷贝到对应位置
2、动态包含
- page属性指定被包含的jsp页面的路径
- 动态包含会把被包含的jsp页面翻译成Java文件
- 底层会调用代码将被包含的页面输出JspRuntimeLibrary.include(request,response,"/include/footer.jsp", out,false);
- 动态包含可以向被包含的页面传递参数
五、请求转发
六、九大内置对象
jsp中的内置对象,是指Tomcat在将jsp翻译成servlet源代码后,内部提供的九个对象;
Exception对象只有在jsp页面出现异常时才会生成,或者在page指令中将isErrorPage属性设置为true;
七、四个域对象
八、out和responce.getWriter().write()的区别
out输出的内容会先保存在out缓冲区内;
responce输出的内容保存在responce缓冲区内;
当jsp页面所有内容执行完毕后,会执行out.flush();将out缓冲区的数据追加到responce缓冲区的末尾;
执行responce的刷新操作,将所有数据发送给客户端;
在jsp被翻译成Java源文件中,使用的都是out输出,所以我们一般最好采用out对象进行输出;避免数据顺序发生错误。
out.write():只适合输出字符串
out.print():观察源码后发现,该方法是将其他类型的数据转换为字符串类型后,调用write()方法进行输出。
out.write()在输出数字的时候,底层会将数字转换为对应的char类型,所以在页面上显示的就不再是数字了;只适合输出字符串;
所以,我们可以使用out.print()方法,永远不会出错;