1. 什么是Servlet

Servlet是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过“请求-相应”编程模型来访问的这个驻留在服务器内存里的Servlet程序。

 

2. Tomcat容器等级

Tomcat的容器分为四个等级,Servlet的容器管理Context容器,一个Context对应一个Web工程。

 

3. 手工编写第一个Servlet

3.1. 继承HttpServlet

3.2. 重写doGet()或者doPost()方法

3.3. 在web.xml中注册Servlet

3.4. 实操

——新建WEB项目

3.4.1. 新建WebProject

3.4.2. 填写WebProject名称,完成

3.4.3. 打开WebRoot -> index.jsp,修改字符编码为UTF-8

 1 //<%@ page language="java" import="java.util.*" pageEncoding-"ISO-8859-1"%>
 2 
 3 <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"%>
 4 
 5 //<body>
 6 //    This is my JSP page. <br>
 7 //</body>
 8 
 9 <body>
10   <hl>第一个Servlet小例子</hl>
11   <hr>
12   <!--用Get方式请求Servlet // href内填访问地址-->
13   <a href="servlet/HelloServlet">Get方式请求HelloServlet</a> 
14   <!-- 用Post方式请求Servlet -->
15   <!-- from表示提交表单,action表示表单提交给哪个程序,method表示提交方式 -->
16   <from action="servlet/HelloServlet" method="post"> 
17     <input type="submit" value="Post方式请求HelloServlet" />
18   </from>
19 </body>

 

——编写用户自定义Servlet类

3.4.4. 在src里新建包,名称为servlet

3.4.5. 包下新建类,名称为HelloServlet,指定父类为HttpServlet,完成

——重写doGet和doPost两个方法

3.4.6. 选择Source -> Override /Implement Methods,选中重写doGet和doPost两个方法,确定

3.4.7. 修改参数名,重写方法内容

 1 package servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 // 继承与HttpServlet
12 public class HelloServlet extends HttpServlet {
13 
14     @Override
15     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
16     // TODO Auto-generated method stub
17     //super.doGet(req, resp);
18     System.out.println("处理Get()请求....");
19     PrintWriter out = response.getWriter(); // 获得一个给浏览器输出的对象
20     response.setContentType("text/html;charset=utf-8"); // 指定输出类型;输出字符集
21     out.println("<strong>HelloServlet</strong><br>"); // out对象给浏览器输出信息,可写入HTML代码
22     }
23 
24     @Override
25     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
26     // TODO Auto-generated method stub
27     //super.doPost(req, resp);
28     System.out.println("处理Post()请求....");
29     PrintWriter out = response.getWriter(); // 获得一个给浏览器输出的对象
30     response.setContentType("text/html;charset=utf-8"); // 指定输出类型;输出字符集
31     out.println("<strong>HelloServlet</strong><br>"); // out对象给浏览器输出信息,可写入HTML代码
32     }
33     
34 }

 

——注册Servlet

3.4.8. 打开WebRoot -> WEB-INF -> web.xml,增加两个标签在<welcome-file-list>之后

 1   <!--配置Serlvet-->
 2   <servlet>
 3     <!--servlet的名称-->
 4     <servlet-name>HelloServlet</servlet-name> 
 5     <!--访问servlet所在的类,要求路径写完整即包名.类名-->
 6     <servlet-class>servlet.HelloServlet</servlet-class> 
 7   </servlet>
 8   
 9   <!--配置servlet-mapping-->
10   <servlet-mapping>
11     <!--与上方的名称一一对应-->
12     <servlet-name>HelloServlet</servlet-name> 
13     <!--servlet访问的路径,要求与index.jsp中的超链接地址一一对应,前一个/表示根目录-->
14     <url-pattern>/servlet/HelloServlet</url-pattern> 
15   </servlet-mapping>

——发布项目

3.4.9. 点击

打开manage deployments界面,选择发布项目,点击ADD选择Tomcat7,点击完成

3.4.10. 点击启动

3.4.11. 打开浏览器,输入地址(http://localhost:8080/MyFirstServletDemo/index.jsp)

 

4. 使用MyEclipse编写Servlet

新建工程,修改index.jsp的编码格式和页面内容

4.1. src -> new -> Servlet

填写包名称,Servlet名称,

4.2. 重写doGet()和doPost()

输出HTML格式内的<body>标签内增加HTML代码

4.3. 部署运行

 

5. Servlet执行流程和生命周期

5.1. Servlet的执行流程

5.2. Servlet的生命周期

5.2.1. 初始化阶段,调用init()方法

5.2.2. 响应客户端请求阶段,调用service()方法。由service()方法根据提交方式选择执行doGet()或者doPost()方法

5.2.3. 终止阶段,调用destroy()方法

5.3. Tomcat装载Servlet的三种情况

5.3.1. Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的<Servlet></Servlet>之间添加如下代码:<loadon-startup>1</loadon-startup>数字越小表示优先级越高

5.3.2. 在Servlet容器启动后,客户首次向Servlet发送请求

5.3.3. Servlet类文件被更新后,重新装载Servlet

5.4. Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次

 

6. Servlet获取九大内置对象

 

7. Servlet与表单

7.1. reg.jsp

 1 <%@ page language="java" import="java.util.*"
 2     contentType="text/html; charset=utf-8"%>
 3 <%
 4     String path = request.getContextPath();
 5     String basePath = request.getScheme() + "://"
 6             + request.getServerName() + ":" + request.getServerPort()
 7             + path + "/";
 8 %>
 9 
10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
11 <html>
12 <head>
13 <base href="<%=basePath%>">
14 
15 <title>My JSP 'reg.jsp' starting page</title>
16 
17 <meta http-equiv="pragma" content="no-cache">
18 <meta http-equiv="cache-control" content="no-cache">
19 <meta http-equiv="expires" content="0">
20 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
21 <meta http-equiv="description" content="This is my page">
22 <!--
23     <link rel="stylesheet" type="text/css" href="styles.css">
24     -->
25 <style type="text/css">
26 .label {
27     width: 20%
28 }
29 .controler {
30     width: 80%
31 }
32 </style>
33 <script type="text/javascript" src="js/Calendar3.js"></script>
34 </head>
35 
36 <body>
37     <h1>用户注册</h1>
38     <hr>
39     <form name="regForm" action="servlet/RegServlet" method="post">
40         <table border="0" width="800" cellspacing="0" cellpadding="0">
41             <tr>
42                 <td class="lalel">用户名:</td>
43                 <td class="controler"><input type="text" name="username" />
44                 </td>
45             </tr>
46             <tr>
47                 <td class="label">密码:</td>
48                 <td class="controler"><input type="password" name="mypassword">
49                 </td>
50             </tr>
51             <tr>
52                 <td class="label">确认密码:</td>
53                 <td class="controler"><input type="password" name="confirmpass">
54                 </td>
55             </tr>
56             <tr>
57                 <td class="label">电子邮箱:</td>
58                 <td class="controler"><input type="text" name="email">
59                 </td>
60             </tr>
61             <tr>
62                 <td class="label">性别:</td>
63                 <td class="controler"><input type="radio" name="gender"
64                     checked="checked" value="Male"><input type="radio"
65                     name="gender" value="Female"></td>
66             </tr>
67             <tr>
68                 <td class="label">出生日期:</td>
69                 <td class="controler"><input name="birthday" type="text"
70                     id="control_date" size="10" maxlength="10"
71                     onclick="new Calendar().show(this);" readonly="readonly" /></td>
72             </tr>
73             <tr>
74                 <td class="label">爱好:</td>
75                 <td class="controler"><input type="checkbox" name="favorite"
76                     value="nba"> NBA &nbsp; <input type="checkbox"
77                     name="favorite" value="music"> 音乐 &nbsp; <input
78                     type="checkbox" name="favorite" value="movie"> 电影 &nbsp; <input
79                     type="checkbox" name="favorite" value="internet"> 上网 &nbsp;
80                 </td>
81             </tr>
82             <tr>
83                 <td class="label">自我介绍:</td>
84                 <td class="controler"><textarea name="introduce" rows="10"
85                         cols="40"></textarea></td>
86             </tr>
87             <tr>
88                 <td class="label">接受协议:</td>
89                 <td class="controler"><input type="checkbox" name="isAccept"
90                     value="true">是否接受霸王条款</td>
91             </tr>
92             <tr>
93                 <td colspan="2" align="center"><input type="submit" value="注册" />&nbsp;&nbsp;
94                     <input type="reset" value="取消" />&nbsp;&nbsp;</td>
95             </tr>
96         </table>
97     </form>
98 </body>
99 </html>

7.2. userinfo.jsp

 1 <%@ page language="java" import="java.util.*,java.text.*"
 2     contentType="text/html; charset=utf-8"%>
 3 
 4 <%
 5     String path = request.getContextPath();
 6     String basePath = request.getScheme() + "://"
 7             + request.getServerName() + ":" + request.getServerPort()
 8             + path + "/";
 9 %>
10 
11 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
12 <html>
13 <head>
14 <base href="<%=basePath%>">
15 
16 <title>My JSP 'userinfo.jsp' starting page</title>
17 
18 <meta http-equiv="pragma" content="no-cache">
19 <meta http-equiv="cache-control" content="no-cache">
20 <meta http-equiv="expires" content="0">
21 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
22 <meta http-equiv="description" content="This is my page">
23 <!--
24     <link rel="stylesheet" type="text/css" href="styles.css">
25     -->
26 <style type="text/css">
27 .title {
28     width: 30%;
29     background-color: #CCC;
30     font-weight: bold;
31 }
32 .content {
33     width: 70%;
34     background-color: #CBCFE5;
35 }
36 </style>
37 </head>
38 
39 <body>
40     <h1>用户信息</h1>
41     <hr>
42     <center>
43         <jsp:useBean id="regUser" class="entity.Users" scope="session" />
44         <table width="600" cellpadding="0" cellspacing="0" border="1">
45             <tr>
46                 <td class="title">用户名:</td>
47                 <td class="content">&nbsp;<jsp:getProperty name="regUser"
48                         property="username" /></td>
49             </tr>
50             <tr>
51                 <td class="title">密码:</td>
52                 <td class="content">&nbsp;<jsp:getProperty name="regUser"
53                         property="mypassword" /></td>
54             </tr>
55             <tr>
56                 <td class="title">性别:</td>
57                 <td class="content">&nbsp;<jsp:getProperty name="regUser"
58                         property="gender" /></td>
59             </tr>
60             <tr>
61                 <td class="title">E-mail:</td>
62                 <td class="content">&nbsp;<jsp:getProperty name="regUser"
63                         property="email" /></td>
64             </tr>
65             <tr>
66                 <td class="title">出生日期:</td>
67                 <td class="content">&nbsp; <%
68                      SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
69                      String date = sdf.format(regUser.getBirthday());
70                  %> <%=date%></td>
71             </tr>
72             <tr>
73                 <td class="title">爱好:</td>
74                 <td class="content">&nbsp; <%
75                      String[] favorites = regUser.getFavorites();
76                      for (String f : favorites) {
77                  %> <%=f%> &nbsp;&nbsp; <%
78                      }
79                  %>
80                 </td>
81             </tr>
82             <tr>
83                 <td class="title">自我介绍:</td>
84                 <td class="content">&nbsp;<jsp:getProperty name="regUser"
85                         property="introduce" /></td>
86             </tr>
87             <tr>
88                 <td class="title">是否介绍协议:</td>
89                 <td class="content">&nbsp;<jsp:getProperty name="regUser"
90                         property="flag" /></td>
91             </tr>
92         </table>
93     </center>
94 </body>
95 </html>

7.3. RegServlet.java

 1 package servlet;
 2 
 3 import java.io.IOException;
 4 import java.text.SimpleDateFormat;
 5 import java.util.Date;
 6 
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 
12 import entity.Users;
13 
14 public class RegServlet extends HttpServlet {
15 
16     public void doGet(HttpServletRequest request, HttpServletResponse response)
17             throws ServletException, IOException {
18 
19         doPost(request, response);
20     }
21 
22     public void doPost(HttpServletRequest request, HttpServletResponse response)
23             throws ServletException, IOException {
24         request.setCharacterEncoding("UTF-8");
25 
26         Users u = new Users();
27         String username, mypassword, email, gender, introduce, isAccept;
28         Date birthday;
29         String[] favorites;
30 
31         SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd");
32         try {
33             // 接收字符串类型
34             username = request.getParameter("username");
35             mypassword = request.getParameter("mypassword");
36             email = request.getParameter("email");
37             gender = request.getParameter("gender");
38             introduce = request.getParameter("introduce");
39             isAccept = request.getParameter("isAccept");
40             // 接收Date类型_字符串转日期格式
41             birthday = sdt.parse(request.getParameter("birthday"));
42             // 接收字符数组类型
43             favorites = request.getParameterValues("favorite");
44 
45             u.setUsername(username);
46             u.setMypassword(mypassword);
47             u.setEmail(email);
48             u.setGender(gender);
49             u.setIntroduce(introduce);
50             u.setBirthday(birthday);
51             u.setFavorites(favorites);
52             u.setFlag(isAccept.equals("true") ? true : false);
53 
54             // 保存信息到Session
55             request.getSession().setAttribute("regUser", u);
56             // 页面跳转
57             request.getRequestDispatcher("../userinfo.jsp").forward(request,
58                     response);
59         } catch (Exception ex) {
60             ex.printStackTrace();
61         }
62     }
63 }

7.4. Users.java

 1 package entity;
 2 
 3 import java.util.Date;
 4 
 5 // 用户实体类
 6 public class Users {
 7     private String username; // 用户名
 8     private String mypassword; // 密码
 9     private String email; // 电子邮箱
10     private String gender; // 性别
11     private Date birthday; // 出生日期
12     private String[] favorites; // 爱好
13     private String introduce; // 自我介绍
14     private boolean flag; // 接受协议
15 
16     public Users() {
17 
18     }
19 
20     public String getUsername() {
21         return username;
22     }
23 
24     public void setUsername(String username) {
25         this.username = username;
26     }
27 
28     public String getMypassword() {
29         return mypassword;
30     }
31 
32     public void setMypassword(String mypassword) {
33         this.mypassword = mypassword;
34     }
35 
36     public String getEmail() {
37         return email;
38     }
39 
40     public void setEmail(String email) {
41         this.email = email;
42     }
43 
44     public String getGender() {
45         return gender;
46     }
47 
48     public void setGender(String gender) {
49         this.gender = gender;
50     }
51 
52     public Date getBirthday() {
53         return birthday;
54     }
55 
56     public void setBirthday(Date birthday) {
57         this.birthday = birthday;
58     }
59 
60     public String[] getFavorites() {
61         return favorites;
62     }
63 
64     public void setFavorites(String[] favorites) {
65         this.favorites = favorites;
66     }
67 
68     public String getIntroduce() {
69         return introduce;
70     }
71 
72     public void setIntroduce(String introduce) {
73         this.introduce = introduce;
74     }
75 
76     public boolean isFlag() {
77         return flag;
78     }
79 
80     public void setFlag(boolean flag) {
81         this.flag = flag;
82     }
83 }

 

8. Servlet路径跳转

8.1. 绝对路径:

<a href="servlet/HelloServlet">访问HelloServlet</a><br>

response.sendRedirect("test.jsp"); 此方法不行,因为路径在根目录下

response.sendRedirect(request.getContextPath() + "/test.jsp"); 可行

8.2. 相对路径:

<a href="<%=path%>/servlet/HelloServlet">访问HelloServlet</a><br>

request.getRequestDispatcher("/test.jsp").forward(request, response); 可行

request.getRequestDispatcher("/test.jsp").forward(request, response); // 此种方法也可