购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 使用Eclipse开发Java Web程序

第1章利用记事本编写了一个只包含几行代码的JSP程序,今后需要编写更多的代码、更多的程序,若再使用记事本开发Web程序则会显得“力不从心”。“工欲善其事,必先利其器”,开发人员有必要先选择一款合适的集成开发环境(Integrated Development Environment,IDE),本书选择免费开源的Eclipse。读者可以根据个人爱好和习惯,选择其他IDE(例如IntelliJ IDEA)。

使用Eclipse开发Java Web程序

2.1.1 Eclipse的安装和启动

Eclipse(译作日食)是一款用Java开发的、免费的、开源的IDE。起初,Eclipse专门用于开发Java程序,如今的Eclipse已经细化为for Enterprise Java Developers版本(开发Java Web程序)、for Java Developers版本(开发Java SE程序),甚至派生出for PHP版本(开发PHP程序)、for C++版本(开发C++程序)。

Eclipse是基于Java开发的,因此下载Eclipse时,要确保Eclipse和JDK兼容。具体来讲,如果使用32位的JDK,建议下载32位的Eclipse;如果使用64位的JDK,建议下载64位的Eclipse。否则,启动Eclipse时可能出现“java was started but returned exit code=13”问题,导致Eclipse启动失败。

目前最新版本的Eclipse只支持64位操作系统。考虑到JDK的兼容性,本书提供了32位以及64位的Eclipse安装程序,读者可根据JDK的位数,到本书前言指定的网址下载对应位数的Eclipse安装程序。下载到C盘根目录后,解压到当前文件夹下即可成功安装Eclipse。启动Eclipse也非常简单,进入Eclipse目录,双击eclipse.exe即可。

2.1.2 启动Eclipse的注意事项

Eclipse是基于Java开发的,启动Eclipse前,必须安装JRE。由于第1章在安装Tomcat前已经安装了JDK,并且JDK里包含了JRE,因此这里无须重新安装JRE。

启动Eclipse时,可能出现图2-1所示的错误提示,这是因为启动Eclipse时需要使用javaw.exe(javaw.exe主要用于基于GUI的应用程序),但是Eclipse找不到javaw.exe,通过下列的操作可排除该错误。如果没有出现此错误提示,我们可以跳过这些操作。

右击桌面的“我的电脑”→选择“属性”→选择“高级系统设置”→选择“高级”选项卡→单击“环境变量”按钮→在“系统变量”下找到Path→单击“编辑”按钮→在变量名Path的变量值前面加上:C:\Program Files\Java\jdk1.8.0_221\bin;(注意不要忘记末尾的分号),单击“确定”按钮,如图2-2所示。再次启动Eclipse,测试Eclipse能否成功启动。

图2-1 错误提示

图2-2 配置Path环境变量

2.1.3 认识Eclipse工作空间

成功启动Eclipse后,Eclipse会提示选择工作空间(Workspace),如图2-3所示。将工作空间修改为C:\workspace,单击Launch按钮,即可看到Eclipse欢迎界面。

图2-3 选择工作空间

Eclipse工作空间实质上是一个文件夹,该文件夹可以存放多个Web项目。简而言之,工作空间就是一个存放所有Web项目的文件夹。

知识扩展:Eclipse的工作空间与Web项目部署到Tomcat的目录

在Eclipse工作空间里编写JSP、Servlet源程序,这些源程序被编译成字节码后,才能在Tomcat上运行。初学者通常会有一个误区,认为Eclipse的工作空间等同于Web项目部署到Tomcat的目录。我们知道在工厂车间里研发出来的汽车,最终是要行驶在马路上的。工作空间就相当于工厂车间,Web项目部署到Tomcat的目录相当于马路,它们是两个不同的事物。

换句话说,Eclipse的工作空间是Web源程序所在的目录;Web项目部署到Tomcat的目录是源程序对应的字节码所在的目录,它们是两个不同的目录。

也可以这样说,工作空间是给Web开发人员在开发阶段编写源程序时使用的;Web项目部署到Tomcat的目录是给Tomcat使用的。工作空间里存放的是Web程序的源代码,Web项目部署到Tomcat的目录里存放的是Web程序的字节码。

本书将Web项目部署到Tomcat的目录,称为Web项目部署后的绝对物理路径(有时也称为Web项目的部署目录)。

2.1.4 小露身手:使用Eclipse创建动态Web项目

步骤

(1)关闭Eclipse欢迎界面,在Eclipse菜单栏中单击File菜单→选择New→选择Dynamic Web Project→弹出New Dynamic Web Project窗口,如图2-4所示。

图2-4 New Dynamic Web Project窗口

(2)在Project name文本框中输入项目名称(例如get),在Dynamic web module version中选择4.0,其他选项保持默认设置(请留意项目的保存位置)。

(3)单击Next按钮,进入Java程序配置界面,如图2-5所示。

(4)保持默认设置,单击Next按钮,进入Web Module界面,如图2-6所示。

图2-5 Java程序配置界面

图2-6 Web Module界面

说明1:使用Eclipse创建Web项目时,Context root配置了Web项目的虚拟路径。在默认情况下,Web项目虚拟路径名就是Web项目名(这里是get)。Web项目虚拟路径“指向了”Web项目部署后的绝对物理路径。由于还没有将get项目部署到Tomcat中,目前还无法得知get项目部署后的绝对物理路径。

说明2:Eclipse中的Content directory配置了Web项目的内容目录,默认值是WebContent。WebContent目录是Eclipse工作空间的子目录,里面存放的是JSP源程序、JavaScript源程序、CSS源程序。

说明3:Web项目部署到Tomcat后,Eclipse会将WebContent目录里的JSP源程序、JavaScript源程序、CSS源程序自动地复制到Web项目的部署目录中(注意Web项目部署目录中并没有WebContent目录)。在浏览器地址栏中输入URL路径就可以访问WebContent中的源程序(实际上访问的是Web项目部署目录中源程序对应的字节码)。例如,在浏览器地址栏中输入网址http://localhost:8080/get/index.jsp,看起来访问的是get项目WebContent里的index.jsp文件,实际上访问的是Web项目部署目录中的index_jsp.class字节码文件。

(5)保持默认设置,单击Finish按钮。

完成上述步骤后,Eclipse就会在工作空间C:\workspace中创建一个get文件夹,该文件夹保存了get项目所有的源程序(注意不是字节码)。

2.1.5 Eclipse的View和Perspective

Eclipse的操作界面看起来复杂,但实际上Eclipse界面由一个个简单的视图(View)组成,所有的Eclipse操作都是在视图中进行的。掌握了Eclipse视图的使用就掌握了Eclipse的使用,初学者首先应该学会如何打开Eclipse视图。在Eclipse菜单栏中单击Window菜单→选择Show View→弹出视图子菜单,如图2-7所示,选择要打开的视图即可。本书常用的视图有项目浏览视图(Project Explorer)、服务器视图(Servers)和控制台视图(Console)等。

图2-7 Eclipse的视图子菜单

透视图(Perspective)定义了一组视图。对于初学者而言,最常用的功能就是重置透视图,方法是:在Eclipse菜单栏中单击Window菜单→选择Perspective→单击Reset Perspective...。重置透视图后,Eclipse会自动重置视图区域,重置视图区域后的中心位置就是代码编辑区域(Eclipse将它称为共享区域(Shared Area))。我们将在代码编辑区域编写代码。

2.1.6 小露身手:使用Eclipse创建第一个Servlet程序

步骤

(1)打开Project Explorer视图→展开刚刚创建的Web项目→展开Java Resources→右击src→选择New→单击Servlet→弹出Create Servlet窗口。Java package文本框处输入controller,Class name文本框处输入ABCServlet,父类是HttpServlet,如图2-8所示。

图2-8 Create Servlet窗口

说明1:通常Servlet程序负责“扮演”控制器(Controller)的角色,在Java package文本框处输入controller,指该package存放的是Servlet程序(有关控制器的更多知识参考第8章内容)。

说明2:父类HttpServlet专门用于处理HTTP请求。本书所开发的Servlet程序都继承了HttpServlet。

(2)单击Next按钮,进入Servlet部署界面,如图2-9所示。Servlet程序的URL mappings保持默认设置(2.1.7节讲解URL Mappings的相关知识)。

(3)单击Next按钮,进入创建Servlet程序的界面,选择创建构造方法、init、destroy、doGet和doPost方法,单击Finish按钮,即可创建ABCServlet程序,如图2-10所示。

图2-9 Servlet部署界面

图2-10 创建ABC Servlet程序

场景1 将servlet-api.jar导入Web项目

Servlet程序继承了HttpServlet类,HttpServlet类定义在第三方库servlet-api.jar中。如果刚刚创建的Servlet程序存在如下所示的语法错误(错误代码下有波浪线),需要将servlet-api.jar导入Web项目中。Tomcat是可以运行Servlet的容器,Tomcat的安装目录里存在该第三方库。

在Tomcat的安装目录C:\apache-tomcat-9.0.29中找到lib目录,找到servlet-api.jar,将它复制到当前Web项目的lib目录下。方法是:复制后,打开Project Explorer视图→展开刚刚创建的Web项目→展开WebContent目录→展开WEB-INF目录→找到lib目录→粘贴。Eclipse自动将servlet-api.jar包复制到Web项目“WEB-INF/lib”下,Eclipse代码编辑区域将不提示错误。

场景2 篇幅所限,精简代码

场景2步骤

(1)删除注释语句。

(2)在每个方法中添加一条Tomcat控制台输出语句。

(3)修改doGet()方法的代码,在Tomcat控制台输出项目部署后的绝对物理路径。

(4)删除doPost()方法的代码“doGet(request, response);”。

(5)再次确保Servlet的urlPatterns是“/类名”。

精简后的代码如下所示。

注解@WebServlet配置了Servlet类的urlPatterns。为了简化Servlet的声明,从Servlet 3.0开始,Servlet新增了注解支持,使得web.xml配置文件从Servlet 3.0开始不再是必选的了。

场景3 Tomcat集成到Eclipse、Web项目部署到Tomcat

说明1:Servlet程序需要Servlet容器才能运行,Tomcat提供了Servlet容器。Eclipse仅是一个集成开发环境,并不提供Tomcat。有必要将第1章的Tomcat集成到本章的Eclipse集成开发环境中,这样就可以在一个界面中编写代码、启动/停止Tomcat、将项目部署到Eclipse的Tomcat中、调试代码。另外,还有很重要的一点:每次修改Servlet程序的代码后,需要重新编译Servlet程序、重启Tomcat。而Eclipse会检测Servlet程序是否修改,若修改,则会自动重新编译Servlet程序、重启Tomcat,使修改后的Servlet程序生效,提高开发效率。通过如下步骤,可将Tomcat集成到Eclipse中以及将Web项目部署到Eclipse的Tomcat中。

说明2:进行下列操作前,请务必阅读第1章有关Tomcat启动的相关内容。

场景3步骤

(1)在Eclipse菜单栏中单击Window菜单→选择Show View→单击Servers命令→进入Servers视图→单击No servers are available. Click this link to create a new server...链接→弹出New Server窗口→找到Apache文件夹→选择Tomcat v9.0 Server,如图2-11所示。

图2-11 New Server窗口

(2)单击Next按钮,进入选择Tomcat安装目录的界面,选择第1章的Tomcat安装目录和JRE,如图2-12所示。

(3)单击Next按钮,进入将项目部署到Eclipse中的Tomcat界面,如图2-13所示。选择要部署的项目get→单击Add按钮→单击Finish按钮。

最终,将Tomcat集成到Eclipse中,同时项目get被部署到Eclipse中的Tomcat界面。

(4)启动集成在Eclipse中的Tomcat。

打开Servers视图,如图2-14所示。右击Tomcat v9.0 Server at localhost→单击Start,启动Tomcat后,在Eclipse的Console控制台视图中就可以看到Tomcat的后台信息。

图2-12 选择Tomcat安装目录和JRE

图2-13 将项目部署到Eclipse中的Tomcat界面

图2-14 打开Server视图

完成上述步骤后,打开Project Explorer视图→展开Servers项目→双击server.xml配置文件,里面会有如下配置选项。该配置选项配置了get项目的虚拟路径。


<Context docBase="get" path="/get" reloadable="true" source="org.eclipse.jst.jee.server:get"/>

场景4 运行第一个Servlet程序

Servlet程序不会自动运行,只有在浏览器地址栏输入Servlet程序对应的urlPatterns,才能触发Servlet程序的执行。启动Tomcat后,打开浏览器,输入网址http://localhost:8080/get/ABCServlet,就会看到一个空白网页。Tomcat控制台会显示图2-15所示的执行结果。

图2-15 Servlet程序执行结果

第一次执行ABCServlet程序时,会依次触发ABCServlet程序的构造方法、init()方法、doGet()方法执行。以后再执行ABCServlet程序时,会触发doGet()方法执行,但构造方法和init()方法将不再执行。

从执行结果可以看出:通过浏览器地址栏访问ABCServlet时,只触发了ABCServlet的doGet()方法(并没有触发doPost()方法)。这是因为通过浏览器地址栏访问资源文件时,浏览器向资源文件发出的是GET请求。

HTTP请求主要有GET请求和POST请求两种。

从浏览器的角度,单击超链接或者直接在浏览器地址栏输入网址,浏览器发出的请求都是GET请求。GET请求会触发Servlet程序的doGet()方法;POST请求会触发Servlet程序的doPost()方法。

从Servlet程序的角度,每个Servlet程序有两个入口:doGet()方法用于处理GET请求;doPost()方法用于处理POST请求。

2.1.7 Eclipse中Servlet的URL Mappings和Servlet的urlPatterns

使用Eclipse创建Servlet程序的过程中,URL Mappings描述了URL路径和Servlet物理文件之间的映射关系。例如前文创建的ABCServlet.java程序,其中的@WebServlet("/ABCServlet")是一个Java注解,其功能是将浏览器地址栏URL路径中的“/ABCServlet”映射为ABCServlet.java物理文件。在浏览器地址栏中输入URL路径http://localhost:8080/get/ABCServlet,浏览器就会向Tomcat服务器发送GET请求,Tomcat服务器接收到该请求,就会将该请求指向get项目的ABCServlet.java,并实例化ABCServlet类的对象,触发ABCServlet的doGet()方法执行。

URL Mappings之所以是复数形式,是因为一个Servlet程序可以映射多个URL Mapping。例如注解@WebServlet(urlPatterns={"/helloServlet","/ABCServlet"}),定义了两个URL Mapping,它们都指向了同一个Servlet程序。

准确地讲,注解@WebServlet的urlPatterns参数配置了URL路径与Servlet程序之间的映射关系(只不过在Eclipse中使用了URL Mappings)。

此外,还可以给Servlet的urlPatterns分配目录。对于刚刚创建的ABCServlet程序,如果将注解@WebServlet修改为@WebServlet("/test/ABCServlet"),在浏览器地址栏中输入URL路径http://localhost:8080/get/test/ABCServlet,才会触发ABCServlet的deGet()方法执行。

上述urlPatterns都属于精确匹配,urlPatterns还支持“*”通配符模糊匹配,模糊匹配有如下两种用法。

用法1:*.扩展名(不以斜杠开头)。例如“*.do”表示任何扩展名是“do”的URL路径都可以映射到该Servlet程序。

用法2:/*(以斜杠开头),例如“/*”“/get/*”。其中“/*”表示任何URL路径都可以映射到该Servlet程序。

说明1:urlPatterns如果以斜杠开头,斜杠表示Web项目的虚拟路径。

说明2:urlPatterns的典型错误用法是“/*.do”。

2.1.8 Servlet程序的生命周期

Servlet程序的生命周期

运行“传统”Java程序时,Java虚拟机将Java类的字节码文件加载到内存,然后调用构造方法实例化一个Java对象,接着运行对象的main()方法。main()方法运行结束后,内存中的对象被清除。下次再运行该Java程序时,重复上述步骤。传统Java程序的生命周期如图2-16所示。

由于许多浏览器用户可以同时运行一个Servlet程序,如果Servlet程序也和传统的Java程序一样,每次运行时先将字节码文件加载到内存、再创建对象,效率将大打折扣。Servlet程序的生命周期如图2-17所示。

在浏览器用户1访问Servlet程序时,Servlet字节码文件将被加载到Tomcat服务器内存,Tomcat先调用构造方法实例化Servlet对象,然后调用init()方法初始化该Servlet对象,接着调用doGet()或者doPost()方法,服务第一个浏览器用户。

图2-16 传统Java程序的生命周期

图2-17 Servlet程序的生命周期

其他浏览器用户再次访问该Servlet程序时,Tomcat将直接使用内存中的Servlet对象,服务其他浏览器用户。

停止Tomcat服务后,内存中的Servlet对象被销毁。

以ABCServlet为例,Servlet程序的生命周期简要描述如下。

ABCServlet第一次接收到GET请求:ABCServlet()→init()→doGet()

其他GET请求:→doGet()→doGet()→…→doGet()

停止Tomcat服务:→destroy()

为了提高开发效率,Eclipse提供了一种机制。Tomcat启动后,Eclipse能够自动判断Servlet源代码是否更改。若更改,Eclipse会自动编译Servlet源代码,生成Servlet字节码文件,并自动重启Tomcat。

2.1.9 小露身手:使用Eclipse创建JSP程序

步骤

(1)在WebContent目录下创建abc.jsp文件,具体方法是:打开Project Explorer视图→展开get项目→右击WebContent目录→选择New→单击JSP File→File Name处输入abc→单击Next按钮→使用默认模板→单击Finish按钮。

(2)打开abc.jsp文件,在<body>标签和</body>标签之间,输入如下代码。


<% 
System.out.println("你好,Tomcat控制台"); 
String realPath = request.getServletContext().getRealPath(""); 
response.getWriter().print("Web项目的根目录或部署后的绝对物理路径是" + realPath); 
%> 

(3)保存JSP程序,将出现图2-18所示的错误提示窗口。关闭错误提示窗口,修改abc.jsp的代码,将代码pageEncoding="ISO-8859-1"修改为pageEncoding="UTF-8",再次尝试是否可以成功保存JSP程序。

图2-18 JSP程序无法保存

(4)打开浏览器,输入网址http://localhost:8080/get/abc.jsp,运行abc.jsp中的程序,执行结果出现中文字符乱码问题,如图2-19所示。

图2-19 执行结果出现中文字符乱码问题

(5)修改abc.jsp的代码,将代码contentType="text/html; charset=ISO-8859-1"修改为content Type="text/html; charset=UTF-8",保存JSP程序。刷新页面,执行结果如图2-20所示。

图2-20 执行结果未出现中文字符乱码问题

说明1:JSP和Servlet之间的关系。

Java Web开发的核心是Servlet程序的开发,JSP程序本质上是一个Servlet程序。当浏览器用户第一次访问JSP程序时,Tomcat服务的JSP引擎首先将JSP程序翻译成Servlet源代码文件(.java)。剩下的执行过程和普通Servlet程序完全相同,不赘述。

例如,首次运行abc.jsp,Eclipse中的Tomcat会在图2-21所示的目录中生成abc.jsp对应的abc_jsp.java文件(实际上是Servlet程序),并将其编译成字节码文件abc_jsp.class。

图2-21 JSP本质上是一个Servlet程序

JSP程序也可视为一个包含Java程序的HTML页面,JSP程序更侧重于页面的展示(在MVC框架中充当视图层View),JSP程序更像一个网页,本书有时将JSP程序称为JSP页面程序。

Servlet程序可视为一个包含HTML页面的Java程序,Servlet程序更侧重于控制、逻辑(它在MVC框架中充当控制器层Controller)。

说明2:作为页面展示层,JSP技术可以被模板引擎技术(例如Thymeleaf)替代。然而目前为止Servlet技术无可替代,这也是本书将Servlet技术作为学习重点的原因。 FTWk2/KN63WryGLTJROjrfbzBfeRyilRzb9tD+lozyJDXcY/XFZddVGyvXjFw2mK

点击中间区域
呼出菜单
上一章
目录
下一章
×