一、JSP简介
JSP全名为Java Server Pages,其根本是一个简化的Servlet设计,他实现了在Java当中使用HTML标签。JSP是一种动态网页技术标准,也是JavaEES的标准。JSP与Servlet一样,是在服务器端执行的。
常见动态网站开发技术对比
- JSP:Java平台,安全性高,适合开发大型的,企业级的、分布式的Web应用程序。
- Asp.net:Net平台,简单易学,安全性以及跨平台性差。
- PHP:简单,高效,成本低开发周期短,特别适合中小型企业的Web应用开发。(LAMP:Linux+Apache+MySQL+PHP)。
JSP页面的元素构成
- 静态内容
- 指令
- 表达式
- 小脚本
- 声明
- 注释
在JSP中其基本的核心语法都来源于Java。
二、JSP注释
在JSP中支持两种注释语句的操作,一种是显示注释,这种注释客户端是可见的;另外一种是隐式注释,这种注释客户端是无法看见的。
1、显示注释语法:(HTML注释,客户端可见)
<!-- 注释内容 -->
2、隐式注释语法:(JSP注释)
<%-- 注释 --%>,JSP注释
3、隐式注释语法:(JSP脚本注释)
//注释,单行注释
/* 注释 */,多行注释
三、JSP脚本
在JSP页面中执行的java代码。
1、Scriptlet(脚本小程序)
在JSP中,最重要的部分就是Scriptlet(脚本小程序),所有嵌入在HTML代码中的Java程序都必须使用Scriptlet标记出来。在JSP中一共有3中Scriptlet代码。
- <% java代码 %>;在此Scriptlet中可以定义局部变量、编写语句等。
注意:
- 尽量不要再JSP中定义类或方法,当JSP中需要类或方法时,往往会通过JavaBean的形式调用。
- 尽量不要使用out.println()输出,而使用表达式输出。
2、Scriptlet标签
在程序中如果过多的出现<%%>会导致代码混乱,所以在新版本的JSP中提供了一种Scriptlet标签,使用此标签可以完成与<%%>同样的功能。
格式:
<jsp:scriptlet>
java scriptlet 代码
</jsp:scriptlet>
四、JSP声明
在JSP页面中定义变量或者方法。
- <%! java代码 %>;在此中可以定义全局变量、方法、类。
五、JSP表达式
在JSP页面中执行表达式。
- <%=表达式 %>;在此中可输出一个变量或一个具体内容。
六、JSP指令(三大指令page、include、taglib)
1、page指令
page指令通常位于JSP页面的顶端,同一个页面可以有多个page指令。
page指令在JSP开发中较为重要,使用此属性,可以定义一个JSP页面的相关属性,包括设置MIME类型,定义需要导入的包,错误页的指定等。
对于以上的操作指令,只有import指令可以重复出现多次,而对于其他属性只能出现一次。且在以上若干指令中,比较常用的是Language、contentType、pageEncoding、errorPage/isErrorPage、import这5个指令。
page指令语法:
<%@ page 属性="内容"%>
1.1、设置页面的MIME
在page指令中,contentType属性是使用最多的一个属性,如果想让一个JSP文件显示中文,则必须对整个页面指定MIME编码。
什么是MIME,有什么作用?
许多文件都存在扩展名,如.doc、.htm ,根据这些不同的扩展名可以打开不同的应用程序,那么MIME(Multipurpose Internet Mail Extensions,多功能Internet邮件扩充服务)就是指定某个扩展名文件将使用何种应用程序打开的一个说明。当该扩展名文件被访问时,浏览器会自动指定应用程序来打开。
为JSP页面指定编码
<%@ page language="java" contentType="text/html;charset=GBK"%>
从Tomcat安装目录/conf/web.xml中可以查询MIME类型。例如,如果现在希望页面可以按照Word文档的形式显示,则可以使用如下的MIME类型:
<mime-mapping>
<extension>doc</extension>
<mime-type>application/msword</mime-type>
</mime-mapping>
1.2、设置文件编码
除了使用contentType指定MIME类型外,还使用charset进行页面编码的指定,当然,在page指令中也可以使用pageEncoding进行编码的指定。
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
contentType使用charset设置编码,和使用pageEncoding设置有什么区别?
pageEncoding指的是JSP文件本身的编码,而contentType中的charset指的是服务器发送给客户端的内容编码(更常使用)。
1.3、错误页面的设置
当一个页面出错后,会自动跳转到一个页面上进行错误信息的提示,那么这个操作,就可以通过错误页面来指定。
要想完成错误页的操作,则一定要满足一下两个条件:
- 指定错误出现时的跳转页,通过errorPage属性指定。
- 错误处理页必须有明确的标识,通过isErrorPage属性指定。
如果一个JSP页面运行时出现了错误,会通过errorPage指定的页面进行跳转,被跳转的页面中必须将isErrorPage的内容设置为true。
会出现错误的页面:
// show.jsp
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page errorPage="error.jsp"%>
<%
int result = 10 / 0;
%>
错误处理页:
//error.jsp
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page isErrorPage="true"%>
<h1>程序出错了</h1>
注意:
错误页的跳转属于服务器端的跳转。
一旦发生错误后,页面的显示内容将变成error.jsp中设置的内容,但是在地址栏上依然是show.jsp。在整个操作工程中,客户端对服务器只发送了一次请求,服务器对客户端也只回应了一次。
以上的错误页是在每一个JSP页面中指定,当然,也可以在整个虚拟目录中指定全局的错误处理,要想达到这个效果,就必须修改web.xml文件,在其中加入错误页的操作。
全局的错误处理可以处理两种类型的错误,一种是HTTP代码的错误,如404或500;还有一种是异常的错误,如NullPointerException等。
修改web.xml文件加入错误处理
<error-page>
<error-code>500</error-page>
<location>/ch05/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-page>
<location>/ch05/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/ch05/error.jsp</location>
</error-page>
1.4、数据库连接操作
在page指令中可以使用import导入所需要的Java开发包,所以直接利用此属性将java.sql包导进来,即可进行数据库的开发操作。
配置数据库的驱动程序,将mysql的驱动程序复制到Tomcat\lib目录中。
配置完成后需要重新启动服务器。只有这样,才能将新配置的jar包在服务器启动时加载进来,不会出现找不到驱动程序的错误。
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.sql.*"%>
<html>
<head>
<title></title>
</head>
<body>
<%!
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
public static final String DBURL = "jdbc:mysql://localhost:3306/databasename";
public static final String DBUSER = "root";
public static final String DBPASS = "";
%>
<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet = null;
%>
<%
try{
Class.forName(DBDRIVER);
conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
String sql = "select * from tablename";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
%>
<center>
<table border="1" width="80%">
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<%
while(rs.next()) {
}
%>
</table>
</center>
<%
} catch(Exception e) {
System.out.println(e);
} finally {
rs.close();
pstmt.close();
conn.close();
}
%>
</body>
</html>
2、include指令(包指令)
将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。
在一般的页面开发中会有很多内容要重复的显示。
要实现这种效果有两种方法:
- 让每一个页面都分别包含该部分。
- 将每个部分做成一个文件,然后在需要的地方导入(包含)。
要想实现这样的包含功能,在JSP中可以通过静态包含和动态包含两种方式完成。
2.1、静态包含
静态包含指令是在JSP编译时插入一个包含文本或代码的文件,这个包含的过程是静态的,而包含的文件可以是JSP文件、HTML文件、文本文件,或是一般java程序。
静态包含语法:
<%@ include file="要包含的文件路径"%>
包含时不管文件的后缀是什么,都会将内容直接包含并显示。
2.2、动态包含
使用<jsp:include>指令可以完成动态包含的操作,与之前的静态包含不同,动态包含语句可以自动区分被包含的页面是静态还是动态。如果是静态页面,则与静态包含一样,将内容包含进来进行处理;而如果被包含的页面是动态页面,则可以先进行动态的处理,然后再将处理后的结果包含进来。
动态包含语法:
//不传递参数
<jsp:include page="{要包含的文件路径 | <%=表达式%>}" flush="true | false"/>
//传递参数
<jsp:include page="{要包含的文件路径 | <%=表达式%>}" flush="true | false">
<jsp:param name="参数名称" value="参数内容"/>
</jsp:include>
flush属性设置为false表示这个网页完全被读进来以后才会输出。在每一个JSP的内部都会有一个Buffer,所以如果是true,当Buffer满了就输出,一般此属性都会设置成true。
静态包含的操作属于先包含后处理,而动态包含如果被包含的页面是动态页,则属于先处理后包含。
在实际开发中建议使用动态包含。
3、taglib指令
是一个标签库。使用标签库定义新的自定义标齐,在JSP页面中启用自定义的标签。
七、跳转指令
在Web中可以使用<jsp:forward>指令,将一个用户的请求(request)从一个页面传递到另一个页面,完成跳转的操作。
页面跳转语法
//不传递参数
<jsp:forward page="{要包含的文件路径 | <%=表达式%>}">
//传递参数
<jsp:forward page="{要包含的文件路径 | <%=表达式%>}" flush="true | false">
<jsp:param name="参数名称" value="参数内容"/>
</jsp:forward>
此跳转语句也属于服务器端跳转。
八、JSP页面生命周期
jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可以大大降低对系统资源的需求,提高系统的并发量及响应时间。但也要注意多线程的编程带来的同步问题,由于该Servlet始终驻于内存,所以响应是非常快的。
八、项目联系
1、实例操作:用户登录程序实现(JSP+JDBC实现)
1.1、创建数据库表
1.2、程序设计思路
2、开发实战练习
2.1、增加分页显示功能。
程序显示格式如下:
2.2、在以上程序中增加模糊查询的功能,之后对查询出的数据进行分页显示。