JSP技术
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准,它实现了在HTML标签中使用Java代码
JSP是一种动态网页技术标准,也是JavaEE的标准。JSP和Servlet一样,是在服务器端执行的。JSP是在Servlet技术发展之后为了让开发者写html标签更方便而发展起来的技术,JSP实际上就是Servlet。但是通常把Servlet作为Web应用中的控制组件来使用,只负责响应请求产生数据,并把数据通过转发技术带给jsp,而把jsp技术作为数据显示模板来使用。这样使程序结构更清晰,可读性和可维护性更高。
Hello JSP
究其本质jsp页面就是包含Java代码的html网页
1、编写一个html网页
- 执行访问不会在work文件夹下生成任何内容
2、将html后缀修改为.jsp
- 自动在work下生成了两个文件,一个名为index_jsp.java,另外一个名为index_jsp.class
- jsp并不能直接执行,需要先通过jsp引擎将jsp文件转换为servlet的类文件,然后通过Servlet引擎将servlet类文件编译为.class字节码文件,然后才能执行并生成html文档
3、可以在jsp文件中使用java语言编写相关的脚本程序
<table width="80%">
<caption>99</caption>
<%
for(int i=1;i<10;i++){
%>
<tr>
<%
for(int k=1;k<=i;k++){
%>
<td><%=k%>*<%=i%>=<%=i*k%></td>
<%}%>
</tr>
<%
}
%>
</table>
JSP基础语法
###注释
从软件工程化管理上说,不写注释是不合理的,一般建议编程中20%-30%左右的编码量为注释
JSP注释
<%-- 多行内容 --%>
会被编译器所忽略,其中可能有语法错误,但是不影响编译
html注释
<!--多行内容-->
其中的内容会被编译执行,只是在浏览器中不进行显示
###模板元素
直接写在jsp页面的html内容称之为jsp页面的模板元素;模板元素在翻译过来的servlet中被out.write()原样输出到浏览器中
out.write("<table width=\"80%\">\r\n");
out.write("\t<caption>99</caption>\r\n");
out.write("\t");
for(int i=1;i<10;i++){
out.write("\r\n");
out.write("\t<tr>\r\n");
out.write("\t\t");
for(int k=1;k<=i;k++){
out.write("\r\n");
out.write("\t\t<td>");
out.print(k);
out.write('*');
out.print(i);
out.write('=');
out.print(i*k);
out.write("</td>\r\n");
out.write("\t\t");
}
out.write("\r\n");
out.write("\t</tr>\r\n");
out.write("\t");
}
out.write("\r\n");
out.write("</table>");
###JSP表达式 --取值
常量 : <%=“hello”%>
<% int k=100; %>
<%=k%> 转换的结果为out.write(k);
- 不能定义合法的java代码,因为out.write()的原因
- 不能定义方法,因为代码段中的内容会出现在
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
- 可以通过匿名内部类的方式定义类
- 注意:默认不能有;号
变量 :<%String name=“aa”;%> //定义变量
<%=name%> //取变量的值
<%
和%>
之间应该是合法的java语句,允许定义多行程序- 不允许直接定义方法,不允许定义属性,可以定义临时变量,可以通过内部类的方式定义类【方法中允许定义类】
<%
int res=0;
for(int i=1;i<=100;i++)
res+=i;
%>
<h3>1+2+3+...+100=<%=res%></h3>
对应编译的结果为
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {
... ...
int res=0;
for(int i=1;i<=100;i++)
res+=i;
out.write("\r\n");
out.write("<h3>1+2+3+...+100=");
out.print(res);
out.write("</h3>");
....
}
代码段的编译结果会出现在_jspService方法内部
声明:
语法规则: <%! 多行声明属性或者方法之类的内部成员 %>
<%!
private int counter=0;
public void cc(){}
%>
编译生成的类定义
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
private int counter=0;
public void cc(){}
- 允许定义方法或者属性以及内部类
- 允许定义静态代码块或者非静态代码块
- 不允许直接写执行语句,例如
out.println(100);
- 不能定义临时变量
需求:
页面计数器:统计当前页面的访问次数
默认Servlet的运行特征为单实例多线程的方式运行service方法,而jsp运行前需要编译为类,所以运行特征也应该是单实例多线程的方式运行_jspService方法
<%@ page contentType="text/html;charset=utf-8" %>
<%! private int counter=0; %>
您是第<%=++counter%>位访问者
因为_jspService是以多线程的方式运行,修改counter可能会导致安全问题
<%@ page contentType="text/html;charset=utf-8" %>
<%! private static int counter=0;
public synchronized void pp(){
counter++;
}
%>
<% pp(); %>
您是第<%=counter%>位访问者,IP地址为<%=request.getRemoteAddr()%>
###3大JSP页面指令
位置: 可以写在JSP页面的任意位置
格式:<%@ 指令名称 若干属性声明%>
- 使用IDEA开发页面的默认存储位置为src/main/webapp/目录下,允许自定义目录
####page指令 --用来声明当前JSP页面的基本属性
<%@ page language="java" %>
– 指定当前JSP使用的语言是java
####pageEncoding和contentType
<%@ page pageEncoding="UTF-8"%>
– 用来通知JSP解析引擎使用指定的编码来翻译JSP
注意:如果想防止JSP乱码,应该要保证JSP文件保存时的编码和pageEncoding指定的编码保持一致
<%@ page contentType="text/html;charset=utf-8" %>
类似于response.setContentType(“text/html;charset=utf-8”)
从语义上说两个属性不是一回事,但是经常会相互替代
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
当前页面的异常处理
<%@ page errorPage="bbc.jsp"%>
如果在当前页面中出现异常自动跳转的页面
JSP中9大默认对象:exception
<%@ page isErrorPage=“true” %>表示在当前bbc.jsp页面中可以通过exception对象获取前面出现的异常
具体实现有异常的页面bbb.jsp
<%@ page contentType="text/html;charset=UTF-8" errorPage="bbc.jsp" language="java" %>
<%
int k=0;
out.println(10/k);
%>
定义bbc.jsp页面用于显示bbb.jsp页面种出现的异常
-
要求必须设置参数
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
,如果不配置isErrorPage则不能使用exception默认对象 -
显示方式1:
<%=exception%>
-
显示方式2:
<% exception.printStackTrace(); %>
在控制台上显示报错信息 -
显示方式3:在页面上显示调用栈
<% exception.printStackTrace(new PrintWriter(out)); %>