2016-03-25 11:34:14

一、实现一个简单的servlet程序

Servlet是在服务器端运行的小程序,这是一个很广泛的概念,并没有说是在web服务器端运行的小程序,除了在web服务器上运行,还可以在email、ftp服务器上运行,而我们现在介绍的servlet是专门在web服务器端运行的小程序。

servlet-api.jar在tomcat下就有,可以直接复制过来,或者使用maven

HTTP的请求方式包括DELETE,GET,OPTIONS,POST,PUT和TRACE,在HttpServlet类中分别提供了相应的服务方法,它们是doDelete(),doGet(),doOptions(),doPost(),doPut() 和doTrace(),这里我们使用doGet()。

package com.nicole.servletDemo01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doGet");
//doGet打印到后台
resp.getWriter().write("<a href='http://www.baidu.com'>go</a>");
//在服务器端拿到了输出流向客户端里写一个百度超链接
} }

然后我们把servlet放到tomcat里面去(当然也可以直接在eclipse中添加服务器run on server)。

在目录下C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\testServlet\WEB-INF下创建了两个文件夹和一个web.xml

在classes文件夹,放置HelloWorldServlet.class,注意这里类文件的完整路径是

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\testServlet\WEB-INF\classes\com\nicole\servletDemo01,即classes文件夹下还有子文件夹;

建立一个lib文件夹,将servlet-api.jar包放进去;

web文件里规定访问途径:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true"> <servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.nicole.servletDemo01.HelloWorldServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
</web-app>

根据url到web.xml中可以找到<url-pattern>(/helloworld)和相应的servlet-name(hello),再根据servlet-name就可以找到servlet-class (com.nicole.testServletDemo01)。

启动tomcat,输入URL:http://localhost:8080/testServlet/helloworld,可以看到一个百度页面的超链接go。

至于doGet,可以打开日志看到

 
一个HttpServlet容器(这里是tomcat)响应Web客户请求流程如下:
1)Web客户向servlet容器发出http请求;
2)Servlet容器解析Web客户的Http请求;
3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
4)Servlet容器创建一个HttpResponse对象;
5)Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
6)HttpServlet调用HttpRequest的有关方法,获取http请求信息;
7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
8)servlet容器把HttpServlet的响应结果传给Web客户。

二、servlet的生命周期

Servlet生命周期分为三个阶段:

  1,初始化阶段                    调用init()方法

  2,响应客户请求阶段        调用service()方法

  3,终止阶段,释放占用资源 调用destroy()方法

通过程序验证servlet的生命周期

package com.nicole.servletDemo02;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletLifeCycle extends HttpServlet{ public ServletLifeCycle(){
System.out.println("constructor");
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doGet");
} @Override
public void destroy() {
System.out.println("destroy");
} @Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
} }

注意到init方法里带有参数Servletconfig。当servlet配置了初始化参数后(就是在web.xml中配置的一些参数),web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

在web.xml中配置路径

 <servlet-name>cycle</servlet-name>
<servlet-class>com.nicole.servletDemo01.ServletLifeCycle</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>cycle</servlet-name>
<url-pattern>/lifecycle</url-pattern>
</servlet-mapping>

输入URL:http://localhost:8080/testServlet/lifecycle,查看日志 “tomcat-stdout.2016-03-23”

多次访问该servlet,可以看到

关闭tomcat,可以看到:

总结servlet执行顺序如下:

加载:classloader将类加载进来;

实例化:new一个对象;

初始化:调用init方法;

处理请求:对于httpservlet来说,一般就是运行doget、dopost方法;

退出服务:调用destroy方法;

并且实例化和初始化只执行了一次,一直只有一个对象提供服务。

servlet / jsp(一)的更多相关文章

  1. NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

    今天调试SSM框架项目后台JSOn接口,报出来一个让人迷惑的错误:NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config 上网查了一下别人的博 ...

  2. MVC开发模式之Servlet+jsp+javaBean

    Servlet+jsp+JavaBean组合开发是一种MVC开发模式,控制器Controller采用Servlet.模型Model采用JavaBean.视图View采用JSP. 1.Web开发的请求- ...

  3. springMVC: java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config

    springMVC开发web的时候,报错:java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config 原因:未引入jstl ...

  4. Struts框架——(一)用Servlet + JSP演示Struts基本原理

    一. 用Servlet + JSP演示Struts基本原理 struts是开源项目.它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web应用的MVC的应用框架.Stru ...

  5. Javabean+servlet+JSP(html)实例应用

    大家都知道Javabean+servlet+JSP是最简单的MVC模式.的确,在一个小型的项目中,这个模式完全够用. 它优雅并且简洁.加上jQueryui的完美展示效果,让这个模式看起来非常合适.当然 ...

  6. 报错:严重: Servlet.service() for servlet [jsp] in context with path [/20161116-Struts2-6] threw exception [/index.jsp (line: 13, column: 20) No tag "textfiled" defined in tag library imported with prefix

    严重: Servlet.service() for servlet [jsp] in context with path [/20161116-Struts2-6] threw exception [ ...

  7. servlet+jsp+java实现Web 应用

    servlet+jsp+java实现Web 应用 用java来构建一个web应用是特别容易的事情,jsp和php很像,可以嵌套在html中.程序的结构很简单,也很清楚,本文主要记录下大概的开发过程和环 ...

  8. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  9. 在Eclipse中配置Tomcat 创建和运行Servlet/JSP

    在Eclipse中配置Tomcat 创建和运行Servlet/JSP 步骤一:在Eclipse中配置Tomcat(注意下载Eclipse IDE for Java EE Developers) (1) ...

  10. javax.servlet.jsp.JspException cannot be resolved to a type

    javax.servlet.jsp.PageContext cannot be resolved to a type javax.servlet.jsp.JspException cannot be ...

随机推荐

  1. Nastya and King-Shamans CodeForces - 992E (线段树二分)

    大意: 给定序列a, 单点更新, 询问是否存在a[i]等于s[i-1], s为a的前缀和, a非负 考虑到前缀和的单调性, 枚举从1开始前缀和, 找到第一个大于等于s[1]的a[i], 如果相等直接输 ...

  2. hdu5730 分治fft

    题意:\(dp[n]=\sum_{i=1}^ndp[i]*a[n-i]+a[n]\),求dp[n], 题解:分治fft裸题,就是用cdq分治加速fft,因为后面的需要用到前面的dp来算,不可能每次都f ...

  3. 关于floyd 打印路径的问题

    我们令    f[i][j]  表示从 i-->j的最短路上j前面的那个点. 显然初始化时  f[i][j]=i;  (这样的话先判断一下i是否能到达j好点) 更新条件时,当发现通过点k能使最短 ...

  4. CodeForces 558B

    Description Amr has got a large array of size n. Amr doesn't like large arrays so he intends to make ...

  5. transition多个属性同时渐变(width,height,background)

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  6. Python的数据类型3元组,集合和字典

    首先要讲到的就是元组 元组其实拥有列表的一些特性,可以存储不同类型的值,但在某些方面元组又比不上列表 定义一个元组,你可以不用加‘ [ ] ’,你只需用逗号隔开即可 例如 1 2 3 4 5 6 7 ...

  7. C语言描述队列的实现及操作(数组实现)

    一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...

  8. 最新版本Firefox表单css兼容性

    场景描述: 为了在各浏览器上传控件保持统一的风格,用隐藏“浏览控件”的方式,在最新版本的Firefox下隐藏的“浏览”按钮漂移了. 问题分析: HTML代码: <form class=" ...

  9. POJ 2195 Going Home 最小费用流 难度:1

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17955   Accepted: 9145 Descr ...

  10. oracle查询在当前数据库下当前用户拥有的表语句

    1.查询表的数目: select count(*) from tabs select count(*) from user_tables 2.查询用户拥有哪些表: select * from tabs ...