jsp为什么会出现?
用servlet做页面很麻烦,jsp就是为了让servlet更好地做界面,对servlet做了包装而已。
jsp是什么?
1、jsp运行在服务器
2、jsp(java server page)
3、jsp的基础是servlet(相对于对servlet进行一个包装)。
4、jsp是一个综合技术,jsp=html+java+jsp标签+js+css。
jsp无需配置,直接使用。如果修改了jsp文件,不需要重新reload web应用。
jsp如何访问 http://ip:8088/web应用名/jsp路径
jsp是一种动态网页技术。
快速入门案例
jsp本身是动态地,jsp文件不能放在src目录下,可以放在web-inf目录下。
jsp文件,showTime.jsp被翻译成showTime_jsp.java,然后被编译成showTime_jsp.class
运行原理:
如果是第一次访问该jsp文件:web服务器就会把showTime.jsp翻译成一个Servlet showTime_jsp.java,再将其编译成一个showTime_jsp.class,然后再把class加载到内存。
如果是第二次或者以后,就直接访问内存。
web有一个内存,记录某jsp文件是否被访问过。因此jsp也是单例。所以当你jsp第一次访问一个jsp时比较慢。
如果某个jsp文件被修改了,相当于是第一次访问了。相当于重新访问jsp文件。
因为第一次访问时,jsp要被翻译并编译文件加载到内存中,所以第一次访问慢,如果是以后访问jsp,那就直接调用内存中jsp实例。
案例:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!-- language表示jsp的嵌入的语言 pageEncoding表示页面编码方式--> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'showTime.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <% //在<%之间可以写我们的java代码,就和我们在java文件中写java代码一样的。 out.println("hello,world"+"当前日期"+new Date()); //int i=9/0; //out.println(i); %> </body> </html>
//为什么可以直接使用out对象?
out对象是jsp的内置对象(jsp提供9个内置对象)。
java代码是怎么发过去的?
<% int i=90; int j=i+90; %> <h1>测试</h1> <% out.println("j="+j); %>
当被翻译成jsp后:java文件
public jspService(){ int i=90; int j=i+90; }
1、就是有多个<% %>其实相当于一个大的<% %>
2、在<% %>中定义的变量,会成为service函数的局部变量。
JSP全程是Java Server Pages,它和servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
JSP这门技术的最大特点在于,写jsp就像在写html,但:
①它相比html而言,html只能为用户提供静态数,而jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
②相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。
JSP基础--语法
(1)指令元素
(2)动作元素
jsp的语法
①指令元素
概念:用于从jsp发送一个信息到容器,比如设置全局变量,文字编码,引入包
1.page指令
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
contentType="text/html;charset=utf-8"
最终在servlet里会用代码setContentType("text/html;charset=utf-8")来实现。
language表示内嵌的语言,import表示要引入的包,session有两个值:true和false,
session=false,可以禁止使用session.是否在jsp页面获取session对象。
buffer给out对象使用的缓冲区是多大,默认8k.
autoFlash当buffer满后,是否自动刷新到浏览器。
isThreadSafe=[true|false]默认true表示该jsp的线程安全由程序员控制。false由对应的servlet控制线程安全。
errorPage:自动跳转到指定的页面。
<%@ page language="java" errorPage="error.jsp" import="java.util.*" pageEncoding="utf-8"%>
contentType和pageEncoding的区别?
contentType指定网页以什么方式显示
pageEncoding指定Servlet引擎以什么方法翻译jsp->servlet,并指定网页以什么方式显示。
pageEncoding比contentType更为强大。
2.inclulde指令
用法如下:
<%@ include file="文件路径" %>
<body> <%@ include file="/b.jsp" %> </body>
b.jsp页面中要把<body></body>和
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
删除。
include指令只有一个file属性,该属性用于指定插入到JSP页面当前位置的文件资源。(注意:插入的路径一般使用相对路径)
被插入文件可以是一个JSP文件、HTML文件、文本文件或一段Java代码,单要保证被插入的文件是可访问的。
②脚本元素
1.java片段:
<% java代码 %>
2.表达式:
<%=java表达式%>
3.声明
<%! %>
<%! int i=900;//该jsp对应的Servlet的成员变量 %>
面试题:
<%! int i=90; %> <% int j=90; out.println(); out.println("i="+(++i)+" j="+(++j)); //第一次访问时输出什么 i=91 j=91 //第二次访问?i=92 j=91 //第三次访问?i=93 j=91 %>
在<%! %>里声明函数
函数不能砸<% %>里定义。
③动作元素
tomcat有个保护机制,不能访问WEB-INF文件夹里的内容。
把jsp代码放在WEB-INF中保护起来。
在开发jsp的过程中,我们通常把jsp放入WEB-INF目录,目的是为了防止用户直接访问这些jsp文件。在WebRoot下我们有一个入口页面,它的主要作用是转发。index.jsp中这样显示:
<jsp:forward page="WEB-INF/manage.jsp"></jsp:forward>
将其他jsp页面都放在WEB-INF中。
include动作和include指令的区别
include指令只会生成一个servlet,而include动作会有生成两个servlet.
前者是动态引入,后者是动态引入。
<%@ include file=""%>静态引入
<jsp:include page=""></jsp:include>动态引入
相同点:把一个文件引入到另外一个文件。
区别:静态引入 把两个jsp翻译成一个Servlet,所以被引入的文件不要包含<body><htm.>
动态引入 把两个jsp分别翻译,所以被引入的jsp文件包含有<html><body>也不会报错。
include动作要编译,反应慢。
jsp中的注释:
<!-- 这是注释 -->
<%--这是注释 --%>(建议使用这种)。