企业软件,WEB和对于他们无限美好的遐想(第三日)--2014-3-12--参观日 + Struts 原理分析 (二)
2014-03-12 11:12
441 查看
--上接前一天--
7.简单的JSP开发
7.1 JSP的工作原理:(为了更好的理解JSP服务器,本例为Tomcat如何创建和发布JSP程序)
JSP服务器(本例为 Tomcat 服务器)管理JSP文件、页面分为两个阶段:
阶段一:转换阶段(Translation Phase)
阶段二:执行阶段(Execution Phase)
如下图所示:
![](https://img-blog.csdn.net/20140313120034140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3R6aA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
文字说明一下这张图:
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服务器都适用,因此才叫【固有目录结构】)
Web应用目录结构如下图:
![](https://img-blog.csdn.net/20140312231035218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3R6aA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
说明:
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文件结构,如下图:
![](https://img-blog.csdn.net/20140313141708906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3R6aA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
其中 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-----------------------
-----------------------web.xml-----------------------end
然后写index.jsp & welcome.jsp页面的代码
index.jsp
welcome.jsp
7.4 发布并测试JSP:打开服务器,然后访问127.0.0.1:8080。看到如下效果:
![](https://img-blog.csdn.net/20140313143901062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3R6aA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
---》
![](https://img-blog.csdn.net/20140313143910671?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3R6aA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
到目前为止关键JSP的初步了解已经结束啦,下边将会讲解一些JSP的常用特性和高级特性,并尝试使用JSP/Servlet来实现Struts的部分功能。
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/lib | jar包存放处 |
说明:
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的部分功能。
相关文章推荐
- GUI - Web前端开发框架
- Extjs4.0 最新最全视频教程
- 我是运营,我没有假期
- JQuery+Strusts1.x无刷新登录
- MyEclipse Web Project转Eclipse Dynamic Web Project
- axis备忘
- DB2数据库的安装
- 通过Mootools 1.2来操纵HTML DOM元素
- WEB标准网页布局中尽量不要使用的HTML标签
- 防止网页脚本病毒执行的方法-from web
- “传奇”图象数据存储方式
- Flash 与 html 的一些实用技巧
- 自学成才的秘密:115个 web Develop 资源
- html工作中表格<tbody>标签的使用技巧
- HTML 向 XHTML1.0 兼容性指导
- 修复mysql数据库
- 使用批处理修改web打印设置笔记 适用于IE
- Apache Web让JSP“动”起来
- web下载的ActiveX控件自动更新
- 推荐六款WEB上传组件性能测试与比较第1/10页