前言:对于web开发,servlet的学习是必不可少的,笔者也是新手,刚接触到servlet觉得很抽象模糊,遂写下学习笔记以便日后回顾。——L.L
=================================分割线==================================
个人建议一开始学习servlet不要去看它的源码究其根本,而是要先学会使用,目睹servlet的工作成果会激起学习兴趣,为深入做铺垫,下面从使用角度来为servlet做介绍:
1.新建一个web project(笔者使用的IDE是MyEclipse 2015):File -- New -- Web Project
1)输入项目名(这里起MyServlet)
2)Java EE version与Java version最好一致(如Java EE 5对应Java1.5)
3)Target runtime理解为该项目运行的环境,又可理解为项目运行的web容器,这里先不做选择,下一步
4)勾选上生成web.xml的复选框,web.xml是servlet的配置文件,完成
2.工作目录
建立好项目后,左图便是我们的工作目录了
1)后缀为“Library”的是该项目所引用的包
2)我们关注的最多的是src和WebRoot,其中src中存放java代码文件,WebRoot则存放包括配置文件的各种资源,所需要引用的包(.jar文件)存放在WebRoot / WEB-INF / lib下
3)本篇我们使用index.jsp。index.jsp是新建项目自带的jsp文件,这个行为我们可以通过设置修改,这不是本篇的重点
3.编写代码
1)新建servlet,创建servlet有两种方式:
a).新建一个class(取名MyServlet1),使MyServlet1继承javax.servlet.http.HttpServlet,我们称其为“手动创建”
重写doGet方法打印“servlet1执行成功”
1 import java.io.IOException; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 8 public class MyServlet1 extends HttpServlet { 9 @Override 10 protected void doGet(HttpServletRequest req, HttpServletResponse resp) 11 throws ServletException, IOException { 12 System.out.println("servlet1执行成功"); 13 } 14 }
b).直接新建一个servlet(取名MyServlet2),可以看到IDE自动让MyServlet2继承了HttpServlet,我们称其为“自动创建”。下面的复选框我们只勾选doGet()
点击下一步,留意Servlet/JSP Mapping URL为/servlet/MyServlet2,这里我们立个flag,先不管是什么意思,点击完成
可以看到,因为我们勾选了doGet(),MyServlet2.class会自动生成doGet()。修改它:
1 import java.io.IOException; 2 import java.io.PrintWriter; 3 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 10 public class MyServlet2 extends HttpServlet { 11 12 /** 13 * The doGet method of the servlet. <br> 14 * 15 * This method is called when a form has its tag value method equals to get. 16 * 17 * @param request the request send by the client to the server 18 * @param response the response send by the server to the client 19 * @throws ServletException if an error occurred 20 * @throws IOException if an error occurred 21 */ 22 public void doGet(HttpServletRequest request, HttpServletResponse response) 23 throws ServletException, IOException { 24 System.out.println("servlet2执行成功"); 25 } 26 27 }
至此servlet创建完毕,让我们将关注点移至web.xml
2)解读配置文件web.xml:
a).从创建项目开始,除了一开始勾选了生成web.xml文件的复选框,一直没有编辑过web.xml,那它为什么会有这么多内容呢?
b).每一个<servlet>对应一个<servlet-mapping>。
c).<servlet>中的<servlet-name>与<servlet-mapping>中的<servlet-name>一定要相同。
以上解读颇为浅显,只要知道是这么回事就可以,后文在项目运行后会较深入解读并解释abc
3)修改index.jsp:添加两个超链接,点击第一个超链接将在控制台打印“servlet1执行成功”,点击第二个超链接则会报错
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'index.jsp' starting page</title> 13 <meta http-equiv="pragma" content="no-cache"> 14 <meta http-equiv="cache-control" content="no-cache"> 15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 17 <meta http-equiv="description" content="This is my page"> 18 <!-- 19 <link rel="stylesheet" type="text/css" href="styles.css"> 20 --> 21 </head> 22 23 <body> 24 <a href="MyServlet1">点击在控制台打印servlet1执行成功</a> 25 <a href="MyServlet2">点击报错</a> 26 </body> 27 </html>
4.运行项目
0)(若已配置好Tomcat服务器则跳过此步)新增配置Tomcat服务器
配置的前提是自己的机器上安装了Tomcat,安装Tomcat的教学不在本篇范围内哈,笔者安装的是Tomcat 8版本
(1)点击运行环境管理
(2)点击添加(这一步指将项目放到哪里运行)
(3)这里有两个选择,使用MyEclipse自带的Tomcat服务器或是自定义的Tomcat服务器,个人建议后者
(4)前面提到笔者安装了Tomcat8.0,所以选择对应的
(5)如果之后的项目都想部署到这个服务器上的话,勾选上
(6)下一步
至此我们会在Servers窗口看到自定义的服务器和部署到上面的MyServlet项目
1)运行
点击右上侧的绿底三角开启服务器,点击工具栏的“小地球”打开MyEclipse自带浏览器,输入http://localhost:8080/MyServlet/确定,出现下图表示项目运行成功,显示的确实是我们的index.jsp页面
点击第一个超链接,可以看到地址栏的url后添加了MyServlet1,控制台也输出“servlet1执行成功”字样,说明我们的MyServlet1.class执行了
回到上一步,再点击第二个超链接会发现,地址栏改变了,但页面报404的错误(表示找不到请求的页面),控制台也没有任何新的输出
至此,运行操作完毕,接下来略深入地了解运行的个中原理
5.servlet的工作原理
首先我们从可视的页面开始,即index.jsp
第一个超链接的href属性值为MyServlet1,由于这不是个地址(如果是个地址如http://www.baidu.com,点击后会直接跳转到百度首页)当点击该超链接时,地址栏显示的“http://localhost:8080/MyServlet/MyServlet1”就是跳转过去的地方,后缀就是“/MyServlet1”,程序则会跑到配置文件,即web.xml中寻找一个url为MyServlet1的servlet-mapping。
1)通过对比url与<url-pattern>找到对应的<servlet-name>;
2)通过找到的<url-pattern>对应的<servlet-name>找同名的<servlet-name>;
3)根据找到的<servlet-name>访问对应的<servlet-class>。
第一个超链接提供的url是http://localhost:8080/MyServlet/MyServlet1,末尾的/MyServlet1与web.xml中的有所匹配,所以程序往下走,而第二个超链接提供的url是http://localhost:8080/MyServlet/MyServlet2,在web.xml中没有url-pattern为/MyServlet2的,只有为/servlet/MyServlet2的,所以程序走不下去,只能报错,回到上文的3.1.b,我们立了个flag,当中的Servlet/JSP Mapping URL就是这里的<url-pattern>,当我们手动在地址栏输入http://localhost:8080/MyServlet/servlet/MyServlet2时,便会看到我们想看到的
通过上面的解释,也就回答了上文的3.2的a、b问题:如果<servlet>和<servlet-mapping>的<servlet-name>不一致,那就找不到,报错;如果一个<servlet>对应多个<servlet-mapping>(或者反过来),那程序执行时哪里知道匹配哪一对呢?(实际上当不是一对一时,IDE会飘红报错)。而问题a的解答是:不建议新手一开始就深究,先自动生成吧
=================================分割线==================================
本篇是笔者写的第一篇博文,内容是写一个最简单的servlet项目。不确定内容没有差错,恳请读者指出不当之处,表述也不敢说绝对清晰,但可以保证没有直接从网络上ctrl+c。作为学习servlet的第一篇笔记,文中没有过多涉及到底层原理的知识,只记录了servlet最简单的一个用例,仅供入门参考。 ——L.L