Servlet处理请求过程
B/S请求响应模型
Servlet介绍
JSP是Servlet的一个成功应用,其子集。
JSP页面负责前台用户界面,JavaBean负责后台数据处理,一般的Web应用采用JSP+JavaBean就可以设计得很好了。
JSP+Servlet+JavaBean是MVC
Servlet的核心思想:在服务器端创建能响应用户请求的对象,即Servlet对象。
Servlet类:属于javax.servlet.http包中的HttpServlet类的子类。
Servlet 与 JSP 内置对象
获得内置对象的方法
获得 out 对象
JSP 中的 out 对象,一般可以使用 doXXX 方法中的 response 参数获得
默认情况下,out 对象是无法打印中文
解决方法:response.setContentType("text/html;charset=gb2312");
获得 request 和 response 对象
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将 request 参数当成 request 对象使用
//将 response 参数当成 response 对象使用
}
获得 application 对象
ServletContext application = this.get ServletContext();
//将 application 当成 application 对象来使用
配置环境
使用servlet的步骤:
1.配置 servlet-api.jar
2.编码 *.java
3.编译生成字节码文件 *.class
4.部署
5.调用
JDK 内置包中不包含编译servlet源文件需要HttpServlet、HttpServletRequest等类,因此,需要在环境变量中包含 servlet.jar,这个 jar 文件在 TOMCAT 安装目录的 common\lib 文件下,如果没有可以网上下载。
编辑 classpath,加入%CATALINA_HOME%\lib\servlet-api.jar
或将servlet.jar文件拷贝到jdk安装目录的jdk\jre\lib\ext中
部署Servlet
Hello.java
package china.dalian;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Hello extends HttpServlet
{ public void init(ServletConfig config) throws ServletException
{ super.init(config);
}
public void service (HttpServletRequest request, HttpServletResponse response) throws IOException
{ response.setContentType(“text/html;charset=gb2312”);
PrintWriter out = reponse.getWriter();
out.println(“”);
out.println(“欢迎学习servlet。”);
out.println(“”);
}
将生成的字节码文件如 Hello.class 保存在Tomcat服务器 WEB-INF\classes 目录下对应包名文件中,包名为 pakage china.dalian 在具体的目录为
WEB-INF\classes\china\dalian
在Web根目录下编辑 web.xml 文件,对 Servlet 文件进行配置
servlet 节:如何生成该servlet
servlet-mapping节:如何调用该servlet
Servlet与JSP的区别
Servlet是使用Java Servlet接口(API)运行在Web应用服务器上Java程序,其功能十分强大,它不但可以处理Http请求中的业务逻辑,而且还可以输出HTML代码来显示指定页面。
JSP是一种在Servlet规范之上的动态网页技术,在JSP页面之中,同样可以编写业务逻辑处理Http请求,也可以通过HTML代码来编辑页面,在实现功能上,Servlet与JSP貌似相同,实质存在一定的区别,表现在以下方面:
1、角色不同
2、编程方法不同
3、Servlet需要编译后运行
4、速度不同
Servlet技术特点
Servlet使用Java语言编写,它不仅继承了Java语言中的优点,而且Servlet还对Web的相关应用进行了封装,同时Servlet容器还提供了对应用的相关扩展,无论是在功能、性能、安全等方面都十分优秀,其技术特点表现在以下方面。
1、功能强大
2、可移植
3、性能高效
4、安全性高
5、可扩展
Servlet代码结构
在Java中,通常所说的Servlet是指HttpServlet对象,在声明一个对象为Servlet时,需要继承HttpServlet类。
HttpServlet类是Servlet接口的一个实现类,继承此类后,可以重写HttpServlet类中的方法对HTTP请求进行处理。 Servlet 工作原理-生命周期
Servlet 工作原理-对象模型 Servlet 工作原理
public void init ( ServletConfig config ) throws ServletException
public void service ( HttpServletRequest request HttpServletResponse response ) throw ServletException, IOException
public destroy ( )n
init方法
…
<init-param>
init-param>
…
对于web.xml中定义的param变量,可以通getInitParameter() 方法来获得。具体格式为:
String str = getInitParameter(“xxx”);
Servlet类可以直接继承这个方法,一般不需要重写。
public destroy()
共享变量
在Servlet中声明的某些成员变量,会被所有请求该servlet的用户共享。
例 servlet共享变量来计算pi的值。
PI/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 ……
doGet和doPost方法
服务器接收到用户请求后,调用service方法检查http的请求类型(如get、post),并在service方法中根据用户的请求方式,对应地调用doGet和doPost方法。
因此,不必重写service方法,可直接继承service方法,在servlet类中重写doPost或doGet方法达到同样的效果。
重定向与转发
重定向
HttpServletResponse类中通过方法
void sendRedirect(java.lang.String location) 可实现页面的跳转。
response.sendRedirect (“xxx.jsp”);
注意:该方法跳转后的页面,不能获得之前页面用户提交的数据。
转发
RequestDispatcher对象可以把用户对当前的JSP页面或servlet的请求转发给另一个JSP页面或servlet,并且将请求对象和相应对象传递给目标页面。
第一步:得到RequestDispatcher对象:
RequestDispatcher rd = request.getRequestDispatcher(“xxx.jsp”);
第二步:转发:
rd.forward( request, response);
转发 vs 重定向
HttpServletRequest对象可以调用getSession方法获取用户的session对象。该session对象即第四章中的session对象。
格式:
HttpSession session = request.getSession(true);
可以在servlet中使用session对象及其方法,实现对同一用户的确认。
Servlet接口
方 法 说 明
public void init(ServletConfig config) Servlet实例化后,Servlet容器调用此方法来完成初始化工作
public void service(ServletRequest request,ServletResponse response) 此方法用于处理客户端的请求
public void destroy() 当Servlet对象应该从Servlet容器中移除时,容器调用此方法,以便释放资源
public ServletConfig getServletConfig() 此方法用于获取Servlet对象的配置信息,返回ServletConfig对象
public String getServletInfo() 此方法返回有关Servlet的信息,它是纯文本格式的字符串,如作者、版本等
方 法 说 明
public String getInitParameter(String name) 此方法返回String类型名称为name的初始化参数值
public Enumeration getInitParameterNames() 获取所有初始化参数名的枚举集合
public ServletContext getServletContext() 用于获取Servlet上下文对象
public String getServletName() 返回Servlet对象的实例名
HttpServletRequest接口
方 法 说 明
public String getContextPath() 返回请求的上下文路径,此路径以“/”开关
public Cookie[] getCookies() 返回请求中发送的所有cookie对象,返回值为cookie数组
public String getMethod() 返回请求所使用的HTTP类型,如get、post等
public String getQueryString() 返回请求中参数的字符串形式,如请求MyServlet?username=mr,则返回username=mr
public String getRequestURI() 返回主机名到请求参数之间部分的字符串形式
public StringBuffer getRequestURL() 返回请求的URL,此URL中不包含请求的参数。注意此方法返回的数据类型为StringBuffer
public String getServletPath() 返回请求URI中的Servlet路径的字符串,不包含请求中的参数信息
public HttpSession getSession() 返回与请求关联的HttpSession对象
HttpServletResponse接口
方 法 说 明
public void addCookie(Cookie cookie) 向客户端写入cookie信息
public void sendError(int sc) 发送一个错误状态码为sc的错误响应到客户端
public void sendError(int sc, String msg) 发送一个包含错误状态码及错误信息的响应到客户端,参数sc为错误状态码,参数msg为错误信息
public void sendRedirect(String location) 使用客户端重定向到新的URL,参数location为新的地址
HttpServlet类
GenericServlet类实现了javax.servlet.Servlet接口,为程序的开发提供了方便;但在实际开发过程中,大多数的应用都是使用Servlet处理HTTP协议的请求,并对请求作出响应,所以通过继承GenericServlet类仍然不是很方便。javax.servlet.http.HttpServlet类对GenericServlet类进行了扩展,为HTTP请求的处理提供了灵活的方法。
public abstract class HttpServlet
extends GenericServlet implements Serializable
GenericServlet类
Servlet创建
在编写一个Servlet对象时,必须实现javax.servlet.Servlet接口,但在Servlet接口中包含5个方法,也就是说创建一个Servlet对象要实现这5个方法,这样操作非常不方便。javax.servlet.GenericServlet类简化了此操作,实现了Servlet接口。
public abstract class GenericServlet
extends Object
implements Servlet, ServletConfig, Serializable
Servlet的创建十分简单,主要有两种创建方法。第一种方法为创建一个普通的Java类,使这个类继承HttpServlet类,再通过手动配置web.xml文件注册Servlet对象。此方法操作比较繁琐,在快速开发中通常不被采纳,而是使用第二种方法——直接通过IDE集成开发工具进行创建。
使用集成开发工具创建Servlet非常方便,下面以Eclipse为例介绍Servlet的创建过程,其他开发工具大同小异。
Servlet配置
要使Servlet对象正常地运行,需要进行适当的配置,以告知Web容器哪一个请求调用哪一个Servlet对象处理,对Servlet起到一个注册的作用。Servlet的配置包含在web.xml文件中,主要通过以下两步进行设置。
(1)声明Servlet对象
(2)映射Servlet