个人java学习路线-JSP初见
基本介绍
1.JSP:JavaServer Pages
- 基于java语言实现的服务器端页面
- JSP是javaEE规范之一
2.jsp目前通常放在WEB-INF目录外,但在实际开发中,我们很多项目是将JSP放到WEB-INF目录中,保护JSP。
- WEB-INF目录中的数据是相对安全的
3.jsp文件的后缀默认是.jsp
- 但是这个可以修改的,通过修改CATALINA_HOME/conf/web.xml文件
4.JS和JSP的区别
- JS:JavaScript,运行在浏览器中,和服务器没有关系
- JSP:JavaServer Pages,运行在服务器中,JSP底层就是java程序,运行在JVM中
5.JSP的执行原理:
- 浏览器上访问的路径虽然是以.jsp结尾,访问的是某个jsp文件,其实底层执行的是jsp对应的java程序
- Tomcat负责将.jsp文件翻译成.java源文件,并且将java源文件编译生成.class字节码文件
- 访问jsp,其实底层还是执行了.class文件中的程序
- Tomcat服务器内置了一个JSP翻译引擎,专门翻译JSP文件,编译java源文件
- index.jsp会被翻译生成index_jsp.java,编译生成index_jsp.class
- index_jsp这个类继承了HttpJspBase,而HttpJspBase继承了HttpServlet
- 可见jsp就是servlet,只不过职责不同,JSP强项是做页面展示
JSP头部的page指令
首先JSP的使用也是有jar包的,一般应该都有,没有tomcat的lib下有jsp-api.jar
1.jsp头部的page指令:
可以修改jsp页面中一些重要的属性或者行为
语法:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
1. language属性 表示jsp翻译后是说明语言文件,暂时只支持java
2. contentType属性 表示jsp返回的数据类型是什么,也就是源码中的response.setContentType()参数值
3. pageEncoding属性 表示当前jsp页面文件本身的字符集
4. import属性 跟java源代码中一样,用于导包,导类
- 下面两个属性是给out输出流使用的 --
5. autoFlush属性 设置当前out输出流缓冲区满了之后,是否自动刷新缓冲区,默认true
6. buffer属性 设置out缓冲区的大小,默认8kb
autoFlush属性和buffer属性引起的异常
java.io.IOException: Error: JSP Buffer overflow -out缓冲区满了之后不能自动刷新,就会报错
-
7. errorPage属性 表示错误后自动跳转去的路径,这个路径一般都是以斜杠打头,他表示请求地址为http://ip:port/工程路径/
映射到web目录
8. isErrorPage属性 设置当前jsp页面是否是错误信息页面,默认false,如果是true可以获取异常信息
9. session属性 设置访问当前jsp页面是否会创建HttpSession对象,默认是true
10. extends属性 设置jsp翻译出来的java类默认继承谁
jsp中常见的脚本
声明脚本(极少使用)
声明脚本的格式: <%! 声明java代码 %>
作用: 可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块,内部类等。
JSP代码(后面只显示JSP代码)
<%--这个是注释--%>
<%@ page import="java.util.Map" %><%--JSP用java代码导入类的格式,idea会自动导入类--%>
<%@ page import="java.util.HashMap" %>
<%@ page autoFlush="true" buffer="8kb" errorPage="error500.jsp" %><%--修改尝试的page指令--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%--默认生成的page指令--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<div>这是jsp页面数据</div>
<%-- ---------声明脚本------ --%>
<%--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 = 12;
private String abc = "abc";
}
%>
</body>
</html>
表达式脚本
格式: <%=表达式%>
作用: 在jsp页面上输出数据(打印在浏览器上)
特点:
1. 所有的表达式脚本都会被翻译到_jspService()方法中
2. 表达式脚本都会被翻译成为out.print()输出到页面上
3. 由于表达式脚本翻译的内容都在_jspService方法中,所以_jspService()方法中的对象都可以直接使用
4. 表达式脚本中的表达式不能以分号结束
<%-- ---------表达式脚本------ --%>
<%--1.输出整形 --%>
<%=12%><br>
<%--2.输出浮点型 --%>
<%=12.2%><br>
<%--3.输出字符型 --%>
<%="我是字符串"%><br>
<%--4.输出对象 --%>
<%=map%><br>
<%-- _jspService()方法中的对象 --%>
<%=request.getParameter("username")%><br>
网页显示:
12
12.2
我是字符串
{key1=value1, key2=value2, key3=value3}
null
代码脚本
格式:
<%
java代码
%>
作用:在jsp页面中,编写我们自己需要的功能
特点:
1>.代码脚本翻译之后都在_jspService方法中
2>.代码脚本由于翻译到_jspService()方法中,所以在_jspService()方法中的现有对象都可以直接使用
3>.还可以由多个代码脚本快组合完成一个完整的java语句
4>.代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据
ps:繁琐,自己写看着都烦,别人看更头疼
<%-- ---------代码脚本------ --%>
<%--if语句 --%>
<%
int i = 250;
if (i == 250) {
System.out.println("250");
} else {
System.out.println("不是250");
}
%>
<%--for循环语句 --%>
<table border="1" cellpadding="o">
<%
for (int j = 0; j < 10; j++) {
%>
<tr>
<td>第<%=j+1%>行</td>
</tr>
<%
}
%>
</table>
<%--翻译后java文件中_jspService方法内的代码都可以写 --%>
<%
System.out.println(request.getParameter("username"));
%>
网页输出一个border="1"的表格,内容为:
第1行
第2行
第3行
第4行
第5行
第6行
第7行
第8行
第9行
第10行
关于JSP中的三种注释
1>. html注释
<!-- 这是html注释 -->
html注释会被翻译到java源代码中,在_jspService方法里,以out.writer输出到客户端
2>. java注释
和之前的一样
java注释会被翻译到java源代码中
3>. jsp注释
<%-- 这是jsp注释 --%>
jsp注释可以注掉jsp页面中所有的代码