java web 入门与jsp动态网页技术原理

静态web:

客户端浏览器发送Http请求到web server,web server从File System调用请求的页面给客户端浏览器;
但发送的页面是相对不变的,静态web不能连接数据库,不能访问资源;
静态web客户端浏览器可以实现动态的页面效果:
1.JavaScript;
2.VBScript;
这两种脚本语言在语言产生前使用,但不是真正的动态web;
1995年,产生,Applet可以在客户端处理必要的操作,而不必请求服务器;但Applet仍然不是动态web,而且Applet的下载要求较好的网络环境,执行效率低;
微软xp系统和.net平台的推出,使 jvm从windows系统消失,Applet也就不能使用了;
为了解决静态web不能连接数据库的问题,出现了动态web;
动态web将根据不同的用户类型和请求给予不同的效果,并且具有动态交互性;
如,BBS的用户具有不同的权限,则他们登录时,页面展现的效果和操作是不同的!
动态交互性: web 服务器端可以分析客户端请求,这个任务由web server plugin完成,它能判断当前请求是静态的还是动态的,
若是静态请求: 则直接通知web server, web server 直接发送File System中相应的静态页面给客户端;
若是动态请求: 则交给web container,web container 可以动态地拼凑代码,将处理好的代码发送给web server , 进而发送给客户端;
web container可以处理程序的生命周期,可以连接数据库;
但中间的跨度,是动态web请求比静态web请求慢!
动态web的主要实现方式:
1. 微软ASP,ASP.Net
2. PHP,
3. Servlet/JSP;

——-tomcat配置与jsp请求原理

tomcat是一个符合J2EE标准的WEB服务器,
但J2EE的EJB程序无法此处运行;
运行EJB程序的容器:WebLogic,WebSphere;
配置JDK环境:
配置path路径:
JAVA_HOME = java安装路径;
端口选择8080,但若安装了oracle,则可能被占用;
项目时,选择80端口,这是每个网站的默认端口,类;
目录:
bin:可执行文件;
common:需要的jar文件;
conf:服务器配置目录;
logs:日志目录,记录服务器运行状态;
service:服务;
webapps:所有的web项目;
work:临时文件保存目录,清空可以解决某些因此造成的故障!
配置端口: /conf/server.xml
配置虚拟目录:
目标文件夹
        |- ROOT 即目标文件夹
        |- WEB-INF文件夹
        |- web.xml文件
web.xml内容:

    xmlns:xsi=”https://www.w3.org/2001/XMLSchema-instance”
    xsi:schemaLocation=”https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”
    version=”2.5″>
          
          
   
修改server.xml使生效:
标签前加入:        # Context表示上下文会话,path表示URI访问最终目录,docBase表示映射的磁盘目录;
重启服务器: sudo /etc/init.d/tomcat6 stop ; sudo /etc/init.d/tomcat6 start;
浏览器输入:https://localhost/pro可以访问;但出现404错误,
这是表示客户端错误,tomcat默认关闭目录的列表功能,要想查看目录内容,需要设置
conf/web.xml中的listings标签为true;
项目时,必须关闭,否则可能会修改数据!
tomcat重新配置文件后,必须重启服务器方能生效!
——–第一个JSP;

       

the first jsp page
       
               
       

保存文件为:index.jsp;
———tomcat第一次执行Jsp的过程:
1.客户端通过浏览器请求jsp页面,此时请求是动态请求,交给web容器处理;
2.在容器中找到需要的*.jsp文件;
3.将jsp文件都转换为*.java 文件; // servlet程序,保存在tomcat/work/…/
4.*.java文件为class文件;
5.服务器执行生成的class文件;
第二次访问时,服务器直接调用生成的class文件,不经过过程!
但是,如果此时修改了jsp源文件,则会重新,再执行!
客户端收到的是服务器发送的html代码:
———-客户端浏览器收到的服务器发送的html源代码:

p>“https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>

Apache Tomcat

It works !

Hello, World!

———-jsp转换的java文件:

package org.apache.jsp;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase

implements org.apache.jasper.runtime.JspSourceDependent {

private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

private static java.util.List _jspx_dependants;

private javax.el.ExpressionFactory _el_expressionfactory;

private org.apache.AnnotationProcessor _jsp_annotationprocessor;

public Object getDependants() {

return _jspx_dependants;

}

public void _jspInit() {

_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();

_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());

}

public void _jspDestroy() {

}

public void _jspService(HttpServletRequest request, HttpServletResponse response)

throws java.io.IOException, ServletException {

PageContext pageContext = null;

HttpSession session = null;

ServletContext application = null;

ServletConfig config = null;

JspWriter out = null;

Object page = this;

JspWriter _jspx_out = null;

PageContext _jspx_page_context = null;

try {

response.setContentType(“text/html”);

pageContext = _jspxFactory.getPageContext(this, request, response,

null, true, 8192, true);

_jspx_page_context = pageContext;

application = pageContext.getServletContext();

config = pageContext.getServletConfig();

session = pageContext.getSession();

out = pageContext.getOut();

_jspx_out = out;

out.write(“\n”);

out.write(“"-//W3C//DTD XHTML 1.0 Strict//EN\"\n");

out.write(” \”https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\”>\n”);

out.write(“\n”);

out.write(“

\n”);

out.write(”

Apache Tomcat\n”);

out.write(“\n”);

out.write(“\n”);

out.write(“

\n”);

out.write(“

It works !

\n”);

out.println(“Hello, World!”);

out.write(“\n”);

out.write(“\n”);

out.write(“\n”);

} catch (Throwable t) {

if (!(t instanceof SkipPageException)){

out = _jspx_out;

try { out.clearBuffer(); } catch (java.io.IOException e) {}

if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);

}

} finally {

_jspxFactory.releasePageContext(_jspx_page_context);

}

}

}

——–ubuntu linux下解决一些问题:
问题1:
他好像随系统一同启动?如何取消?
答:
1.执行代码:

runlevel

ubuntu的默认值为N 2
2.执行代码:

ls /etc/rc2.d/

此处rc后的数字应与runlevel命令得到的结果一致
3.你可以在返回结果中看到诸如S92tomcat6的字段,将该链接文件改名为K08tomcat6 (解释:92+8=100):
代码:

sudo mv /etc/rc2.d/S92tomcat6 /etc/rc2.d/K08tomcat6

至此,下次开机的时候,tomcat6就不会自动启动了
------
问题2:
我如何关闭? 使用/usr/share/tomcat6/bin/*.sh关闭会报错!
根据你的执行后输出可以看到,关闭错误的原因在于环境变量CATALINA_BASE有误,如果使用apt-get方式安装tomcat6的话,CATALINA_BASE应当为/var/lib/tomcat6
推荐使用现成脚本的方式来关闭tomcat6:
代码:

sudo /etc/init.d/tomcat6 stop

和mysql的操作相同
------
问题3:
如何更改端口?
如果想更改tomcat6的端口,可以修改/var/lib/tomcat6/conf/server.xml文件,修改其中Connector元素的port属性

———tomcat6启动过程分析:
ClassLoader
Class Loading是java提供的强大机制之一。JVM利用ClassLoader来装载用到的类文件。有两个原因会促使我们自定义ClassLoader:
1. 希望支持一个新的类仓库,而不只是本地文件系统(JVM提供的ClassLoader只能从本地文件系统中load类)。applet ClassLoader 就是一个例子。它支持从HTTP server上load类文件。
2. 希望在一个server上分离用户代码。比如servlet engine,可能不同的开发者写出的servlet运行在一个engine里面,而他们之间相互不可知的。他们也当然希望自己的代码独立于别人的代码运行。通过为每一个开发者的servlets自定义一个 ClassLoader 把他们的code分离开了。因为在JVM中class是靠它的全限定名称(包名+类名)以及他的ClassLoader来唯一标示的。这样不同的 ClassLoader 装入的类就彼此分开了。(A class is uniquely identified in a JVM using its fully qualified class name along with the instance of the ClassLoader that loaded the class. )。 JVM默认只是通过AppClassLoader来load我们的类。
Class and Data
class表示一段可执行的代码,而data则表示与这段代码关联的类的状态。状态可变,代码通常不能变。当我们将data和class关联起来的时候就是一个类的实例对象。不同的实例拥有不同的data即状态,但公用一段class代码。在一个JVM中一个Loader指挥load一次同一个类。类是通过全限定名称标识的。不同的 loader装的同一个类的类型都不兼容。(classes loaded by different loaders are completely different and not type-compatible to each other. )
Class Loaders In J2EE
J2EE的class loader主要需要考虑热部署和应用独立性(hot redeployment and application independence)。
一般来说,loaders都是通过父子继承关系方式组织的。所以一般的loader都有父loader,要知道loader本身也是class,也需要被load。当一个loader收到一个class装载请求的时候,它会首先请求它的父loader去做,一直向上请求到top loader。如果父loader能做就做,不能做就往下走,一直到底,在找不到就报ClassNotFoundException。注意,父 loader装的class看不到子loader装的class。当然兄弟之间也不行。
Tomcat Class Loaders
当Tomcat启动的时候,它创建几个loader,他们的继承关系,如下:
引用
   Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 …
* Bootstrap
这个loader装载JVM提供的基本的运行时类,以及来至$JAVA_HOME/jre/lib/ext的jar文件。
* System
这个loader装载环境变量CLASSPATH下面的类,这些类对tomcat内部类和web app里面的类都可见。但标准的Tomcat 6 startup scripts ($CATALINA_HOME/bin/catalina.sh or %CATALINA_HOME%\bin\catalina.bat) 完全忽略了CLASSPATH下面的类对它的可见性,取而代之的从下面的库里面构建:
     o $CATALINA_HOME/bin/bootstrap.jar – 包含用于初始化Tomcat 6 server的main()方法以及它所依赖的类。
     o $CATALINA_HOME/bin/tomcat-juli.jar – 更名的Jakarta commons logging API和java.util.logging LogManager.
* Common  
这个loader装载一些额外的类,这些类对tomcat内部类和所有web app里面的类都可见。通常app 类不应该放在这里。它包含$CATALINA_HOME/lib下面未打包的类和资源,并且Jar里面的资源也通过这个loader对外可见了。默认情况包括:
          o annotations-api.jar – JEE annotations classes.
          o catalina.jar – Implementation of the Catalina servlet container portion of Tomcat 6.
          o catalina-ant.jar – Tomcat Catalina Ant tasks.
          o catalina-ha.jar – High availability package.
          o catalina-tribes.jar – Group communication package.
          o el-api.jar – EL 2.1 API.
          o jasper.jar – Jasper 2 Compiler and Runtime.
          o jasper-el.jar – Jasper 2 EL implementation.
          o jasper-jdt.jar – Eclipse JDT 3.2 Java compiler.
          o jsp-api.jar – JSP 2.1 API.
          o servlet-api.jar – Servlet 2.5 API.
          o tomcat-coyote.jar – Tomcat connectors and utility classes.
          o tomcat-dbcp.jar – package renamed database connection pool based on Commons DBCP.
          o tomcat-i18n-**.jar – Optional JARs containing resource bundles for other languages. As default bundles are also included in each individual JAR, they can be safely removed if no internationalization of messages is needed.
* WebappX  
这个loader装载每一个部署在单个Tomcat 6 实例下面的web application。所有/WEB-INF/classes和/WEB-INF/lib下面的类和资源都在本web app内彼此可见。单对别的web app不可见。
分析

private void initClassLoaders() {

try {

commonLoader = createClassLoader(“common”, null);

if( commonLoader == null ) {

// no config file, default to this loader – we might be in a ‘single' env.

commonLoader=this.getClass().getClassLoader();

}

catalinaLoader = createClassLoader(“server”, commonLoader);

sharedLoader = createClassLoader(“shared”, commonLoader);

} catch (Throwable t) {

log.error(“Class loader creation threw exception”, t);

System.exit(1);

}

}

ClassLoader classLoader = ClassLoaderFactory.createClassLoader

(locations, types, parent);

classLoader = new StandardClassLoader(array);

80端口是为HTTP(HyperText Transport Protocol)即超文本传输协议开放的,这是上网冲浪使用最多的协议,主要用于WWW(World Wide Web)即万维网传输信息的协议。我们可以通过HTTP地址(即常说的“网址”)加“:80”来访问网站,比如 https://www.cce.com.cn:80,因为浏览网页服务默认的端口号都是80,所以只要输入网址即可,不用输入“:80”了。
[编辑本段]
相关说明
  端口漏洞:有些木马程序可以利用80端口来攻击计算机的,比如Executor、RingZero等。
  操作建议:为了能正常上网冲浪,我们必须开启80端口。
  在Windows2000/XP/Server2003中要查看端口,可以使用NETSTAT命令:
“开始”>”运行”>“cmd”,打开命令提示符窗口。在命令提示符状态下键入“NETSTAT -a-n”,按下回车键后就可以看到以数字形式显示的TCP和UDP连接的端口号及状态.
  命令格式:Netstat-a-e-n-o-s
  -a表示显示所有活动的TCP连接以及计算机监听的TCP和UDP端口。
  -e表示显示以太网发送和接收的字节数、数据包数等。
  -n表示只以数字形式显示所有活动的TCP连接的地址和端口号。
  -o表示显示活动的TCP连接并包括每个连接的进程ID(PID)。
  -s表示按协议显示各种连接的统计信息,包括端口号。
  关闭端口
  比如在Windows2000/XP中关闭SMTP服务的25端口,可以这样做:首先打开“控制面板”,双击“管理工具”,再双击“服务”。接着在打开的服务窗口中找到并双击“SimpleMailTransferProtocol(SMTP)” 服务,单击“停止”按钮来停止该服务,然后在“启动类型”中选择“已禁用”,最后单击“确定”按钮即可。这样,关闭了SMTP服务就相当于关闭了对应的端口。
  开启端口
  如果要开启该端口只要先在“启动类型”选择“自动”,单击“确定”按钮,再打开该服务,在“服务状态”中单击“启动”按钮即可启用该端口,最后,单击“确定”按钮即可。
  另外在网络连接属性中,选择“TCP/IP协议”属性,打开高级TCP/IP设置,在选项的那个页面打开TCP/IP筛选,在出现的设置窗口中也可以根据实现情况设置端口的打开和关闭,默认是未启用TCP/IP筛选。

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《java web 入门与jsp动态网页技术原理
本文地址:https://www.zhiletu.com/archives-189.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微