------------------------------------------------------------------------------------------------------------------------------------
什么是Servlet?
J2EE规范的一部分,是用java语言编写的服务器端程序,用于创建动态页面,不依赖于具体的协议,必须运行在web容器中。Servlet是J2EE 的其中的一个标准,servlet开发人员遵循这个标准开发的Servlet可以部署到任何的web application server中。
1.模块化的程序,运行在服务器端,增强了请求、响应导向服务。
2.应用示例:
a)访问远端对象
b)跟踪大量信息
c)多用户协作
------------------------------------------------------------------------------------------------------------------------------------
CGI和Servlet的优缺点
CGI程序可以有多种语言编写,但是服务器端处理请求使用单进程,消耗服务器端资源。
Servlet只能由java编写,服务器端处理请求使用多线程,移植性好。
------------------------------------------------------------------------------------------------------------------------------------
使用Servlet的步骤
1.写Servlet类
(1)继承HttpServlet
(2)重写服务方法,一般是以下两种方式:
doGet(HttpServletRequest request,HttpServletResponse response)
doPosr(HttpServletRequest request,HttpServletResponse response)
(3)设置响应的文本类型
response.setContext("text.xml");
(4)获取输出流
response.getWriter();
response.getOutputStream();
(5)往客户端写内容
pw.print(...);
(6)关闭输出流
pw.close();
(7)可以记录日志
getServletContext().log(...);
2.编译Servlet
javac -classpath javax.servlet.jar -d Servlet类.java==>产生.class文件
3.创建符合要求的WEB应用目录结构
应用名
---->WEB-INF
----->classes :存放生成的.class文件
----->lib :存放第三方jar包
----->web.xml :配置Servlet
web.xml中的配置:
<servlet>
<servlet-name>name</servlet-name>
<servlet-class>class</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>name</servlet-name>
<url-pattern>url</url-pattern>
</servlet-mapping>
4.将web应用程序打成war包
jar -cvf hello.war
在Tomcat中能自动识别war包,并对其进行解压
5.将war包考到Tomcat/webapps下
6.启动Tomcat
7.打开浏览器访问 http://127.0.0.1:8080/应用名/servlet的url-pattern
-----------------------------------------------------------------------------------------------------------------------------------
Servlet 的生命周期
1.通过web Container容器装载(J2EE的组件都是被动地装载入Container)并实例化Servlet对象,产生一个实例。
2.调用init()方法(在整个生命周期中只被调用一次)
init(ServletConfig config)先被调用, init()后被调用
设置初始化参数:
(1) 全局的
<context-param>
<param-name>age</param-name>
<param-value>20</param-value>
</context-param>
通过ServletConfig.getServletContext().getInitParameter(...)获取
通过getServletContext()获得运行上下文环境才能获取到全局参数的值
(2)局部的
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
</servlet>
通过ServletConfig.getInitParameter(....)获取
3.根据用户的每一次请求,调用一次service()服务方法doGet()/doPost()等(在整个生命周期中可被多次调用);
a.service(ServletRequest req,ServletResponse res)
b.service(HttpServletRequest req,HttpServletResponse res)
c.doGet()/doPost()
需要考虑多线程的问题:
多线程的处理
1)implements SingleThreadModel每个请求创建一个Servlet实例为其服务,性能低。
2)建议在servlet类不要用实例变量,如果用,使用synchronized进行同步
4.调用destroy()方法(在整个生命周期只被调用一次)
-----------------------------------------------------------------------------------------------------------------------------------
用Servlet处理表单数据
1. Form元素的属性
1) ACTION: 用来指定要处理FORM数据的Servlet的URL,也可以指定FORM数据将要发送到的电子邮件;
2) METHOD: 指定数据传送给HTTP服务器的方法;
3) ENCTYPE: 指定数据在传输之前进行编码的方式, 例multipart/form-data 编码将每个字段作为MIME可兼容的文档的单独部分传输。
2. 解析请求
对于所有的请求:
a. getParameterNames: 以Enumeration形式获取表单中清单, 每一项都可以转换成String;
b. getParameter: 返回表单中参数名(区分大小写)对应的值(没有这样的参数,返回null;没有任何值,返回空String);
c. getParameterValues: 返回表单中参数名(区分大小写)对应的字符串数组(没有这样的参数,返回null;只有一个值,返回值为单一元素组);
http请求:包括请求头和请求体
Get请求:浏览器提交的数据是放在请求头部的;
Post请求:浏览器提交的数据是放在请求体部的;
----------------------------------------------------------------------------------------------------------------------------------
Servlets中的持久状态
1. HTTP协议中无状态的优缺点:
优点:可以服务很多客户端;
缺点:不能在多个请求之间共享信息(通过Cookie和Session解决);
2. Cookies
1) Cookies是Web服务器发送到浏览器的简短文本信息,以后在访问同一个Web站点或域时浏览器就会毫无更改地返回该文本信息。
2) 用户可以决定是否接受Cookie。
3) 一个Cookie由以下内容组成:
a. 名称;
b. 单个值;
c. 一些操作属性:路径或所在域、有效期以及版本号。
4) 每个站点,浏览器通常只接受20条Cookie,总共接受300条,以及每条Cookie限制为4KB。
3. 设置Cookie
1) 创建Cookie:
Cookie c = new Cookie("CookieName", "CookieValue");
2) 设置有效期:
c.setMaxAge(int lifetime); 黙认为负值,只作用于当前会话,不能存储在磁盘上;如为0值表示删除Cookie;有效值为秒为单位。
3) 在响应头中放置Cookie:
response.addCookie(c);
4) 从客户端读取Cookie:
Cookie[] cookies = request.getCookies();
Cookie cookie;
for(int i=0; i<cookies.length; i++)
{
cookie = cookies[i];
out.println("<tr><td>" + cookie.getName() + "</td><td>" + cookie.getValue());
}
4. Sessions
1) 一个客户端和一个服务器端一次连接信息的所有集合,通过brower发出,由服务器端的servlet调用;
2) 提供一种方式在多个页面请求间确认用户或者储存关于用户的信息;
3) 实现会话跟踪的三种方式:a. cookie; b. URL重写; c. 隐藏的表单段
5. 设置Sessions
1) 创建Sessions:
HttpSession session = request.getSession(true); // true表示如不存在则创建一个新的session
2) 用指定名称将一个对象绑定到session:
public void setAttribute(String name, Object value);
3) 删除与指定名称相关的所有值:
public void removeAttribute(String name);
4) 返回会话中所有属性名
public Enumeration getAttributeNames();
5) 返回指定名称对象
public Object getAttribute(String name);
6. Cookies和Sessions的比较
1) Cookies可由用户决定是否需要, Sessions不能;
2) Cookies是一种装载sessionID的可能;
3) Cookies存储在客户端, Sessions存储于服务器端;
4) Cookies可以构造,可以由Request取出,由Response返回