下面是我整理下来的JSP知识点:html
图上的知识点均可以在我其余的文章内找到相应内容。java
jsp静态包含和动态包含的区别web
在讲解request对象的时候,咱们曾经使用过request.getRequestDispatcher(String url).include(request,response)来对页头和页尾面进行包含面试
inclue指令也是作这样的事情,咱们来试验一下吧!设计模式
这是页头浏览器
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>页头</title>
</head>
<body>
我是页头
<br>
<br>
<br>
</body>
</html>
复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>页尾</title>
</head>
<body>
我是页尾
</body>
</html>
复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>包含页头和页尾进来</title>
</head>
<body>
<%@include file="head.jsp" %>
<%@include file="foot.jsp" %>
</body>
</html>
复制代码
<jsp:include page=""/>
复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>包含页头和页尾进来</title>
</head>
<body>
<jsp:include page="head.jsp"/>
<jsp:include page="foot.jsp"/>
</body>
</html>
复制代码
jsp行为包含文件就是先编译被包含的页面,再将页面的结果写入到包含的页面中(1.jsp)缓存
固然了,如今有静态包含和动态包含,使用哪个更好呢?答案是:动态包含。服务器
动态包含能够向被包含的页面传递参数(用处不大),而且是分别处理包含页面的(将被包含页面编译后得出的结果再写进包含页面)【若是有相同名称的参数,使用静态包含就会报错!】!微信
模拟一下场景吧,如今个人头页面有个名为s的字符串变量session
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>页头</title>
</head>
<body>
<%
String s = "zhongfucheng";
%>
我是页头呀
<br>
<br>
<br>
</body>
</html>
复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>页尾</title>
</head>
<body>
<%
String s = "zhongfucheng";
%>
我是页尾呀
</body>
</html>
复制代码
<%@include file="xxx.jsp"%>
为jsp中的编译指令,其文件的包含是发生在jsp向servlet转换的时期,而<jsp:include page="xxx.jsp">
是jsp中的动做指令,其文件的包含是发生在编译时期,也就是将java文件编译为class文件的时期
使用静态包含只会**产生一个class文件,而使用动态包含会产生多个class文件 **
使用静态包含,包含页面和被包含页面的request对象为同一对象,由于静态包含只是将被包含的页面的内容复制到包含的页面中去;而动态包含包含页面和被包含页面不是同一个页面,被包含的页面的request对象能够取到的参数范围要相对大些,不只能够取到传递到包含页面的参数,一样也能取得在包含页面向下传递的参数
jsp有哪些内置对象?做用分别是什么?
九个内置对象:
其中,request、response、session、application、config这五个对象和Servlet的API是同样的。这5个对象我就不解释了。
在JSP中,尤为重要的是pageContext对象。
pageContext是内置对象中最重要的一个对象,它表明着JSP页面编译后的内容(也就是JSP页面的运行环境)!
pageContext对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>获取八大内置对象</title>
</head>
<body>
<%
System.out.println(pageContext.getSession());
System.out.println(pageContext.getRequest());
System.out.println(pageContext.getResponse());
System.out.println(pageContext.getException());
System.out.println(pageContext.getPage());
System.out.println(pageContext.getServletConfig());
System.out.println(pageContext.getServletContext());
System.out.println(pageContext.getOut());
%>
</body>
</html>
复制代码
pageContext做为域对象
相似于request,session,ServletContext做为域对象而言都有如下三个方法:
固然了,pageContext也不例外,pageContext也有这三个方法!
pageContext本质上表明的是当前JSP页面编译后的内容,做为域对象而言,它就表明着当前JSP页面(也就是page)!也就是说:pageContext域对象只在page范围内有效,超出了page范围就无效了!
首先来看看在page范围内能不能使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用page域对象</title>
</head>
<body>
<%
pageContext.setAttribute("name", "zhongfucheng");
%>
<%
String value = (String) pageContext.getAttribute("name");
System.out.println(value);
%>
</body>
</html>
复制代码
咱们如今来试验一下是否是超出了page范围就无效了!
在2.jsp中request域对象设置属性
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>request域对象设置属性</title>
</head>
<body>
<%
//这是request域对象保存的内容
request.setAttribute("name","zhongfucheng");
%>
<%--跳转到1.jsp中--%>
<jsp:forward page="1.jsp"/>
</body>
</html>
复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>在page域对象获取属性</title>
</head>
<body>
<%
//企图获取request域对象存进的属性
String value = (String) pageContext.getAttribute("name");
System.out.println(value);
%>
</body>
</html>
复制代码
pageContext本质上表明着编译后JSP的内容,pageContext还能够封装了访问其余域的方法!
上面的pageContext默认是page范围的,但pageContext对象重载了set、get、removeAttribute这三个方法
多了一个设置域范围的一个参数,若是不指定默认就是page。固然了,pageContext把request、session、application、page这几个域对象封装着了静态变量供咱们使用。
刚才咱们没有使用重载方法的时候,使用pageContext是没法获取到request域对象设置的属性的。如今咱们使用重载后的方法看一下能不能获取获得!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>在page域对象获取request域对象的属性</title>
</head>
<body>
<%
//使用重载的方法获取request域对象的属性
String value = (String) pageContext.getAttribute("name",pageContext.REQUEST_SCOPE);
System.out.println(value);
%>
</body>
</html>
复制代码
pageContexst还有这么一个方法:
该方法会查找各个域的属性,从小到大开始寻找!也就是page—>request->session->application。
咱们用此方法看能不能查找出request域对象的属性吧!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用findAttribute</title>
</head>
<body>
<%
//使用findAttribute查找2.jsp中request域对象的属性
String value = (String) pageContext.findAttribute("name");
System.out.println(value);
%>
</body>
</html>
复制代码
out对象:
咱们能够简单理解为:JspWriter就是带缓存的PrintWrieter。
out对象的原理以下:
只有向out对象中写入了内容,且知足以下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并经过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
通常咱们在JSP页面输出都是用表达式(<%=%>),因此out对象用得并非不少!
page对象
内置对象page是HttpJasPage对象,其实page对象表明的就是当前JSP页面,是当前JSP编译后的Servlet类的对象。也就是说:page对象至关于普通java类的this
exception对象
**内置对象exception是java.lang.Exception类的对象,exception封装了JSP页面抛出的异常信息。**exception常常被用来处理错误页面
前面咱们已经讲过了怎么设置错误页面了,下面咱们就来简单使用一下exception对象吧
1.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title></title>
</head>
<body>
<%--模拟空指针异常的错误--%>
<%
String sss = null;
sss.length();
%>
</body>
</html>
复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>错误页面</title>
</head>
<body>
<%
out.println("程序抛出了异常:" + exception);
%>
</body>
</html>
复制代码
jsp和servlet的区别、共同点、各自应用的范围?
属性做用域范围
应用场景:
写出5种JSTL经常使用标签
<c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>
复制代码
写一个自定义标签要继承什么类
咱们能够有两种方式来实现自定义标签:
SimpleTagSupport类的执行顺序(原理):
SimpleTagSupport,通常调用doTag方法或者实现SimpleTag接口
JSP是如何被执行的?执行效率比SERVLET低吗?
如何避免jsp页面自动生成session对象?为何要这么作?
可使用页面指令显式关掉,代码以下:
<%@ page session="false" %>
jsp的缺点?
说出Servlet和CGI的区别?
简述JSP的设计模式。
在Web开发模式中,有两个主要的开发结构,称为模式一(Mode I)和模式二(Mode II)
首先咱们来理清一些概念吧:
模式一指的就是在开发中将显示层、控制层、数据层的操做统一交给JSP或者JavaBean来进行处理!
模式一有两种状况:
彻底使用JSP作开发:
优势:
缺点:
使用JSP+JavaBean作开发:
优势:
缺点:
Mode II 中全部的开发都是以Servlet为主体展开的,由Servlet接收全部的客户端请求,而后根据请求调用相对应的JavaBean,并全部的显示结果交给JSP完成!,也就是俗称的MVC设计模式!
MVC设计模式:
若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章的同窗,能够关注微信公众号:Java3y