• 构建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应用程序。

  • 相关阅读:
    如果你也时常想要上进,我们可以相互鼓励,相互促进
    (转)Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
    乐观锁和悲观锁(Version:0.1)
    redis数据丢失及解决【转】
    Spring的IOC原理[通俗解释一下]
    Java中Error与Exception的区别
    WebService
    JDBC详解
    Cookie与Session
    java的pojo规范
  • 原文地址:https://www.cnblogs.com/liqiong/p/4268053.html
Copyright © 2020-2023  润新知