从本篇文章开始,我会用文章记录下我在学习Java EE过程中的一些笔记和感悟,至于还没有更新结束的Java SE还是会继续写的,只是我觉得一直写语法很枯燥,自己也没法继续下去,所以带着点web学习,会有趣些。我主要学习的书籍是李刚老师的轻量级企业应用实战,后续博文不再声明。本文将从以下几个方面总结一下JSP的基本用法:

  • JSP的基本原理以及和servlet的关系
  • JSP的基本语法
  • 编译指令Page和include
  • 基本的动作指令
  • 内置对象

一、JSP的基本原理以及和servlet的关系

     在没有出现 JSP之前,我们访问网站都是访问的Servlet,通过它返回html代码。就像下面这样:

	  out.write("\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title></title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write("\t");
out.print("<p>hello world</>");
out.write("\n");
out.write(" </body>\n");
out.write("</html>\n");

     所有的html代码都是用这种方式输出到浏览器的,这种将html代码耦合在Java代码中的方式,直接导致前端程序员没法直接参与编码工作,后端程序员的工作量日益增大,这是低效的,是必然要被淘汰的。

     在不甘痛苦中,我们发明了JSP,这是一种将Java代码耦合在html代码中的方式,类似于这样:

<html>
<head>
<title></title>
</head>
<body>
//输出一个字符串,具体语法,下面介绍
<p><%="hello,world"%></p>
</body>
</html>

     这是一个jsp页面,实际上jsp就是servlet的草稿文件,为什么这么说呢?每个jsp页面都会对应一个servlet实例,在编译的时候,编译器会将这个jsp页面读取到servlet实例中。我们看看这个jsp对应的servlet实例的代码:

	  out.write("\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title></title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write("\t\t<p>"); //<p> out.print("hello,world"); //<%="hello,world"%> out.write("</p>\n"); //</p>
out.write(" </body>\n");
out.write("</html>\n");

     对于jsp中的一般html页面的标签内容,直接是用字符串的形式输出,而对于jsp 语法部分,拿到servlet中执行之后将结果输出。对于整个过程,我们只需要知道,jsp页面中的所有内容都会在编译器编译阶段被一个servlet全部读取,对于其中的html代码,以字符串的形式返回,对于jsp语法,执行之后返回。本质上用户虽然请求的是jsp页面,为用户返回结果的却是servlet。

     那有人会问了,既然都是用servlet返回结果,那有了jsp和没有的时候,效率体现在哪呢?我们需要明确的知道,没有jsp之前,所有在servlet中的html代码都是程序员手写的,有了jsp页面之后(等于有了模板了),编译器帮我们完成了读取jsp到servlet中的工作,我们只需要关心html元素布局即可。以上就是jsp和servlet的关系,不知道我有没有说明白,但是为了能够更好的理解后面的内容,建议你还是好好感受一下。

二、JSP的基本语法

     在介绍jsp的基本语法之前,我想先带大家看看我们的Tomcat服务器上的各个文件夹都是什么作用。(假设你用的Tomcat服务器)



     这是Tomcat 9 服务器上的基本文件。我们挑几个经常使用的,第一个webapps,这个目录里放的都是你的Web应用,也就是网站的总文件夹。第二个是work目录,这个目录下存放的是对应的每个Web应用中所有使用的jsp文件的对应servlet类,我们说过每个jsp文件都会有一个对应的servlet类,他们就是存放在这个里面的。包括源代码.java和编译后的.class文件,其实很多人认为JSP好像和面向对象没有什么关系了,其实不然,因为每个servlet都是一个Java类,不然如何执行Java脚本。(暂时先了解一下,后面会继续介绍)第三个目录是conf目录,其中存放着一个重要的文件web.xml,这是一个服务器配置文件,可以定义Web应用的默认页面(index.jsp,default.jsp等),就是你不输任何一个页面的地址,直接输入域名时默认访问的页面。其他的一些目录,等用到的时候在说吧。

     现在来介绍一下JSP的基本语法,每个servlet类中都会有三个方法,_jspinit(),_jspdestroy(),_jspservice()。第一个方法用来初始化servlet,不用我们关心,第二个方法用来销毁servlet中方法,我们暂时也不关心。重点是第三个方法,这个就是jsp页面中所有内容被读取的目的地,这个方法主要用来响应用户请求,返回html页面回去的,记住这个方法,我们后面会使用到。第一个要介绍的jsp语法是,注释。

<%--这是jsp注释--%>
<!--这是html注释-->

     注释的语法和html的注释语法很像,一个小细节,html的注释在源代码中是能够看到的,而jsp注释你在查看源代码的时候是看不到的,也就是jsp注释是没有被返回给浏览器的。

     第二个语法,输出表达式。<%=表达式%>

<html>
<head>
<title></title>
</head>
<body>
<%="hello,world"%>
</body>
</html>

     可以是常量表达式,也可以是变量表达式。还可以是一个函数的返回值。

     第三个语法,jsp的声明。<%!声明内容%>

<html>
<head>
<title></title>
</head>
<body>
<%!
public int id;
public intshowId(){
return this.id;
}
%>
</body>
</html>

我们打开servlet类看看,

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports { //哪里来的实例变量和实例方法?
public int id;
public int showId(){
return this.id;
} //响应请求的方法
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
........
try {
response.setContentType("text/html;charset=UTF-8");
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("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title></title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write("\t\t");
out.write("\n");
out.write(" </body>\n");
out.write("</html>\n");
........
}
}

     从上述servlet源代码中,我们也可以看出来,凡是在jsp中声明的变量或者方法都会成为servlet类对应的实例的成员。我们从一个实例来直观的感受下。

<html>
<head>
<title></title>
</head>
<body>
<%!
public int id;
%>
<%=id++%>
</body>
</html>

     这一段代码执行之后,每刷新一次页面输出的数值就会加一。就是因为id是对应servlet实例的成员变量,这个实例没有被销毁,id的就会一直被保存。就相当于你在_jspservice()方法中输出了id 的值之后,将id加1一样,只要没有对jsp页面修改,这个对应的实例就不会重新编译生成,id的就不会因为刷新而重置。

第四个语法是,JSP脚本。我们可以在jsp页面中使用java的for循环,if,else判断等,只要是Java语法允许的,jsp页面都是可以写的。我们看一个例子:

<html>
<head>
<title></title>
</head>
<body>
<%for(int a=0;a<10;a++){%>
<p>Walker</p>
<%}%>
</body>
</html>

     这种语法可能在我们的实际项目中会经常的使用到,比如我要列举数据库中所有User的信息,我们可以使用循环输出,基本的格式前端给你了,你只要将对应的位置使用变量替换即可。像这样:

<html>
<head>
<title></title>
</head>
<body>
<%foreach(String name in <%=returnList()%>){%>
<p>name</p>
<%}%>
</body>
</html>

     假设后台写了个returnList方法返回数据库中所有人的信息。你会发现这样写会节省很多代码,不至于有多少用户就会有多少p标签。

     为了读者阅读舒服,篇幅不宜过长。未完,待续。。。

Java EE基础之JSP的更多相关文章

  1. Java EE基础之JSP(二)

    接着上篇文章,我们上篇文章讲到了jsp的基本原理以及和servlet的关系,还介绍了jsp的基本语法部分,本篇文章就继续介绍余下的内容. 编译指令Page和include 基本的动作指令 内置对象 一 ...

  2. Java EE基础之JSP(三)

         原来准备简单点,用一篇文章介绍完JSP的,没想到细节很多.这是第三篇也是最后一篇,这三篇文章介绍了基本的JSP知识,很多名词概念和用法,一定要在实践项目中使用之后才会有更加亲切的体会.第三篇 ...

  3. Java Web基础:JSP基础概念

    JSP介绍 JSP全称是Java Server Pages,它和Servlet都是Sun公司定义的用于开发动态Web资源的技术,它解决了Servlet输出流排版复杂和难以维护的问题.JSP完美融合了H ...

  4. Eclipse Java EE IDE中jsp页面编码修改

    Eclipse Java EE IDE模板编码是ISO8859,肯定不是我们需要的,修改方法如下图: 依次点击:Window---->Preference---->Web---->J ...

  5. Eclipse Java EE 编译器设置JSP默认编码

    在windows-preferences-web-jsp files-encoding那里设置默认编码.如下图所示:

  6. 什么是Java EE

    Java:是一门编程语言,可以用来编写各种应用程序. Java EE:是一个标准中间件体系结构,旨在简化和规范分布式多层企业应用系统的开发和部署. Java EE是一个标准中间件体系结构 Java E ...

  7. JavaWeb学习----JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  8. JAVA EE Hibernate基础一之环境配置

    对于JAVA开发高级,hibernate是java三大框架之一,足以见得它的重要性,那么对于hibernate的使用大家有了解多少呢?从今天开始我将带领大家一道共同探讨一下hibernate的知识,h ...

  9. 关于JAVA EE项目在WEB-INF目录下的jsp页面如何访问WebRoot中的CSS和JS文件

    找了这么久资料,总算解决了 感谢博客园:http://www.cnblogs.com/xsht/p/5275081.html 感谢百度:http://zhidao.baidu.com/link?url ...

随机推荐

  1. WKWebView的使用与JS交互详细解读

    前言: WKWebView 这是在iOS8.0之后增加的一个比UIWebView更加完善和强大的控件!看网上关于它的博客也是有许多的了,从各个方面总结一下这个WKWebView看网上说它主要是为了和J ...

  2. Python 最大公约数的欧几里得算法及Stein算法

    greatest common divisor(最大公约数) 1.欧几里得算法 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数. 其计算原理依赖于下面的定理: 两个整数的最大公约数等 ...

  3. 【录教程必备】推荐几款屏幕录制工具(可录制GIF)

    我们经常会遇到一些场景,需要你向别人展示一些操作或是效果——例如告诉别人某某软件的配置步骤啊.刚设计出来网站的动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快人心的NBA绝杀瞬间是怎么回事 ...

  4. iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a

    一.概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错:No architectures to compile for ( ...

  5. Android 调用jepg库进行图片压缩,保持图片不失真

    1. 浅谈为什么Android和iOS图片质量差距那么大? 首先来说,作为一个安卓狗,机器当然用的是安卓的手机.现在的安卓手机大多数都会以高清拍照,动不动就几千万柔光相机来吸引各种买家.买来后,拍照发 ...

  6. 使用Bootstrap + Vue.js实现 添加删除数据

    界面首先需要引入bootstrap的css和bootstrap的js文件,还有vue.js和jQuery.js才可以看见效果. 这里提供bootstrap的在线文件给大家引用: <!-- 最新版 ...

  7. 【转】JDBC连接数据库

    创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的 ...

  8. gstunnel---一个网络安全管道

    项目简介: gstunnel 是 基于go 语言开发的一个安全网络管道,支持tcp协议. gstunnel分为client和server两部分. gstunnel 基于aes进行数据加密. 流程示意: ...

  9. C# 字符串比较大小 string.Compare()方法

    string.Compare方法,用来比较2个字符串值得大小 string.Compare(str1, str2, true); 返回值: 1 : str1大于str2 0 : str1等于str2 ...

  10. java里Struts2学习登录练习详解

    最近在学struts2里面遇到很多错误,今天跟大家分享一下,我的开发工具是Eclipse: 1.到网上下载Struts2的包,这里不再累赘,百度有很多: 2.新建一个项目,记得后面加上web.xml文 ...