- 浏览: 150183 次
- 性别:
- 来自: 保定
文章分类
最新评论
-
hellostory:
高级查询的查询参数放哪里?
SSH超实用分页实现(原创开源)! -
topbox163:
不错。。。。。。。。。
拥有属于自己的SVN(Google SVN)(更新版) -
shiyangxt:
忧_零 写道不知道这个问题LZ是否解决了啊,今天同样碰到这个问 ...
救助贴???关于Mysql插入二进制文件 -
忧_零:
不知道这个问题LZ是否解决了啊,今天同样碰到这个问题了,错误相 ...
救助贴???关于Mysql插入二进制文件 -
sornor:
不错!总算对servlet和jsp之间的关系有了了解了!感谢感 ...
JSP与Servlet的关系和实例分析(转帖)
JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术。Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTML页面中出现的内容。
由于包括大量的HTML标签、大量的静态文本及格式等,导致Servlet的开发效率极为低下。所有的表现逻辑,包括布局、色彩及图像等,都必须耦合在Java代码中,这的确让人不胜其烦。JSP的出现弥补了这种不足,JSP通过在标准的HTML页面中插入Java代码,其静态的部分无须Java程序控制,只有那些需要从数据库读取并根据程序动态生成信息时,才使用Java脚本控制。
从表面上看,JSP页面已经不再需要Java类,似乎完全脱离了Java面向对象的特征。事实上,JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。
看下面一个简单的JSP页面:
<!-- 表明此为一个JSP页面 -->
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>第一个JSP页面</TITLE>
</HEAD>
<BODY>
<!-- 下面是Java脚本-->
<%for(int i = 0 ; i < 10; i++)
{
out.println(i);
%>
<br>
<%}%>
</BODY>
</HTML>
当启动Tomcat之后,可以在Tomcat的Catalina\localhost\jsptest\org\apache\jsp目录下找到如下文件(假如Web应用名为jsptest,上面JSP页的名为test1.jsp):test1_jsp.java和test1_jsp.class。这两个文件都是Tomcat生成的,Tomcat根据JSP页面生成对应Servlet的Java文件及class文件。
下面是test1_jsp.java文件的源代码,这是一个特殊的Java类,是一个Servlet类:
//JSP页面经过Tomcat编译后默认的包
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
//继承HttpJspBase类,该类其实是个Servlet的子类
public final class test1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent
{
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants() {
return _jspx_dependants;
}
//用于响应用户的方法
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException
{
//获得页面输出流
JspFactory _jspxFactory = null;
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
{
_jspxFactory = JspFactory.getDefaultFactory();
//设置输出的页面格式
response.setContentType("text/html; charset=gb2312");
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("\r\n");
//下面输出HTML标签
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0
Transitional//EN\">\r\n");
out.write("<HTML>\r\n");
out.write("<HEAD>\r\n");
out.write("<TITLE>first Jsp</TITLE>\r\n");
out.write("</HEAD>\r\n");
out.write("<BODY>\r\n");
//页面中的循环,在此处循环输出
for(int i = 0 ; i < 10; i++)
{
out.println(i);
out.write("\r\n");
out.write("<br>\r\n");
}
out.write("\r\n");
out.write("</BODY>\r\n");
out.write("</HTML>\r\n");
out.write("\r\n");
}
catch (Throwable t)
{
if (!(t instanceof SkipPageException))
{
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (_jspx_page_context != null) _jspx_page_context.handle
PageException(t);
}
}
finally
{
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_
page_context);
}
}
}
即使读者不了解上面提供的Java代码,也依然不会影响JSP页面的编写,因为这都是由Web容器负责生成的。图2.1显示了test1.jsp的执行效果。
根据图2.1的执行效果,再次对比test1.jsp和test1_jsp.java文件,可得到一个结论:该JSP页面中的每个字符都由test1_jsp.java文件的输出流生成。
根据上面的JSP页面工作原理图,可以得到如下四个结论:
— JSP文件必须在JSP服务器内运行。
— JSP文件必须生成Servlet才能执行。
— 每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。
— JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。
JSP和Servlet会有如下转换:
- JSP页面的静态内容、JSP脚本都会转换成Servlet的xxxService()方法,类似于自行创建Servlet时service()方法。
- JSP声明部分,转换成Servlet的成员部分。所有JSP声明部分可以使用private,protected,public,static等修饰符,其他地方则不行。
- JSP的输出表达式(<%= ..%>部分),输出表达式会转换成Servlet的xxxService()方法里的输出语句。
- 九个内置对象要么是xxxService()方法的形参,要么是该方法的局部变量,所以九个内置对象只能在JSP脚本和输出表达式中使用。
*******************************************java生成静态页面**********************************************************
1 toHtml.java(不用修改,直接用)
package com.jetsum.mystatic;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class toHtml extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String url = request.getParameter("urls")!=null?request.getParameter("urls"):"";
//url是要生成htm的jsp页面
String name = "";
response.setContentType("text/html;charset=gb2312");
ServletContext sc = getServletContext();
System.out.println("request.getRealPath"+request.getRealPath(""));
name = request.getRealPath("") + "/index.htm"; /*生成htm页 位置在%服务器的根目录%/工程名/index.htm 例如:d:/tomcat5.0/webapp/studyteach/index.htm ,注意这里是在根目录生成,你可以生成后放到你想放的文件夹里,保证其它东西如图片的路径正确 这里就写成name = request.getRealPath("") + "/kszx/kszx.htm"; */
RequestDispatcher rd = sc.getRequestDispatcher(url);
final ByteArrayOutputStream os = new ByteArrayOutputStream();
final ServletOutputStream stream = new ServletOutputStream()
{
public void write(byte[] data, int offset, int length) {
os.write(data, offset, length);
}
public void write(int b) throws IOException {
os.write(b);
}
};
final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
HttpServletResponse rep = new HttpServletResponseWrapper(response)
{
public ServletOutputStream getOutputStream() {
return stream;
}
public PrintWriter getWriter() {
return pw;
}
};
rd.include(request, rep);
pw.flush();
FileOutputStream fos = new FileOutputStream(name); // 把jsp输出的内容写到xxx.htm
os.writeTo(fos);
fos.close();
PrintWriter out = response.getWriter();
out.print("<p align=center><font size=3 color=red>首页已经成功生成!</font></p>");
}
}
web.xml
中添加
<servlet>
<servlet-name>tohtm</servlet-name>
<servlet-class>com.jetsum.mystatic.toHtml</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>tohtm</servlet-name>
<url-pattern>/web/tohtm</url-pattern>
</servlet-mapping>
使用方法很简单 mytest.jsp(wwwroot下)
<a href="web/tohtm?urls=/kszx/kszx.jsp">生成静态页</a> kszx.jsp为要生成htm的动态页
如果不在wwwroot下,在wwwroot/pp下
就要写成
<a href="../web/tohtm?urls=/kszx/kszx.jsp">生成静态页</a>
发表评论
-
Java入门编程实例
2008-06-03 16:38 761php的学习先告一段落了,现在拿出近几天看的视频教 ... -
java基础进阶(文件列表,线程,线程组)编程实例(4篇)
2008-06-09 19:59 1051此处刊登代码均测试通过,完全准确! import j ... -
闭关贴!(含Java实践经验)
2008-06-16 11:32 711由于下周就考试 ... -
JSP环境配置全解!
2008-06-30 12:26 788实现JSP文件环境配置除了MyEclipse外,最 ... -
JSF搭建完成!(源码)
2008-07-07 12:07 1084今天搭建了我的第一个J ... -
Struts搭建完成!(源码)
2008-07-08 17:07 1334今天又搭好了我的第一个Struts框架,虽然觉有些复杂。但是我 ... -
Java连接数据库(mysql,sqlsever,Oracle,access)的调用函数!
2008-07-09 20:34 1706Java连各种数据库容易混淆,所以总结一下: oracle: ... -
实现Java连接mysql(源码)!
2008-07-10 22:14 3719Java连接mysql数据库,代码经过运行准确无误。 下面为实 ... -
Hibernate搭建成功!(源码)
2008-07-12 12:00 858昨天晚上搭建了我的第一个Hibernate框架。感觉挺爽的! ... -
MyEclipse内的Tmocat启动异常解决方案
2008-07-13 18:51 987在我们平常使用MyEclipse运行项目的时候,往往只需要启动 ... -
Struts+DAO框架搭建完成!(源码)
2008-07-13 21:32 842今天做了这个Struts+DAO框架,可以说是又向SSH迈了一 ... -
一个折磨我一下午的编程问题
2008-07-14 20:36 621今天下午搭Struts+DAO+Hibernate遇到一处错误 ... -
搭SSH时遇到的问题,已解决!
2008-07-16 18:46 711今天下午搭SSH,由于MyEclipse版本的不同,所以在搭的 ... -
JS验证框架的使用方法
2008-07-26 17:01 1068今天着重介绍的是JS验证框架在Java Web项目中的应用, ... -
搭建Servlet在线视频
2008-07-27 22:09 994这个视频flash上传及在 ... -
快速实现国际化---插件ResourceBunbleEditor的使用
2008-07-29 16:33 1012最近发现一个非常好用的插件,这个插件可以使Java的Web项目 ... -
Java数据库连接池类源码
2008-07-30 21:41 1735环境:MyEclipse 数据库:mysql 首先新建 ... -
Common Dbutils组件的使用(源码)
2008-08-01 20:50 1316Common Dbutils是操作数据库的组件,对传统操作数据 ... -
hibernate错误集锦(转)
2008-08-06 21:03 729**************************hiber ... -
Java测试Mysql数据库的最大连接数
2008-08-07 21:55 1448Java测试Mysql数据库的最大连接数类: import ...
相关推荐
最简单的 Jsp+Servlet+JavaBean 实例,简单易懂
jsp+servlet实例数据库jsp+servlet实例数据库
jsp+servlet实现班级信息管理项目
使用原始的servlet操作熟悉EJB的实体管理。 本实例主要功能:实现对员工、角色、账号、部门的关系管理。 本实例的实体设计:部门-员工:一对多。员工-账号:一对一。账号-角色:一对一。 主要采用EJB进行会话管理。...
servlet与jsp的有效结合实现信息提交跳转功能
这是一个以JSP、servlet、JavaBean实现MVC三层架构的简单例子,使用XML作为数据库连接的配置文件。 使用环境:eclipse_3.2、myeclipse_5.1、jdk_6.0、tomcat_5.5、sql server 2005 <br>----------------------...
jsp+servlet+mysql的学生管理系统小实例,很适合初学者
java jsp servlet 登录验证实例,希望对大家有所帮忙。
jsp+servlet+jdbc实现简单的购物车实例,购物数据通过session存储 1、加入购物车时,把数据保存在session中 2、点击系统退出时,购物车中的数据插入到数据库购物车表 3、再次登录时,查询数据库购物车表的数据加载到...
JSP与Servlet学习课件
JSP实验报告,完整,详尽。1. 系统概述 图书馆管理系统,具有登录、注册、图书的添加、修改、删除,个人信息查询、修改,退出等功能。
一个servlet的demo,使用servlet实现方法具体实现,jsp实现前端
JSP与Servlet核心技术JSP与Servlet核心技术JSP与Servlet核心技术
Servlet与JSP之间的关系 PPT的哦 很难得哦
主要介绍了基于jsp+servlet实现的简单博客系统,以完整实例形式分析了基于jsp+servlet简单博客系统的原理与相关技巧,并附带了完整源码供读者下载学习,需要的朋友可以参考下
非常完整,易于理解,条理清晰,导入即可运行,适合初学servlet和jsp技术或者想理清jsp技术的人,完整简洁的jsp+servlet+jstl实例。
简单介绍了jsp与servlet的一些基本的联系和区别
jsp与Servlet跳转jsp与Servlet跳转jsp与Servlet跳转,图形并茂
JSP与Servlet复习
基于Jsp+Servlet+JavaBean+JDBC实现登录功能,简单实例