从本篇文章开始,我会用文章记录下我在学习Java EE过程当中的一些笔记和感悟,至于尚未更新结束的Java SE仍是会继续写的,只是我以为一直写语法很枯燥,本身也无法继续下去,因此带着点web学习,会有趣些。我主要学习的书籍是李刚老师的轻量级企业应用实战,后续博文再也不声明。本文将从如下几个方面总结一下JSP的基本用法:html
1、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代码中的方式,相似于这样:java
<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的关系,不知道我有没有说明白,可是为了可以更好的理解后面的内容,建议你仍是好好感觉一下。web
2、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注释是没有被返回给浏览器的。
第二个语法,输出表达式。<%=表达式%>apache
<html> <head> <title></title> </head> <body> <%="hello,world"%> </body> </html>
能够是常量表达式,也能够是变量表达式。还能够是一个函数的返回值。django
第三个语法,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标签。
原本想一篇文章就写完的,没想到一吹上就没能停下,为了读者阅读舒服,篇幅不宜过长。未完,待续。。。