JSP:
Html代码与Java程序共同存在,在执行的过程中会被Tomcat进行编译,编译后的JSP与HttpServlet一样的都是Servlet接口的子类,所以可以说JSP本质上来产说也是一种Servlet
99年—>JSP 1.0
JSP也是一种Servlet,因而它是可以完成HttpServlet的所有事情的
我们在JSP中写的页面大体如下:
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%
String path =request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
Locale locale = request.getLocale(); //获得本地化信息
Calendar calendar = Calendar.getInstance(locale); //获得用户所在地的时间
int hour = calendar.get(Calendar.HOUR_OF_DAY); //获得小时数
String hello = "";
if(hour<=6)
hello = "凌晨好!";
else if(hour<=9)
hello = "早上好!";
else if(hour<=12)
hello="上午好!";
else if(hour<=18)
hello="下午好!";
else
hello="晚上好!";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Hello页面</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<table>
<tr><td><%=hello %></td></tr>
</table>
</body>
</html>
对于JSP来说它与Servlet不同的时它不再需要使用out.println()来进行输出,而是直接在页面中写HTML代码就可以了而且不用在web.xml中进行部署了直接对这个jsp文件进行访问就可以了
JSP的工作原理:
HttpServlet是先由源代码编译为class文件后部署到服务器下是一个先编译后部署的过程,而JSP则是先部署源代码后编译为class文件是一种先部署后编译的过程
在客户端第一次请求JSP文件的时候会选编译为HttpJspPage类,这个类是一个Servlet接口的子类,它会被临时存放在服务器工作目录里面,以后的客户端访问的时候就无须再去重新编译了,直接用之前编译好的class文件响应客户的请求即可。
JSP的生命周期
jsp与Servlet是一样的运行时只会有一个实例,JSP实例的初始化、销毁也会去调用Servlet的init(),destroy()方法Jsp也有自己的初始化和销毁方法分别是:_jspInit(),_jspDestroy()
JSP语法规则:
JSP是HTML代码、Java代码混合在一起的HTML代码遵循HTML的语法,Java代码遵循Java语法
Jsp的源代码:
1, 模板数据:
JSP中的Html代码,它的内容是固定的,无论程序怎么运行这些输出到客户端浏览器时都不会发生变化,模板数据是不会控制程序的流程的也是不会影响程序运行结果的。
2, 元素:
JSP中的Java代码,它决定着程序的流程
JSP脚本:
“<%”,”%>”进行括起来的部分就是写Jsp脚本的地方如果不这样括起来的话则会把写的内容视为模板数据,而且注意这两个之间的内容要遵循Java的语法规则,否则的话会发生编译的错误,Jsp的脚本可以出现在JSP文件的任何地方
我们可以在JSP页面的<body>标签中写下如下的JSP脚本
<body>
<%
//在这里做指定数的累加
//如果没有num这个请求的参数过来的话则默认是求100的和
try {
if (request.getParameter("num") == null) {
out.println("没有提供请求的参数num的值,默认求100的累加和为:" + sum(100));
} else {
out.println("求指定的"
+ Integer.parseInt(request.getParameter("num"))
+ " 的累加和是:"
+ sum(Integer.parseInt(request.getParameter("num"))));
}
} catch (NumberFormatException e) {
out.println("请求参只能是纯数字,无法进行计算!");
}
%>
<%!private long sum(int num) {
return (1 + num) * num / 2;
}%>
</body>
注意在JSP页面的开头部分有如下的一行
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
指定了要引入的类,页面的编码
格式是<%@ page…%>
在上面我们在JSP中进行对客户端的输出是使用了out.println()方法,这里的out在编译后的源代码中我们可以看到:
在_jspService()方法中有如下的定义:
JspWriter out = null;
out = pageContext.getOut();
_jspx_out = out;
有点类似于Servlet中的response.getWriter();
JSP中还有一种直接的输出方法:
使用<%=……%>,它可以输出各种数据类型,有一点要注意的就是在使用这种方式进行输出的时候对于表达式后面不要加上;作为结尾,直接写上表达式,或者调用的方法就可以了
JSP的注释:
<%--
多行注释
%>
在脚本中可以使用Java的注释方法
// 单行注释部分
/*
注释部分
*/
在JSP中声明方法和属性(全局变量)不能在<%...%>之间而是如同下面的在<%!...%>之间
<%!private long sum(int num) {
return (1 + num) * num / 2;
}%>
如下面的例子中就使用了全局的属性和全局的变量:
<html>
<head>
<base href="<%=basePath%>">
<title>通过IP查询区域</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="css/style.css">
<%-- 首先定义全局变量 --%>
<%!
private IPSeeker ipSeeker = IPSeeker.getInstance();
//查询所在的区域
private String getArea(String ip){
return ipSeeker.getArea(ip);
}
//查询所在国家
private String getCountry(String ip){
return ipSeeker.getCountry(ip);
}
//检查IP是否有效
private boolean isValidIp(String ip){
return ip!=null
&& ip.trim().matches("^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$");
}
%>
</head>
<body>
<%
//从request中获得IP参数
String ip = request.getParameter("ip");
String area = "" ;
String country="" ;
if(isValidIp(ip)){
//如果是正常IP的话则去查
country = getCountry(ip);
area = getArea(ip);
}
%>
<div align="center">
<form action="checkip.jsp" method="get">
<fieldset style="width:500">
<legend>IP 地址查询</legend>
<table align="center"width="400">
<%
if(isValidIp(ip)){
%>
<tr>
<td align="right">IP地址:</td>
<td><%= ip %></td>
</tr>
<tr>
<td align="right">国家:</td>
<td><%=country %></td>
</tr>
<tr>
<td align="right">地区:</td>
<td><%=area %></td>
</tr>
<%} else{%>
<div align="center">
<span style="color: red;">你输入的IP不正确,请输入正确的IP进行查询!</span>
</div>
<%} %>
<tr height="40">
<td align="right">请输入要查询的IP地址:</td>
<td><input type="text"name="ip" value=""style="width:200px;"/></td>
</tr>
<tr>
<td colspan="2"align="center">
<input type="submit" value=" 查询 IP地址 " class="button">
</td>
</tr>
</table>
</fieldset>
</form>
</div>
</body>
</html>
从上面的例子中还可以看到如果有一个类似于if的语句如果在它们之间如果夹带的有HTML语句的时候需要把前后的”{“,”}”用<%%>进行单独的隔开
在JSP中通常会for与if一起使用形成很好的效果:
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<title>JSP for与if一起使用</title>
</head>
<body>
<%--使用一个二维数组来模似相关的信息 --%>
<%
Object[][]letters={
{true,"恭喜你已注册成功!","advent-86@163.com","416582590@qq.com","2013-09-14"},
{true,"很高兴与你成为朋友...","advent-86@163.com","416582590@qq.com","2013-09-14"},
{false,"来信已收到,原订于下周的...","advent-86@163.com","416582590@qq.com","2013-09-14"},
{false,"你有新的留言...","advent-86@163.com","416582590@qq.com","2013-09-14"}
};
String[]colors = {"#dddddd","#aaaaaa"};
%>
<table border=0 cellspacing="1"cellpadding="2" width="700"align="center">
<tr style="background:url(images/vertical_line.gif);">
<td align="center" style="line-height:22px;"> </td>
<td align="center" style="line-height:22px;">标题 </td>
<td align="center" style="line-height:22px;">收件人 </td>
<td align="center" style="line-height:22px;">发件人 </td>
<td align="center" style="line-height:22px;">时间 </td>
</tr>
<%--这里使用for循环进行操作数据 --%>
<%
//使用for对二维数组中内容进行遍历
for(inti=0;i<letters.length;i++){
Object[]letter=letters[i];
%>
<tr style="background: <%=colors[i%2] %>">
<td align="center">
<%--这里有一点要说明的就算是if下面只有一条也需要加上{}把语句包起来 --%>
<%
if(letter[0]==Boolean.TRUE){
%>
<img src="images/mail.gif">
<%}
else {
out.println(" ");
}
%>
</td>
<td><a href="#"><%=letter[1] %></a></td>
<td><%=letter[2] %></td>
<td><%=letter[3] %></td>
<td align="center"><%=letter[4] %></td>
</tr>
<% }%>
</table>
</body>
</html>
在JSP中Java脚本中也可以写上while循环,它与for循环经常是可以替换的,不同的地方在于for一般是用于已明确循环数量的循环,while一般是针对不确定循环次数但明确了循环的结束条件的情况
JSP代码在执行过程中如果希望停止不再向下执行的时候就直接使用return就可以了,要把一个JSP想成它就是一个Servlet,也是就是一个Servlet类,<%%>中的代码会在请求的处理函数中执行使用return则可以使用这个请求处理函数中止向下执行
不要使用System.exit()这个函数的执行会使用Tomcat退出
break:它与return有些相似,都可以改变程序的运行的流程,不同的就是return是使用函数不再执行后面的过程,而break则是跳出一个程序代码块,如for,while,switch等子句,其跳出来后外层的代码是依然会执行到的,而且要注意break中能出现在for,while,switch子句的代码块内部,return则可以出现在任何的地方
JSP指令:
它是用来声明JSP页面的一些属性的,如文档的类型、编码的方式
<%@这个开始,%>这个结束
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
比如上面的指明是一个page指令
page指令:
用来声明JSP页面的属性等,其属性可以写在一个page指令中也可以写在多个page指令中
注意:一个属性在页面中只能出现一次(import属性除外)
它的常见属性:
language,取值:java 指明这个JSP页面解释时使用的语言,只能是java
extends,取值:任何类的全名,JSP是Servlet因而当指明继承一个普通类的时候要实现Servlet的init,destroy等方法
import,取值:任何包名,类名,引入JSP中要使用到的类,包,在JSP中有四个包里的类是可以直接使用的java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*
session,取值:true,false,指明这个JSP中否内置Session对象,默认是内置的,则可以直接使用Session
autoFlush,取值:true,false,是否运行缓存,如果是true,则out.println()等方法输出的字符串不会直接到客户端,而是先放在缓存中,当使用out.flush()时才会到客户端,默认是true
buffer,取值:none或者数字+kb,指定缓存的大小,当autoFlush设为true时有效
isThreadSafe,取值:true,false,指定是否线程安全,如果是true则运行多个线程的同时运行这个JSP程序,否则只运行一个线程运行,其它的等待,默认是false
isErrorPage,取值:true,false,指定这个页面是否是错误处理页面,默认是false,如果是true则JSP内置一个Exception对象exception可以直接使用
errorPage,取值:某个JSP页面的相对路径,如果这个JSP抛出一个未捕获的异常的时候则会跳转到指定的错误页面
contentType,取值:有效文档类型,text/html,text/plain(纯文本),image/jpeg,image/gif,application/msword…
info,取值:任意的字符串,指明了JSP页面的信息,这个信息可以通过Servlet.getServletInfo()取得
trimDirectiveWhitespaces,取值true,false,是否去掉指令的前后空白,默认是false,也就是说如果设定为true的话则会把page属性当的空行全部取消掉对于xml来说这一般来说是必要的,对JSP来说对于显示没有影响
include指令:
它只有一中形式:<%@include file=”相对路径”%>,这里的相对路径指的是本应用内的另一个JSP或HTML,一般常见的有如下的形式
<%@include file=”头jsp”>
<html>
</html>
<%@include file=”尾jsp”>
JSP中还有一种方式可以包含文件
<jsp:include page=”相对路径”/>
它与<%@include file=”相对路径”>不同之处是后者是把源代码包含进来后再一起编译成一个class文件,而前者是先编译后把编译的结果加到文件中
taglib指令:
声明使用JSP的标签库则要使用这个指令,它有两个属性uri(指定了类库的地址)、prefi为标签的前缀
JSP行为:
JSP Action是一组JSP内置的标签,它分为自定义标签行为和标准JSP行为
格式一般为:<jsp:elements attribute=”value”…/>
<jsp:include />行为:用于运行时包含某个文件,如果被包含的文件是JSP则会先运行这个程序然后把结果包含进来
<jsp:include page=”相对路径” flush=”true”/>
在这里面page属性是必须的,指定了被包含的文件的相对路径,flush可以设定为true,false,指定读入被保存文件内容时是否清空缓存
这里include行为与page指令的include本质上还是有区别的前者是先运行把结果包含进行,后者是把源代码直接包含进来再运行
include行为使用request.getRequestDispatcher(“相对路径”).forward(req,res)来执行被包含文件
POJO:
Java Bean行为是一组与Java Bean相关的行为,它包含useBean,setProperty,getProperty行为等
Java Bean实际上就是普通的Java类,对于这个类中最为主要的就是属性与对应的setter、getter方法一定要有
getter方法用于获取这个属性,它是有返回值的,setter方法用于设置属性,因而是void类型的
对于属性名xxxàgetter方法:getXxx();setter方法:setXxx()
如是属性是boolean类型则getter方法是isXxx(),setter方法为setXxx()
如下就是一个简单的Java Bean:
/*一个简单的java bean*/
public class Person {
private String name;
private int age;
private String sex;
private boolean secret;
// getter、setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public boolean isSecret() {
return secret;
}
public void setSecret(boolean secret) {
this.secret = secret;
}
}
UserBean用于在JSP中定义一个Java Bean对象,UseBean行为格式如下
<jsp:useBean id=”beanid” class=”class全限定名” scope=”value”/>
id:指定Java Bean对象的名称,之后在JSP中可以通过这个名称来引用这个Java Bean对象
class:Java Bean的类名
scope:取值可以是page(该JSP页面有效),request(当前的request中有效),session(当前session有效),application(当前的Web应用程序中有效),默认的取值是page
UseBean行为定义了Java Bean对象后就可以通过getProperty行为来获得Java Bean属性或者是通过setProperty来设置Java Bean属性
getProperty行为格式如下:
<jsp:getProperty name=”beanName” property=”propertyName”/>
setProperty行为格式如下:
<jsp:setProperty name=”beanName” property=”propertyName”value=””/>
首先要有一个Java Bean类,也就是一个普通的类POJO
package com.xiaoxie.jsp.bean;
/*一个简单的java bean*/
public class Person {
private String name;
private int age;
private String sex;
private boolean secret;
// getter、setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public boolean isSecret() {
return secret;
}
public void setSecret(boolean secret) {
this.secret = secret;
}
}
接下来通过一个html页面来提交属性的值:
<!DOCTYPE html>
<html>
<head>
<title>useBean.html</title>
<meta http-equiv="keywords"content="keyword1,keyword2,keyword3">
<meta http-equiv="description"content="this is my page">
<meta http-equiv="content-type"content="text/html; charset=UTF-8">
<link rel="stylesheet"type="text/css" href="css/style.css">
</head>
<body>
<div align="center">
<form action="useBean.jsp" method="post">
<fieldset style="width:300">
<legend>请填写 Person 信息</legend>
<table align="center" width="400">
<tr>
<td align="right" style="font-weight: bold;">姓名:</td>
<td><input type="text" name="name"value="" style="width:200px;"></td>
</tr>
<tr>
<td align="right" style="font-weight: bold;">年龄:</td>
<td><input type="text" name="age"value="" style="width:200px;"></td>
</tr>
<tr>
<td align="right" style="font-weight: bold;">性别:</td>
<td>
<input type="radio"name="sex" value="男"/>男
<input type="radio"name="sex" value="女"/>女
</td>
</tr>
<tr>
<td align="right" style="font-weight: bold;"><br></td>
<td>
<input type="submit" value="提交 Person 信息" class="button">
</td>
</tr>
</table>
</fieldset>
</form>
</div>
</body>
</html>
注意在上面的html页面中<input>中的name属性要与Java Bean属性名一致
最后在JSP页面中使用Java Bean行为:
<%@ page language="java"import="java.util.*" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.xiaoxie.jsp.bean.*"%>
<%
String path =request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'useBean.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<%--声明使用Person为一个Java Bean
1,指定一个类的id
2,指定类的全限定名class
3,指定这个Java Bean的作用范围,scope 的默认取值是page
--%>
<jsp:useBean id="person"class="com.xiaoxie.jsp.bean.Person" scope="page"></jsp:useBean>
<%--使用Java Bean
首先要设置Java Bean中的属性值,自动从request中取值,这里property="*"表示设置所有的属性
--%>
<jsp:setProperty property="*" name="person"/>
<div align="center">
<fieldset style="width: 300">
<legend>填写的Person信息</legend>
<table align="center" width="400">
<tr>
<td align="right" style="font-weight: bold;">姓名:</td>
<td>
<%--获得Java Bean中的相关属性值 --%>
<jsp:getProperty property="name" name="person"/>
</td>
</tr>
<tr>
<td align="right" style="font-weight: bold;">年龄:</td>
<td>
<%--获得Java Bean中的相关属性值 --%>
<jsp:getProperty property="age" name="person"/>
</td>
</tr>
<tr>
<td align="right" style="font-weight: bold;">年龄:</td>
<td>
<%--获得Java Bean中的相关属性值 --%>
<jsp:getProperty property="sex" name="person"/>
</td>
</tr>
<tr>
<td align="right" style="font-weight: bold;"><br></td>
<td>
<input type="button" value="返回" class="button"onclick="history.go(-1);">
</td>
</tr>
</table>
</fieldset>
</div>
</body>
</html>
注意一个问题,对于中文来说这样子提交的数据会出现乱码的情况解决的办法如下:
1、实现一个Filter,设置处理字符集为UTF-8。(Tomcat下Tomcat/webapps/examples/WEB-INF/classes/filters有完整的例子,请参考web.xml和SetCharacterEncodingFilter的配置。)
a、只要把Tomcat/webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.class文件拷到你的/WEB-INF/classes/filters下,如果没有filters目录,就创建一个。
b、在你的web.xml里加入如下几行:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、打开tomcat的Tomcat/conf/server.xml文件,加入URIEncodeing="UTF-8",完整的如下:
<Connector port="8080"protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" URIEncodeing="UTF-8"/>
3、别忘了重启Tomcat。
这样改完,再运行就正确了。
关于scope的介绍:
scope指定了Java Bean的作用范围
scope可以指定的范围有:page,request,Session,application
对于request可以通过forward,include等传到多个JSP的页面
比如我们可在一个JSP页面中写如下的来声明Java Bean
<%--定义一个Session范围内的计数器,记录个人访问信息 --%>
<jsp:useBean id="personCount" class="com.xiaoxie.jsp.bean.Counter" scope="session"></jsp:useBean>
<%--定义一个appliation范围内的计数器,记录所有人的访问信息 --%>
<jsp:useBean id="allCount"class="com.xiaoxie.jsp.bean.Counter" scope="application"></jsp:useBean>
把一个Java Bean分别声明到不同的范围当中去,接下来则可以在<jsp:getProperty>当中取Java Bean属性的时候从声明的不同的Java Bean中去取就可以了
<jsp:forward/>行为:
Servlet的转发是通过如下的方法实现:request.getRequestDispatcher(“somefile”).forward(res,rea)
<jsp:forward/>行为则是对forward进行的封装
我们可以如下进行跳转:
<jsp:forwardpage=”/somepage.jsp”>
<jps:param name=”param1” value=”value1”/>
<jsp:param name=”param2” value=”value2”/>
</jsp:forward>
在进行跳转的时候地址栏参数为<jsp:param/>指定的值,转发之前是不能有任何输出到客户端的
<jsp:directive/>行为:
这个就相当于一个JSP指令
<jsp:directive.page…/> 相当于<%@page …%>
<jsp:directive.include/>相当于<%@include%>
<jsp:directive.incluedfile=”head.jsp”/>
<jsp:directive.taglib>相当于<%@taglib%>
<jsp:directive.tagliburi=”…” prefix=”..”/>
JSP九大内置对象:
out,request,response,config,session,application,page,pageContext,exception
1, out输出流对象:
它是javax.servlet.jsp.JspWriter类的实例,服务器向客户端输出的字符内容可以通过out对象输出
常用方法:
voidappend(CharSequence cs);向out的缓存中进行输出,当缓存中满或执行out.flush()时这些内容会写到客户端
voidclear();清空要输出的内容
voidflush();把缓存的内容flush到客户端浏览器
voidprintln(String str);向客户端输出内容
booleanisAutoFlush();返回缓存满的时候是否会自动flush,如果是false则不会flush,而是会抛出异常
intgetBufferSize();获得缓存的大小,单位是KB
intgetRemaining();返回缓存剩余的大小,单位是KB
request请求对象:
它是javax.servlet.ServletRequest类的实例,它代表了客户端的请求request包含了客户端的信息和请求的信息,每次客户端请求都会产生一个request实例
voidsetAttribute(String name,Object value);在request中保存一个对象,在本页面或是forward后的页面中可以通过getAttribute(String name)来获取到这个对象
ObjectgetAttribute(String name);从request中获得name对应的对象
StringgetMethod();返回提交的方式,一般是get或post
StringgetPrarameter(String key);返回提交的参数
String[]getParameterValues(String key);返回多个同名参数值
EnumerationgetPrameterNames();返回所有提交的参数名称
Cookie[]getCookies();返回所有的Cookie
StringgetContextPath();返回应用程序的路径
StringgetRequestURI();返回请求URI路径
voidSetCharacterEncoding(String encoding);设置request的编码方式
StringgetHeader(String name);获取request头信息
EnumerationgetHeaderNames();返回所有的reqeust头名称
DispatchergetRequestDispatcher();返回Dispatcher对象,它可以进行forward操作
HttpSessiongetSession();返回HttpSession对象
response响应对象:
它是javax.servlet.ServletResponse类的实例,代表客户端的响应,服务端的任何输出都是通过response对象发送到客户端浏览器的
response对象的常用方法:
voidclear();清空暂存在缓存区中的输出
voidaddCookie(Cookie cookie);设置Cookie
OutputStreamgetOutputStream();返回服务器输出流,可以通过这个进行二进制的输出
voidsendRedirect(String url);使本页面重定向到另一个页面
voidsetContentType(String contentType);设置文档类型
PrintWritergetWriter();获得Out对象
voidsetHeader(String name,String value);设置response的头信息
voidsetStatus(int status);设置response状态码
config配置对象:
它是javax.servlet.ServletConfig类的实例,封装了配置在web.xml中初始化JSP参数。JSP中通过config获取这些参数,每个JSP文件共有一个config对象
常用的方法:
StringgetInitParameter(String name);返回配置在web.xml中的初始化参数
EnumerationgetInitParameterNames();返回所有的初始化参数名称
ServletContextgetServletContext();返回ServletContext对象
StringgetServletName();返回Servlet的名称
session会话对象:
它是javax.servlet.http.HttpSession类的实例,session与cookie是记录客户访问信息的两种机制,session用于在服务端保存用户信息,cookie用于在客户端保存用户的信息,在Servlet中通过request.getSession()取得session对象,JSP中这个对象是可以直接使用的,但注意如果<%@pagesession=”false”%>则session是不可用的,每个用户对应一个session
seeion对象常用方法:
StringgetId();返回sessionId
ObjectgetAttribute(String name);返回session中属性名为name的对象
EnumerationgetAttributeNames();返回session中的所有属性名
longgetCreationTime();返回这个session的创建时间
longgetLastAccessedTime();返回这个session最后一次访问时间
intgetMaxInactiveInterval();返回session的最大允许的间隔时间,单位是秒
voidsetAttribute(String name,Object value);为session中的属性名绑定值
voidsetMaxInactiveInterval(long second);设置最大允许的时间间隔
application应用程序对象:
它是javax.servlet.ServletContext类的对象,封装了JSP所在的WEB程序的信息,在Servlet中需通过ServletConfig.getServletContext()来获取,整个应用中只有一个application对象
常用方法:
ObjectgetAttribute(String name);返回application中属性名为name的对象
EnumerationgetAttributeNames();返回application中所有属性名
voidsetAttribute(String name,Object value);为application中属性绑定相应的值
voidremoveAttribute(String name);移除application属性
StringgetInitParameter(String name);返回全局初始化参数
EnumerationgetInitParameterNames();返回所有全局初始化参数
StringgetMimeType(String filename);返回文档的类型
StringgetRealPath(String relativePath);返回web应用内相对网址对应的绝对路径
page页面对象(JSP页面)
它是javax.servlet.jsp.HttpJspPage类的实例,page代表了JSP页面是当前JSP编译后的Servlet类的对象,page相当于普通Java类中的关键字this
pageContext页面上下文对象:(JSP页面编译后的内容)
它是javax.servlet.jsp.PageContext类的实例,它代表了当前JSP页面编译后的内容,通过pageContext能够获取到JSP中的资源
常用方法:
ObjectfindAttribute(String name);在JSP页面中查找变量
void forward(Stringurl);forward到另一个页面
ObjectgetAttribute(String name);返回指定的属性
ObjectgetAttribute(String name,int scope);返回在指定范围中的指定属性值
scop可以取PAGE_SCOPE ,REQUEST_SCOPE,SESSION_SCOPE,APPLICATION_SCOPE
JspWritergetOut();返回out对象
ObjectgetPage();返回page对象
ServletRequestgetRequest();返回request对象
ServletResponsegetResponse();返回response对象
HttpSessiongetSession();返回session对象
exception对象:
它是java.lang.Exception类的实例,封装了JSP中抛出的异常信息,如果要使用exception则要设置<%@page isErrorPage=”true”%>
JSP配置:
与Servlet类似,Servlet使用的是<servlet-class></servlet-classs>
而JSP使用的是<jsp-file></jsp-file>
也是放在<servlet></servlet>和<servlet-mapping></servlet-mapping>当中
JSP页面进行配置后可以通过源来的xxx.jsp来访问也可以使用<servlet-mapping></servlet-mapping>中的<url-pattern></url-pattern>的设置来进行访问
在<servlet></servlet>当中可以可以加上<init-param></init-param>
这个时候在JSP页面中可以通过config对象的getInitParameter(String name)来取得初始化参数的配置。
<jsp-config>标签:
在web.xml当中<jsp-config>标签支持对JSP的批量配置,它包含两个子标签:<taglib>、<jsp-property-group>
EL表达式:
使用${}这个括起来的脚本,这是为了方便的读取对象,EL表达式是写在HTML代码中的而不是<%%>中
EL表达式提供了获取对象及属性的简单方式
EL表达式可以获取request中的对象,也可以从session中获取,它先从request中去找,如果没有找到它会去Session中去找
常用的就是使用setAttribute(String name,Object value);把对象放在request或是session当中再去用el表达式去取这些对象
除了request,session中的属性名,el表达式还可以读其它JSP隐藏对象的属性
${param.属性名}:这个就是读的地址栏参数,相当于request.getParameter(“属性名”);
${initParam.属性名}:这个是用来读取初始化参数,相当于config.getInitParamter(“属性名”)
${header.头参数}:这个读head参数中的值,相当于request.getHeader(“头参数”);
param,initParam,header都是Map类型的对象,可以使用数组的形式来获取
${param[“属性名”]}
${initParam[“属性名”]}
${header[“头参数”]}
EL表达式对隐藏对象的访问
1, 请求参数
param ${param.参数名},${param[“参数名”]}
paramValues 当请求参数名有多个值的时候,${param.参数名[0]},${param.参数名[1]…}
2, 头信息:
header ${header.头信息名}
headerValues ${header.头信息名[0]}, ${header.头信息名[1]}…
3, Cookie:
cookie <%response.addCookie(new Cookie(cookie名,cookie 值))%>设置Cookie后
${cookie.cookie名}—>返回Cookie
${cookie.cookie名.value}—>返回指定cookie对应的值
${cookie.cookie名.name}—>返回Cookie的名字
4, 初始化参数:
initParam ${initParam.初始化参数名}
5, 作用域:
在使用el表过式的时候在表达式的最前面加上作用域.比如:${pageScope.person.name}
其它的作用域还有:requestScope,sessionScope,sessionScope,applicationScope,pageContext
注意:如果没有指定作用域的话则会先在request中去找,找不到会到session中去找
EL表达式运算:
它包括了简单的运算:+,-,*,/(div),%(mod),三目运算
支持简单的比较运算:>(gt),<(lt),==(eq),!=(ne),>=(ge),<=(le)
多个比较运算可以进行逻辑上的组合:且(&&,and),或(||,or),否(!,not),在组合过程中可以使用括号
对于字符进行比较,如果是对于大小进行比较EL表过式会调用int compare(char ch),如果是等于进行比较则会调用equals()
对于Map或者数组类,可以使用[]进行取值,或者使用empty判断是否为空
${param.paramA[0]}
${emptyparam.paramA}