一、JSP简介
JSP本身就是一个servlet;直接在HTML中内嵌JSP代码;JSP程序由JSP Engine先转换成servlet代码,接着编译成类文件载入执行;只有当客户端第一次请求JSP时,才需要将其转换、编译
HelloWorld.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Hello World JSP</title>
</head>
<body>
<%
out.println("Hello World!");
out.println(new java.util.Date());
%>
</body>
</html>
二、JSP的基本语法
1.JSP有四种语法:
1)JSP传统语法。(使用<%%>嵌套java语言)
2)JSTL。(和标签语言类似,没有%)
3)JSF。(JSTL的替代品)
4)其他tablib(如struts)。
2.JSP的传统语言:
1)Declaration。 2)Scriptlet。 3)Expression。 4)Comment。 5)Directives。 6)Action动作指令。 7)内置对象
Declaration 基本语法:<%! %>
在此声明的变量、方法都会被保留成唯一的一份,直到JSP程序停止执行;类似java中的成员变量和成员方法。
示例:
<body>
<h1>JSP Declaration</h1>
<%!
int accessCount = 0; //此处声明的是成员变量,每次刷新页面,都会递增1
%>
<%
int accessCount2 = 0; //此处声明的是局部变量,每次刷新页面,程序执行一次,就新生成一个变量,故每次刷新值都不会变。
%>
<h2>Access to page since server reboot:
<%= ++accessCount %>
<br />
<%= accessCount2 %>
<br />
</h2>
</body>
Scriptlet基本语法:<% 程序代码区 %>
可以放入任何的java程序代码
注释格式: <%--... ... --%>
<%//... ...%>
<%/*... ...*/%>
示例:(链接后面跟参数示例 url?bgColor=red)
<!--
客户端可以看见的html注释
-->
<%
// java单行注释,客户端看不见
/*
java多行注释
客户端看不见
*/
String bgColor = request.getParameter("bgColor");
boolean hasColor;
if(bgColor == null) {
hasColor = false;
bgColor = "white";
} else {
hasColor = true;
}
%>
<body style = "background-color:<%= bgColor %>;">
<h1>Test BGColor</h1>
<p>
<%
if(hasColor) {
out.println("You have choosed " + bgColor + " as backgroud color");
} else {
out.println("You have the default backgroud color \"white\"");
}
%>
</p>
</body>
Expression 基本语法:<%=... ...%>
=后面必须是字符串变量或者可以被转换成字符串的表达式;不需要以“;”结束;只有一行;
示例:Expressions.jsp
<body>
<h1>JSP Expressions</h1>
<p>Current time: <%= new Date() %></p>
<p>You Host Name: <%= request.getRemoteHost() %></p>
<p>You Session ID: <%= session.getId() %></p>
<p>The testParam is: <%= request.getParameter("testParam") %></p>
</body>
Directive 基本语法格式:<%@Directive属性="属性值"%>
directive(编译指令)相当于在编译期间的命令
常见的Directive:1)page 2)include 3)taglib
1)Directive — page
指明与JSP Container的沟通方式
基本格式:
<%@page language="script language"| --目前值只能取java,默认为java。
extends="className"| --说明该JSP页面从谁继承,不需要指定。
import="importList"| --*!引入进来哪些包,相当于java的import语句
buffer="none|kb size"| --缓冲区,none为不缓冲,默认8k的缓冲。
session="true|false"| --页面能不能使用session,默认能使用。指定较少。
autoFlush="true|false"| --页面输出完是否flush到客户端,默认true。
isThreadSafe="true|false"| --相当于servlet实现了singleThreadMode(已废弃)
info="infoText"| --JSP的描述信息,很少用
errorPage="errorPageUrl"| --*!这个页面出错了,显示哪个页面。
isErrorPage="true|false"| --*!这个页面是否是显示错误的页面
contentType="contentTypeInfo" --*!通常为"text/html"
%>
示例:
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="ISO-8859-1" import="java.util.Date,java.text.*"
errorPage="ErrPage.jsp"
%>
2)Directive — include
将指定的JSP程序或者HTML文件包含进来
格式:<%@ include file="fileURL"%>
JSP Engine会在JSP程序的转换时期先把file属性设定的文件包含进来,然后开始执行转换编译工作。
不能向fileURL中传参数。
3)Directive — taglib
后续项目中再讲。
Action 基本语法:<jsp: .. /> 严格上来讲它属于jsp的第二种语法。
动作指令是在运行期间的命令
常见的:
jsp:useBean
jsp:setProperty
jsp:getProperty
jsp:include
jsp:forward
jsp:param
jsp:plugin //往网页里面插入一个applet小程序,基本不用了。
jsp:include/jsp:param
用于动态包含JSP程序或者HTML文件等
除非这个指令被执行,否则它是不会被Tomcat等JSP Engine编译。
格式:
<jsp:include page="URLSpec" flush="true" />或者
<jsp:include page="URLSpec" flush="true">
<jsp:param name="ParamName" value="paramValue" />
</jsp:include>
与Directive include的区别:
1)include编译指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行;而jsp:include在转换期间不会被编译,只有在客户端请求时如果被执行到才会被动态编译载入,所以效率较低
2)include编译指令不能带参数;而jsp:include可以
jsp:forword/jsp:param
用于将一个jsp的内容传送到page所指定的JSP程序或者Servlet中处理
格式:
<jsp:forword page="URLSpec" flush="true" />或者
<jsp:forword page="URLSpec" >
<jsp:param name="ParamName" value="paramValue" />
</jsp:forword>forword的页面和forward到的页面用的是同一个request。
与此对应的是:
response.sendRedirect(区别,此为跳转到另一个链接上,不是同一个request;所以跳转后的链接地址不是原来的url)
jsp:useBean
通过jsp:useBean,可以在JSP中使用定义好的Bean
基本用法:
<jsp:useBean id="beanName" scope="page|request|session|application"
class="package.BeanClass" type="typeName" />
<jsp:useBean ...>
<jsp:setProperty ...>
<jsp:getProperty ...>
</jsp:useBean>
示例:
<jsp:useBean id="cd" scope="page" class="bean.CounterBean" type="Object" />
/*相当于
<% Object cb = new bean.CounterBean();%>
*/
<jsp:setProperty name="cd" property="count" value="23" />
<jsp:setProperty name="cd" property="count" />
/*相当于
<% cd.setcount("23"); %>
<% cd.getcount; %>
*/
bean的放置目录同servlet,连包一起放;
3.jsp_characterEncoding
<% request.setCharacterEncoding("GBK"); %>
或者在单个的显示上用:
<%
String name = request.getParameter("name");
new String(name.getBytes("ISO8859_1"),"GBK");
%>
<%= new String(hello.getName().getBytes("ISO8859_1"),"GBK")%>
4.JSP内置对象
out
request
response
pageContext //用得很少
session
application
config //用得较少;一般指web.xml对于这个JSP或者它编译成功之后的servlet的配置
exception
page //page里面的所有东西可以直接使用,一般不用它
5.servlet和JSP的相互跳转
JSP跳转到Servlet:使用<jsp:forword>或者response.sendRedirect
Servlet跳转到JSP:getServletConfig().getServletContext().getRequestDispatcher("/servlet_jsp/SercletUseJsp.jsp").forword(req,resp);