一、JSP技术简介

JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护。

JSP是HTML代码与Java代码的混合体。

JSP文件通常以JSP或JSPX的扩展名。

JSP拥有自己的语法。

JSP形式上像HTML,但本质上是Servlet。

JSP的出现,使得将Web开发中的HTML与业务逻辑代码有效分离成为可能。通常JSP只负责生成动态的HTML文档,而业务逻辑由其他Java组件如JavaBean来实现。JSP可以通过Scriptlet来访问这些组件。

<% %>

Tomcat首次访问JSP的过程图示:

首先来看下,我们用Tomcat发布这个一个web : index.jsp的代码是:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> </head> <body>
<h1>演示JSP技术</h1>
<%
String name = "jack";
HttpSession s = request.getSession();
ServletConfig cfig = getServletConfig();
ServletContext aa = getServletContext();
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
session.setAttribute("a","aabbcc");
request.setAttribute("req", "request");
%>
<h1>这里用文字隔一下</h1> <%
out.println("name="+name);//注解1:上面jsp中定义了name变量,所以这里能访问,至于为什么能访问,去看下底层代码就知道了
out.println(session.getAttribute("a"));
%> <br/>
<!-- 我们在这里就调用sum函数,和输出age -->
sum=<%=sum(100) %><br/>
age=<%=age %> <%!
//下面是加了"!"号的内容
int age = 25;
int sum(int n){
int s=0;
for(int i=0;i<=n;i++){
s+=i;
}
return s;
}
%>
</body>
</html>

运行的结果是这样的:

为什么会这样的呢。我们来看Tomcat帮我们生成的java源代码(无论jsp怎么写,别人访问我们的网站的时候,tomcat会临时去读我们的jsp,然后再生成对应的.java文件):

我的tomcat安装在D盘下,myJspDemo是我的项目名,

D:\apache-tomcat-7.0.30\work\Catalina\localhost\myJspDemo\org\apache\jsp 这个目录下面会生成:index_jsp.java文件,我们打开它,

我只贴出与我刚写的jsp有关的代码图片了,不然太长了。

看完第一张图片,有没有感觉到什么~

再看第二张~~是不是一下子就懂了,原来jsp<% %>中的字符就只是原样写进java代码中啊~

<% %>中的字符是写进servlet()方法中的!!!!

而<%! %>中的字符是写进类的,和方法一个级别,变量就是成员变量!—-用这个有一个好玩的东西哦,自己再写一个servlet进去,覆盖tomcat的 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)类!也就是运行后,自己写的jsp完全不会再运行,只会运行自己的servlet中的内容了(方法名字取和tomcat一样_jspService,里面的变量用HttpServletRequest 的父类,就可以实现覆盖啦)。有趣吧,嘿嘿,不过只是画蛇添足啦,没必要这样,我只是想说明一个,就是用了<%! %>,这个中的变量,方法 的作用域就是整个类了!(写内部类都行)

<%=age %> 底层是把该名翻译成:out.print(age );

静态导入:

在index.jsp的<%! %>之后插入:

 <h2>--从这里开始导入包含页--静态导入,合成一个类,可以共享:局部变量、request和response对象等等</h2>
<!-- 静态导入:
-->
<%@include file="jsps/a.jsp" %>

/jsps/a.jsp:

这个写出来,myEclipse会报错的,但是没关系,这是myEclipse的智能识别问题,它无法识别那个变量名。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

    <h1>a.jsp...开始</h1>
<%
out.println("name="+name); //局部变量,可以访问
out.println("age="+age); //全局变量,可以访问
out.println("sum="+sum(100));//方法,可以访问
out.println(session.getAttribute("a"));//可以访问
%>
<h1>a.jsp...结束</h1>

演示结果:



看下tomcat帮我们把这个a.jsp的代码生成到哪了:

很明显,和index.jsp的生成在一个类中了,而且是servlet方法中!

所以,通过这个,我们就很容易理解为什么能够访问到name,age变量和sum()方法了吧。

解释一下:

静态导入其实就是把另外导入的jsp中的代码(相当于除了jsp的头,其他的全部原样拷过来)(采用jsp的方式翻译后的)直接插入到当前 _jspServlet()中的对应的位置!

jsp的方式翻译:html代码(包括html、body等标记、DOCTYPE约束)是采用 out.write()封装。jsp中写的java代码,就原样拷入!

动态导入:

index.jsp中在静态导入演示之后添加:

<h2>以下演示动态导入(包含)---生成两个独立的jsp类,只能够共享:request对象(输出结果是合并成一个页面显示的)</h2>
<jsp:include page="jsps/b.jsp"></jsp:include> <%
out.println("<br/>");
out.println("index中的request="+request);
out.println("<br/>");
out.println(request.getAttribute("req"));
%>
<h2>这是index.jsp的结尾</h2>

b.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>这是被动态导入的页面</title>
</head> <body>
<h1>这是被jsp:include(动态导入)的页面</h1>
<%
out.println("b.jsp中的session.getAttribute(a)="+session.getAttribute("a"));
out.println("<br/>");
out.println("b.jsp中的request="+request);
out.println("<br/>");
out.println(request.getAttribute("req"));
%> </body>
</html>

演示结果:

index_jsp.java:

可以很明显的看到,b.jsp中内容并没有生成在这里。

而是重新生成了一个类:

自然,b.jsp中的代码是在这个类中生成了,至于为什么不能访问那些局部变量和成员变量,懂Java的人很容易理解了吧!

所以,静态导入和动态导入,

区别是:静态导入不另外生成java类,而是在当前导入的类中生成java代码,而动态导入,会另外再生成java类,这也是为什么访问静态导入的网站运行会比动态导入的网站运行快的原因。

静态导入时导入所有,编译指令会起作用。

而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容。

实际应用:

使用包含引入页面统一的元素,如网头和网脚。

使用<%@ include file = url %><jsp:include page=url/>都可以。

使用包含引用用户是否已经登录的验证。

必须使用<%@ include file=url%>静态包含。

因为在同一个servlet中执行了redirect后面的代码将不会再执行。

而动态包含无论目标页面如何操作,都会再返回到源页再执行后面的代码。

JSP的注释语句:

<%- - 在这儿输入注释 - - %>

JSP-讲解(生成java类、静态导入与动态导入)的更多相关文章

  1. Jsp的include指令静态导入和动态导入的区别

    1.什么是静态导入? 静态导入指的是,将一个外部文件嵌入到当前JSP文件中,同时解析这个页面的JSP语句,它会把目标页面的其他编译指令也包含进来. include的静态导入指令使用语法: <%@ ...

  2. jsp里面include的静态导入和动态导入的区别

    静态导入就是将被导入页面完全融入到导入的页面中:而动态导入只是在servlet里面插入了include方法,导入的这是被导入页面的body标签里面的内容 1.什么是静态导入? 静态导入指的是,将一个外 ...

  3. YangTools从YANG生成Java类(Maven)

    1.说明 ODL提供了Yang Tools工具从YANG文件生成Java类, 本文介绍使用Maven插件的方式生成, 基于yang-maven-plugin这个插件. 2.创建Maven工程 Ecli ...

  4. JSP编译为Java类

    JSP编译为Java类: 注意可以随便写import的内容:可以写类属性.方法.main函数.内部类:可以使用内部类: JSP: <%@ page language="java&quo ...

  5. mybits根据表自动生成 java类和mapper 文件

    mybits根据表自动生成 java类和mapper 文件 我这个脑子啊,每次创建新的工程都会忘记是怎么集成mybits怎么生成mapper文件的,so today , I can't write t ...

  6. mybatis怎样自动生成java类,配置文件?

    其实没有什么东西是可以自动生成的,只不过是别人已经写好了,你调用罢了. 所以想要mybatis自动生成java类,配置文件等,就必须要一些配置和一些jar包.当然这些配置也很简单. 为了有个初步的认识 ...

  7. 根据XML文件 生成 java类

    最近一直在做关于webservice 的项目,这种项目最麻烦的就是根据对方的要求产生XML,文档里面虽然有XML结构,但是要转化为java里面的实体实在费劲, 有个自动化的工具就好了,半自动化也好,省 ...

  8. Jsonschema2pojo从JSON生成Java类(命令行)

    1.说明 jsonschema2pojo工具可以从JSON Schema(或示例JSON文件)生成Java类型, 在文章Jsonschema2pojo从JSON生成Java类(Maven) 已经介绍过 ...

  9. Jsonschema2pojo从JSON生成Java类(Maven)

    1.说明 jsonschema2pojo工具可以从JSON Schema(或示例JSON文件)生成Java类型, 并且可以配置生成Jackson 1.x,Jackson 2.x, Moshi 1.x或 ...

随机推荐

  1. HttpContext.Current多线程调用

    1.在web网站的Global中,进行数据量比较大的初始化工作,而为了使用户在页面上能够及时响应,我们在Global中开启了一个线程执行该函数模块. 不过,在线程中用到HttpContext.Curr ...

  2. ASP.NET 学习小记 -- “迷你”MVC实现(1)

    ASP.NET 由于采用了管道式设计,具有很好的扩展性.整个ASP.NET MVC应用框架就是通过扩展ASP.NET实现的.通过ASP.NET的管道设计,我们知道,ASP.NET的扩展点主要是体现在H ...

  3. Sqlmap下载安装与基础命令使用

    本文介绍一下Sqlmap的安装跟配置环境变量. 顺便附上一些常用的命令 SQLMAP-64位.Python 下载链接:http://pan.baidu.com/s/1c0D82fm 密码:d7ec P ...

  4. Git权威指南 读笔(2)

    第七章 Git重置: Git提供了一个挽救机制,通过.git/logs目录下日志文件记录了分支的变更. master分支的日志文件.git/logs/refs/heads/master,显示最后5行: ...

  5. shell 练习

    shell 练习 iii= ] do iii=$[$iii+] echo -n "$iii " done iii= ] do iii=$[$iii+] echo -n " ...

  6. Ubuntu下与菜单和图标相关的几个文件夹

    转自UBUNTU下与菜单和图标相关的几个文件夹 /usr/share/icons  系统图标文件夹 /usr/share/applications  系统菜单文件夹,要在左上角的应用程序菜单中添加一项 ...

  7. POJ 2983 Is the Information Reliable?(差分约束系统)

    http://poj.org/problem?id=2983 题意:N 个 defense stations,M条消息,消息有精确和模糊之分,若前边为P.则为精确消息,有两个defense stati ...

  8. Linux中与DNS相关的内容

    Linux中与DNS有关的三个东西: 1. 主机名 2. DNS服务器 3. Host文件 Linux中和DNS有关的三个文件: 1. /etc/hostname 2. /etc/resolv.con ...

  9. 去除Coding4Fun中MessagePrompt的边框(Border)

    在App.xaml文件中添加 xmlns:c4f="clr-namespace:Coding4Fun.Toolkit.Controls;assembly=Coding4Fun.Toolkit ...

  10. *[topcoder]LittleElephantAndIntervalsDiv1

    http://community.topcoder.com/stat?c=problem_statement&pm=12822&rd=15707 第一次用C++提交,艰辛.首先想到可以 ...