Servlet简介
Servlet是在服务器端运行的Java程序,可以接收客户端请求并做出响应。
Servlet主要用于生成动态的内容。它可以接受和处理请求,并动态生成HTML内容对客户端进行响应
Servlet与JSP的关系
Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
初始Servlet
i
mport java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServletTest extends HttpServlet { //继承javax.servlet.http.HttpServlet类
public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
sponse.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println(" <head><title>Servlet</title></head>");
out.println(" <body>");
out.println("你好,欢迎来到Servlet世界");
out.println(" </body>");
out.println("</html>");
out.close();
}
}
Servlet接口
定义了所有Servlet需要实现的方法
方法名称 | 功能描述 |
void init (ServletConfig config) | 由 Servlet 容器调用,用于完成Servlet对象在处理客户请求前的初始化工作 |
void service ( ServletRequest req,ServletResponse res) | 由 Servlet 容器调用,用来处理客户端的请求 |
void destroy ( ) | 由 Servlet 容器调用,释放Servlet对象所使用的资源 |
ServletConfig getServletConfig ( ) | 返回ServletConfig 对象,该对象包含此 Servlet 的初始化和启动参数。返回的 ServletConfig 对象是传递给 init( ) 方法的对象 |
String getServletInfo ( ) | 返回有关 Servlet 的信息,比如作者、版本和版权。返回的字符串是纯文本,而不是任何种类的标记(如 HTML、XML等) |
GenericServlet抽象类
提供了Servlet与ServletConfig接口方法的默认实现(service( )方法除外)
方法名称 | 功能描述 |
public void init ( ServletConfig config ) | 对Servlet接口中init()方法的实现,对ServletConfig实例进行了保存。此方法还有一个无参的重载方法,可用于子类中重写 |
public String getInitParameter (String name ) | 返回web.xml中名称为name的初始化参数的值 |
public ServletContext getServletContext ( ) | 返回ServletContext对象的引用 |
HttpServlet抽象类
继承自GenericServlet
处理HTTP协议的请求和响应
方法名称 | 功能描述 |
public void service ( ServletRequest req, ServletResponse res ) | 对GenericServlet类中service()方法的实现,将请求分发给protected void service (HttpServletRequest req, HttpServletResponse res ) |
protected void service ( HttpServletRequest req, HttpServletResponse res ) | 接收HTTP 请求,并将它们分发给此类中定义的 doXXX( ) 方法 |
protected void doXXX ( HttpServletRequest req, HttpServletResponse res ) | 根据请求方式的不同分别调用的相应处理方法,如doGet()、doPost()等 |
ServletConfig接口
在Servlet初始化过程中获取配置信息
一个Servlet只有一个ServletConfig对象
方法名称 | 功能描述 |
String getInitParameter ( String name ) | 获取web.xml中设置的以name命名的初始化参数值 |
ServletContext getServletContext( ) | 返回Servlet的上下文对象引用 |
ServletContext接口
获取Web应用上下文,与Servlet容器进行通信
方法名称 | 功能描述 |
String getInitParameter (String name ) | 获取名为name的系统范围的初始化参数值,系统范围的初始化参数可在部署描述符中使用<context-param>元素定义 |
void setAttribute ( String name, Object object ) | 设置名称为name的属性 |
Object getAttribute ( String name ) | 获取名称为name的属性 |
String getRealPath (String path ) | 返回参数所代表目录的真实路径 |
void log ( String message ) | 记录一般日志信息 |
请求、响应相关接口
ServletRequest接口
获取客户端请求的数据
方法名称 | 功能描述 |
Object getAttribute ( String name ) | 获取名称为name的属性值 |
void setAttribute ( String name, Object object ) | 在请求中保存名称为name的 属性 |
void removeAttribute (String name) | 清除请求中名字为name的属性 |
String getCharacterEncoding ( ) | 返回请求体所使用的字符编码 |
void setCharacterEncoding (String charset ) | 设置请求体的字符编码 |
String getParameter ( String name ) | 返回指定请求参数的值 |
String[ ] getParameterValues (String name ) | 返回指定请求参数的全部值 |
RequestDispatcher getRequestDispatcher( String path ) | 返回指向指定路径的请求分发 对象 |
HttpServletRequest接口
除了继承ServletRequest接口中的方法,还增加了一些用于读取HTTP请求信息的方法
方法名称 | 功能描述 |
String getContextPath( ) | 返回请求URI中表示请求上下文的路径,上下文路径是请求URI的开始部分 |
Cookie[ ] getCookies( ) | 返回客户端在此次请求中发送的所有cookie对象 |
HttpSession getSession( ) | 返回和此次请求相关联的session,如果没有给客户端分配session,则创建一个新的session |
String getMethod( ) | 返回此次请求所使用的HTTP方法的名字,如GET、POST |
String getHeader( String name ) | 返回指定的请求头信息 |
ServletResponse接口
设置响应参数和向客户端发送响应数据
方法名称 | 功能描述 |
PrintWriter getWriter ( ) | 返回PrintWriter对象,用于向客户端发送文本 |
String getCharacterEncoding ( ) | 返回在响应中发送的正文所使用的字符编码 |
void setCharacterEncoding ( String charset ) | 设置响应的字符编码 |
void setContentType ( String type ) | 设置发送到客户端的响应的内容类型,此时响应的状态属于尚未提交 |
HttpServletResponse接口
除了继承ServletResponse接口中的方法,还增加了适用于HTTP响应的新方法
方法名称 | 功能描述 |
void addCookie ( Cookie cookie ) | 增加一个cookie到响应中,这个方法可多次调用,设置多个cookie |
void addHeader ( String name,String value ) | 将一个名称为name,值为value的响应报头添加到响应中 |
void sendRedirect(String location) | 发送一个临时的重定向响应到客户端,以便客户端访问新的URL |
void encodeURL ( String url ) | 使用session ID对用于重定向的URL进行编码 |
Servlet的应用
步骤
1、创建Servlet
继承HttpServlet
重写doPost()或doGet()方法
2、部署Servlet
编译Servlet到/WEB-INF/classes目录
编辑部署描述文件web.xml
<servlet>
<servlet-name>HttpServletTest</servlet-name>
<servlet-class>cn.store.servlet.HttpServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HttpServletTest</servlet-name>
<url-pattern>/HttpServletTest</url-pattern>
</servlet-mapping>
3、启动Tomcat,访问Servlet
使用Servlet实现控制器
Servlet则仅充当控制器的角色,它的作用类似于调度员:所有用户的请求都 发给Servlet,Servlet调用Model来处理用户请求,并调用JSP来呈现处理结果;或者Servlet直接调用JSP将应用的状态数据呈现给用户。
Model通常由JavaBean来充当,所有的业务逻辑、数据访问逻辑都在Model中实现。
控制器负责接收客户端的额请求,它既不直接对客户端输出响应,也不处理用户请求,只调用JavaBean来处理用户请求。JavaBean处理结束后,Servlet根据处理的结果,调用不同的JSP页面向浏览器呈现处理结果。
Servlet的生命周期
生命周期的各个阶段
实例化——>Servlet 容器创建 Servlet 的实例
初始化——>该容器调用 init ( ServletConfig ) 方法
服务——>如果请求 Servlet,则容器调用 service() 方法
销毁——>销毁实例之前调用 destroy() 方法
获取Servlet初始化参数
Servlet初始化参数配置
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>demo.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>initParam</param-name>
<param-value>Hello Servlet</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
获取初始化参数
public void doGet ( HttpServletRequest request,
HttpServletResponse response )
throws ServletException, IOException {
System.out.println("处理请求时,doGet()方法被调用。");
String initParam = getInitParameter( "initParam" );
System.out.println(initParam);
}
获取Servlet上下文参数
读取Servlet上下文
public class HelloServlet extends HttpServlet {
// …省略其他代码
public void doGet ( HttpServletRequest request,
HttpServletResponse response )
throws ServletException, IOException {
System.out.println("处理请求时,doGet()方法被调用。");
String initParam = getInitParameter( "initParam" );
String contextParam =
this.getServletContext().getInitParameter( "contextParam" );// 根据参数名称进行读取
System.out.println("Servlet初始化参数" + initParam);
System.out.println("系统初始化参数" + contextParam);
}
}