3. jsp的三种语法
a) jsp头部的page指令
jsp的page指令可以修改jsp页面中的一些重要的属性,或者行为。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
i. language属性 表示jp翻译后是什么语言文件。暂时只支持java。 ii. contentType属性 表示jsp返回的数据类型是什么。也是源码中response.setContentType()参数值 iii. pageEncoding属性 表示当前jsp页面文件本身的字符集。 iv. import属性 跟java源代码中一样。用于导包,导类。
==============两个属性是给out输出流使用================== v. autoflush属性 设置当out输出流缓冲区满了之后,是否自动刷新冲级区。默认值是true。 vi. buffer属性 设置out缓冲区的大小。默认是8kb
缓存区溢出错误
vii.errorPage 属性 设置当jsp页面运行时出错,自动跳转去的错误页面路径。 <!-- errorPage表示错误后自动跳转去的路径<br/> 这个路径一般都是以斜杠打头,它表示请求地址为http://ip:port/工程路径/ 映射到代码的Web目录--> viii.isErrorPage 属性 设置当前jsp页面是否是错误信息页面。默认是false。如果是true可以 获取异常信息。 ix.session 属性 设置访问当前jsp页面,是否会创建HttpSession对象。默认是true。 x.extends 属性 设置jsp翻译出来的java类默认继承谁。
b) jsp中的常用脚本
i.声明脚本(极少使用)
声明脚本的格式是:<%! 声明java代码 %>
作用:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块、内部类等
练习:
1、声明类属性
2、声明static静态代码块
3、声明类方法
4、声明内部类
ii.表达式脚本(常用)
表达式脚本的格式是: <%=表达式%>
作用:在jsp页面上输出数据。
表达式脚本的特点:
1、所有的表达式脚本都会被翻译到_jspService()方法中
2、表达式脚本都会被翻译成为out,print()输出到页面上
3、由于表达式脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用。
4、表达式脚本中的表达式不能以分号结束。
练习:
1.输出整型
2.输出浮点型
3.输出字符串
4、输出对象
iii.代码脚本
代码脚本的格式是:
<% java语句 %>
代码脚本的作用是:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)。
代码脚本的特点是:
1、代码脚本翻译之后都在_jspService方法中
2、代码脚本由于翻译到_jspService()方法中,所以在_jspService(方法中的现有对象都可以直接使用。
3、还可以由多个代码脚本块组合完成一个完整的java语句。
4、代码脚本还可以和表达式脚本一起组合使用。在jsp页面上输出数据
练习:
1.代码脚本–if语句
2.代码脚本—for循环语句
3.翻译后java文件中_jspService方法内的代码都可以写
c) jsp中的三种注释
i.html注释
<!–这是html注释–>
html注释会被翻译到java源代码中。在jspService方法里,以out.writer输出到客户端。
ii. java注释
<%
//单行java注释
/*多行java注释*/
%>
java注释会被翻译到java源代码中。
iii. jsp注释
<%–这是jsp注释–%>
jsp注释可以注掉,jsp页面中所有代码。
a.jsp
<%@ page import="java.util.Map" %> <%@ page import="java.util.HashMap" %><%-- Created by IntelliJ IDEA. User: lenovo Date: 2021/8/13 Time: 上午 11:57 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%-- 1、声明类的属性--%> <%! private Integer id; private String name; private static Map<String,Object> map; %> <%--2、声明static静态代码块--%> <%! static { map=new HashMap<String,Object>(); map.put("key1","value1"); map.put("key2","value2"); map.put("key3","value3"); } %> <%--3、声明类方法--%> <%! public int abc(){ return 12; } %> <%--4、声明内部类--%> <%! public static class A{ private Integer id; private String abc="abc"; } %> <%--练习:--%> <%--1.输出整型 2.输出浮点型 3.输出字符串 4、输出对象--%> <%= 12 %><br/> <%= 12.12 %><br/> <%= "我是字符串" %><br/> <%= map %><br/> <%--练习:--%> <%--1.代码脚本--if语句--%> <% int i=12; if(i==12){ %> <h1>我好帅</h1> <% }else { %> <h1>骗人</h1> <% } %> <%--2.代码脚本---for循环语句--%> <table border="1" cellspacing="0"> <% for (int j=0;j<10;j++){ %> <tr> <td>第<%=j+1%>行</td> </tr> <% } %> </table> <%--3.翻译后java文件中_jspService方法内的代码都可以写--%> <% String username = request.getParameter("username"); System.out.println("用户名的请求参数值是:"+username); %> <!--这是html注释--> //单行java注释 /*多行java注释*/ <%--这是jsp注释--%> </body> </html>
4. jsp九大内置对象
说明:exception对象在page中设置isErrorPage="true"之后才出现
5. jsp 四大域对象
四个域对象分别是:
pageContext(PageContextlmpl类) 当前jsp页面范围内有效 request(HttpServletRequest类) 一次请求内有效 session (HttpSession类) 一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器) application(ServletContext类) 整个web工程范围内都有效(只要web工程不停止,数据都在)
域对象是可以像Map一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
虽然四个域对象都可以存储数据。在使用上它们是有优先顺序的。
四个域在使用的时候,优先顺序分别是,它们从小到大的范围的顺序。
pageContext ===>> request ===>> session ===>> application
演示
注意导入Tomcat的lib下的jsp-api.jar
scope.jsp
<%-- Created by IntelliJ IDEA. User: lenovo Date: 2021/8/13 Time: 下午 02:43 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>scope页面</h1> <% //往四个域中都分别保存了数据 pageContext.setAttribute("key","pageContext");//导Tomcat的lib下的jsp-api.jar request.setAttribute("key","request"); session.setAttribute("key","session"); application.setAttribute("key","application"); %> pageContext域是否有值:<%=pageContext.getAttribute("key")%> <br/> request域是否有值:<%=request.getAttribute("key")%> <br/> session域是否有值:<%=session.getAttribute("key")%> <br/> application域是否有值:<%=application.getAttribute("key")%> <br/> <% request.getRequestDispatcher("/scope2.jsp").forward(request,response); %> </body> </html>
scope2.jsp
<%-- Created by IntelliJ IDEA. User: lenovo Date: 2021/8/13 Time: 下午 02:43 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>scope2页面</h1> pageContext域是否有值:<%=pageContext.getAttribute("key")%> <br/><%--scope 请求转发 null--%> request域是否有值:<%=request.getAttribute("key")%> <br/><%--单独访问scope2 null--%> session域是否有值:<%=session.getAttribute("key")%> <br/><%--关闭浏览器,再次访问scope2 null--%> application域是否有值:<%=application.getAttribute("key")%> <br/><%--重新部署/重启 访问scope2 null--%> </body> </html>
6. jsp中的out输出和response.getWriter输出的[ 别
response中表示响应,我们经常用于设置返回给客户端的内容(输出)
out也是给用户做输出使用的。
output.jsp
<%-- Created by IntelliJ IDEA. User: lenovo Date: 2021/8/13 Time: 下午 03:10 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% out.write("out输出1 <br/>"); // out.flush(); out.write("out输出2 <br/>"); response.getWriter().write("response输出1 <br/>"); response.getWriter().write("response输出2 <br/>"); %> </body> </html>
由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下。我们在jsp页面中统一使用out来进行输出。避免打乱页面输出内容的顺序。
out.write()输出字符串没有问题
out.print(,输出任意数据都没有问题(都转换成为字符串后调用的write输出)
深入源码,浅出结论:在jsp页面中,可以统一使用out.print()来进行输出
<% out.write(12);// out.print(12);//12 %>