JSP基础知识
JSP概述
JSP全名Java Server Page,本质就是一个servlet,JSP是为了简化Servlet的工作而出现的替代者。虽然Servlet能够完成大部分工作,但是Servlet中不能直接嵌套HTML代码,输出太困难,且部署过程复杂。为了克服这种困难,Sun公司在1999年初推出了JSP1.0。
JSP包括很多技术,包括Java Bean,自定义标签(Custom Tags),EL表达式(Expression Language),JSTL标准标签类库(Java Standard Tag Library)等等。
一个JSP文件由三部分组成:java+HTML+JSP特有内容。
JSP作用
作为Servlet的补充,JSP在生成HTML代码的过程比Servlet方便了许多,并且JSP不用特殊部署,只需要复制到服务器下即可。在后来JSP的段优化升级,其功能也越来越强大。
总的来说,JSP的作用就是将内容的生成和信息的展示相分离。
JSP工作流程
当第一次访问JSP文件时,服务器加载web.xml文件。
通过反射机制找到servlet-name为jsp的Servlet(org.apache.jasper.servlet.JspServlet)进行处理。
服务器会将该* . jsp文件转化生成相应*_jsp.java文件。
服务器将后者转化为*_jsp.class文件运行,生成一个响应把结果传给服务器。
再由服务器响应给浏览器,进行解析。
JSP生命周期
JSP也是一个Servlet,运行时只会有一个实例。跟Servlet一样,JSP实例初始化、销毁时也会调用Servlet的init()方法与destroy()方法。另外,JSP还有自己的初始化方法与销毁方法_jspInit()与_jspDestroy(),例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%!//注意这里是%!
public void _jspInit() {
//初始化时运行的代码
}
public void _jspDestory() {
//销毁时运行的代码
}
%>
JSP特有的内容
JSP脚本
这里我们讲述3个部分:Java程序片段的格式、输出表达式的格式、声明方法与属性的格式。
Java程序片段
JSP脚本生成在service()方法中,必须用“<%”与“%>”括起来,否则会被认为是模板数据。内部书写Java程序片段,JSP脚本可以出现在JSP文件的任意位置,例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int num = 5;
int result = 1;
for (int i = 0 ; i < num ; i++) {
result *= num;
}
out.println(num + "的" + num + "次方为" + result);
%>
</body>
</html>
运行结果如下:
相当于输出到客户端浏览器的HTML代码为:
<html>
<head>
<title>Title</title>
</head>
<body>
5的5次方为3125
</body>
</html>
输出表达式
输出表达式也是生成在service()方法中,在源程序中是使用out.println()方法输出的,类似于Servlet中的输出。JSP中还可以使用"<%=“与”%>"输出各种类型的数据,包括int、double、boolean、String、Object等,例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int num = 5;
int result = 1;
for (int i = 0 ; i < num ; i++) {
result *= num;
}
%>
<%= num %>的<%= num %>次方为<%= result %>
</body>
</html>
运行结果如下:
注意:输出表达式中输出的变量后面不能有“;”,输出时调用该对象的toString()方法。
声明方法与属性
JSP中可以声明方法和属性(全局变量),但是不能在“<%”与“%>”之间声明,也不能在“<%=”与“%>”之间声明。JSP声明方法和全局变量时使用另一组符号“<%!”与“%>”,例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Calculator</title>
</head>
<body>
<%!
private int add(int firstNumber, int secondNumber) {
return firstNumber + secondNumber;
}
private int subtract(int firstNumber, int secondNumber) {
return firstNumber - secondNumber;
}
private int multiply(int firstNumber, int secondNumber) {
return firstNumber * secondNumber;
}
private double divide(int firstNumber, int secondNumber) {
return firstNumber * 1.0 / secondNumber;
}
%>
<%!
private String result = "";
%>
<form action="/xjm/demo1.jsp" method="post">
<table>
<tr>
<td>firstNumber:</td>
<td><input type="text" name="firstNumber" value="0" style="width: 100px;height: 20px"/></td>
</tr>
<tr>
<td>secondNumber:</td>
<td><input type="text" name="secondNumber" value="0" style="width: 100px;height: 20px"/></td>
</tr>
<tr align="center">
<td><input type="submit" value="add" name="calculate" style="width:70px;height:20px"/></td>
<td><input type="submit" value="subtract" name="calculate" style="width:70px;height:20px"/></td>
</tr>
<tr align="center">
<td><input type="submit" value="multiply" name="calculate" style="width:70px;height:20px"/></td>
<td><input type="submit" value="divide" name="calculate" style="width:70px;height:20px"/></td>
</tr>
<%
String firstStr = request.getParameter("firstNumber");
String secondStr = request.getParameter("secondNumber");
String calculateStr = request.getParameter("calculate");
if (firstStr != null && secondStr != null && calculateStr != null) {
int firstNumber = Integer.parseInt(firstStr);
int secondNumber = Integer.parseInt(secondStr);
if (calculateStr.equals("add")) {
result = firstNumber + " + " + secondNumber + " = " + add(firstNumber, secondNumber);
} else if (calculateStr.equals("subtract")) {
result = firstNumber + " - " + secondNumber + " = " + subtract(firstNumber, secondNumber);
} else if (calculateStr.equals("multiply")) {
result = firstNumber + " * " + secondNumber + " = " + multiply(firstNumber, secondNumber);
} else if (secondNumber == 0) {
%>
分母不能为零
<%
} else {
result = firstNumber + " / " + secondNumber + " = " + divide(firstNumber, secondNumber);
}
}
%>
<tr>
<td align="center" colspan="2"><%= result %></td>
</tr>
</table>
</form>
</body>
</html>
运行结果如下:
注意:
1. 这里有一句if (firstStr != null && secondStr != null && calculateStr != null) { }。是为了防止空指针异常导致500错误
2. JSP中Java的if语句中需嵌套HTML代码时,if语句块前后必须使用“{”与“}”。同理for循环、while循环也是如此,这里就不再一一赘述了。
JSP注释
JSP注释有别于HTML注释“<!–注释文本–>”,以及Java注释“//注释文本 /*注释文本*/ /**注释文本*/”,JSP注释格式如下:
<%--注释文本--%>
JSP指令
JSP指令(点击浏览)用来声明JSP页面的一些属性等,例如编码方式、文档类型。JSP指令由“<%@”开始,“%>”结束。JSP指令格式如下:
<%@ directive {attribute=value}* %>
注意星号表示可以有0或多个属性。例如前面例子中的指令:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
该指令directive位置是page,因此该指令是一个page指令。该指令包含language和contentType两个属性。常见的指令有page、taglib、include等。
JSP隐藏对象
Servlet与JSP中获取上下文数据都需要servletContext对象,Servlet中的servletContext对象是通过getServletContext()方法获取的。而JSP中没有定义getServletContext对象,却可以直接使用。这是因为getServletContext是JSP内置的隐藏对象(Implicit Object)(点击浏览)。JSP中内置了9个隐藏对象,使得JSP比Servlet使用起来更方便,更方便。
JSP中内置的隐藏对象有out、request、response、config、session、application、page、pageContext、exception。
JSP的行为
JSP的行为(JSP Actions)(点击浏览)是一组JSP内置标签,只需要书写很少的标记代码就能使用JSP提供的丰富功能。JSP行为是JSP功能的抽象与封装,包括两种,自定义JSP行为与标准JSP行为。标准JSP行为格式如下:
<jsp:elements {attribute="value"}* />
一个JSP行为可以指定0或多个属性对。