Servlet

一、什么是Servlet

1、概念:servlet(java服务器小程序)是用java编写的服务器程序。
2、特点:(1)由服务器调用和执行;(2)用java语言编写的;(3)按照servlet规范开发;(4)功能强大,可以完成几乎所有的网站功能;(5)学习jsp的基础。

二、开发servlet的三种方法

1、实现servlet接口。

2、继承GenericServlet。

3、继承HttpServlet。

三、servlet开发流程

1.在%TOMCAT_HOME%/webapps下WEB-INF的文件夹,写一个文件web.xml(该网站的配置信息),建立一个classes的子文件夹,也可以从别的目录ROOT下拷贝

2.开发servlet(引入Tomcat文件夹下lib文件夹里的servlet-api.jar)

3.部署你的servlet(servlet开发流程)

4.启动Tomcat,访问你的servlet,在浏览器的地址栏中输入:http://127.0.0.1:8080/myWebSite/hello回车就可以看到servlet的输出

注意:127.0.0.1是服务器所在的IP,8080是端口号,要根据实际情况定。

在web.xml文件中添加如下代码:
<servlet>
<!—给servlet取名,可以随意取名-->
<servlet-name>hello</servlet-name>
<!—指明servlet的路径,就是servlet的包+类名-->
<servlet-class>com.test.Hello</servlet-class>
</servlet>
<servlet-mapping>
<!—给servlet取名,可以随意取名-->
<servlet-name>hello</servlet-name>
<!—浏览器中输入的url,可以随意取名-->
<url-pattern>/hello<url-pattern>
</servlet-mapping>

四、servlet的生命周期

servlet的生命周期分为以下几个阶段:
1.装载servlet,由相应的容器来完成
2.创建一个servlet实例
3.调用servlet的init()方法,该方法只会在第一次访问servlet时被调用一次
4.服务:调用servlet的service()方法,一般业务逻辑在这里处理,该方法在访问该servlet时,会被调用
5.销毁:调用servlet的destroy()方法,销毁该servlet实例,该方法在以下情况被调用:
a)tomcat重新启动
b)reload该webapps
c)重新启动电脑

五、开发Servlet的两种方法

1、通过GenericServlet去开发servlet,只需要重写service方法;
2、通过HttpServlet去开发servlet,需要重写doGet、doPost方法,这是目前用的最多的一种方法。

六、Servlet常用对象

Servlet入门

1、Request

request对象是服务器对浏览器请求的封装,request用来取出请求信息。
(1)request概述
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。
(2)request域方法
a、void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

b、Object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;

c、 void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,则该方法无用;

d、 Enumeration getAttributeNames():获取所有域属性的名称。

(3)request获取请求头数据
a、String getHeader(String name):获取指定名称的请求头;

b、Enumeration getHeaderNames():获取所有请求头名称;

c 、int getIntHeader(String name):获取值为int类型的请求头。

(4)request请求相关方法

a、int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;

b、String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;

c、String getMethod():返回请求方法,例如:GET

d、Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;

e、String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;

f、void setCharacterEncoding(String code):设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!

g、String getContextPath():返回上下文路径,例如:/hello

h、String getQueryString():返回请求URL中的参数,例如:name=zhangSan

i、String getRequestURI():返回请求URI路径,例如:/hello/oneServlet

jStringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息

l、String getServletPath():返回Servlet路径,例如:/oneServlet
m、String getRemoteAddr():返回当前客户端的IP地址;

n、String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
x、String getScheme():返回请求协议,例如:http;

y、String getServerName():返回主机名,例如:localhost

z、int getServerPort():返回服务器端口号,例如:8080。
Servlet入门

(5)常见的客户端传递参数方式

a、浏览器地址栏直接输入:一定是GET请求;

b、 超链接:一定是GET请求;

c、 表单:可以是GET,也可以是POST,这取决与<form>的method属性值;

(6)GET请求和POST请求的区别:

A、 GET请求:

a.请求参数会在浏览器的地址栏中显示,所以不安全;

b.请求参数长度限制长度在1K之内;

c.GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

B、POST请求:

a.请求参数不会显示浏览器的地址栏,相对安全;

b.请求参数长度没有限制;

(7)request获取请求参数的API
a、String getParameter(String name):通过指定名称获取参数值。
b、String[] getParameterValues(String name):当多个参数名称相同时,可以使用方法来获取。
c、Enumeration getParameterNames():获取所有参数的名字。
d、Map getParameterMap():获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String。

2、Response

response则用来添加要返回给浏览器的信息。
Response对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应。Response对象只提供了一个数据集合cookie,它用于在客户端写入cookie值。若指定的cookie不存在,则创建它。若存在,则将自动进行更新。结果返回给客户端浏览器。
(1)write
作用:向客户端发送浏览器能够处理的各种数据,包括:html代码,脚本程序等。response.write **
(2)redirect
作用:在服务器端重定向于另一个网页。response.redirect(“url”)

3、Cookie

Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
Servlet入门
Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了。
不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把IE保存的Cookie发送给服务器。
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

Cookie的生命周期:
Cookie在客户端的有效时间。
通过setMaxAge(int)来设置Cookie的有效时间。
cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。
cookie.setMaxAge(60*60):表示cookie对象可存活1小时。当创建时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时;
cookie.setMaxAge(0):cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。 
例如:求最后一次访问某网站的时间:

package com.westos.untitle2;

import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import org.apache.jasper.tagplugins.jstl.core.If;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

@WebServlet(name = "Cookie3Servlet")
public class Cookie3Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request .setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=uft-8");
        response.setCharacterEncoding("utf-8");
        //创建一个Cookie对象
        Cookie cookie=new Cookie("lasttime",new Date().toString());
        //设置Cookie生命周期
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
        String s="您是首次访问该网站";
        Cookie[] cs=request.getCookies();
        if(cs!=null){
            for(Cookie c:cs){
                if(c.getName().equals("lasttime")){
                    s="您上次访问该网站的时间是:"+c.getValue();
                }
            }
        }
        response.getWriter().println(s);
    }
}

Cookie的path
什么是Cookie的路径:
现在有WEB应用A,向客户端发送了10个Cookie,这就说明客户端无论访问应用A的哪个Servlet都会把这10个Cookie包含在请求中!但是也许只有AServlet需要读取请求中的Cookie,而其他Servlet根本就不会获取请求中的Cookie。这说明客户端浏览器有时发送这些Cookie是多余的!
可以通过设置Cookie的path来指定浏览器,在访问什么样的路径时,包含什么样的Cookie。
Cookie路径与请求路径的关系:
Cookie路径的作用:
客户端浏览器保存的3个Cookie的路径:
a: /cookietest;
b: /cookietest/servlet;
c: /cookietest/jsp;
浏览器请求的URL:
A: http://localhost:8080/cookietest/AServlet
B: http://localhost:8080/cookietest/servlet/BServlet
C: http://localhost:8080/cookietest/servlet/CServlet
请求A时,会在请求中包含a;
请求B时,会在请求中包含a、b;
请求C时,会在请求中包含a、c;
请求路径如果包含了Cookie路径,那么会在请求中包含这个Cookie,否则不会请求中不会包含这个Cookie。
A请求的URL包含了“/cookietest”,所以会在请求中包含路径为“/cookietest”的Cookie;
B请求的URL包含了“/cookietest”,以及“/cookietest/servlet”,所以请求中包含路径为“/cookietest”和“/cookietest/servlet”两个Cookie;
C请求的URL包含了“/cookietest”,以及“/cookietest/jsp”,所以请求中包含路径为“/cookietest”和“/cookietest/jsp”两个Cookie;
设置Cookie的路径:
设置Cookie的路径需要使用setPath()方法,例如:
cookie.setPath(“/cookietest/servlet”);
如果没有设置Cookie的路径,那么Cookie路径的默认值当前访问资源所在路径,例如:
访问http://localhost:8080/cookietest/AServlet时添加的Cookie默认路径为/cookietest;
访问http://localhost:8080/cookietest/servlet/BServlet时添加的Cookie默认路径为/cookietest/servlet;
访问http://localhost:8080/cookietest/jsp/BServlet时添加的Cookie默认路径为/cookietest/jsp;

4、Session

(1)什么是session:session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。 
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办法知道这是同一个客户,这就需要session对象。
(2)session对象的ID:当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个session对象,同时分配一个String类型的ID号,JSP引擎同时将这个ID号发送到客户端,存放在Cookie中,这样session对象和客户之间就建立了一一对应的关系。当客户再访问连接该服务器的其他页面时,不再分配给客户新的session对象,直到客户关闭浏览器后,服务器端该客户的session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的session对象。

5、ServletContext**

一个共用的空间,可以被所有的用户访问。
使用ServletContext:
(1)如何得到ServletContext实例
this.getServletContext();
(2)和session非常相似,每一行就是一个属性:
添加属性setAttribute(String name, Object ob);
得到值getAttribute(String name); 返回Object
删除属性removeAttribute(String name);
(3)生命周期
ServletContext中的生命周期从创建开始,到服务器关闭而结束。

使用ServletContext的注意事项:
因为存在ServletContext中的数据会长时间保存在服务器,会占用内存,因此我们建议不要向ServletContext中添加过大的数据,切忌。

使用ServletContext实例:
在网站开发中,有很多功能需要使用ServletContext,比如:
1.网站计数器
2.网站在线用户显示
3.简单的聊天系统
总之,如果是涉及到不同用户共享数据,而这些数据量不大,同时又不希望写入数据库中,我们就可以考虑使用ServletContext来实现。

七、四大作用域

1、application:全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享,生命周期为:应用程序启动到停止。

2、session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。

3、request:请求作用域,就是客户端的一次请求。

4、page:一个JSP页面。 
以上作用范围使越来越小, request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页(include,forward以及filter)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值