JSP的使用

  JSP全称为(Java server page),之所以出现JSP,最主要的目的是抽离出Servlet中输出HTML的部分,由于之前响应客户端的时候,是直接在Servlet中利用response.getWriter().println()方法写的HTML代码,这样做显然很麻烦。并且代码的耦合度非常高,因此产生了JSP。

  JPS中可以含有JAVA代码、HTML(CSS+JS)代码,JSP是一种Servlet,它内置了许多对象。如request、out等。虽然JSP是一种Servlet但是与HttpServlet的工作方式有点不同。HttpServlet是由编译器编译成.class文件,然后才部署到服务器的。然而JSP是先部署源代码,后编译成.class文件的。

  如:index.jsp文件,当第一次被访问的时候会先由Tomcat转换成index_jsp.java文件,然后再编译成index_jsp.class文件,该class文件便是jsp对应的Servlet文件。如果后面再次访问该JSP的时候无需再次编译而是直接使用之前编译好的index.class文件。所以第一次加载JSP的时候会感觉比较慢,但是后面的访问就没有该问题了。

  JSP主要包含以下几个技术点:

    1.javaBean

    2.EL (Expreission Language) 表达式

    3.JSTL (Java Standard Tag Library) 标签库

    4.自定义标签

    5.指令

              6.行为

一:JSP代码演示

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ page import="java.util.*"%>
 4 <!-- 添加java代码 -->
 5 <%
 6     //创建变量保存要展示的数据
 7     String showInfo = "";
 8     //获取用户本地信息
 9         Locale locale = request.getLocale();
10         Calendar calendar = Calendar.getInstance(locale);
11         //获取小时
12         int hour = calendar.get(Calendar.HOUR_OF_DAY);
13         
14         if(hour>0){
15             if(hour<=12){
16                 showInfo = "早上好";
17             }else if(hour>12 && hour<=18){
18                 showInfo = "下午好";
19             }else if(hour>18){
20                 showInfo = "晚上好";
21             }
22         }
23 %>
24 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
25 <html>
26 <head>
27 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
28 <title>JSP测试界面</title>
29 <style type="text/css">
30     p{
31         color:red;
32     }
33 </style>
34 </head>
35 <body>
36     <!-- 编写html代码 -->
37     <p><%=showInfo %></p>
38 </body>
39 </html>

*:该例子中涉及的知识点

  ①:Java 代码一般写在<%  %>语句块中;Html代码写在<body></body>标签之间。

  ②:JSP中输出采用两种方式,使用内置对象out.println()、<%= %>进行输出展示。<%= %>(中不能出现";")

  ③:<%@ page import="java.util.*"%> 属于JSP的page指令 import指令是唯一,一个可以重复出现的指令,其余的像 <%@page language="java"%>等指令,language只能在当前jsp文件中出现一次。

二:JSP中小知识点

  1.JSP中代码注释,除了使用//外还可以使用<%-- jsp代码注释 --%>

  2.JSP中的java代码部分和Java语法完全一样。无非是<%%>标签后台Html代码的来回切换、穿插。

    比如 if、for、while、switch、break、return等都一样。

    *:值得注意的是,return语句使用后,后面的html代码也是不生效的。

  3.JSP中声明成员方法和成员属性,需要注意一点妖精声明部分的代码放置在<%! %>中:

 1  <%!
 2 
 3     private String name;
 4     public void setName(String name){
 5 
 6       this.name = name;
 7     }
 8     public String getName(){
 9 
10       return name;
11     }
12   %>

  4.JSP的生命周期函数(因为JSP是一种Servlet,所以JSP的生命周期函数和Servlet一样)

    _jspInit() 初始化Jsp 、_jspService 服务Jsp、_jspDestroy 销毁Jsp

    *:当然这些方法在使用的时候也要放置在<%! %>之间,自定义方法的时候尽量不要和上面的方法名称一样,一样的时候默认为覆盖了上面的方法。

二:JSP指令

JSP的指令都放置在<%@ %>标签中,常见的指令分为三类:

①:<%@page %>

  

②:<%@taglib %>为JSP的标签库,使用标签库,能够更加方便的展示数据,同时减少<%%>语句块在Html之间的穿插,避免写java代码。 [jstl标签可以近似的看作是html标签] 

<%-- 
    添加标签库,前提项目中导入的有jstl-1.2_1.jar
    uri:为标签库的路径
    prefix:表明使用该库中指令的时候需要添加什么样的前缀
--%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%-- 
     使用jstl标签库中的forEach标签
     ${index}该语句是使用了EL表达式,前提项目中要导入jstl_el.jar包
     var="index"是为当前遍历的items命名,配合${}表达式和<c:out>
     标签进行输出显示
 --%>
    <c:forEach begin="0" end="10" var="index">
        <p>
            使用jstl表达式创建的p标签<c:out value="${index}"></c:out>
        </p>
    </c:forEach>    

③:<%@include %>  该指令用来引用一些公共的jsp或者html文件。(比如一个web页面的头部和尾部)

//include 指令【先合并,后编译,属于一个文件】
<%@ include file="./xxx.jsp" %>
//include 行为 【先编译,后合并,属于多个文件】
<jsp:include page="./xxx.jsp">

 三:JSP的行为 【作用:减少<%%>标签(java代码的出现),使得整个jsp文件代码更加整洁。】

  在第二部分中提到的有一个include行为,它的作用和<%@include file="./xxx.jsp"%>指令的作用一样,不同的就是,include行为是,先编译后合并。除了该行为JSP还有以下几种行为:

  JSP行为的一般书写规则为:<jsp:行为名称 属性名称="属性值">

  1.useBean行为【作用:创建一个javaBean类的实例】,配合<jsp:setProperty > 和<jsp:getProperty >行为 使用:

    <!-- 
该行为代替的就是java代码: JavaBean javaBean = new JavaBean();
id:为要创建的实例对象的名称
class:为要创建对象的类名
scope:指明该对象的作用域(不写默认为page)page指在当前jsp文件中有效,在其他jsp文件中使用<jsp:getProperty>是不能够获得属性的。
        可以选用的值:
request:本次请求中有效【一个request,可以同过forward()方法,贯穿多个jsp,那么这些jsp中都可以使用】
session:本次会话中有效【即对当前用户有效】
application: web应用程序内有效【服务关闭后失效】
--> <jsp:useBean id="javaBean" class="cn.woo.entity.JavaBean" scope="page"></jsp:useBean> <!-- 给javabean对象的age属性赋值为23 --> <jsp:setProperty property="age" name="javaBean" value="23"/> <!-- 给javabean对象的name属性赋值为woo 类似java代码: javaBean.setName("woo"); --> <jsp:setProperty property="name" name="javaBean" value="woo"/> <p>
<!--获取javaBean对象的属性值 类似java代码 javaBean.getAge();--> 年龄:<jsp:getProperty property="age" name="javaBean"/> </p> <p> 姓名:<jsp:getProperty property="name" name="javaBean"/> </p>

  2.forward行为【相当于对代码request.getRequestDispatcher("/xxx.jsp").forward(request, response);的封装(转发)】

    <!-- 
jsp的froward行为,执行该代码将跳转至xxx.jsp文件,并携带参数score = "123";可以在xxx.jsp中采用EL表达式${score}的方式进行获取。
--> <jsp:forward page="./xxx.jsp"> <!-- 跳转的时候可以携带参数 --> <jsp:param value="123" name="score"/> </jsp:forward>

  3.directive行为 【代替了,jsp的指令 如:<%@page%> 、<%include%>、<%@taglib%>等】  

   <jsp:directive.page/>行为相当于<%@page%>指令
   <jsp:directive.include/>行为相当于<%include%>指令
   <jsp:directive.taglib/>行为相当于<%@taglib%>指令

四:JSP的9大内置对象和4大作用域

   9大内置对象:

   

   *:注意在使用exception内置对像的时候,要使用<%@page %>指令开启,exception的使用。<%@ page errorPage="true" %>

   4大作用域:【在Servlet中通常将javaBean或者其他响应数据存放在下方域中比如,然后再jsp中利用EL表达式进行数据的获取和展示】

    page指在当前jsp文件中有效
    request:本次请求中有效【一个request,可以同过forward()方法,贯穿多个jsp,那么这些jsp中都可以使用】
session:本次会话中有效【即对当前用户有效】
application: web应用程序内有效【服务关闭后失效】

五:JSP的配置 【JSP是一种Servlet所以它的配置和Servlet很类似】
  
 1   <!-- 配置JSP -->
 2   <servlet>
 3       <servlet-name>second</servlet-name>
 4       <jsp-file>/jsp/second.jsp</jsp-file>
 5       <!-- 
 6           因为jsp也是servlet所以可以配置jsp的初始化参数
 7           在jsp中使用内置对象config进行初始化参数的获取config.getInitParameter("aaa");
 8           当然jsp中也可以使用配置好的上下文参数(使用pageContext内置对象):pageContext.getServletContext().getInitParameter("上下文参数");
 9        -->
10       <init-param>
11           <param-name>aaa</param-name>
12           <param-value>123</param-value>
13       </init-param>
14   </servlet>
15   
16   <!-- 
17       配置JSP的映射 【这样一来不仅可以通过浏览器直接访问jsp文件,而且还可以通过映射进行访问】
18   -->
19   <servlet-mapping>
20       <servlet-name>second</servlet-name>
21       <url-pattern>/jsp/second</url-pattern>
22       <!-- 配置多映射 -->
23       <url-pattern>/jsp/second1</url-pattern>
24   </servlet-mapping>
六:EL表达式

  1.EL表达式  
el表达式出现在html代码中,不能放置在<% %>标签中。el表达式使用${}符号进行操作。
 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>使用EL表达式</title>
 8 </head>
 9 <body>
10     
11     <!-- 运用JSP的useBean行为创建对象 -->
12     <jsp:useBean id="obj" class="cn.woo.entity.JavaBean"></jsp:useBean>
13     <jsp:setProperty name="obj" property="age" value="23"></jsp:setProperty>
14     <jsp:setProperty name="obj" property="name" value="unknown"></jsp:setProperty>
15     <!-- 使用EL表达式获取存放在page域中的对象 -->
16     <!-- 相当于obj.getName() -->
17     欢迎:<p>${obj.name}</p>
<!-- 相当于obj.getAge() --> 18 年龄:<P>${obj.age}</P> 19 </body> 20 </html>
  *:EL表达式查询原则(范围从小到大)先从request中查找,如果没有去session、application中找。【当然你可以直接指定范围,比如:pageScope.obj.age】

   2.EL表达式操作隐藏对象

  

    

  3.EL表达式中的运算符

    + - * / %      > == < != >= <=     &&    ||     !    支持三目运算符 ?:   如:${1+1} 等

    ${javaBean.param[0]} 去除param中的第一个元素

    判断javaBean中的属性是否为空,${empty javaBean.param}

 
原文地址:https://www.cnblogs.com/wooyoohoo/p/9471275.html