博和利初级培训 第三讲 serverlet讲解

Download Report

Transcript 博和利初级培训 第三讲 serverlet讲解

第二讲 Servlet&JSP基础培训
博和利初级培训
—开发技能
Web编程概述-- B/S
Web Server
浏览器
DB
Server
浏览器与Web服务器的动态交互
……
<FORM ACTION="xxx.jsp" METHOD="POST">
<INPUT TYPE="text" NAME="param_1"><BR>
……
<INPUT TYPE="submit" VALUE="Submit">
</FORM>
……
Method属性指定了
数据传送方式,可
以是GET或POST
各种输入控件,接
受用户输入。
提交按钮,点此Button将
把FORM内的数据传送到服
务器
GET方式将数据接在URL后面传送给服务器端程序,
如:http://url?name1=abc&name2=def
POST方式将数据放在HTTP请求的请求头后面发送。
Servlet简介
Servlet是java语言的CGI实现,与传统的CGI和许多其他类似CGI的技
术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有
更好的可移植性。
• 高效
传统的CGI程序以进程方式运行,而Servlet以线程方式运行。
• 方便
Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表
单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。
• 功能强大
可以完成很多传统的CGI程序很难做到的事情。
• 可移植性好
Servlet API具有完善的标准。
Servlet基本结构
public class SomeServlet extends HttpServlet
{
// 必须继承自HttpServlet
public void doGet(HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException
{ // 使用“request”读取和请求有关的信息(比如Cookies)和表单数据
// 使用“response”指定HTTP应答状态代码和应答头(比如指定内容类型,设置
Cookie)
PrintWriter out = response.getWriter();
// 使用 "out"把应答内容发送到浏览器
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
…… }
}
Servlet生命周期
• 服务器只创建每个Servlet的单一实例,每个用户请求都会引
发新的线程。
• 创建Servlet实例时,会调用init()方法,针对每个用户请求
都会创建一个线程,该线程调用前面创建实例的service()方法,
由service()方法依据接收到的HTTP请求的类型,调用相应的
doXxx方法,比如doGet(),最后调用destroy()方法销毁。
Servlet工作原理
HTTP GET请求
doGet()方法
响应
HTTP POST请求
doPost()方法
响应
客户机
Web服务器
HttpServletRequest&HttpServletResponse
doGet 和 doPost 方法的参数都是 HttpServletRequest 和 Http
ServletResponse 对象。其中HttpServletRequest 对象代表了客户
端的请求,servlet 通过这个对象获得客户 端 的 请 求 数 据;
HttpServletResponse对象代表了servlet对客户端请求的响应,sevl
et用这个对象向客户端返回数据。
HttpServletRequest&HttpServletResponse
通过HttpServletRequest对象获取客户请求数据:getParameter()方法
protected void doGet(HttpServletRequest request, HttpServletResponse re
sponse) {
●
String str = request.getParameter("name");
控件的名字}
//
参数为FORM内某输入
通过HttpServletResponse对象向客户端返回数据
protected void doGet(HttpServletRequest request, HttpServletResponse re
sponse) {
●
PrintWriter out = response.getWriter();
out.println("……");
户端返回HTML文本}
//
获取输出流对象
//
通过输出流对象向客
Servlet处理用户请求简介
• 单个值的读取
request.getParameter(“Param1”);
• 多个值的读取
request.getParameterValues();
• 参数名的查找
request.getParameterNames();
request.getParameterMap();
• 原始表单数据的读取以及对上载文件的分析
request.getReader();
request.getInputStream();
• 多字符集输入的读取
request.setCharacterEncoding(“utf-8”);
Servlet设置响应报头
• 普通设置方法
setHeader(String headerName, String headerValue)
• HttpServletResponse提供的方法
setDateHeader(String header, long milliseconds)
setIntHeader(Stirng header, int headerValue)
setContentType(String mimeType)
setContentLength(int length)
会话跟踪
• HTTP是无状态协议,它没有提供内置方法来对一系列由相同用户发起的请求进行
识别。客户程序每次读取Web页面,都打开到Web服务器的单独的连接,并且服务器也
不自动维护客户的上下文信息。
• 因此如果Web应用程序如果想要为来自同一个用户的请求保留状态或数据的话(比
如购物车程序,用户会在不同网页间切换来选购商品,因此要求Web应用程序必须要能
记住一个用户选购的所有商品),这一般可以通过以下几个方法实现:
– Cookie
– URL重写
– 隐藏表单项目
解决HTTP无状态的方法
• Cookie
cookie是是一些由服务器发向浏览器并且还能由浏览器读回来的小段
的文本信息。Web服务器将它发送到浏览器,之后在访问同一网站或域时,
浏览器又将它原封不动的返回。一般用于记录用户名密码、根据用户的偏
好定制站点、定向广告。
cookie的内容主要包括:名字,值,过期时间,路径和域。
--域可以指定某一个域比如www.google.com。
--路径就是跟在域名后面的URL路径 ,比如/news。
解决HTTP无状态的方法
• Cookie代码样例
Cookie userCookie = new Cookie(“uesr”, “uid1234”);
userCookie.setMaxAge(60*60*24*265);
response.addCookie(userCookie );
//一年
解决HTTP无状态的方法
• URL重写
利用URL重写技术,每个可能被用户点击的URL都会被动态修
改,为URL附加上一个标志本次会话的ID。采用这种方式时,客户
程序在每个URL的尾部添加一些额外数据,用来表示当前的会话,
服务器将这个标识符与它存储的用户相关数据关联起来。比如:
http://url/xxx?jsessionid=123
解决HTTP无状态的方法
• 隐藏的表单域
所谓隐藏表单项目指的是HTML表单上不在客户端上显示的项目,它们在
提交表单时也被送到服务器端。我们可以利用这一机制来维护会话信息。
<FORM ACTION="url" METHOD="POST">
<INPUT TYPE=HIDDEN NAME="xxx" VALUE="yyy">
……
</FORM>
在提交表单时,要将指定的名称和值自动包括在GET和POST数据中,隐藏
域可以用来存储有关会话的信息。
缺点:仅当每个页面都是由表单提交而动态生成时,才能使用这种方法。
Servlet的会话管理
• HttpSession API
HttpSession API是一个基于Cookie和URL重写机制的高级会话状态跟
踪接口:如果浏览器支持Cookie,则使用Cookie;如果浏览器不支持
Cookie或者Cookie功能被关闭,则自动使用URL改写方法。Servlet开发者
无需关心细节问题,也无需直接处理Cookie或附加到URL后面的信息,API
自动为Servlet开发者提供一个可以方便地存储会话信息的地方。
• 会话状态跟踪API
在Servlet中使用会话信息是相当简单的,主要的操作包括:查看和当前
请求关联的会话对象,必要的时候创建新的会话对象;查看与某个会话相关
的信息;在会话对象中保存信息以及会话完成或中止时释放会话对象。
会话跟踪基础
• 常用api样例
HttpSession session = request.getSession();
session.setAttribute(“test”,”test”);
String str = (String)session.getAttribute(“test”);
session.removeAttribute(“test”);
JSP概述
•
JSP采用的是动态代码与静态HTML页面相结合的方式,JSP的语法
内容放入在以“<%”开始,以“%>”结束的特殊标记之内。
•
JSP页面文件通常以.jsp为扩展名。虽然从代码编写来看,JSP页面
更象普通Web页面而不象Servlet,但实际上,JSP最终会被转换成正规的
Servlet,静态HTML直接输出到和Servlet service方法关联的输出流。
JSP文件结构
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*“ %>
...
<HTML>
<BODY>
其他 HTML 语言
<%
符合JAVA 语法的 JAVA 语句
%>
其他 HTML 语言
</BODY>
</HTML>
JSP执行过程
servlet
servlet分析器
request
jsp parser
*.jsp
*.java
JSDK
*.class
执
行
response
JSP执行过程
查找对应的JSP文件
是否存在
N
Y
是否是修改或创建
后第一次调用
Y
调用Jsp Parser将其
编译成Servlet程序
Client
调用JSDK将对应的Servlet
程序编译成Servlet字节码
Server
执行(若未载入则先载入)
已有的对应的Java字节码
N
JSP语法概述
•
JSP原始代码中包含了JSP元素和Template data两类
–
Template data指的是JSP引擎不处理的部分,即标记<%……%>以外
的部分,例如代码中的HTML的内容等 ,这些数据会直接传送到客户
端的浏览器。
–
JSP元素则是指将由JSP引擎直接处理的部分,这一部分必须符合
JSP语法,否则会导致编译错误。
JSP语法概述
• 脚本元素(Scripting Element)
脚本元素用来在JSP中嵌入Java代码,它允许声明变量和方法,包含任
意脚本代码和对表达式求值。这些Java代码将成为转换得到的Servlet的一部
分。
• 指令(Directive)
JSP指令是用作从JSP发送到JSP引擎上的一个信息。它们不向客户端产生
任何输出,只是指示JSP引擎需要做什么,所有的指令都在整个JSP文件内有
效。也就是说,一个指令影响整个JSP文件,并且只影响这个JSP文件。在标
签中指令由<%@ %>标记。
• 动作(Action)
动作用来引入现有的组件或者控制JSP引擎的行为。
JSP基础---注释
• 注释
<!-- comment [ <%= expression %> ] -->
或
<!-- 注释 [<%= 表达式 %> ] -->
这种注释发送到客户端,但不直接显示,在源代码中可以查到。
<%-- 注释 --%>
这种注释不发送到客户端。
JSP基础---声明
• 声明
语法:<%! declaration; [ declaration; ] ... %>
样例:
<%@ page language=”java” import=”java.util.*” %>
<html>
<head>
<title>berhely</title> </head>
<body>
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Date date; %>
<%!
int doSomething() ……
}
%>
</body>
</html>
JSP基础---表达式
• 表达式
语法:<%= expression %>
样例:
<%@ page language=”java” import=”java.util.*” %>
<html>
<head> <title>berhely</title> </head>
<body>
<%! Date date=new Date(); %>
<%! int a, b, c; %>
<% a=12;b=a; c=a+b;%>
<%=date.toString()%>
<b>a=<%= a %></b><br>
<b>b=<%= b %></b><br>
<b>c=<%= c %></b><br>
</body>
</html>
JSP基础---脚本段
• 脚本段
语法:<% code %>
样例:
<%@ page language=”java” import=”java.util.*” %>
<html>
<head>
<title>berhely</title>
</head>
<body>
<% for(int i = 0; i < 10; i++)
{out.println(“berheley”);}
%>
</body>
</html>
JSP基础--- include指令
• include 指令
include指令的作用是向当前页中插入一个静态文件的内容。
语法: <%@ include file="relativeURL" %>
样例:
<body>
The current date and time are <%@ include file=“2.jsp" %>
</body>
当JSP引擎把JSP文件转译成java文件时,会把当前JSP和被包含的JSP页面
合并成一个新的JSP页面。当被包含的文件的内容发生变化时,则必须要重新
将JSP页面转译成java文件才能看到更新后的内容。
JSP基础--- page指令
page 指令
page指令用于定义JSP文件中的全局属性。
语法:
<%@ page [ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*},..." ]
[ session="true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relativeURL" ]
[ contentType="mimeType | text/html”]
[ charset=ISO-8859-1]
[ isErrorPage="true | false" ]
%>
JSP基础--- page指令
language="java"
 声明脚本语言的种类,目前只能用"java" 。
import="{package.class | package.* },... “
 需要导入的Java包的列表,这些包作用于程序段,表达式,以及声明。下面的
包在JSP编译时已经导入了,所以就不需要再指明了:
java.lang.*/ javax.servlet.* /javax.servlet.jsp.*/javax.servlet.http.*
errorPage="relativeURL"
 设置处理异常事件的JSP文件。如果运行时有未能处理的异常发生,就跳转到这
个JSP。
isErrorPage="true | false"
 表明当前的JSP页面是否作其他JSP页面的errorPage的URL目标。如果被设置
为true,那么就可以使用隐含的变量exception对象。该属性默认为“false”。
JSP基础--- page指令
• buffer="none | 8kb | sizekb”
指定到客户的输出流中缓存的模式。如果值为“none”,就不
出现任何缓存,所有的输出都由一个PrintWriter直接写到
ServletResponse。如果指定Buffer值,那么输出就用不小于这个值
的缓冲区来进行缓冲。
• autoFlash="true | false”
如果值为“true”,当缓冲区被填满时,到客户的输出缓冲区会
自动刷新。如果值为“false”,就会出现运行时异常,表示缓存溢
出。默认为“true”。
<%@ page import="java.util.*" %>
<%@ page buffer=“24kb” autoFlush=“false” %>
<%@ page errorPage =“error.jsp” %>
<%@ page isErrorPage =“false” %>
JSP基础--- page指令
• <%@ page %>指令作用于整个JSP页面,同样包括静态的包含文件。
但是<%@ page %>指令不能作用于动态的包含文件,比如
<jsp:include>。
• 可以在一个页面中用上多个<%@ page %>指令,但是其中的属性
只能用一次,不过也有例外,那就是import属性。因为import属性
和Java中的import语句类似(参照Java Language,import语句引入
得是Java语言中的类),所以此属性就能多用几次。
• 无论把“%@ page %>指令放在JSP的文件的哪个地方,它的作用
范围都是整个JSP页面。不过,为了JSP程序的可读性,以及好的编
程习惯,最好还是把它放在JSP文件的顶部。
JSP基础--- taglib指令
• taglib指令
这个指令允许页面使用用户自定义的标签。它也为标签库(一个压缩文
件)命名,标签在这个库中定义。
语法: <%@ taglib uri=“tagLibraryURI" prefix="tagPrefix" %>
属性:
– uri=“tagLibraryURI"
Uniform Resource Identifier (URI ,统一资源标识符),标识标签库描述
符。一个标签库描述符用来维一地确定该定制标签集的名字,并告诉包容器
如何处理指定的标签。
– prefix="tagPrefix"
自定义标签的前缀字符。不能用jsp, jspx, java, javax, servlet, sun, 和
sunw做为你的前缀,这些已被Sun公司声明保留。
例子:<%@ taglib uri="watool-taglib" prefix="watool" %>
JSP基础---动作
•
•
•
•
•
•
•
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:param>
<jsp:include>
<jsp:forward>
<jsp:plugin>
这里只介绍<jsp:include>和<jsp:forward>两个动作。
JSP基础--- <jsp:forward>动作
• <jsp:forward>
例子:
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head>
<title>test</title>
</head>
<body>
<jsp:forward page="forwardTo.jsp">
<jsp:param name="userName" value="rose"/>
</jsp:forward>
</body>
</html>
JSP基础---
<jsp:include>动作
• <jsp:include>
告诉JSP页面动态包含一个文件,即JSP页面运行时才将文件加入。
与静态插入文件的include指令标签不同,当JSP引擎把JSP页面转译成
java文件时,不把JSP页面中动作指令include所包含的文件与原JSP页面
合并成一个新的JSP页面,而是告诉java解释器,这个文件在JSP运行时
(java文件的字节码文件被加载执行)才包含进来。如果包含的是普通
的文本文件,就将文件的内容发送到客户端,由客户端负责显示;如果
包含的是JSP文件,JSP引擎就执行这个文件然后将执行的结果发送到客
户端,由客户端负责显示。
语法:
<jsp:include page="filename">
<jsp:param name="paramname" value="paramvalue">
</jsp:include>
JSP基础---内置对象
• 内置对象
 request
封装了来自客户端的请求,它是javax.servlet.ServletRequest类的一个实例。
来自客户的请求经由JSP引擎处理后,由request对象进行封装。
 response
它是javax.servlet.ServletReponse类的一个实例。它封装由JSP产生的响应,
并被发送到客户端以响应请求。它由JSP引擎生成并传递给JSP 。
 pageContext
javax.servlet.jsp.PageContext,作用域page。
 session
javax.servlet.http.HttpSession,表示为发出请求的客户建立的会话,并只是
对这个HTTP请求才有效。
JSP基础---内置对象
• 内置对象
 application
javax.servlet.SservletContext,通过调用getServletConfig().getContext()
方法获得,作用域整个web应用程序运行期,表示JSP正在执行的上下文。
 out
javax.servlet.jsp.JspWriter,代表输出流的对象,作用域page。
 config
javax.servlet.ServletConfig,页面的ServletConfig对象,作用域page。
 page
java.lang.Object,作用域page。
JSP基础---内置对象
• 内置对象
 exception
java.lang.Throwable,作用域page。它是java.lang.Throwable类的一
个实例。它指的是运行时的异常,也就是被调用的错误页面中的结
果,并且它只在错误页面中才有(错误页面就是在页面指令中有
isErrorPage=true属性的页面)。