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}