`
zhangyuanjava
  • 浏览: 126606 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论
阅读更多
什么是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返回
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics