概述
Servlet是sun公司提供的一门用于开发动态web资源的技术。
Sun公司在其API中提供了一个servlet接口,用户若想开发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1.编写一个Java类,实现servlet接口。
2.把开发好的Java类部署到web服务器中。
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
开发第一个servlet流程:
1.在webapps目录下新建一个web应用,
然后在web应用中创建一个WEB-INFclasses目录.
2.在classes目录下创建一个动态web资源MyFirstServlet.java
</pre><pre name="code" class="java">package cn.itcast;
import java.io.*;
import javax.servlet.*;
public class MyFirstServlet extends GenericServlet{
public void service(ServletRequest req,ServletResponse res)
throws ServletException,java.io.IOException{
PrintWriter out = res.getWriter();
out.write("hello MyFirstServlet!!!!");
}
}
3.编译MyFirstServlet.java
set classpath=%classpath%;C:apache-tomcat-6.0.20libservlet-api.jar
javac -d . MyFirstServlet.java
4.把web资源部署到web服务器,就是在WEB-INF目录下新建一个web.xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<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_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>flx</servlet-name>
<servlet-class>cn.itcast.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>flx</servlet-name>
<url-pattern>/abc</url-pattern>
</servlet-mapping>
</web-app>
5、启动服务器,使用IE访问:http://localhost:8080/day05/abc
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
1)Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步。
2)装载并创建该Servlet的一个实例对象。
3)调用Servlet实例对象的init()方法。
4)创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
5)WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
HttpServlet:
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
一个简单的HttpSerblet示例:
一个简单的HttpSerblet:
1.搭建环境:
确认系统装好Tomcat服务器,设置好了java_home、catalina_home环境变量,两个分别是jdk按照路径和Tomcat安装路径
2.开发:
建立一个Web工程,导入Java EE包,实现一个Servlet接口, 或继承其子类HttpServlet,覆盖doGet方法或doPost方法
3.配置:
书写Servlet的配置信息,修改WebRoot/WEB-INF/web.xml文件,修改配置信息,否则服务器无法找到
注意:
1、如何在浏览器浏览工程,看到该应用的jap等文件?
修改C:apache-tomcat-6.0.14confweb.xml中init-param标签下变量listing值为true后,就可以在工程发布后
浏览器中输入工程路径就可以看到工程下的相关文件。如在浏览器输入:http://localhost:8080/servlettest
就会有FistServlet.java文件目录
2、具体服务器认同的,我们可以访问的应用为何要看部署时,服务器中生成的应用路径,即使我们的工程名字更改了,可能在webapps下应用的名字并没有改
3、在myeclipse中部署项目时,出现exploded location overlaps an existing deployment问题,即Deploy type为Exploded Archive(deveplopment mode),finish按钮为灰色时无法部署项目
解决决方法: project上右键properties->MyEclipse->web->web context-root为空 输入"/项目名"即可。
4、Tomcat服务器访问项目文件路径不能有中文或"."号 * .
Tomcat服务器接受客户请求并做出响应的过程 :
Tomcat=Web服务器+容器(Tomcat服务器没有Apache服务器好)
① 客户端(通常都是浏览器)访问Web服务器,发送HTPP请求。
② Web服务器接收到请求后,传递给Servlet容器。
③ Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。
④ Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。
⑤ Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器。
package cn.itcast.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
//HttpServlet时候创建一个http Servlet或一个Web站点
//根据需要至少要覆盖doGet、doPost中的一个方法,它们分别处理服务端的Get、Post请求
//service方法不用覆盖,service方法会自动调用doXXX方法
//修改程序Java代码后要程序部署工程,否则系统不知道的,如果该jsp、xml文件后系统自动感知
<span style="white-space:pre"> </span>/*类名是继承HttpServlet的类的名字,必须指明web项目下src文件夹下的绝对路径。
在配置文件中定义(注册)servlet时,<servlet-name>变量名</servlet-name>中的变量名是指在整个sevlet中的一个个servlet变量?
然后每个servlet有自己的init方法,service方法,destroy方法,一个配 置文件中定义的servlet变量间会不会有什么不同?
如果定义了两个变量名相同的servlet会怎么样?*/
private int count = 0;
public FirstServlet(){
System.out.println("in FirstServlet constructor");
}
@Override
public void init() throws ServletException {
//覆盖init方法,初始化一个Servlet时,调用Servlet构造方法后会调用这个方法
super.init();
System.out.println("in init method");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
System.out.println("in service method");
super.service(arg0, arg1);
//父类的service方法做了各种更复杂的事情,包括去调用各种doXXX方法。
//覆盖service方法时要调用父类的service方法
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse response)
throws ServletException, IOException {
//doGet有两个参数,一个是请求对象Request req,来自客户端的信息;
//一个是回复Response对象reponse,是服务端将发回给客户端的
//doGet方法可以让客户端得到信息,此方法读取客户端请求HttpServletRequest信息,
//可以写一个回复对象HttpServletRsponse的头部,可以得到回复类HttpServletRsponse的输出流,
//并写回复信息给客户端。
//System.exit(0); //此方法可以结束Java虚拟机,而Tomcat就是在JVM上运行的,
//所以此代码可以让客户一访问服务器就让服务器自动关闭
StringBuffer html = new StringBuffer();//定义一个可以变长的字符串类,让里面存储一个标准的html文件
html.append("<html>");
html.append(" <head>");
html.append(" <title>First servlet</title>");
html.append(" </head>");
html.append(" <body>");
html.append(" welcome to learn servlet!");
html.append(" </body>");
html.append("</html>");
PrintWriter writer = response.getWriter();
writer.write(html.toString());//可变长字符串转换成一般的字符串后再输出
writer.flush();
//this.destroy();
//当退出服务时去调用destory方法,并不是调用destory就退出服务
//所以这里调用destory后,servlet仍然在运行
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//doPost方法用于客户端给服务端发送信息
System.out.println(" in doPost method");
this.doGet(req, resp);
}
@Override
public void destroy() {
super.destroy();//由容器调用,标志此servlet即将退出服务
System.out.println(" in destroy method");
}
}
</pre><p><strong>web.xml为:</strong></p><pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">
<!--部分Servlet配置标签说明:
缩进表示下一行的是上一行的子标签 ,不缩进表示同级
<servlet>标签:用于配置Servlet,包含<servlet-name>、 <servlet-class>
<servlet-name>:指明配置的Servlet名称 】
<servlet-class>: 指明配置的Servlet对应项目中的那个类,是那个类的实例,要写带包名的全名
<load-on-startup>: 说明什么时候初始化一个Servlet,但标签间的值非负时在应用启动时就初始化,为负数时在用户访问服务器才初始化
<init-param>: 在此xml文档中定义一个参数
<param-name>: 指明参数名
<param-value>: 指明参数值
<servlet-mapping>: 指明servlet的映射路径
<servlet-name>: 要映射的Servlet变量名
<url-pattern>: 映射的相对应用的路径
-->
<!--Servlet、服务端、客户端三方协议:Servlet与容器要签订协议,服务器又与客户端签订协议-->
<!-- Servlet与服务器签订协议用servlet标签:要指明我们建的Servlet名字、类名(包括包名) -->
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>cn.itcast.web.FirstServlet</servlet-class>
<load-on-startup>-1</load-on-startup>
<!-- 以通过web.xml中配置load-on-startup控制启动,设置为非负数在应用启动时初始化Servlet. -->
<!-- 服务器一启动,Servlet就开始初始化了 -->
</servlet>
<!--在配置文件中注册(定义)一个名为firstServlet的servlet,其真正的类 是放在src下的
cn.itcast.web下的FirstServlet类,此类实现了Servlet接口或继承 了实现Sevlet接口的类-->
<!--服务器又与客户端签订协议用servlet-mapping标签:要指明服务器的Servlet名字、客户端访问服务端的相对此应用的地址
这样执行时,客户端找到服务器应用并且找到应用下的/firstServlet,服务器发现与这个目录对应
的Servlet是firsrServlet,再到cn.itcast.web下面找-->
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
<!-- 用于指定外部客户端访问firstServlet这个servlet的路径为/firstServlet-->
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/lu.jing</url-pattern>
</servlet-mapping>
<!--servlet-mapping用于定义servlet被浏览器访问时的相对路径,上面几句定义后,
firstServlet.class中对应的Servlet被执行的相对路径是/do或/firstServlet,比如
http://localhost:8080/servlettest/lu.jing或http://localhost:8080/servlettest/firstServlet -->
</web-app>
ServletConfig:
在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
ServletContext:
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletContext对象被包含在ServletConfig对象中,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得对ServletContext对象的引用。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
最后
以上就是殷勤绿茶为你收集整理的JavaWeb之Servlet开发、HttpServlet开发的全部内容,希望文章能够帮你解决JavaWeb之Servlet开发、HttpServlet开发所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复