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 <input type="checkbox" 77 name="favorite" value="music"> 音乐 <input 78 type="checkbox" name="favorite" value="movie"> 电影 <input 79 type="checkbox" name="favorite" value="internet"> 上网 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="注册" /> 94 <input type="reset" value="取消" /> </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"> <jsp:getProperty name="regUser" 48 property="username" /></td> 49 </tr> 50 <tr> 51 <td class="title">密码:</td> 52 <td class="content"> <jsp:getProperty name="regUser" 53 property="mypassword" /></td> 54 </tr> 55 <tr> 56 <td class="title">性别:</td> 57 <td class="content"> <jsp:getProperty name="regUser" 58 property="gender" /></td> 59 </tr> 60 <tr> 61 <td class="title">E-mail:</td> 62 <td class="content"> <jsp:getProperty name="regUser" 63 property="email" /></td> 64 </tr> 65 <tr> 66 <td class="title">出生日期:</td> 67 <td class="content"> <% 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"> <% 75 String[] favorites = regUser.getFavorites(); 76 for (String f : favorites) { 77 %> <%=f%> <% 78 } 79 %> 80 </td> 81 </tr> 82 <tr> 83 <td class="title">自我介绍:</td> 84 <td class="content"> <jsp:getProperty name="regUser" 85 property="introduce" /></td> 86 </tr> 87 <tr> 88 <td class="title">是否介绍协议:</td> 89 <td class="content"> <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); // 此种方法也可