一、JSP的由来
在很多动态网页中,绝大多部分内容是不变的,只有局部内容需要动态产生和改变。例如, 一个新闻的浏览次数,只有这个次数是动态改变的,而Servlet程序返回客户端的代码全是java程序动态创建的。Servlet 的缺点,处理界面困难。JSP 是在Servlet的基础上发展起来的,它弥补了Servlet在界面处理方面的缺陷。
简单来讲,JSP =html+java片段+jsp标签+Javascript,它功能强大,可以和javabean 结合
另外,JSP+javabeen+servlet 就构成了mvc模式。
JSP是运行在服务端的,也就是说,我们在桌面上创建一个.JSP文件,它也不能能够被执行哦。
我们将它黏贴到Tomcat上的webapps文件中(或者你直接在里面创建.jsp文件也可以)。
下一步,我们要启动tomcat。接着在浏览器中访问:http://localhost:8080/myweb/Demo.jsp。
接下来神奇的事情发生了。在Tomcat的webapps中可以看到,帮我们自动生成两个文件。
<%String userName&#61;"zhangsan";
%>
注意&#xff1a;访问JSP的过程
如果是第一次访问服务器&#xff0c;则翻译成一个对应的java文件&#xff08;Servlet&#xff09;。然后&#xff0c;再被编成 .class 文件并加载到内存中。
如果是以后访问&#xff0c;则直接调用内存中的jsp实例&#xff0c;所以第一次访问慢,以后访问会更加快。
四、3种JSP注释
1.
<%//this is /* thisis */
%>
2.
<%-- //这样的注释内容不会被发送到客户端
这是被注起来的内容
这是注起来的
--%>
3.
//这里的内容会发送到客户端,但浏览器不会显示
五、JSP脚本元素&#xff08;3种&#xff09;
1.
1) 代码段 <% %>
它要严格遵守java语言规范,需要导包的要导包
<% %> 和 <% %> 之间的java代码是可以互相访问的,相当于写在一个 <% %>里
2.
2) 声明 <%!xxxxxxx%> //注意 <%! 中间千万不能空格
<%!public String test(){
return "ok:";
}%>
3.
3) 表达式 <%&#61; xxx %> //注意 <%&#61; 中间千万不能空格,后面不能有分号
<%&#61;String str&#61;"嘻嘻嘻";%>例子&#xff1a;
//和下面的写法等价
附&#xff1a;myeclipse 生成的jsp页面&#xff0c;解说&#xff1a;
&#xff08;在实际应用中&#xff0c;不需要的我们可以删除它&#xff09;
<%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"utf-8"%> //解说&#xff1a;page指令,import用来导包的,pageEncoding指当前页面编码方式
<%String path &#61; request.getContextPath(); //解说&#xff1a; contextPath 代表web应用的名称 /shop-adminString basePath &#61; request.getScheme()&#43;"://"&#43;request.getServerName()&#43;":"&#43;request.getServerPort()&#43;path&#43;"/";//上下对齐解说&#xff1a; //http //localhost //8080 // shop-admin//上面最后生成的结果&#xff1a;-> http://localhost:8080/shop-admin/
%> //解说&#xff1a;言档类型声明
六、JSP版本的计算器&#xff08;代码示例&#xff09;
<% //接收参数String num1 &#61;request.getParameter("num1"); String num2 &#61;request.getParameter("num2"); String flag &#61;request.getParameter("flag"); int n_num1&#61;0;int n_num2&#61;0;int result&#61;0;if(num1!&#61;null&&num2!&#61;null&&flag!&#61;null){//计算n_num1&#61;Integer.parseInt(num1);n_num2&#61;Integer.parseInt(num2);if(flag.equals("&#43;")){result&#61;n_num1&#43;n_num2;}else if(flag.equals("-")){result&#61;n_num1-n_num2;}else if(flag.equals("*")){result&#61;n_num1*n_num2;}else if(flag.equals("/")){result&#61;n_num1/n_num2;}out.print("
计算结果是 "&#43;result&#43;"
");}//输出结果 %>请输入第一个数:&#39;/>请输入第二个数:&#39; />
七、MVC模式
M ->mode 模型层 -> javaBeen (比如 UserDao,UserInfo)
V ->view 视图层 -> html , jsp
C ->controller 控制层 ->由Servlet担当
八、JSP指令
指令是为JSP引擎而设计的,它不直接产生任何输出,只是告诉引擎如何处理JSP页中的其余部分。指令必须嵌套在<%&#64; %> 中,其本语法如下
<%&#64; 指令 属性名&#61;"值" %>,其中属性名是大小写敏感的
//例子
<%&#64; page language&#61;"java" import&#61;"java.util.*,java.text.*,cat.bean.*" pageEncoding&#61;"UTF-8"%>
* JSP中的指令一共有三种
-- page // <%&#64; page ... >
-- include // <%&#64; include ... > 用来包含别的页面
-- tablib // <%&#64; tablib ... > 用来指定标签库
* page 指令
-- Page 用来定义jsp页面的各属性,几乎所有的页面都会出现page属性
-- 无论page属性出现在什么位置,它的作用都是整个jsp页面
-- 一个页面可以包含多任意数量的page指令
* page 指令的属性
--language :jsp页面采用的语言&#xff0c;默认的是”java”
--contentType: 用于设置响应正文的 mime 类型(即指定Content-Type响应头字段的值),和说明
JSP文件中的文本内容的字符集编码. content-Type 默认的mime 类型是 text/html,字符集是”iso8859-1”
JSP引擎会根据page指令的contentType 属性生成相应调用ServletRresponse.setContentType 方法的语句
--extends:在当前的jsp页面中所用到的类的基类。&#xff08;一般不使用&#xff09;
--import:当前jsp页面所用到的java类。
--session&#xff1a;当前的jsp页面是否使用会话。默认的是true.&#xff08;不要修改它&#xff09;
如果将其设为false,则JSP翻译成的Servlet将不自动预先创建好Session隐式对象
--buffer&#xff1a;指定了out 变量所使用的缓存的大小。默认的是8K.
--autoFlush :当缓冲区满的时候&#xff0c;是否自动将值输出至jsp页面。默认的是true.
--errorPage:用来处理已经发生的&#xff0c;但当前页面没有捕获的异常。例如要求有输入参数&#xff0c;但是没有输入.
它的属性值必须使用相对路径,如果以/开头,表示想对于当前web应用程序的根目录,而不是站点根目录
--isErrorPage: 设置当前页面是否是专门用于处理其他页面未捕异常的页面,默认值为false
只有明确的将 isErrorPage 设为true,当前页面才能用做异常处理,才能拿到exception隐式对象
&#61;&#61;小例子: errorPage 指令 的应用
在要捕捉异常的页面中:
-- <%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"gbk" errorPage&#61;"ErrPage.jsp"%>在异常处理页面中
-- <%&#64; page language&#61;"java" isErrorPage&#61;"true"%>
-- <%&#61; exception.toString() %>
--pageEncoding :指定jsp源文件中的字符所使用的字符集编码
pageEncoding 指jsp文件本身的编码
contentType&#61;"text/html;charset&#61;gkb" 这里的charset 指的是服务器发送给客户端时的内容编码
注意&#xff1a;JSP要经过两次编码
&#61;&#61;第一阶段,将jsp编译成 .java 它会根据pageEncoding来读取jsp 结果是由指定的编码方案翻译成统一的UTF-8 的java源码(即.java)
如果pageEncoding设定错的话,将会出现中文乱码
&#61;&#61;第二阶段 就是由java源码到java的字节码的编译,不管JSP文件在编写的时候用的是什么编码,最后这个阶段的结果全是UTF-8 java源码
* include 指令
include 指令 是静态导入
用于通知JSP引警在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行的引入称为静态引入,当前JSP页面和静态引入的页面紧密结合成一个Servlet。
1 被引入的文件必须尊循JSP语法,可以包含静态HTML,JSP脚本元素,JSP指令 和 jsp行为元素等普通JSP页面所具有的一切内容
2 被引入的文件可以使用任意扩展名,(就是叫.html也行), 为了见名知义,jsp规范建议使用.jspf (jsp fragments) 作为静态引入文件的扩展名
3 在将JSP文件翻译成Servlet 源文件时,JSP引擎将合并被引入的文件与当前JSP页面中的指令元素&#xff0c;所以,除了pageEncoding 和 import ,page指令的其他属性不能在这两个页面中有不同的设置
4 除了指令元素外,要引入的文件中的所有其他元素都被转换成相应的java代码,然后插入进当前
JSP 页面所翻译成的Servlet文件中,插入的位置和 include 指令 在当前jsp 页面中的位置保持一致
5 两者是在 JSP引擎翻译成Servlet的过程中进行合并的,而不是先合并成源文件再翻译
6 file 属性设置的路径必须是相对路径,如果以 / 开头,指的是相对于当前web应用程序的根目录,而不是 站点根目录
7 出现在一个 JSP 页面中的 include 指令的数量不受限制
<%&#64; include file&#61;"localURL" %>
<%&#64; include file&#61;"test.html"%> | bbb |
数据 | <%&#64; include file&#61;"test.html"%> |
* taglib 指令
通知 JSP 容器&#xff0c;页面依赖于自定义标记库
<%&#64; taglib uri &#61;"tagLibraryURI" prefix &#61; "tagPrefix" %>