Jsp
java server pages,从用户角度,jsp就是一个网页;从程序员角度,jsp就是一个继承了servlet的Java类,所以jsp可以看作是servlet
html是用来显示静态内容是一成不变的, 但是有时候我们需要在网页上显示一些动态数据, 比如: 查询所有的学生信息, 根据姓名去查询具体某个学生。 这些动作都需要去查询数据库,然后在网页上显示。 html是不支持写java代码 , jsp里面可以写java代码
jsp指令
1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 11 </body> 12 </html>
指令写法<%@ 指令名称%>
page指令
属性
language
language="java",表明jsp页面中可以写Java代码
contentType
contentType="text/html; charset=UTF-8",说明这个文件是什么类型,告诉浏览器这个文件是什么类型以及使用什么编码
text/html是一种MIMEType,说明这是一个文本方式的html网页
pageEncoding
jsp内容编码
extends
用于指定jsp编译成Java类后继承的父类是谁,一般不修改
import
导包时使用
session
值可选的有true or false .用于控制在这个jsp页面里面,能够直接使用session对象。
具体的区别是,请看翻译后的java文件 如果该值是true , 那么在代码里面会有getSession()的调用,
如果是false : 那么就不会有该方法调用,也就是没有session对象了。在页面上自然也就不能使用session了。
errorPage
指的是错误的页面, 值需要给错误的页面路径
isErrorPage
上面的errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个isErroPage , 就是声明某一个页面到底是不是错误的页面。
include指令
包含另一个jsp的页面进来
<%@ include file="other.jsp"%>
将另一个页面的所有内容都拿过来,包括所有的标签元素(静态包含)
taglib指令
<%@ taglib prefix="" uri=""%>
prefix:标签库别名
uri:标签库路径
Jsp动作标签
<jsp:include page="other.jsp"></jsp:include>
包含指定的页面,动态包含。也就是不把包含的页面的所有标签元素拿过来输出,而是只把它的运行结果拿过来
<jsp:forword page=""></jsp:forword>
前往到哪个页面,其实就是<%request.getRequestDispatcher("other02.jsp").forward(request, response); %>
<jsp:param name="" value=""></jsp:param>
在包含某个页面的时候,或者在跳转某个页面的时候,加入这个参数
e.g:
<jsp:forward page="other.jsp"> <jsp:param name="user" value="admin"/> </jsp:forward>
在other.jsp中获取参数 :<%= request.getParameter("address")%>
Jsp内置对象
内置对象,就是我们可以在jsp页面内直接使用的对象,不需要创建

1 /* 2 * Generated by the Jasper component of Apache Tomcat 3 * Version: Apache Tomcat/8.0.14 4 * Generated at: 2014-10-31 11:14:54 UTC 5 * Note: The last modified time of this file was set to 6 * the last modified time of the source file after 7 * generation to assist with modification tracking. 8 */ 9 package org.apache.jsp; 10 11 import javax.servlet.*; 12 import javax.servlet.http.*; 13 import javax.servlet.jsp.*; 14 15 public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase 16 implements org.apache.jasper.runtime.JspSourceDependent { 17 18 private static final javax.servlet.jsp.JspFactory _jspxFactory = 19 javax.servlet.jsp.JspFactory.getDefaultFactory(); 20 21 private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; 22 23 private javax.el.ExpressionFactory _el_expressionfactory; 24 private org.apache.tomcat.InstanceManager _jsp_instancemanager; 25 26 public java.util.Map<java.lang.String,java.lang.Long> getDependants() { 27 return _jspx_dependants; 28 } 29 30 public void _jspInit() { 31 _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); 32 _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); 33 } 34 35 public void _jspDestroy() { 36 } 37 38 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) 39 throws java.io.IOException, javax.servlet.ServletException { 40 41 final java.lang.String _jspx_method = request.getMethod(); 42 if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { 43 response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD"); 44 return; 45 } 46 47 final javax.servlet.jsp.PageContext pageContext; 48 javax.servlet.http.HttpSession session = null; 49 final javax.servlet.ServletContext application; 50 final javax.servlet.ServletConfig config; 51 javax.servlet.jsp.JspWriter out = null; 52 final java.lang.Object page = this; 53 javax.servlet.jsp.JspWriter _jspx_out = null; 54 javax.servlet.jsp.PageContext _jspx_page_context = null; 55 56 57 try { 58 response.setContentType("text/html; charset=UTF-8"); 59 pageContext = _jspxFactory.getPageContext(this, request, response, 60 null, true, 8192, true); 61 _jspx_page_context = pageContext; 62 application = pageContext.getServletContext(); 63 config = pageContext.getServletConfig(); 64 session = pageContext.getSession(); 65 out = pageContext.getOut(); 66 _jspx_out = out; 67 68 out.write(" "); 69 out.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> "); 70 out.write("<html> "); 71 out.write("<head> "); 72 out.write("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> "); 73 out.write("<title>Insert title here</title> "); 74 out.write("</head> "); 75 out.write("<body> "); 76 77 out.println("文字内容"); 78 79 out.write(" "); 80 out.write("</body> "); 81 out.write("</html>"); 82 } catch (java.lang.Throwable t) { 83 if (!(t instanceof javax.servlet.jsp.SkipPageException)){ 84 out = _jspx_out; 85 if (out != null && out.getBufferSize() != 0) 86 try { 87 if (response.isCommitted()) { 88 out.flush(); 89 } else { 90 out.clearBuffer(); 91 } 92 } catch (java.io.IOException e) {} 93 if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); 94 else throw new ServletException(t); 95 } 96 } finally { 97 _jspxFactory.releasePageContext(_jspx_page_context); 98 } 99 } 100 }
作用域
表示这些对象可以存值,他们的取值范围有限定。 setAttribute 和 getAttribute
- pageContext
- PageContext,作用域仅限当前的页面
- 可以获取其它八个内置对象
- request
- HttpServletRequest,作用域仅限于一次请求,只要服务器对请求做出响应,这个作用域就失效了
- session
- HttpSession,作用域仅限于一次会话(一个会话的多次请求和响应)
- application
- ServletContext,整个工程中都可以访问,服务器关闭后就不可以访问了
使用作用域存取数据
1 <body> 2 <% 3 pageContext.setAttribute("name", "page"); 4 request.setAttribute("name", "request"); 5 session.setAttribute("name", "session"); 6 application.setAttribute("name", "application"); 7 %> 8 9 取出四个作用域中的值<br> 10 11 <%=pageContext.getAttribute("name")%><br> 12 <%=request.getAttribute("name")%><br> 13 <%=session.getAttribute("name")%><br> 14 <%=application.getAttribute("name")%><br> 15 </body>
作用域范围大小:
pageContext -- request --- session -- application
输出
out对象,JspWriter
如果同时有HttpServletResponse输出,那么先将out对象的输出内容放到HttpServletResponse的缓冲区中,先等待HttpServletResponse本身内容输出完成再输出out要输出的内容
其他内置对象
- response
- HttpServletResponse
- config
- ServletConfig
- page
- jsp翻译成的java类的实例对象
- exception
- Throwable
EL表达式
简化在jsp中写的Java代码
格式:${表达式}
如果从作用域中取值,先从小的作用域开始取,如果没有,就去下一个作用域取,如果四个作用域都没有,就不显示
取作用域中的值
1.作用域中值是普通的String,基本属性等
<body> <% pageContext.setAttribute("name", "page"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> 取出四个作用域中的值<br> <%=pageContext.getAttribute("name")%> <%=request.getAttribute("name")%> <%=session.getAttribute("name")%> <%=application.getAttribute("name")%> <br> EL表达式取值:<br> ${pageScope.name } ${requestScope.name } ${sessionScope.name } ${applicationScope.name } </body>
浏览器输出
2.作用域中的值是数组
<body> <% String[] names = {"name1","name2","name3"}; pageContext.setAttribute("names", names); %> <br> EL表达式取值:<br> ${names[0] } ${names[1] } ${names[2] } </body>
浏览器输出
3.作用域中的值是集合
<body> <% List<String> names = new ArrayList<String>(); names.add("name1"); names.add("name2"); names.add("name3"); pageContext.setAttribute("names", names); %> <br> EL表达式取值:<br> ${names[0] } ${names[1] } ${names[2] } </body>
浏览器输出
4.作用域中的值是map
<body> <% Map map = new HashMap(); map.put("name", "wxf"); map.put("age", "21"); pageContext.setAttribute("map", map); %> <br> EL表达式取值:<br> name:${map.name }<br> age:${map.age } </body>
浏览器输出
总结:
- 从域中取值,必须先存值
- 直接指定取哪个作用域取值:${pageScope.name}
- 未指定取哪个作用域取值:${name},先从page里找,再去request中找,再去session中找,最后再去application中找
- 如果作用域中的值是有下标的,直接使用[]的方式获取:${names[0]},这里names说的是setAttribute(name,value)中的name
- 如果作用域中的值是没有下标的,直接使用.的方式获取:${user.name},${user.age},${map.name}
EL表达式的11个内置对象
${ 对象名.成员 }
作用域相关对象 :pageScope ,requestScope ,sessionScope ,applicationScope
头信息相关对象 :header ,headerValues
参数信息相关对象:param , paramValues
pageContext
cookie 全局初始化参数
initParam
JSTL
JSP Standard Tag Library jsp标准标签库,简化jsp编写,替换<%%>写法,一般与EL表达式配合
使用
- 导入jar,WebContent/WEB-INF/lib,jstl.jar和standard.jar
- 在jsp页面,使用taglib指令引入标签库
- 如果想要使用EL表达式,引入的标签库必须选择1.1版本,1.0版本不支持EL表达式
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
常用标签
<body> <!-- 声明一个变量name,值是wxf,存储到session中,默认是page --> <c:set var="name" value="wxf" scope="session"></c:set> ${sessionScope.name } <br> <!-- 判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出 , c:if 是没有else的 --> <c:set var="age" value="21"></c:set> <c:if test="${age>18 }"> 已成年 </c:if> <br> <!-- 从1 开始遍历到8 ,得到的结果 ,赋值给 i ,并且会存储到page域中, step , 增幅为2 --> <c:forEach begin="1" end="8" step="2" var="i"> ${i } </c:forEach> <br> <!-- items : 表示遍历哪一个对象,注意,这里必须写EL表达式。 var: 遍历出来的每一个元素用user 去接收。 --> <% List<String> list = new ArrayList<String>(); list.add("str1"); list.add("str2"); list.add("str3"); pageContext.setAttribute("list", list); %> <c:forEach var="str" items="${list }"> ${str } </c:forEach> </body>
浏览器输出