参考书籍:《J2EE开源编程精要15讲》

Servlet是可以处理客户端传来的HTTP请求,并返回响应,由服务器端调用执行,有一定编写规范的Java类。

例如:  

 

 package test;

 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 Test extends HttpServlet { public Test() {
super();
} public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
} //处理HTTP GET请求
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设定Web服务器的响应方式是HTML
response.setContentType("text/html");
//获得PrintWriter对象,以打印输出响应
PrintWriter out = response.getWriter();
//吧HTML形式的响应显示在浏览器上
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the GET method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
//处理HTTP POST请求
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
} public void init() throws ServletException {
// Put your code here
}
}

Servlet需要部署在Web容器中,生命周期由Web容器管理,可分为以下几个阶段:

  • 装载Servlet:一般动态执行
  • 创建一个Servlet实例
  • 调用Servlet的init()方法
  • 服务:如果Web容器接受到对此Servlet请求,调用相应的响应方法(通过web.xml配置Servlet)
  • 销毁:实例被销毁,调用destroy()    

主要接口类:

  HttpServletRequest接口提供了处理客户请求的方法,如String getParameter(String name)等(注:name为表单标签的name属性名),从客户页面窗口取得数据,如取得用户名

 HttpServletRequest request;
String name=request.getParameter("username");

  HttpServletResponse接口提供了以HTML页面形式把请求发给客户的方法,主要有setContentType()等,如请求转发给下一个页面

 HttpServletResponse response;
response.sendRedirect("next.jsp");

  HttpSession接口记录当前Servlet中的用户对话,可用于存储关于用户对话的信息,可用HttpSession接口的putValue()和getValue()等方法存取数据,通过HttpServeltRequest对象的getSession()方法可生成一个HttpSession对象,如

 HttpServletRequest request;
HttpSession session=request.getSession(true);

  RequestDispatcher接口可通过forward(HttpServletRequest request,HttpServletResponse response)方法把Servlet的请求提交或委派给另一个资源,如Servlet、HTML或JSP。RequestDispatcher对象可通过HttpServletRequest对象的getRequestDispatcher()方法生成。如

 RequestDispatcher rd=request.getRequestDispathcer("reply.jsp");
rd.forward(request,response);

综合使用示例:

 package test;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class Test extends HttpServlet { public Test() {
super();
} public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
} //处理HTTP GET请求
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
//处理HTTP POST请求
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name=request.getParameter("username");
RequestDispatcher rd; try{
try{
if(name.equals("Tom")){
HttpSession session=request.getSession();
session.setAttribute("nm", name);
response.sendRedirect("reply.jsp");
}
else{
rd=request.getRequestDispatcher("error.jsp");
rd.forward(request, response);
}
}catch(ServletException e){
e.printStackTrace();
}
}catch(IOException e){
e.printStackTrace();
}
} public void init() throws ServletException {
// Put your code here
}
}

  

当Servlet部署到Web服务器中时,需要在Web配置文件web.xml中声明,如:

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Login_Proj</display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>login.LoginServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

假设用户表单action="LoginServlet",表单提交跳转到/LoginServlet,web.xml中<servlet-mapping>标签内<url-pattern>/LoginServlet</url-pattern>对应的<servlet-name>为LoginServlet,于是在<servlet>标签下找<servlet-name>为LoginServlet的servlet,找到对应的类login.LoginServlet。

  

最新文章

  1. 2013-09-22 [随笔]-Roy
  2. random模块
  3. React之JSX入门
  4. [MFC] MFC 获取指定窗口截图(大小可调)
  5. Python学习笔记(1):列表元组结构
  6. Android开发贴士集合
  7. 编译android源码官方教程(5)编译完之后刷机、编译fastboot
  8. memory CPU cache books
  9. 【hadoop】有参考价值的博客整理
  10. uva 11178 Morley&amp;#39;s Theorem(计算几何-点和直线)
  11. js页面跳转 和 js打开新窗口 方法
  12. C#研究OpenXML之路(1-新建工作簿文件)
  13. Objective-C特有类型——id
  14. 企业移动化?AppCan教你正确的打开方式
  15. 如何使用ASP.NET Core、EF Core、ABP(ASP.NET Boilerplate)创建分层的Web应用程序(第一部分)
  16. child_process 子进程
  17. Linux 进程后台运行的几种方式 screen
  18. 每天备份tomcat日志
  19. Vue创建头部组件示例
  20. 关于ios下字体描边的一个细节

热门文章

  1. iOS$299企业账号In House ipa发布流程
  2. UVALive 4872 Underground Cables 最小生成树
  3. Code First 中的 TPH TPT TPC
  4. NGUI屏幕自适应解决方案
  5. 利用vim阅读源代码一个好用的工具
  6. Python-aiohttp百万并发
  7. struts2-2.3.4.1的struts-default.xml源码
  8. MyEclipse +Tomcat 异常操作
  9. Java API —— Map接口
  10. UDP丢包和无序 问题的解决方法