企业软件,WEB和对于他们无限美好的遐想(第三日)--2014-3-12--参观日 + Struts 原理分析 (二)

来源:互联网 发布:电影配乐知乎 编辑:程序博客网 时间:2024/06/04 18:27

--上接前一天--


7.简单的JSP开发

    7.1 JSP的工作原理:(为了更好的理解JSP服务器,本例为Tomcat如何创建和发布JSP程序)

          JSP服务器(本例为 Tomcat 服务器)管理JSP文件、页面分为两个阶段:

 阶段一:转换阶段(Translation Phase)

 阶段二:执行阶段(Execution Phase)

     如下图所示:

    

     文字说明一下这张图:

    1.当某JSP文件第一次被请求时,客户端通过HTTP协议将客户端的请求发送到服务器端,服务器会将JSP页面分配给JSP引擎。(JSP引擎是Servlet),然后把JSP文件转换成Servlet(Java文件.java)。Servlet始终停驻于内存中,响应时间非常快,但是,第一次调用相关服务时,由于需要转换JSP文件,并将Servlet编译为.class文件,因而会有相对的延迟,同样对于我们用友的UAP系统也一样---第一次进入UAP - NC 系统中会有相对的延时存在,但是,可以通过下载缓存、懒加载等方式降低延时时间

    2.转换过程中检验JSP文件语法是否存在错误,出错则终止转化,并向服务端和客户端输出报错信息

    3.如果无错误,JSP引擎调用javac把Java源文件编译成相应的.class文件并将该.class文件加载到内存中。
    4.之后,创建该Servlet的实例,并执行实例的jspInit()方法(jspInit()方法在Servlet的生命周期中只被执行一次,在jspInit()方法中会进行相关初始化工作,如,建立与数据库的连接、建立网络连接、从配置文件中获取相关参数等)。
    5.接下来,服务器会创建并启动一个新的线程,新线程调用实例的jspService()方法。(每个请求,JSP引擎都会创建一个新的线程来进行请求的处理工作。多个客户端同时请求同一个JSP文件,则JSP引擎会创建多个线程,每个客户端请求对应一个线程)。

     注意:多线程方式执行请求,可降低对系统的资源需求,提高并发及响应时间,但是,编程时需要注意多线程的编程禁忌和相关限制。
    重点说明:服务器或者叫Servlet容器会把客户端(本例为浏览器)请求和回应

                    封装成

                                  HttpServletRequest

                                                                  和

                                 HttpServletResponse对象

                       并调用对应的Servlet实例中的jspService()方法,把这两个对象作为参数传递到jspService()方法中。
     6.对应Servlet实例的jspService()方法执行后会将HTML内容返回给客户端。

在JSP执行期间,JSP服务器会检查JSP文件,如果JSP文件被修改了,服务器将根据设置决定是否对该文件进行重新编译。如果需要重新编译,则将编译结果取代内存中的Servlet,并继续上述处理过程。 如果系统资源不足,JSP引擎将把Servlet从内存中移除。此时会先调用jspDestroy()方法, 然后将Servlet实例标记为“垃圾收集”并处理(我认为此步骤应该是释放资源,待看过程序代码后进行相关的补充工作,另外,执行已有的Servlet的速度应该和原生的Servlet一样快,这个应该就是JSP这种机制的好处了)。  


关于CGI的相关介绍我会整理成为一个专题的,到时候连接过去即可。


    7.2 Web应用的固有目录结构,假设Web应用名为test -- (Web的目录结构不仅仅是针对于Tomcat,对于所有的JSP服务器都适用,因此才叫【固有目录结构】)


目录描述/test Web应用的根目录,JSP & HTML 文件都存放在此/test/WEB-INF存放Web应用的发布描述文件web.xml和自定义标签文件*.tld/test/WEB-INF/classes存放class & Servlet等/test/WEB-INF/libjar包存放处

Web应用目录结构如下图:




说明:

       1.classes & lib 目录下,都可以存放JAVA类,但是在运行中JSP服务器(本例为Tomcat)会先装载classes目录下的类,再装载lib下的。因此可以看出,classes目录下的类具有更高的优先权,或者说当两个目录同时存在相同的类时,classes会覆盖掉lib的类。

       2.一般情况下,lib中应该只存放外部引用的类,向Struts的JAR包呀,JDBC驱动程序的JAR文件呀,还有其他的开源项目包呀等待,用户自己编写的类文件一定放在classes目录下边。

       3.WEB-INF 文件目录对于客户端用户是隐藏的,不能通过浏览器直接访问到该目录中的文件


    7.3 写个简单的JSP程序吧

          如果JDK - Tomcat 等都安装完毕了,或者也不拘泥于何种形式的IDE,那么打开记事本开始进行第一次快乐的JSP简单编程吧,哈哈~

          (我这里用的IDE是MyEclipse,大家可以翻看前一章)

  先来看一下我的简单的JSP文件结构,如下图:


        

其中 Web.xml文件非常重要,JAVA上的Web应用通过它来描述并配置发布信息,这些配置信息非常重要,比如Servlet的相关信息、拦截器、资源引用等,下边我们来详细的看一下这些配置信息,以及再MyEclipse中的可视化配置和非可视化配置是如何进行操作的。(此部分具体的内容还在整理之后会补充完整)

       1.定义Servlet

       2.Servlet参数初始化

       3.JSP/Servlet映射管理

       4.安全域配置参数

       5.定义Filter

       6.welcome文件清单

       7.资源引用配置

       8.环境变量定义


一般情况下使用IDE新建Web Project时都会自动创建Web.xml。对于手写此文件的人来说可以将下边的文件拷贝并保存到相关位置。


-----------------------web.xml-----------------------

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" 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_2_5.xsd">  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>

-----------------------web.xml-----------------------end


然后写index.jsp & welcome.jsp页面的代码


index.jsp 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>This is my JSP page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>    <body>     <br>   <form method="post" action="welcome.jsp" name="loginFrom">   <p> <input type="text" maxlength="25" size="20" name="username" value="用户名"></p>   <p> <input type="text" maxlength="25" size="20" value="密码" name="password"></p>   <p> <input type="Submit" value="提交" name="submit"></p>   </form></body></html>

 welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'welcome.jsp' starting page</title>    <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>    <body>    欢迎:<%=request.getParameter("username") %><br>     </body></html>

7.4 发布并测试JSP:打开服务器,然后访问127.0.0.1:8080。看到如下效果:


 ---》 



到目前为止关键JSP的初步了解已经结束啦,下边将会讲解一些JSP的常用特性和高级特性,并尝试使用JSP/Servlet来实现Struts的部分功能。


0 0
原创粉丝点击