JSP内置对象及方法详解
目录
9.Exception内置对象及其方法三.请求重定向和请求转发
一.JSP基本架构
1.JSP简介
JSP全名为Java Server Pages,实现了在java中使用HTML标签。JSP是一种动态网页技术,执行JAVAEE标准,在服务器端显示。
2.JSP基础语法
(1)JSP脚本:
<1>Jsp脚本:在JSP页面中执行的java代码
<2>语法:<% java代码 %>
(2)JSP声明:
<1>Jsp声明:在JSP页面中定义变量或者方法
<2>语法:<%! java代码 %>
(3)JSP表达式:
<1>Jsp表达式:在JSP页面中执行的表达式
<2>语法:<%= java表达式 %>//注意表达式不以分号结尾
(4)JSP注释:
<1>HTML注释:<!-- html注释 --> 客户端可见
<2>JSP注释:<%-- html注释 --%> 客户端不可见
<3>JSP脚本注释:// 单行注释 /**/ 多行注释
3.JSP页面生命周期
对于每次单个客户端发出的请求,JSP会对该情趣予以判断。如果为第一次请求,则JSP引擎会把该JSP文件转换成一个Servlet生成字节码文件,并执行jspInit();否则直接访问已生成的字节码文件。最终两类请求都会被jspService()方法解析执行。
二.JSP内置对象及其方法(标红的内置对象为常用对象)
1.out内置对象及其方法
out对象方法(标红为常用方法) | |
---|---|
void println() | 向客户端打印字符串 |
void clear() | 清除缓冲区的内容,如果在flush之后调用会抛出异常 |
void clearBuffer() | 清除缓冲区的内容,如果在flush之后调用不会抛出异常 |
void flush() | 将缓冲区内容输出到客户端 |
int getBufferSize() | 以字节数返回缓冲区的大小 |
int getRemaining() | 返回缓冲区还剩余多少字节 |
boolean isAutoFlush() | 返回缓冲区满时,时自动清空还是抛出异常 |
void close() | 关闭输出流 |
2.response内置对象及其方法
response对象方法(标红为常用方法) | |
---|---|
String getCharacterEncoding() | 返回响应用的是何种字符编码 |
void setContentType(String type) | 设置响应的MIME类型 |
PrintWriter getWriter() | 返回可以向客户端输出字符的一个对象(注意比较:PrintWriter与内置对象out的区别) |
sendRedirevt(java.lang.String location) | 重新定向客户端的请求,跳转到其他JSP文档 |
setHeader(String name,value) | 页面显示系统时间,并定时刷新 |
3.request内置对象及其方法
request对象方法(标红为常用方法) | |
---|---|
String getParameter(String name) | 返回name中指定参数的参数值 |
String[] getParaameterValues(String name) | 返回包含参数name的所有值数组 |
void setAttribute(String,Object) | 储存此请求中的属性 |
object getAttribute(String name) | 返回指定属性的属性值 |
String getContentType() | 得到请求体的MIME类型 |
String getProtocol() | 返回请求用的协议类型及版本号 |
String getServerName() | 返回接受请求的服务器的主机名 |
4.session内置对象及其方法
session对象方法(标红为常用方法) | |
---|---|
long getCreationTime() | 返回SESSION创建时间 |
public String getId() | 返回SESSION创建时JSP引擎为它设的唯一的ID号 |
public Object setAttribute(String name,Object value) | 使用指定名称将对象绑定到此会话 |
public Object getAttribute(String name) | 返回与会话中的指定名称绑定在一起的对象,如果没有对象绑定再改名成下,返回null |
String[] getValueNames() | 返回一个包含此SESSION种所有可用属性的数组 |
int getMaxInactiveInterval() | 返回两次请求间隔多长时间此SEESSION被取消 |
void setMaxInactiveInterval(int number) | 设置session最大生存周期 |
以上四个内置对象在JSP出现频率较高,所以将为大家代码演示:
代码包含5个JSP页面,index.jsp页面存储登陆页面的form代码并跳转到response.jsp页面。response.jsp页面进行判断所属部门,若为前端,请求转发到front.jsp页面;否则请求转发到back.jsp。front.jsp与back.jsp两个页面会进行掌握语言form填写,最终将所有数据传入out.jsp页面输出
index.jsp 页面代码:
这里简单制作了一个登陆页面
<%@ page language="java" import="java.io.*" import="java.util.*" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="com.po.Users"%>
<html>
<head> <title> JSP</title></head>
<body>
<h1>登录页面</h1>
<form name="entrance" action="response.jsp" method="post" >
<table>
<tr>
<td>姓名</td>
<td> <input type="text" name="name"/> </td>
</tr>
<tr><td aligh="center">所属部门</td>
<td>
<input type="radio" name="department" value="front">前端
<input type="radio" name="department" value="back">后端
</td>
</tr>
<tr>
<td>账号</td>
<td> <input text="password" name="account"/> </td>
</tr>
<tr>
<td>密码</td>
<td> <input text="password" name="password"/> </td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
</body>
</html>
效果如下图:
response.jsp页面代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
<%!
Object department = null;
%>
<%
department = request.getParameter("department");//判断所属部门
session.setAttribute("Name",request.getParameter("name"));
session.setAttribute("Account",request.getParameter("account"));
session.setAttribute("Password",request.getParameter("password"));
session.setAttribute("Department",request.getParameterValues("department"));
%>
<%
//response.sendRedirect("目标地址");//请求重定向
if(department.equals("front")) {
request.getRequestDispatcher("front.jsp").forward(request,response);//若为前端,请求转发front.jsp
}
else {
request.getRequestDispatcher("back.jsp").forward(request,response);//请求转发,请求转发back.jsp
}
%>
front.jsp页面代码:
这里同样制作了一个简单的fom表
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
<form name="improvement" action="out.jsp" method="post">
<table>
<tr>
<td colspan="2">前端掌握语言
<input type="checkbox" name="front_language" value="javascript">javascript语言
<input type="checkbox" name="front_language" value="PHP">PHP语言
<input type="checkbox" name="front_language" value="HTML">HTML语言
<input type="checkbox" name="front_language" value="CSS">CSS语言
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交"/> </td>
</tr>
</table>
</form>
</body>
</html>
效果如下图:
back.jsp页面代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
<form name="improvement" action="out.jsp" method="post">
<table>
<tr>
<td colspan="2">后端掌握语言
<input type="checkbox" name="back_language" value="JAVA">java语言
<input type="checkbox" name="back_language" value="C++">C++语言
<input type="checkbox" name="back_language" value="C#">C#语言
<input type="checkbox" name="back_language" value="database">数据库语言
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交"/> </td>
</tr>
</table>
</form>
</body>
</html>
效果如下图:
out.jsp页面代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
</body>
</html>
姓名<% out.println(session.getAttribute("Name")); %>
账号<% out.println(session.getAttribute("Account")); %>
密码<% out.println(session.getAttribute("Password"));%>
掌握语言<%
if(session.getAttribute("Department").equals("front")) {
String []string1 = request.getParameterValues("front_language");
if(request.getParameterValues("front_language")!=null)
for(int i=0;i<=string1.length-1;i++) {
out.println(string1[i]+" ");
}
}
else {
String[] string2 = request.getParameterValues("back_language");
if(request.getParameterValues("back_language")!=null)
for (int i = 0; i <= string2.length - 1; i++) {
out.println(string2[i]+" ");
}
}
%>
最终程序运行截图如下:
5. application内置对象及其方法
application对象方法(标红为常用方法) | |
---|---|
public void setAttribute(String name,Object value) | 使用指定名称将对象绑定 |
public Object getAttribute(String name) | 返回与此会话中指定名称绑定在一起的对象,如果没有对象绑定在该名称之下,则返回null |
public Object getAttribute(String name) | 返回所有可能属性名的枚举 |
String getSererInfo() | 返回JSP引擎名及版本号 |
6.page内置对象及其方法
page对象方法 | |
---|---|
class getClass() | 返回此Object的类 |
int hashCode() | 返回此Object的hash码 |
boolean equals(Object obj) | 判断此Object是否与指定的Object对象相等 |
boolean equals(Object obj) | 把此Object拷贝到指定的Object对象中 |
Object clone() | 克隆此Object对象 |
String toString() | 把此Object对象转换成String类对象 |
void notify() | 唤醒一个等待的线程 |
void notify() | 唤醒所有等待的进程 |
void wait(int timeout) | 使一个线程处于等待直到timeout结束或被唤醒 |
void wait(int timeout) | 使一个线程处于等待直到被唤醒 |
7.pageContext内置对象及其方法
pageContext内置对象可以理解为之前所有内置对象的集大成者
pageContext对象方法 | |
---|---|
JspWriter getOut() | 返回当前用户端响应被使用的JSPWriter流(out) |
HttpSession getSession() | 返回当前页中的HttpSession对象(session) |
Object getPage() | 返回当前页的Object对象 |
ServletRequest getRequest() | 返回当前页的ServletRequest对象(request) |
ServletResponse getResponse() | 返回当前页的ServletResponse对象(response) |
void setAttribute(String name,Object attribute) | 设置属性及属性值 |
Object getAttribute(String name,int scope) | 在指定范围内取属性值 |
int getAttributeScope(String name) | 返回某属性的作用范围 |
void forward(String relativeUrlPath) | 使当前页面重导到另一个页面 |
void include(String relativeUrlPath) | 在当前位置包含另一文件 |
8.config内置对象及其方法
conig对象方法 | |
---|---|
ServletContext getServletContext() | 返回含有服务器相关信息的ServletContext对象 |
String getInitParameter(String name) | 返回初始话参数的值 |
Enumeration getInitParamterNames() | 返回Servlet初始化所需所有参数的枚举 |
9.Exception内置对象及其方法
exception对象方法 | |
---|---|
String getMessage() | 返回描述异常的消息 |
String toString() | 返回关于异常的简短描述消息 |
void printStackTrace() | 显示异常及其栈轨迹 |
Throwable FillInStackTrace() | 重写异常的执行轨迹 |
这里简单编写一个代码向大家展示pageContext内置对象和exception内置对象
该代码只是在原有基础上修改了response.jsp页面 out.jsp页面以及增加了Exception.jsp页面来处理异常状况
response.jsp页面代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
<%!
Object department = null;
%>
<%
department = pageContext.getRequest().getParameter("department");//判断所属部门
pageContext.getSession().setAttribute("Name",request.getParameter("name"));
pageContext.getSession().setAttribute("Account",request.getParameter("account"));
pageContext.getSession().setAttribute("Password",request.getParameter("password"));
pageContext.getSession().setAttribute("Department",request.getParameter("department"));
%>
<%
if(department.equals("front"))
response.sendRedirect("front.jsp");//这里使用请求重定向,前一次提交的内容会丢失
else
response.sendRedirect("back.jsp");
%>
out.jsp页面代码如下:
<%@ page contentType="text/html;charset=UTF-8" errorPage="Exception.jsp"%>
<html>
<head>
</head>
<body>
</body>
</html>
姓名<% pageContext.getOut().println(pageContext.getSession().getAttribute("Name"));
//这里使用pageContext调用getSession方法显然没有直接用session调用getAttribute()方法简便
%><br>
账号<% pageContext.getOut().println(pageContext.getSession().getAttribute("Account")); %><br>
密码<% pageContext.getOut().println(pageContext.getSession().getAttribute("Password"));%><br>
<%
String string = (String)session.getAttribute("Department");
%>
掌握语言<%
if(string.equals("front")) {
String []string1 = request.getParameterValues("front_language");
for(int i=0;i<=string1.length-1;i++) {
out.println(string1[i]+" ");
}
}
else {
String[] string2 = request.getParameterValues("back_language");
for (int i = 0; i <= string2.length - 1; i++) {
out.println(string2[i]+" ");
}
}
%><br>
Exception.jsp页面代码如下:
<%@ page contentType="text/html;charset=UTF-8" errorPage="Exception.jsp"%>
<html>
<head>
</head>
<body>
</body>
</html>
<%
Exception exception = new Exception();
%>
异常信息 <% out.println(exception.getMessage()); %><br>
异常字符串描述 <% out.println(exception.toString()); %><br>
运行结果如下图:
(这里面使用到了请求重定向,因为我用了setAttribute()方法将首次登录信息存入了内存,才能够正常输出;否则首次输入的信息会丢失,无法在out.jsp页面显示)
如果不使用setAttribute()方法时对应out.jsp页面如下(其他页面照常不变):
<%@ page contentType="text/html;charset=UTF-8" errorPage="Exception.jsp"%>
<html>
<head>
</head>
<body>
</body>
</html>
姓名<% pageContext.getOut().println(request.getParameter("name"));
//这里使用pageContext调用getSession方法显然没有直接用session调用getAttribute()方法简便
%><br>
账号<% pageContext.getOut().println(request.getParameter("account"));%><br>
密码<% pageContext.getOut().println(request.getParameter("password"));%><br>
<%
String string = (String)session.getAttribute("Department");
%>
掌握语言<%
if(string.equals("front")) {
String []string1 = request.getParameterValues("front_language");
for(int i=0;i<=string1.length-1;i++) {
out.println(string1[i]+" ");
}
}
else {
String[] string2 = request.getParameterValues("back_language");
for (int i = 0; i <= string2.length - 1; i++) {
out.println(string2[i]+" ");
}
}
%><br>
运行效果如下图 :
有关于请求重定向和请求转发请看第三点
三.请求重定向和请求转发
1.请求重定向
客户端行为,response.sendRedirect("目标地址"),
从本质上讲等同于两次请求(相当于让客户端发一个新请求,这会导致前一次请求的参数不会保留,前一次的请求对象不会保存,地址栏的URL地址会改变。
2.请求转发
服务器行为,request.getRequestDispatcher("目标地址").forward(request,response);
是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。