zoukankan      html  css  js  c++  java
  • 构建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应用程序。

  • 相关阅读:
    内存泄漏 Memory Leaks 内存优化 MD
    Handler Thread 内部类引起内存泄露分析
    为什么不取消注册BroadcastReceiver会导致内存泄漏
    WebChromeClient 简介 API 案例
    WebViewClient 简介 API 案例
    java.net.URI 简介 文档 API
    android.net.Uri 简介 API
    RV 多样式 MultiType 聊天界面 消息类型 MD
    JS函数声明与定义,作用域,函数声明与表达式的区别
    CSS中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
  • 原文地址:https://www.cnblogs.com/liqiong/p/4268053.html
Copyright © 2011-2022 走看看