在开发过程中,servlet做界面非常不便,这时把servlet包装一下,产生了jsp,如下
然而servlet并没有丢弃,在实际开发中servlet通常用作控制处理;jsp做界面,比较符合mvc模式。
1、jsp语法
(1)<%=表达式%>
(2)<% %>里面可以嵌套java片段,这些片段最终被翻译在servlet的service函数中。所以尽管有多个<% %>但还是相当于一个<% %>。由此可见,在<% %>里面定义的变量,是局部变量。如下:
JSP页面
<!DOCTYPE HTML >
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="pragma"content="no-cache">
<meta http-equiv="cache-control"content="no-cache">
<meta http-equiv="expires"content="0">
</head>
<body>
<% int i=3;%>
<% int j=7; %>
<% int k=i+j; %>
</body>
</html>
翻译为servlet文件,起其service方法的部分代码如下:
out.write("\t<metahttp-equiv=\"pragma\" content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"cache-control\"content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"expires\"content=\"0\"> \r\n");
out.write(" </head>\r\n");
out.write(" <body>\r\n");
out.write(" ");
inti=3;
out.write("\r\n");
out.write(" ");
int j=7;
out.write("\r\n");
out.write(" ");
intk=i+j;
out.write("\r\n");
out.write(" </body>\r\n");
out.write(" </html>\r\n");
(3)<%! %>中可以定义变量或方法,在此处定义的变量为全局变量,被翻译为servlet类的类变量。
(4)<!-- -->html注释方式,可以使用在jsp中,但此注释会被返回给浏览器端,造成额外数据量的传输;
<%-- --%> jsp注释,此种方式的注释,不会返回给浏览器,只能在服务器端看得到。
(5)jsp中的tag是通过servlet的out对象输出到浏览器端的。
2、jsp指令标签
指令元素:用于从jsp发送一个信息到容器,比如:设置字符编码,全局变量,引入包等。起其格式如下:<%@ 指令名属性名=”属性值”>
(1)page指令
<%@ page contentType=”text/html; charset=”utf-8"%>
参数 | 默认值 | 释义 |
language | language=”java” | jsp中嵌入的语言 |
contentType | contentType=”text/html;charset=utf-8” | 设定MIME类型及JSP页面的编码方式 |
pageEncoding | Utf-8 | 指定servlet引擎易哪种编码方式翻译jsp到servlet,并指定网页以什么编码方式显示页面 |
import | import=”java.util.*” | 引入JSP页面使用的Java API |
session | true | 是否在jsp页面创建session对象 |
buffer | 8k | 决定输出流是否使用缓冲区,默认为8K |
autoFlash | true | 当buffer满后,是否自动刷新到浏览器 |
errorPage |
| 当jsp页面出错时,跳转到指定的JSP页面;要求使用相对路径,当”/”开始时,表示当前web应用的根目录,如果不以”/”开头则表示相对本jsp页面 |
isErrorPage | false | 设定此jsp页面是否为处理异常的页面,当isErrorPage为true时,就可以在此页面中访问内置的exception对象,进而进行异常处理,显示一些提示信息等。此页面就可以被其他jsp页面中的errorPage属性引用了。 |
isELIgnored | false | 设定jsp页面是否执行el表达式 |
(2)include指令
<%@ include=”finename” %>
该指令用于引入一个文件,通常是html、JSP文件,JSP引擎会把这两个JSP文件翻译成一个servlet文件,也称为静态引入。静态引入只是简单的将页面内容合并,所以若在多个jsp页面出现重复变量,在jsp编译为class文件时就会报错。所以被引入的html、jsp文件只需保留page指令即可,<body>标签均要省略。
动作标签<jsp:include>也称为动态引入,动态引入是分别编译的,之后再把html进行合并。<jsp:include>元素允许引入静态文件和动态文件。如果是静态文件,则只是将文件内容进行合并;若是动态文件,那么这个包含的的文件也会被编译执行的。
(3)taglib指令
这个指令允许在JSP页面使用自定义的标签,如
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%>
3、动作标签
动作标签是使用xml语法写的,是JSP规定的一系列标准动作。在容器处理JSP时,当遇到动作元素,就执行相应的操作。
指令 | 描述 |
<jsp:include> | 引入一个动态的文件。静态引入与动态引入的区别:动态引入把两个JSP页面分别翻译、编译;所以被引入的jsp中可以包含<body>等标签 |
<jsp:forward> | 请求转发.在开发jsp过程中,通常把jsp放入WEB-INF目录下,可以防止用户直接访问这些文件。因为服务器是不会直接让外界来访问WEB-INF目下的文件,这时我们可以在webRoot下有一个入口页面,主要作用是转发,如下 <jsp:forward page=”WEB-INF/xxx.jsp”></jsp:forward> |
<jsp:param> | 为其他指令提供附加信息,如传递参数,常常与<jsp:include>结合使用 <jsp:include file=”info.jsp”> <jsp:param name=”param1” value=”value1”/> <jsp:param name=”param2” value=”value2”/> </jsp:include> |
<jsp:plugin> | 在浏览器中执行一个applet或Bean |
<jsp:fallback> | Java插件不能启动时显示给用户的错误提示 |
<jsp:useBean> | 找到并实例化一个JavaBean |
<jsp:setProperty> | 设置一个JavaBean属性 |
<jsp:getProperty> | 将JavaBean的属性插入到输出点 |
4、jsp内置对象
内置对象 | 描述 |
out | 输出流,对应Servlet的getWriter |
request | 对应servlet的HttpServletRequest对象 |
response | 对应servlet的HttpServletResponse对象 |
session | 对应 servlet的HttpSession对象 |
application | 对应servlet的ServletContext对象 |
pageContext | 代表当前jsp页面,只在当前页面内有效 |
exception | 代表运行时的一个异常 |
page | 代表jsp这个实例本身,相当servlet中的this对象 |
config | 对应servlet的ServletConfig对象 |