Servlet

  • 格式:pdf
  • 大小:1.67 MB
  • 文档页数:50




Servlet是运行在web容器中,这个web容器 可以控制Servlet对象的生命周期,控制请求 由Servlet对象处理。 web服务器,这里的服务器不是硬件概念, 而是软件,常用的web服务器有 Tomcat, Jboss等,我们所用到的Tomcat是一个开源 的服务器,Tomcat是一个用java语言编写的 web服务器,所以需要有相应的java运行环 境,也就是JVM,还要配置tomcat的具体路 径。
service方法
每当服务器接收到对Servlet的请求时,服务 器就会产生一个新线程, 并调用service。 service方法检查HTTP请求类型,并相应地 调用doGet、doPost、doPut、doDelete。 被container调用去响应(ServletResponse)来 自客户端的请求(ServletRequest);
get & post



在浏览器的地址栏操作按回车键,或者是热连接, 都是get请求,form的method属性如果不指定,默 认为get请求(传的数据不能太大,且表现为明文)。 get请求,会将参数显示在浏览器的地址栏上,其 显示格式,在地址之后会以?开始,以'&'分隔参 数,可以通过HttpServletRequest对象的 getQueryString()方法来获得get请求的参数值。 post请求:ServletRequest对象的getInputStream() 方法可以获得一个由Socket得来的输入流,可以使 用这个流来实现文件的上传。getReader()方法可以 直接获取post请求的参数。
Servlets
Servlet基本概念

Servlet,服务器端的小程序,它是相对于 Applet而言的,Applet是客户端小程序。 Servlet和CGI都是运行在Web服务器上,用来 生成Web页面。 Servlet,是接受来自网络的请求(form表 单,以及其他的请求),并对不同请求作出 不同的响应。 Servlet,是基于Http协议的,是运行在web 服务器中的程序。
Servlet的生命周期




创建Servlet对象,通过服务器反射机制创建Servlet 实例,默认第一次请求时才会创建。 调用Servlet对象的init()方法,初始化Servlet的信 息,init()方法只会在创建后被调用一次。 响应请求,调用service()或者是doGet(),doPost() 方法来处理请求,这些方法是运行的在多线程状态 下的。 在长时间没有被调用或者是服务器关闭时,会调用 destroy()方法来销毁Servlet对象。

HTTP servlet类的基本结构


继承HttpServlet 实现至少一个service方法,如:doGet(...)和 doPost(...) service方法有两个参数,HttpServletRequest 和 HttpServletResponse: HttpServletRequest代表经过容器加工的用户的 请求 HttpServletResponse代表需要容器进一步加工 的对用户的响应 我们写的servlet需要引入javax.servlet.* 和 javax.servlet.http.* 两个命名空间
servlet name的映射,以及servlet name 与 servlet class name的映射。
构造web应用程序目录结构如下:
└─MyWebApp 应用程序名 └─WEB-INF └─classes └─lib └─*.html/*.jsp 配置文件web.xml放在WEB-INF目录下 servlet类文件放在classes目录下 将整个应用程序目录拷贝到$Tomcat\webapps\ 目录下

Servlets的多线程安全
多线程占用资源少,处理速度快,提高了效方式, 例如单纯取
值操作不会有多线程安全问题; 同步化所有访问重要数据的实例变量; 多线程 下,如果操作的是一个变量,且兼有读写操作, 就要考虑加上同步,但同步不能乱加,否则会造 成死锁问题。

Servlet环境配置
JAVA_HOME=/XXX/XXX/(JDK路径,bin的 上一层目录) CATALINA_HOME=/XXXX/XXX(tomcat的 绝对路径 windows中 X:\xxx\xxx)

Tomcat使用

在启动Tomcat时,是运行Tomcat的bin目录下的 startup.sh(windows中使用startup.bat) Linux中要显示后台的具体信息, 则用catalina.sh run 代替startup.sh命令。 判断Tomcat是否启动成功,可以在浏览器的地址栏 中使用http://localhost:8080/或 http://127.0.0.1:8080/可以访问到tomcat的主页就表 示启动成功。要想停止tomcat服务器,可使用 shutdown.sh(windows中使用shutdown.bat),如 果直接关闭启动窗口,就会造成8080端口占用错 误,这时可以再使用shutdown.sh关闭一下服务器。
测试应用

在tomcat服务器中,访问应用下的资源可以 在端口号后加上web应用文件夹得名字就可 以看到资源 http://localhost:8080/应用文件夹名/urlpattern,静态页面只能放在web应用的文件 夹下,不能够放在WEB-INF文件夹下, WEB-INF文件夹中的资源是受保护的,不能 够通过网络访问到。
使用此结构的优点

一个Web容器中可以共存多个Web应用程序。 Web容器知道该到何处寻找装入Web应用程 序所需的类。

web.xml文件的写法
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="/xml/ns/j2ee" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation=/xml/ns/j2ee /xml/ns/j2ee/web-app_2_4.xsd version="2.4"> <servlet> <servlet-name>IpLogServlet</servlet-name> <servlet-class>tarena.servlet.lc.IpLogServlet</ servlet-class> <init-param> <param-name>filename</param-name> //getServletConfig().getInitParameter(); <param-value>c:/iplog.txt</param-value> </init-param> <load-on-startup>2</ load-on-startup > //在服务器启动的时候就创建该servlet实例, </servlet> 必须是正数,小的数先创建 <servlet-mapping> <servlet-name>IpLogServlet</servlet-name> //要和servlet标签中的相同 <url-pattern>/lc/iplog</url-pattern> //指定servlet相对于应用目录的虚拟路径 </servlet-mapping> /xxx/xxx(绝对路径),xxx(相对路径) </web-app>
Servlet对客户端提供服务的时序图
Servlet生命周期状态图
init方法
当首次创建Servlet时就会调用init方法, 而不 是每个用户请求都会调用该方法。 我们可以在init方法中完成类似于构造方法的 初始化功能。 init方法一结束,servlet即可接受客户端请求;

init方法实例
Servlet的调用过程

用户通过浏览器向web服务器发送请求 http://serverip:port/appname 服务器为用户定位资源
静态资源:/a.html /a/b.html (这里的路径是针对web
应用文件夹目录)读文件并把内容发送到客户端。 动态资源:解析web.xml定位Servlet类的名字。 装载类(WEB-INF/classes | WEB-INF/lib/*.jar) 创建该对象的实例 Servlet ser=(Servlet)(Class.forName(“servle的类名 ")).newInstance(); //我们写的Servlet一定要实现Servlet接口或者继承实 现了Servlet接口的类 ser.service(request,response);
覆盖init(ServletConfig conf)方法时,应该总 是在首行调用super.init(); 或者直接覆盖init(); init方法接受ServletConfig作为参数, 用以下 方法获得参数值:

getInitParameter: 返回指定参数名称对应的值,
如果参数不存在,返回null; getInitParameterNames: 返回所有初始化参数 的名字 ;
用Servlet处理表单数据

FORM元素的属性
action: 用来指定要处理FORM数据的Servlet的URL method: 指定数据传送给HTTP服务器的方法

解析请求