第三章 Servlet编程
3.2 servlet的结构
与Servlet相关的类、接口都定义在javax.servlet和javax.servlet.http这两个包中,
可以通过下载java ee api文档来查看。javax.servlet包主要定义了Servlet编程的一
般架构,而javax.servlet.http则定义了基于http协议的Servlet相关API。
3.2.1 javax.servlet.servlet 接口与抽象类
Servlet.java这个接口中定义的init(),service()和destroy()方法是Servlet生命周期
方法,这些方法将在Servlet对象特定的状态下被Web服务器自动调用。
1.init()方法:
当一个Servlet被Web服务器实例化以后,这个方法会被web服务器自动调用。并且只调
用一次。我们在Servlet编程的时候,可以把需要初始化的代码放到这个方法中。
2. destroyed()方法。
当一个Servlet被销毁的时候,这个方法会被调用,编写Servlet的时候可以把在当前
Servlet实例被销毁之前需要执行的代码写到这个方法中,通常是释放资源的操作。
3. getServletConfig()方法:
返回一个ServletConfig类型的对象,通过个个对象可以获得当前Servlet设置信息和初
始化Servlet时通过俘。xml配置文件所传入的参数。
4. getServletInfo()方法:
返回有关Servlet的信息,例如作者、Servlet的版本和Servlet的版权信息。
3.2.2 javax.servlet.GenericServlet:
javax.servlet.GenericServlet这个抽象类,直接把Servlet接口的中所有方法都实现
了。方法体为空。这种设计思想体现的是设计模式中缺省适配器(Default Adapter)
模式。
3.2.3 javax.servlet.http.HttpServlet
这类继承了javax.servlet.GenericServlet的javax.servlet.http.HttpServlet就成为
我们编写Servlet使用最多的类。
流程:
Interface(接口)-GenericServlet(空实现类)-HttpServlet(实现类)
3.3 Servlet里的方法:
根据需求对其中的doPost()和doGet()方法进行重写。
解决乱码问题:
response.setContentType("text/html;charset=utf-8");
此句要写在new out对象之前才会起作用。
3.4.2 用MyEclipse新建Web Project
project name:Web项目名称。
Location:是否需要专门指定项目存放位置。默认选项是选中,使用设置好的项目存放
位置。通常使用默认值。
Directory:项目默认的存放位置,新建的Web项目存放在工作空间(Workspace)中。
Source folder: Web项目中的Java源程序的存放目录,例如JavaBeans和Servlet的源程
序就存放到这个目录中。通常该选项使用默认值。
Web root folder: 这个目录包括所有的Web内容,例如:JSP文件和HTML,也包括WEB-
INF目录和web.xml文件。
Context root URL: 这个选项指定将来Java Web应用访问的上下文路径名称。这个值,
MyEclipse会默认成“Project name”的值。Java web应用部署成功以后,会通过这个
名字来访问这个java web应用。如:“http://www.cari-power.com/project”来访问
。
Java Enterprise specification Level: 设定当前Web项目使用哪个Java EE的版本。
JSTL Support: 是否需要java standard tag library(jstl)的支持。如果勾选,相应
的JAR文件会添加到项目“WebRoot/WEB-INF/lib”目录下。Java EE 5.0,这个选项是不
可选的。
3.5 Servlet生命周期描述:
Servlet整个生命周期是这样的,当Servlet部署到Web容器中以后,客户机发送调用这
个Servlet的请求到达Web容器,Web容器会先判断所调用的Servlet的实例是否存在。如
果存在,新创建一个线程,并在新建线程中调用这个实例的service()方法。如果不存
在,装载当前所调用的Servlet的类,调用构造方法生成这个Servlet的实例,调用这个
实例的init()方法进行初始化,特别强调init()这个方法只会在Servlet初始化的时候
调用一次,除非这个Servlet被重新部署。然后在新建的线程中调用这个Servlet实例的
service()方法,处理用户的请求,回应给用户相应的内容。
当Servlet不再需要使用的时候,比如其所在的WEB应用被卸载或Web服务器关闭时,它
会被卸载掉,卸载前调用destory()方法,完成所有相关资源的释放。
HttpServlet的service()方法会对不同的HTTP请求分发给不同的方法去处理。这些请求
有GET,HEAD,PUT,POST,DELETE,OPTIONS和TRACE,但通常用的只有GET和POST。不
管是doGet()和doPost()方法都需要接收HttpServletRequest和HttpServletResponse
类型的参数。
3.6 利用web.xml设定参数:
从web.xml里获得参数:
int repeat = Integer.parseInt(getInitParameter("repeat"));
web.xml写法:
……
<init-param>
<param-name>repeat</param-name>
<param-value>5</param-value>
</init-param>
……
然后在这个Servlet中就可以使用从GenericServlet继承过来的getInitParameter()方
法获得初始化参数的数值。
3.7 Servlet所运行的这个服务器的运行参数以及这些参数的具体含义:
服务器IP:
request.getRemoteAddr();
服务器名:
request.getServerName();
服务器端口号:
request.getServerPort();
协议名:如:HTTP
request.getScheme();
协议版本:
request.getProtocol();
请求的方法:
request.getmethod();
请求的URl:
request.getRequestURI();
上下文路径:
request.getContextPath();
Servlet路径:
request.getServletPath();
3.8 Servlet获得头信息:
即,获取请求客户端的参数以及这些参数的具体含义。
写法:
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()){
headers = (String)e.nextElement();
if(headers != null){
out.println(header);
out.println(request.getHeader(headers));
}
}
3.2 servlet的结构
与Servlet相关的类、接口都定义在javax.servlet和javax.servlet.http这两个包中,
可以通过下载java ee api文档来查看。javax.servlet包主要定义了Servlet编程的一
般架构,而javax.servlet.http则定义了基于http协议的Servlet相关API。
3.2.1 javax.servlet.servlet 接口与抽象类
Servlet.java这个接口中定义的init(),service()和destroy()方法是Servlet生命周期
方法,这些方法将在Servlet对象特定的状态下被Web服务器自动调用。
1.init()方法:
当一个Servlet被Web服务器实例化以后,这个方法会被web服务器自动调用。并且只调
用一次。我们在Servlet编程的时候,可以把需要初始化的代码放到这个方法中。
2. destroyed()方法。
当一个Servlet被销毁的时候,这个方法会被调用,编写Servlet的时候可以把在当前
Servlet实例被销毁之前需要执行的代码写到这个方法中,通常是释放资源的操作。
3. getServletConfig()方法:
返回一个ServletConfig类型的对象,通过个个对象可以获得当前Servlet设置信息和初
始化Servlet时通过俘。xml配置文件所传入的参数。
4. getServletInfo()方法:
返回有关Servlet的信息,例如作者、Servlet的版本和Servlet的版权信息。
3.2.2 javax.servlet.GenericServlet:
javax.servlet.GenericServlet这个抽象类,直接把Servlet接口的中所有方法都实现
了。方法体为空。这种设计思想体现的是设计模式中缺省适配器(Default Adapter)
模式。
3.2.3 javax.servlet.http.HttpServlet
这类继承了javax.servlet.GenericServlet的javax.servlet.http.HttpServlet就成为
我们编写Servlet使用最多的类。
流程:
Interface(接口)-GenericServlet(空实现类)-HttpServlet(实现类)
3.3 Servlet里的方法:
根据需求对其中的doPost()和doGet()方法进行重写。
解决乱码问题:
response.setContentType("text/html;charset=utf-8");
此句要写在new out对象之前才会起作用。
3.4.2 用MyEclipse新建Web Project
project name:Web项目名称。
Location:是否需要专门指定项目存放位置。默认选项是选中,使用设置好的项目存放
位置。通常使用默认值。
Directory:项目默认的存放位置,新建的Web项目存放在工作空间(Workspace)中。
Source folder: Web项目中的Java源程序的存放目录,例如JavaBeans和Servlet的源程
序就存放到这个目录中。通常该选项使用默认值。
Web root folder: 这个目录包括所有的Web内容,例如:JSP文件和HTML,也包括WEB-
INF目录和web.xml文件。
Context root URL: 这个选项指定将来Java Web应用访问的上下文路径名称。这个值,
MyEclipse会默认成“Project name”的值。Java web应用部署成功以后,会通过这个
名字来访问这个java web应用。如:“http://www.cari-power.com/project”来访问
。
Java Enterprise specification Level: 设定当前Web项目使用哪个Java EE的版本。
JSTL Support: 是否需要java standard tag library(jstl)的支持。如果勾选,相应
的JAR文件会添加到项目“WebRoot/WEB-INF/lib”目录下。Java EE 5.0,这个选项是不
可选的。
3.5 Servlet生命周期描述:
Servlet整个生命周期是这样的,当Servlet部署到Web容器中以后,客户机发送调用这
个Servlet的请求到达Web容器,Web容器会先判断所调用的Servlet的实例是否存在。如
果存在,新创建一个线程,并在新建线程中调用这个实例的service()方法。如果不存
在,装载当前所调用的Servlet的类,调用构造方法生成这个Servlet的实例,调用这个
实例的init()方法进行初始化,特别强调init()这个方法只会在Servlet初始化的时候
调用一次,除非这个Servlet被重新部署。然后在新建的线程中调用这个Servlet实例的
service()方法,处理用户的请求,回应给用户相应的内容。
当Servlet不再需要使用的时候,比如其所在的WEB应用被卸载或Web服务器关闭时,它
会被卸载掉,卸载前调用destory()方法,完成所有相关资源的释放。
HttpServlet的service()方法会对不同的HTTP请求分发给不同的方法去处理。这些请求
有GET,HEAD,PUT,POST,DELETE,OPTIONS和TRACE,但通常用的只有GET和POST。不
管是doGet()和doPost()方法都需要接收HttpServletRequest和HttpServletResponse
类型的参数。
3.6 利用web.xml设定参数:
从web.xml里获得参数:
int repeat = Integer.parseInt(getInitParameter("repeat"));
web.xml写法:
……
<init-param>
<param-name>repeat</param-name>
<param-value>5</param-value>
</init-param>
……
然后在这个Servlet中就可以使用从GenericServlet继承过来的getInitParameter()方
法获得初始化参数的数值。
3.7 Servlet所运行的这个服务器的运行参数以及这些参数的具体含义:
服务器IP:
request.getRemoteAddr();
服务器名:
request.getServerName();
服务器端口号:
request.getServerPort();
协议名:如:HTTP
request.getScheme();
协议版本:
request.getProtocol();
请求的方法:
request.getmethod();
请求的URl:
request.getRequestURI();
上下文路径:
request.getContextPath();
Servlet路径:
request.getServletPath();
3.8 Servlet获得头信息:
即,获取请求客户端的参数以及这些参数的具体含义。
写法:
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()){
headers = (String)e.nextElement();
if(headers != null){
out.println(header);
out.println(request.getHeader(headers));
}
}