Fork me on GitHub

构建Java Web开发环境

1.Java的安装与配置
Step by step安装结束,安装路径为E:\dev\java

配置环境变量:
JAVA_HOME:E:\dev\java\jdk1.7.0_45
在PATH的最后添加:;%JAVA_HOME%\bin

在命令行输入java -version或javac即可测试安装是否成功。

 

2.Eclipse的安装
解压即安装,解压目录E:\dev,解压后Eclipse所在目录:E:\dev\eclipse
Workspace Path:E:\dev\workspace

在Eclipse中配置JRE:
Windows-Preference-Java-Installed JREs:
默认是JAVA_HOME(E:\dev\java\jdk1.7.0_45)所在目录下的jre。

 

3.在Eclipse中编辑并运行Java应用程序
File-Project-Java Project:
Project Name:demo
JRE:Use default JRE
点击Finally。

选中项目,右键New-Package:
Name:com.xxx.demo
点击Finally。

选中刚创建的包,右键New-Class:
Name:HelloWorld
点击Finally。

编辑HelloWorld.java:

package com.xxx.demo;
public class HelloWorld {
 public static void main(String[] args){
  System.out.println("Hello, World!你好,世界!");
 }
}

在代码编辑区,单击右键-Run As-Java Application,即可运行成功。

 

Note:在Eclipse使用JDK源码

(1)点击"window"->"Preferences"->"Java"->"Installed JRES"
(2)此时"Installed JRES"右边是列表窗格,列出了系统中的 JRE 环境,选择你的JRE,然后点边上的 "Edit...", 会出现一个窗口(Edit JRE)
(3)选中rt.jar文件的这一项:"E:\dev\java\jdk_1.7.0_45/lib/rt.jar"点 左边的"+" 号展开它,
(4)展开后,可以看到"Source Attachment:(none)",点这一项,点右边的按钮"Source Attachment...",选择你的JDK目录下的 "E:/dev/java/jdk1.7.0_45/src.zip"文件,
(5)一路点"ok",结束。

在代码窗口将鼠标定位在某个方法上如println,按住Ctrl键,然后单击鼠标左键,即可看到println方法的源代码。

Ctrl+左键
这个是大多数人经常用到的,用来查看变量、方法、类的定义

Ctrl+O:查看一个类的纲要,列出其方法和成员变量。
提示:再多按一次Ctrl+O,可以列出该类继承的方法和变量。
助记:"O"--->"Outline"--->"纲要"

Ctrl+T
查看一个类的继承关系树,是自顶向下的,
再多按一次Ctrl+T, 会换成自底向上的显示结构。
提示:选中一个方法名,按Ctrl+T,可以查看到有这个同名方法的父类、子类、接口。

 

4.Tomcat的安装与配置
解压即安装,解压目录E:\dev\tomcat,
解压后Tomcat所在目录:E:\dev\tomcat\apache-tomcat-7.0.52

配置环境变量:
CATALINA_HOME:E:\dev\tomcat\apache-tomcat-7.0.52
在PATH的最后添加:;%CATALINA_HOME%\bin

在命令行中输入:startup.bat即可启动tomcat
启动tomcat后,即可访问:http://localhost:8080/

在命令行中输入:shutdown.bat即可关闭tomcat。

 

5.在Eclipse中配置Tomcat
Windows-Preference-Server-Runtime Environment:
Add-Apache Tomcat v7.0--Next:
Name:Apache Tomcat v7.0
Tomcat installation directory: E:\dev\tomcat\apache-tomcat-7.0.52
JRE: 选择jdk1.7.0_45

单击OK,配置完成。

 

6.在Eclipse中编辑并运行Servlet
File-New-Web-Dynamic Web Project:
Project Name:webdemo
Target runtime:Apache Tomcat v7.0
Dynamic web module version:3.0

点击Finally。

选中项目,右键New-Package:
Name:com.xxx.webdemo
点击Finally。

选中刚创建的包,右键New-Servlet:
Project:webdemo
Source folder:/webdemo/src
Java package:com.xxx.webdemo
Class Name:HelloServlet

点击Finally。

编辑HelloServlet.java:

package com.xxx.webdemo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
 public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{
  res.setContentType("text/html; charset=UTF-8");
  PrintWriter out = res.getWriter();
  String name = req.getParameter("name");
   
  out.println("<html>");
  out.println("<head><title>Hello Servlet</title></head>");
  out.println("<body>");
  out.println("<h1>Hello Servlet</h1>");
  out.println("<p>Hello " + name + "! </p>");
  out.println("</body>");
  out.println("</html>");
   
  out.close();
 }
}
 

选中项目单击右键-Run as-Run on Server:
选择Manually define a new server(此时还没有存在的server)
Select the server type:Tomcat v7.0 Server
Server's host name:localhost
Server name:Tomcat v7.0 Server at localhost
Server runtime environment:Apache Tomcat v7.0
点击Next-Finaly。

在浏览器中访问:
http://localhost:8080/webdemo/HelloServlet
浏览器显示:
Hello Servlet
Hello null!

http://localhost:8080/webdemo/HelloServlet?name=huhu
浏览器显示:
Hello Servlet
Hello huhu!

注意:浏览器请求的URL中的HelloServlet是Web应用程序的路径,因为默认项目名就是Web应用程序的路径,其中URL中的/HelloServlet与@WebServlet("/HelloServlet")有关。详见后面讲解。

 

Note:在Eclipse使用servlet源码

JDK的源码中没有包含servlet的源码实现,所以之前关联的jdk的src后还是不能查看servlet相关方法的源码。tomcat中有servlet的实现,所以只需要下载tomcat的源码,然后点击servlet的某个方法关联一下源码,就可以查看servlet方法的源码了。

 

7.深入解析Eclipse编译Servlet并将其部署到Tomcat的过程

到目前为止,借助IDE的辅助,完成了一个Servlet的编译部署和运行,但是具体的过程中许多细节被省略了,即IED帮助我们做了很多细节的事情。
比如:
(1)IDE的项目管理中看到的文件组织结构是部署到Web容器中的文件结构吗?
(2)HelloServlet.java的编译
(3)IDE是如何将Web项目部署到Web容器上的?
(4)Web容器会读取哪些设置?
(5)Web容器对于请求的到来,又如何调用Servlet?

(1)关于Eclipse编译web项目
删除项目中的build/classes中的com包。

C:\Users\hengheng>e:
E:\>cd e:\dev\workspace\webdemo
E:\dev\workspace\webdemo>javac -classpath E:\dev\tomcat\apache-tomcat-7.0.52\lib\servlet-api.jar -d ./build/classes ./src/com/xxx/webdemo/HelloServlet.java
 

这样即可编译HelloServlet到build/classes中了,此时只进行了编译(而Eclipse会发现文件有变化自动编译到build/classes并且自动部署到webapps/lib)。

(2)将Eclipse编译好的Servlet部署到tomcat中
双击代码区下方的Servers选项中的Tomcat v7.0 Server at localhost,处于已启动的状态。
在弹出的界面中,可以看到Server Locations,这里便是配置Server路径和项目的部署路径的。
但此时看到,这部分是灰色即不可编辑的。
若要编辑,点击该窗口下方的Modules选项卡:
选择已存在的Web Modules,单击右侧的"Remove",关闭该窗口时保存;

然后重新双击打开Tomcat Server,定位到Server Locations部分:
选择"Use Tomcat installation",Server path默认不可编辑且为tomcat的安装目录。
Deploy path:webapps
编辑好之后,Ctrl+S保存,接着单击窗口下方的Modules选项卡:
单击右侧的"Add Web Module",在弹出的窗口选择Modules为webdemo,单击OK即可。

保存关闭,即配置成功。

设置完成之后,每次"Run on Server"都会将当前项目部署到上面设置的部署路径下。

部署成功时,Tomcat的webapps目录下会多出一个webdemo的目录,且conf目录的server.xml的<Host>中会添加一个<Context>:

<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
 
<Context docBase="webdemo" path="/webdemo" reloadable="true" source="org.eclipse.jst.jee.server:webdemo"/></Host>

(3)Web容器会读取哪些设置?(部署Web app时)
server.xml中的Host元素中的autoDeploy="true"会自动监控webapps中的web项目(即监视web app中的web.xml文件),发现了就部署。
(3.1)使用@WebServlet
编写好Servlet之后,接下来要告诉Web容器有关这个Servlet的一些信息。在Servlet 3.0中,可以使用标注(Annotation)来告知容器哪些Servlet会提供服务以及额外信息。
如@WebServlet("/HelloServlet")
使用WebServlet注解类型来声明一个Servlet类,在声明Servlet的同时,还可以告诉容器是哪个URL调用这个Servlet。
只要在Servlet上设置@WebServlet标注,容器就会自动读取当中的信息。
上面的@WebServlet告诉容器,如果请求的URL是/HelloServlet,就会由当前的Servlet即HelloServlet的实例提供服务。
可以使用@WebServlet提供更多的信息:

@WebServlet(
    name="HelloServlet",
    urlPatterns="/HelloServlet",
    loadOnStartup=1
)
public class HelloServlet extends HttpServlet{
 

上面的@WebServlet告知容器,HelloServlet这个Servlet的名称是HelloServlet,由name属性指定。
如果客户端请求的URL是/HelloServlet,则由有HelloServlet名字的Servlet(即当前的Servlet类)来处理,由urlPatterns属性指定。

在Java EE相关应用程序中使用注解类型时,没有设置的属性通常会有默认值。例如,若没有设置@WebServlet的name属性,其默认值会是Servlet类的完整名称。

当应用程序启动后,事实上并没有创建所有的Servlet实例。容器会在首次请求需要某个Servlet服务时,才会将对应的Servlet类实例化、进行初始化等操作,
然后再处理请求。这意味着第一次请求该Servlet的客户端,必须等待Servlet类实例化、初始化动作所必需花费的时间,才真正得到请求的处理。

如果希望Web app启动时,就先将Servlet类载入、实例化并做好初始化动作,则可以使用loadStartup属性。
设置大于0(默认值是-1),表示启动app后就要初始化Servlet,数字代表了Servlet的初始化顺序,容器必须保证较小数字的Servlet先初始化,
在使用注解类型的情况下,如果多个Servlet在设置loadStartup时使用了相同的数字,则容器实现厂商可以自行决定要如何加载哪个Servlet。

(3.2)使用web.xml(部署描述文件)
使用注解类型定义Servlet是Java EE6中的Servlet 3.0之后才有的功能,在先前的版本中,必须在Web app中的WEB-INF目录中,建立一个web.xml文件定义Servlet相关信息。
在Servlet 3.0中,可以使用web.xml文件来定义一个Servlet。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">
    
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.xxx.webdemo.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
   
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping
</web-app>

web.xml中的设置会覆盖Servlet中注解类型@WebServlet的设置,可以使用@WebServlet来做默认值,而web.xml作为日后更改设置值时使用。

(4)Web容器对于请求的到来,又如何调用Servlet?
Servlet的请求对应:
1.客户端请求:http://localhost:8080/webdemo/HelloServlet?name=huhu
webdemo是Web应用程序环境的根目录
HelloServlet是逻辑资源名称
?号后面的name=huhu是请求参数

2.寻找对应的URL模式 servlet-mapping中的<url-pattern>/HelloServlet</url-pattern>

3.找出Servlet注册名称 servlet-mapping中的<servlet-name>HelloServlet</servlet-name>

4.对应的注册名称 servlet中的<servlet-name>HelloServlet</servlet-name>
找到实体类名称:servlet中的<servlet-class>com.xxx.webdemo.HelloServlet</servlet-class>

5.使用找到的实体类处理请求

Tomcat默认使用应用程序根目录(Context Root)作为环境根目录,对应到server.xml的Context元素。
Web应用程序环境根目录可以自行设置,不过不同的Web容器设置各不相同。如:在Eclipse设置(与应用程序根目录相同):
web项目右键-Properties-Web Project Settings-Context root

小结:
无论使用@WebServlet注解类型,还是使用web.xml设置,在请求时的URL是逻辑名称(Logical Name),请求/HelloServlet时并不是在服务器上找一个叫HelloServlet实体文件,而是会由Web容器映射到实际处理请求的文件或程序实体名称(Physical Name)。如果愿意,也可以再用个像hello.jsp之类的名称来伪装资源。

到目前为止可以知道,一个Servlet类在web.xml中会有是三个名称设置:<url-pattern>设置的逻辑名称,<servlet-name>注册的Servlet名称,<servlet-class>设置的实体类名称。

注意:提供@WebServlet和web.xml两种配置方式的好处
1.@WebServlet的设置当做默认值;web.xml用来覆盖默认值
2.还有一个好处:
在Servlet3之前,只能使web.xml设置时的问题。
如写好一个Servlet类并编译完成,现在需要传给客户,需要告诉客户:
a.将编译好的Servlet放到WEB-INF/classes中
b.在web.xml进行设置

在Servlet3之后,使用了@WebServlet设置好默认的部署信息:
编译好发给客户,客户只需要将其放到WEB-INF/classes中即可,不需要设置额外的配置文件了。
部署上,简化了很多。

(5)IDE的项目管理中看到的文件组织结构是部署到Web容器中的文件结构吗?
IDE为了管理项目资源,会有其项目专属的文件组织,那并不是真正上传至Web容器之后该有的架构。

Web容器要求应用程序部署时,必须遵照如下的结构:
webdemo
|--WEB-INF
|       |--web.xml   部署描述文件
|       |--lib   放置当前应用程序所需的JAR文件
|             |--xxx.jar
|       |--classes   放置类文件含包的层次
|                |--com
|                       |--xxx
|                                |--webdemo
|                                          |--HelloServlet.java
|--other
       |--
上图中的几个重要的目录与文件位置说明:
1.WEB-INF:这个目录名称是固定的,而且一定是位于应用程序根目录下。放置在WEB-INF中的文件或目录,对外界来说是封闭的,也就是客户端无法使用HTTP的任何方式直接访问到WEB-INF中的文件或目录。若有这类需要,则可以通过Servlet/JSP的请求转发(Forward)。不想让外界存取的资源,可以放置在这个目录下。
2.web.xml:这是Web应用程序部署描述文件,一定是放在WEB-INF根目录下,名称一定是web.xml。
3.lib:放置当前Web应用所需的JAR文件的目录,一定是放在WEB-INF根目录下,名称一定是lib。
4.classes:放置编译后class文件的目录,一定是放在WEB-INF目录下,名称一定是classes。编译过后的类文件,必须有与包名称相符的目录结构。

如果使用Tomcat作为Web容器,则可以讲符合上图的webdemo这个目录复制到Tomcat安装目录的webapps子目录下。可启动(之前没有启动)或不启动(已启动,且server.xml中的Host元素中的autoDeploy="true"),使用以下的URL请求访问:
http://localhost:8080/webdemo/HelloServlet?name=huhu

实际部署WEB应用程序时,会将Web应用程序封装成一个WAR文件,也就是一个后缀名为*.war的文件。WAR文件可使用JDK所附的JAR工具程序来建立。
例如,可按照以上方式组织好Web应用程序的文件之后,进入webdemo目录,然后运行以下命令:

也可以在Eclipse中点击项目右键-->Export/WAR file导出WAR文件。

WAR文件使用zip压缩格式封装,可以使用解压缩软件来查看其中的内容。

如果使用Tomcat,则可以将所建立的WAR文件复制到webapps目录下,重启Tomcat(也可以不重启),容器若发现webapps中有WAR文件,会将其解压缩,并载入Web应用程序。

posted @ 2015-02-02 16:21  liqiong  阅读(254)  评论(0编辑  收藏  举报