Java语言诞生,由于其很好的跨平台特性,加速了Web应用的发展。与传统的C/S模式相比,Java对整个Web应用提供了一整套的解决方案:在客户端,Applet的应用;在Server端,有Servlet的应用。
一、Applet:Applet(小应用程序)采用Java创建的基于HTML的程序。浏览器将其暂时下载到用户的硬盘上,并在Web页打开时在本地运行。一般的Applet只能通过appletviewer或者浏览器来运行,一般的Java程序通过继承Applet类也可以嵌入网页运行。
二、Servlet:先看传统的Server端处理程序CGI,CGI运行在服务器端,当监听到用户请求时,针对每个请求Server端将启用一个新的进程来完成相应请求的逻辑运算。而Servlet出现替换了Server端的处理程序。Servlet由Java编写,具有CGI相同的扩展Server功能。但比之CGI,Servlet有如下两个优势:
(1)、当在服务器端采用Servlet处理程序时,当监听到一个用户请求时,服务器将会启动一个Java线程,由该Java线程来完成用户请求的逻辑运算。这与CGI采用的进程相比,由于进程相对Java线程的重量级,当并发访问量达到一定的数量后,服务器的开销将有很大的差距。使得利用Servlet作为服务器端的处理程序时,可以得到较好的运行效率。
(2)、由于Servlet由Java编写,而CGI虽然可以用任何一种语言编写,但大多数实现都是C或C++编写。所以利用Servlet作为Web应用的服务器端处理程序使得Web应用具有更好的跨平台特性,众所周知,只要在服务器上安装了Java虚拟机,任何平台都可以运行Java应用。
三、Servlet的实现:继承javax.servlet.http.HttpServlet类的一个Java类即可。但需注意HttpServlet类是一个抽象类,所以写Servlet类时需要实现其声明的一些方法。常用的方法有:doGet,doPost,doPut,doHead,分别为处理方法为Http GET(Post、Head、Put)的请求。Servlet的配置需在web.xml中进行相应的配置。
四、JSP与Servlet的关系:大家不难发现其关系。在Tomcat中部署一个Web应用,对应每个Webapps文件夹下的Web应用,在Tomcat根目录中用一个work文件夹下的相应文件对应,一个JSP页面,对应一个Java文件。例如:D:\Tomcat 6.0\work\Catalina\localhost\examples\org\apache\jsp\jsp\jsp2\simpletag\hello_jsp.java与D:\Tomcat 6.0\webapps\examples\jsp\jsp2\simpletag\hello.jsp.注意他们的路径和文件名。将jsp文件中的“.”替换为“_”并在后面加上后缀“.java”.这里的Java文件就是相应JSP页面转换的Servlet。
package org.apache.jsp.jsp.jsp2.simpletag;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class hello_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;
static {
_jspx_dependants = new java.util.ArrayList(1);
_jspx_dependants.add("/WEB-INF/jsp2/jsp2-example-taglib.tld");
}
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(" Licensed to the Apache Software Foundation (ASF) under one or more\n");
out.write(" contributor license agreements. See the NOTICE file distributed with\n");
out.write(" this work for additional information regarding copyright ownership.\n");
out.write(" The ASF licenses this file to You under the Apache License, Version 2.0\n");
out.write(" (the \"License\"); you may not use this file except in compliance with\n");
out.write(" the License. You may obtain a copy of the License at\n");
out.write("\n");
out.write(" http://www.apache.org/licenses/LICENSE-2.0\n");
out.write("\n");
out.write(" Unless required by applicable law or agreed to in writing, software\n");
out.write(" distributed under the License is distributed on an \"AS IS\" BASIS,\n");
out.write(" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
out.write(" See the License for the specific language governing permissions and\n");
out.write(" limitations under the License.\n");
out.write("-->\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title>JSP 2.0 Examples - Hello World SimpleTag Handler</title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write(" <h1>JSP 2.0 Examples - Hello World SimpleTag Handler</h1>\n");
out.write(" <hr>\n");
out.write(" <p>This tag handler simply echos \"Hello, World!\" It's an example of\n");
out.write(" a very basic SimpleTag handler with no body.</p>\n");
out.write(" <br>\n");
out.write(" <b><u>Result:</u></b>\n");
out.write(" ");
if (_jspx_meth_mytag_005fhelloWorld_005f0(_jspx_page_context))
return;
out.write("\n");
out.write(" </body>\n");
out.write("</html>\n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
private boolean _jspx_meth_mytag_005fhelloWorld_005f0(PageContext _jspx_page_context)
throws Throwable {
PageContext pageContext = _jspx_page_context;
JspWriter out = _jspx_page_context.getOut();
// mytag:helloWorld
jsp2.examples.simpletag.HelloWorldSimpleTag _jspx_th_mytag_005fhelloWorld_005f0 = new jsp2.examples.simpletag.HelloWorldSimpleTag();
org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_mytag_005fhelloWorld_005f0);
_jspx_th_mytag_005fhelloWorld_005f0.setJspContext(_jspx_page_context);
_jspx_th_mytag_005fhelloWorld_005f0.doTag();
org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_mytag_005fhelloWorld_005f0);
return false;
}
}
JSP转换后的Servlet不是继承HttpServlet而是HttpJspBase,并实现了JspSourceDependent接口。这个Servlet中有个方法为_jspService():这是Servlet执行业务逻辑的接口。我们可以看出JSP文件的内置对象application\request\response\session是怎么来的。(在对应的Servelt的_jspService()方法中创建的)
五、Servlet的生命周期:加载、初始化、请求执行、销毁。
(1)加载:分为自动加载和调用时加载两种加载方式,这两种方式都是通过Web应用的web.xml配置文件来配置完成的。自动加载表示在服务器启动时,Servlet自动加载到内存。直到服务器重新启动Servelt才会被删除。自动加载的配置:
<servlet>
<serlvet-name></servlet-name>
<servlet-class></serlvet-class>
<load-on-startup>1</load-on-startup>
</servlet>
只要load-on-startup标记的值大于等于0时,就是自动加载。并且数值越大,加载的优先级(次序)越高。
同理,调用时加载只要不配置load-on-startup标记即可。调用时加载表示只有通过浏览器端访问在Servlet-mapping中配置的URL时,对应的servlet-class才被调用,即被加载到内存。第一次调用Servlet时,系统响应较慢,这是因为服务器要进行内存配置,当加载后,系统响应效率就会大大提高。
(2)初始化-init()
(3)请求处理—service()
(4)销毁—destroy().
分享到:
相关推荐
Why use with Struts + Spring + Hibernate
介绍字典分解中Gabor基的作用,是小波、压缩感知技术的介绍性文章
经典文章:为什么需要functional programming语言。
Why use GNU? GNU is a complete, Unix-like operating system that has been in development for just over twenty years. GNU software is known for it’s stability and standard compliance. Most GNU systems ...
Why use it? Let's face it - instrumentation tests can be flaky. Even if your brand new test passes the first time you run it on a device, it doesn't mean that it won't fail if you run it again. ...
加花器绝对好用Themida is a powerful software protection system designed for software developers who wish to protect their applications against advanced reverse engineering and ... · Why use Themida?
Albert Einstein once said, “If you can’t explain it simply, you don’t understand it well enough.” Since I understand Near Field Communication (NFC) well, my intention in ...Chapter 5: Why Use NFC?
Why use fftshift(fft(fftshift(x))) instead of fft(x) in Matlab
leetcode卡面试准备 对于准备面试并拥有 ...use it ? VM vs Docker What is Docker and why use it ? VM vs Docker - KAFKA - 联网 Networking basic(LAN,WAN,Switch,Hub,Routers, etc) - OSI Model in network
Why Use Redux? Chapter 2. Core Concepts Chapter 3. Redux Patterns Chapter 4. Building the Sample App Chapter 5. Syncing Data with the Server Chapter 6. Showing Request State to Users Chapter 7. ...
Why!?
why use cProfile? cProfile,一个python程序性能分析模块。其实Python有两个profiler,Profile和cProfile,前者是纯Python写的,会产生比较大的开销,测试结果不准确。后者是c语言扩展模块,对受测程序影响比较小,...
没有人预料到这一点——甚至包括它的创造者:ChatGPT作为一种能够以令人信服的人类水平进行写作的AI已经出现在舞台上。但是它真正的工作原理是什么?其“AI大脑”内部发生了什么?在这本短篇书籍中,杰出科学家和...
So why use dTree? dTree is very simple to set up and use. You don't have to worry about adding pages to the tree in a specific order, which makes it ideal for generating a tree from a database.
信息安全_数据安全_Frameworks and Why We Use Them 风险分析 移动安全 漏洞管理 安全测试 AI
You can use this tooling to operation sap system automatically,so great enhance your work efficiency,liberate your hands to another something.why not use?
#1.1_Why_Linux__(Linux_机器学习_教程教学_tutorial)
Why do successful people get things done at the last minute? Why does poverty persist? Why do organizations get stuck firefighting? Why do the lonely find it hard to make friends? These questions seem...
ChatGPT研究资料,What Is ChatGPT Doing ... and Why Does It Work (Stephen Wolfram) (Z-Library)
Why Qt5? Because Qt5 is awesome! Why cadaques? Because one of the authors had a great holiday in this rocky coast line in the north-east of spain. We are heavily working on this book and that means ...