Jsp的使用

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 }
View Code

作用域

表示这些对象可以存值,他们的取值范围有限定。 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表达式配合

使用

  1. 导入jar,WebContent/WEB-INF/lib,jstl.jar和standard.jar
  2. 在jsp页面,使用taglib指令引入标签库
  3. 如果想要使用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>

浏览器输出 

原文地址:https://www.cnblogs.com/qf123/p/10072199.html